From f4bbd8ea107d687ba31eb906e62180d0d3f8dc54 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 23 Feb 2017 11:27:19 +0100 Subject: [PATCH 01/60] Use dirty state rather events to avoid O(N^2) behaviour --- .../public/coffee/ide/editor/Document.coffee | 5 +- .../track-changes/TrackChangesManager.coffee | 154 +++++++++--------- .../ide/review-panel/RangesTracker.coffee | 72 +++++--- 3 files changed, 124 insertions(+), 107 deletions(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 1de01b5467..91c05e6e39 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -353,11 +353,12 @@ define [ @ranges.applyOp op, { user_id: track_changes_as } if old_id_seed? @ranges.setIdSeed(old_id_seed) + @emit "ranges:dirty" _catchUpRanges: (changes = [], comments = []) -> # We've just been given the current server's ranges, but need to apply any local ops we have. # Reset to the server state then apply our local ops again. - @ranges.emit "clear" + @emit "ranges:clear" @ranges.changes = changes @ranges.comments = comments @ranges.track_changes = @doc.track_changes @@ -367,4 +368,4 @@ define [ for op in @doc.getPendingOp() or [] @ranges.setIdSeed(@doc.track_changes_id_seeds.pending) @ranges.applyOp(op, { user_id: @track_changes_as }) - @ranges.emit "redraw" + @emit "ranges:redraw" diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee index 38b3e5678c..17c10e7f71 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee @@ -14,11 +14,11 @@ define [ return if !track_changes? @setTrackChanges(track_changes) - @$scope.$watch "sharejsDoc", (doc) => + @$scope.$watch "sharejsDoc", (doc, oldDoc) => return if !doc? - @disconnectFromRangesTracker() - @rangesTracker = doc.ranges - @connectToRangesTracker() + if oldDoc? + @disconnectFromDoc(oldDoc) + @connectToDoc(doc) @$scope.$on "comment:add", (e, thread_id, offset, length) => @addCommentToSelection(thread_id, offset, length) @@ -36,10 +36,10 @@ define [ @removeCommentId(comment_id) @$scope.$on "comment:resolve_threads", (e, thread_ids) => - @resolveCommentByThreadIds(thread_ids) + @hideCommentsByThreadIds(thread_ids) @$scope.$on "comment:unresolve_thread", (e, thread_id) => - @unresolveCommentByThreadId(thread_id) + @showCommentByThreadId(thread_id) @$scope.$on "review-panel:recalculate-screen-positions", () => @recalculateReviewEntriesScreenPositions() @@ -92,18 +92,11 @@ define [ else unbindFromAce() - disconnectFromRangesTracker: () -> + disconnectFromDoc: (doc) -> @changeIdToMarkerIdMap = {} - - if @rangesTracker? - @rangesTracker.off "insert:added" - @rangesTracker.off "insert:removed" - @rangesTracker.off "delete:added" - @rangesTracker.off "delete:removed" - @rangesTracker.off "changes:moved" - @rangesTracker.off "comment:added" - @rangesTracker.off "comment:moved" - @rangesTracker.off "comment:removed" + doc.off "ranges:clear" + doc.off "ranges:redraw" + doc.off "ranges:dirty" setTrackChanges: (value) -> if value @@ -111,56 +104,15 @@ define [ else @$scope.sharejsDoc?.track_changes_as = null - connectToRangesTracker: () -> + connectToDoc: (doc) -> + @rangesTracker = doc.ranges @setTrackChanges(@$scope.trackChanges) - # Add a timeout because on remote ops, we get these notifications before - # ace has updated - @rangesTracker.on "insert:added", (change) => - sl_console.log "[insert:added]", change - setTimeout () => - @_onInsertAdded(change) - @broadcastChange() - @rangesTracker.on "insert:removed", (change) => - sl_console.log "[insert:removed]", change - setTimeout () => - @_onInsertRemoved(change) - @broadcastChange() - @rangesTracker.on "delete:added", (change) => - sl_console.log "[delete:added]", change - setTimeout () => - @_onDeleteAdded(change) - @broadcastChange() - @rangesTracker.on "delete:removed", (change) => - sl_console.log "[delete:removed]", change - setTimeout () => - @_onDeleteRemoved(change) - @broadcastChange() - @rangesTracker.on "changes:moved", (changes) => - sl_console.log "[changes:moved]", changes - setTimeout () => - @_onChangesMoved(changes) - @broadcastChange() - - @rangesTracker.on "comment:added", (comment) => - sl_console.log "[comment:added]", comment - setTimeout () => - @_onCommentAdded(comment) - @broadcastChange() - @rangesTracker.on "comment:moved", (comment) => - sl_console.log "[comment:moved]", comment - setTimeout () => - @_onCommentMoved(comment) - @broadcastChange() - @rangesTracker.on "comment:removed", (comment) => - sl_console.log "[comment:removed]", comment - setTimeout () => - @_onCommentRemoved(comment) - @broadcastChange() - - @rangesTracker.on "clear", () => + doc.on "ranges:dirty", () => + @updateAnnotations() + doc.on "ranges:clear", () => @clearAnnotations() - @rangesTracker.on "redraw", () => + doc.on "ranges:redraw", () => @redrawAnnotations() clearAnnotations: () -> @@ -181,6 +133,55 @@ define [ @_onCommentAdded(comment) @broadcastChange() + + _doneUpdateThisLoop: false + _pendingUpdates: false + updateAnnotations: () -> + # Doc updates with multiple ops, like search/replace or block comments + # will call this with every individual op in a single event loop. So only + # do the first this loop, then schedule an update for the next loop for the rest. + if !@_doneUpdateThisLoop + @_doUpdateAnnotations() + @_doneUpdateThisLoop = true + setTimeout () => + if @_pendingUpdates + @_doUpdateAnnotations() + @_doneUpdateThisLoop = false + @_pendingUpdates = false + else + @_pendingUpdates = true + + _doUpdateAnnotations: () -> + dirty = @rangesTracker.getDirtyState() + + updateMarkers = false + + for id, change of dirty.change.added + if change.op.i? + @_onInsertAdded(change) + else if change.op.d? + @_onDeleteAdded(change) + for id, change of dirty.change.removed + if change.op.i? + @_onInsertRemoved(change) + else if change.op.d? + @_onDeleteRemoved(change) + for id, change of dirty.change.moved + updateMarkers = true + @_onChangeMoved(change) + + for id, comment of dirty.comment.added + @_onCommentAdded(comment) + for id, comment of dirty.comment.removed + @_onCommentRemoved(comment) + for id, comment of dirty.comment.moved + updateMarkers = true + @_onCommentMoved(comment) + + @rangesTracker.resetDirtyState() + if updateMarkers + @editor.renderer.updateBackMarkers() + @broadcastChange() addComment: (offset, content, thread_id) -> op = { c: content, p: offset, t: thread_id } @@ -200,6 +201,7 @@ define [ acceptChangeId: (change_id) -> @rangesTracker.removeChangeId(change_id) + @updateAnnotations() rejectChangeId: (change_id) -> change = @rangesTracker.getChange(change_id) @@ -221,8 +223,9 @@ define [ removeCommentId: (comment_id) -> @rangesTracker.removeCommentId(comment_id) + @updateAnnotations() - resolveCommentByThreadIds: (thread_ids) -> + hideCommentsByThreadIds: (thread_ids) -> resolve_ids = {} for id in thread_ids resolve_ids[id] = true @@ -231,7 +234,7 @@ define [ @_onCommentRemoved(comment) @broadcastChange() - unresolveCommentByThreadId: (thread_id) -> + showCommentByThreadId: (thread_id) -> for comment in @rangesTracker?.comments or [] if comment.op.t == thread_id @_onCommentAdded(comment) @@ -421,23 +424,18 @@ define [ lines = @editor.getSession().getDocument().getAllLines() return AceShareJsCodec.shareJsOffsetToAcePosition(offset, lines) - _onChangesMoved: (changes) -> - # TODO: PERFORMANCE: Only run through the Ace lines once, and calculate all - # change positions as we go. - for change in changes - start = @_shareJsOffsetToAcePosition(change.op.p) - if change.op.i? - end = @_shareJsOffsetToAcePosition(change.op.p + change.op.i.length) - else - end = start - @_updateMarker(change.id, start, end) - @editor.renderer.updateBackMarkers() + _onChangeMoved: (change) -> + start = @_shareJsOffsetToAcePosition(change.op.p) + if change.op.i? + end = @_shareJsOffsetToAcePosition(change.op.p + change.op.i.length) + else + end = start + @_updateMarker(change.id, start, end) _onCommentMoved: (comment) -> start = @_shareJsOffsetToAcePosition(comment.op.p) end = @_shareJsOffsetToAcePosition(comment.op.p + comment.op.c.length) @_updateMarker(comment.id, start, end) - @editor.renderer.updateBackMarkers() _updateMarker: (change_id, start, end) -> return if !@changeIdToMarkerIdMap[change_id]? diff --git a/services/web/public/coffee/ide/review-panel/RangesTracker.coffee b/services/web/public/coffee/ide/review-panel/RangesTracker.coffee index 865ecf4ef6..1f32f19d3a 100644 --- a/services/web/public/coffee/ide/review-panel/RangesTracker.coffee +++ b/services/web/public/coffee/ide/review-panel/RangesTracker.coffee @@ -1,5 +1,5 @@ -load = (EventEmitter) -> - class RangesTracker extends EventEmitter +load = () -> + class RangesTracker # The purpose of this class is to track a set of inserts and deletes to a document, like # track changes in Word. We store these as a set of ShareJs style ranges: # {i: "foo", p: 42} # Insert 'foo' at offset 42 @@ -36,6 +36,7 @@ load = (EventEmitter) -> # middle of a previous insert by the first user, the original insert will be split into two. constructor: (@changes = [], @comments = []) -> @setIdSeed(RangesTracker.generateIdSeed()) + @resetDirtyState() getIdSeed: () -> return @id_seed @@ -75,7 +76,7 @@ load = (EventEmitter) -> comment = @getComment(comment_id) return if !comment? @comments = @comments.filter (c) -> c.id != comment_id - @emit "comment:removed", comment + @_markAsDirty comment, "comment", "removed" getChange: (change_id) -> change = null @@ -103,7 +104,11 @@ load = (EventEmitter) -> @addComment(op, metadata) else throw new Error("unknown op type") - + + applyOps: (ops, metadata = {}) -> + for op in ops + @applyOp(op, metadata) + addComment: (op, metadata) -> # TODO: Don't allow overlapping comments? @comments.push comment = { @@ -114,18 +119,18 @@ load = (EventEmitter) -> t: op.t metadata } - @emit "comment:added", comment + @_markAsDirty comment, "comment", "added" return comment applyInsertToComments: (op) -> for comment in @comments if op.p <= comment.op.p comment.op.p += op.i.length - @emit "comment:moved", comment + @_markAsDirty comment, "comment", "moved" else if op.p < comment.op.p + comment.op.c.length offset = op.p - comment.op.p comment.op.c = comment.op.c[0..(offset-1)] + op.i + comment.op.c[offset...] - @emit "comment:moved", comment + @_markAsDirty comment, "comment", "moved" applyDeleteToComments: (op) -> op_start = op.p @@ -138,7 +143,7 @@ load = (EventEmitter) -> if op_end <= comment_start # delete is fully before comment comment.op.p -= op_length - @emit "comment:moved", comment + @_markAsDirty comment, "comment", "moved" else if op_start >= comment_end # delete is fully after comment, nothing to do else @@ -161,7 +166,7 @@ load = (EventEmitter) -> comment.op.p = Math.min(comment_start, op_start) comment.op.c = remaining_before + remaining_after - @emit "comment:moved", comment + @_markAsDirty comment, "comment", "moved" applyInsertToChanges: (op, metadata) -> op_start = op.p @@ -206,12 +211,12 @@ load = (EventEmitter) -> # If this is an insert op at the end of an existing insert with a delete following, and it cancels out the following # delete then we shouldn't append it to this insert, but instead only cancel the following delete. # E.g. - # foo|<--- about to insert 'b' here + # foo|<--- about to insert 'bar' here # inserted 'foo' --^ ^-- deleted 'bar' - # should become just 'foo' not 'foob' (with the delete marker becoming just 'ar'), . + # should become just 'foo' not 'foobar' (with the delete marker disappearing), . next_change = @changes[i+1] is_op_adjacent_to_next_delete = next_change? and next_change.op.d? and op.p == change_end and next_change.op.p == op.p - will_op_cancel_next_delete = is_op_adjacent_to_next_delete and next_change.op.d.slice(0, op.i.length) == op.i + will_op_cancel_next_delete = is_op_adjacent_to_next_delete and next_change.op.d == op.i # If there is a delete at the start of the insert, and we're inserting # at the start, we SHOULDN'T merge since the delete acts as a partition. @@ -281,8 +286,8 @@ load = (EventEmitter) -> for change in remove_changes @_removeChange change - if moved_changes.length > 0 - @emit "changes:moved", moved_changes + for change in moved_changes + @_markAsDirty change, "change", "moved" applyDeleteToChanges: (op, metadata) -> op_start = op.p @@ -406,8 +411,8 @@ load = (EventEmitter) -> @_removeChange change moved_changes = moved_changes.filter (c) -> c != change - if moved_changes.length > 0 - @emit "changes:moved", moved_changes + for change in moved_changes + @_markAsDirty change, "change", "moved" _addOp: (op, metadata) -> change = { @@ -427,17 +432,11 @@ load = (EventEmitter) -> else return -1 - if op.d? - @emit "delete:added", change - else if op.i? - @emit "insert:added", change + @_markAsDirty(change, "change", "added") _removeChange: (change) -> @changes = @changes.filter (c) -> c.id != change.id - if change.op.d? - @emit "delete:removed", change - else if change.op.i? - @emit "insert:removed", change + @_markAsDirty change, "change", "removed" _applyOpModifications: (content, op_modifications) -> # Put in descending position order, with deleting first if at the same offset @@ -486,13 +485,32 @@ load = (EventEmitter) -> previous_change = change return { moved_changes, remove_changes } + resetDirtyState: () -> + @_dirtyState = { + comment: { + moved: {} + removed: {} + added: {} + } + change: { + moved: {} + removed: {} + added: {} + } + } + + getDirtyState: () -> + return @_dirtyState + + _markAsDirty: (object, type, action) -> + @_dirtyState[type][action][object.id] = object + _clone: (object) -> clone = {} (clone[k] = v for k,v of object) return clone if define? - define ["utils/EventEmitter"], load + define [], load else - EventEmitter = require("events").EventEmitter - module.exports = load(EventEmitter) \ No newline at end of file + module.exports = load() \ No newline at end of file From 7418d12bf8602aa7eb5233014ec895145bdae589 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 23 Feb 2017 11:34:58 +0100 Subject: [PATCH 02/60] Defer updates of remote ops until Ace has been updated --- services/web/public/coffee/ide/editor/Document.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/Document.coffee b/services/web/public/coffee/ide/editor/Document.coffee index 91c05e6e39..a321b85049 100644 --- a/services/web/public/coffee/ide/editor/Document.coffee +++ b/services/web/public/coffee/ide/editor/Document.coffee @@ -353,7 +353,12 @@ define [ @ranges.applyOp op, { user_id: track_changes_as } if old_id_seed? @ranges.setIdSeed(old_id_seed) - @emit "ranges:dirty" + if remote_op + # With remote ops, Ace hasn't been updated when we receive this op, + # so defer updating track changes until it has + setTimeout () => @emit "ranges:dirty" + else + @emit "ranges:dirty" _catchUpRanges: (changes = [], comments = []) -> # We've just been given the current server's ranges, but need to apply any local ops we have. From dd0271e7994a856b1505382ce7966dedbd3f4f9b Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 24 Feb 2017 14:20:26 +0100 Subject: [PATCH 03/60] Only cancel deletes with inserts on undo and reject --- .../track-changes/TrackChangesManager.coffee | 4 +++ .../editor/sharejs/vendor/client/ace.coffee | 10 +++--- .../sharejs/vendor/types/text-api.coffee | 14 +++++--- .../editor/sharejs/vendor/types/text.coffee | 33 +++++++++++-------- .../ide/review-panel/RangesTracker.coffee | 18 +++++----- 5 files changed, 50 insertions(+), 29 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee index 17c10e7f71..f51d1ed41e 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee @@ -210,14 +210,18 @@ define [ if change.op.d? content = change.op.d position = @_shareJsOffsetToAcePosition(change.op.p) + session.$fromReject = true # Tell track changes to cancel out delete session.insert(position, content) + session.$fromReject = false else if change.op.i? start = @_shareJsOffsetToAcePosition(change.op.p) end = @_shareJsOffsetToAcePosition(change.op.p + change.op.i.length) editor_text = session.getDocument().getTextRange({start, end}) if editor_text != change.op.i throw new Error("Op to be removed (#{JSON.stringify(change.op)}), does not match editor text, '#{editor_text}'") + session.$fromReject = true session.remove({start, end}) + session.$fromReject = false else throw new Error("unknown change: #{JSON.stringify(change)}") diff --git a/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee b/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee index 9526f9826c..b382a439ff 100644 --- a/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee +++ b/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee @@ -3,7 +3,7 @@ Range = ace.require("ace/range").Range # Convert an ace delta into an op understood by share.js -applyToShareJS = (editorDoc, delta, doc) -> +applyToShareJS = (editorDoc, delta, doc, fromUndo) -> # Get the start position of the range, in no. of characters getStartOffsetPosition = (start) -> # This is quite inefficient - getLines makes a copy of the entire @@ -27,11 +27,11 @@ applyToShareJS = (editorDoc, delta, doc) -> switch delta.action when 'insert' text = delta.lines.join('\n') - doc.insert pos, text + doc.insert pos, text, fromUndo when 'remove' text = delta.lines.join('\n') - doc.del pos, text.length + doc.del pos, text.length, fromUndo else throw new Error "unknown action: #{delta.action}" @@ -78,8 +78,10 @@ window.sharejs.extendDoc 'attach_ace', (editor, keepEditorContents, maxDocLength if maxDocLength? and editorDoc.getValue().length > maxDocLength doc.emit "error", new Error("document length is greater than maxDocLength") return + + fromUndo = !!(editor.getSession().$fromUndo or editor.getSession().$fromReject) - applyToShareJS editorDoc, change, doc + applyToShareJS editorDoc, change, doc, fromUndo check() diff --git a/services/web/public/coffee/ide/editor/sharejs/vendor/types/text-api.coffee b/services/web/public/coffee/ide/editor/sharejs/vendor/types/text-api.coffee index 274b6019c5..98bb3fd503 100644 --- a/services/web/public/coffee/ide/editor/sharejs/vendor/types/text-api.coffee +++ b/services/web/public/coffee/ide/editor/sharejs/vendor/types/text-api.coffee @@ -11,14 +11,20 @@ text.api = # Get the text contents of a document getText: -> @snapshot - insert: (pos, text, callback) -> - op = [{p:pos, i:text}] + insert: (pos, text, fromUndo, callback) -> + op = {p:pos, i:text} + if fromUndo + op.u = true + op = [op] @submitOp op, callback op - del: (pos, length, callback) -> - op = [{p:pos, d:@snapshot[pos...(pos + length)]}] + del: (pos, length, fromUndo, callback) -> + op = {p:pos, d:@snapshot[pos...(pos + length)]} + if fromUndo + op.u = true + op = [op] @submitOp op, callback op diff --git a/services/web/public/coffee/ide/editor/sharejs/vendor/types/text.coffee b/services/web/public/coffee/ide/editor/sharejs/vendor/types/text.coffee index 2a3b79997d..ee7bf57043 100644 --- a/services/web/public/coffee/ide/editor/sharejs/vendor/types/text.coffee +++ b/services/web/public/coffee/ide/editor/sharejs/vendor/types/text.coffee @@ -56,6 +56,13 @@ text.apply = (snapshot, op) -> throw new Error "Unknown op type" snapshot +cloneAndModify = (op, modifications) -> + newOp = {} + for k,v of op + newOp[k] = v + for k,v of modifications + newOp[k] = v + return newOp # Exported for use by the random op generator. # @@ -69,10 +76,10 @@ text._append = append = (newOp, c) -> last = newOp[newOp.length - 1] # Compose the insert into the previous insert if possible - if last.i? && c.i? and last.p <= c.p <= (last.p + last.i.length) - newOp[newOp.length - 1] = {i:strInject(last.i, c.p - last.p, c.i), p:last.p} - else if last.d? && c.d? and c.p <= last.p <= (c.p + c.d.length) - newOp[newOp.length - 1] = {d:strInject(c.d, last.p - c.p, last.d), p:c.p} + if last.i? && c.i? and last.p <= c.p <= (last.p + last.i.length) and last.u == c.u + newOp[newOp.length - 1] = cloneAndModify(last, {i:strInject(last.i, c.p - last.p, c.i)}) + else if last.d? && c.d? and c.p <= last.p <= (c.p + c.d.length) and last.u == c.u + newOp[newOp.length - 1] = cloneAndModify(last, {d:strInject(c.d, last.p - c.p, last.d), p: c.p}) else newOp.push c @@ -150,25 +157,25 @@ text._tc = transformComponent = (dest, c, otherC, side) -> checkValidOp [otherC] if c.i? - append dest, {i:c.i, p:transformPosition(c.p, otherC, side == 'right')} + append dest, cloneAndModify(c, {p:transformPosition(c.p, otherC, side == 'right')}) else if c.d? # Delete if otherC.i? # delete vs insert s = c.d if c.p < otherC.p - append dest, {d:s[...otherC.p - c.p], p:c.p} + append dest, cloneAndModify(c, {d:s[...otherC.p - c.p]}) s = s[(otherC.p - c.p)..] if s != '' - append dest, {d:s, p:c.p + otherC.i.length} + append dest, cloneAndModify(c, {d:s, p:c.p + otherC.i.length}) else if otherC.d? # Delete vs delete if c.p >= otherC.p + otherC.d.length - append dest, {d:c.d, p:c.p - otherC.d.length} + append dest, cloneAndModify(c, {p:c.p - otherC.d.length}) else if c.p + c.d.length <= otherC.p append dest, c else # They overlap somewhere. - newC = {d:'', p:c.p} + newC = cloneAndModify(c, {d:''}) if c.p < otherC.p newC.d = c.d[...(otherC.p - c.p)] if c.p + c.d.length > otherC.p + otherC.d.length @@ -198,18 +205,18 @@ text._tc = transformComponent = (dest, c, otherC, side) -> if c.p < otherC.p < c.p + c.c.length offset = otherC.p - c.p new_c = (c.c[0..(offset-1)] + otherC.i + c.c[offset...]) - append dest, {c:new_c, p:c.p, t: c.t} + append dest, cloneAndModify(c, {c:new_c}) else - append dest, {c:c.c, p:transformPosition(c.p, otherC, true), t: c.t} + append dest, cloneAndModify(c, {p:transformPosition(c.p, otherC, true)}) else if otherC.d? if c.p >= otherC.p + otherC.d.length - append dest, {c:c.c, p:c.p - otherC.d.length, t: c.t} + append dest, cloneAndModify(c, {p:c.p - otherC.d.length}) else if c.p + c.c.length <= otherC.p append dest, c else # Delete overlaps comment # They overlap somewhere. - newC = {c:'', p:c.p, t: c.t} + newC = cloneAndModify(c, {c:''}) if c.p < otherC.p newC.c = c.c[...(otherC.p - c.p)] if c.p + c.c.length > otherC.p + otherC.d.length diff --git a/services/web/public/coffee/ide/review-panel/RangesTracker.coffee b/services/web/public/coffee/ide/review-panel/RangesTracker.coffee index 1f32f19d3a..a9c43e9816 100644 --- a/services/web/public/coffee/ide/review-panel/RangesTracker.coffee +++ b/services/web/public/coffee/ide/review-panel/RangesTracker.coffee @@ -172,6 +172,7 @@ load = () -> op_start = op.p op_length = op.i.length op_end = op.p + op_length + undoing = !!op.u already_merged = false @@ -189,8 +190,9 @@ load = () -> change.op.p += op_length moved_changes.push change else if op_start == change_start - # If the insert matches the start of the delete, just remove it from the delete instead - if change.op.d.length >= op.i.length and change.op.d.slice(0, op.i.length) == op.i + # If we are undoing, then we want to cancel any existing delete ranges if we can. + # Check if the insert matches the start of the delete, and just remove it from the delete instead if so. + if undoing and change.op.d.length >= op.i.length and change.op.d.slice(0, op.i.length) == op.i change.op.d = change.op.d.slice(op.i.length) change.op.p += op.i.length if change.op.d == "" @@ -208,15 +210,15 @@ load = () -> # Only merge inserts if they are from the same user is_same_user = metadata.user_id == change.metadata.user_id - # If this is an insert op at the end of an existing insert with a delete following, and it cancels out the following - # delete then we shouldn't append it to this insert, but instead only cancel the following delete. + # If we are undoing, then our changes will be removed from any delete ops just after. In that case, if there is also + # an insert op just before, then we shouldn't append it to this insert, but instead only cancel the following delete. # E.g. - # foo|<--- about to insert 'bar' here + # foo|<--- about to insert 'b' here # inserted 'foo' --^ ^-- deleted 'bar' - # should become just 'foo' not 'foobar' (with the delete marker disappearing), . + # should become just 'foo' not 'foob' (with the delete marker becoming just 'ar'), . next_change = @changes[i+1] is_op_adjacent_to_next_delete = next_change? and next_change.op.d? and op.p == change_end and next_change.op.p == op.p - will_op_cancel_next_delete = is_op_adjacent_to_next_delete and next_change.op.d == op.i + will_op_cancel_next_delete = undoing and is_op_adjacent_to_next_delete and next_change.op.d.slice(0, op.i.length) == op.i # If there is a delete at the start of the insert, and we're inserting # at the start, we SHOULDN'T merge since the delete acts as a partition. @@ -513,4 +515,4 @@ load = () -> if define? define [], load else - module.exports = load() \ No newline at end of file + module.exports = load() From 1a9c0356472ce9e5a1c0d1057d6ce49a9cc6293f Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 28 Feb 2017 18:53:34 +0000 Subject: [PATCH 04/60] bring system message checks down to 1 min. can take ages when at 5 mins --- .../coffee/Features/SystemMessages/SystemMessageManager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee b/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee index 54b65993bf..aaad83dc3f 100644 --- a/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee +++ b/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee @@ -23,7 +23,7 @@ module.exports = SystemMessageManager = clearCache: () -> delete @_cachedMessages -CACHE_TIMEOUT = 5 * 60 * 1000 # 5 minutes +CACHE_TIMEOUT = 1 * 60 * 1000 # 1 minutes setInterval () -> SystemMessageManager.clearCache() , CACHE_TIMEOUT \ No newline at end of file From 8db684bd2d502d7cbc7d7c835fcf27baaa7294e6 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 1 Mar 2017 15:46:43 +0000 Subject: [PATCH 05/60] Update SystemMessageManager.coffee --- .../Features/SystemMessages/SystemMessageManager.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee b/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee index aaad83dc3f..e3705b3577 100644 --- a/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee +++ b/services/web/app/coffee/Features/SystemMessages/SystemMessageManager.coffee @@ -23,7 +23,7 @@ module.exports = SystemMessageManager = clearCache: () -> delete @_cachedMessages -CACHE_TIMEOUT = 1 * 60 * 1000 # 1 minutes +CACHE_TIMEOUT = 20 * 1000 # 20 seconds setInterval () -> SystemMessageManager.clearCache() -, CACHE_TIMEOUT \ No newline at end of file +, CACHE_TIMEOUT From a6679a1aeb1f568def6644d938385e506e8d597d Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 1 Mar 2017 16:33:04 +0000 Subject: [PATCH 06/60] Stop local and remote ops being batched together in the undo manager if they happen in the same flush --- .../ide/editor/directives/aceEditor.coffee | 4 -- .../aceEditor/undo/UndoManager.coffee | 67 ++++++++++++------- .../editor/sharejs/vendor/client/ace.coffee | 36 +++++++++- 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee index faa1159e00..2a633e24f8 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor.coffee @@ -322,10 +322,6 @@ define [ doc = session.getDocument() doc.on "change", onChange - sharejs_doc.on "remoteop.recordRemote", (op, oldSnapshot, msg) -> - undoManager.nextUpdateIsRemote = true - trackChangesManager.nextUpdateMetaData = msg?.meta - editor.initing = true sharejs_doc.attachToAce(editor) editor.initing = false diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee index a4348bed98..1f53fffe52 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/undo/UndoManager.coffee @@ -11,10 +11,10 @@ define [ show_remote_warning: false @reset() - @nextUpdateIsRemote = false @editor.on "changeSession", (e) => @reset() + @session = e.session e.session.setUndoManager(@) showUndoConflictWarning: () -> @@ -38,20 +38,44 @@ define [ @firstUpdate = false return aceDeltaSets = options.args[0] - @session = options.args[1] return if !aceDeltaSets? + @session = options.args[1] - lines = @session.getDocument().getAllLines() - linesBeforeChange = @_revertAceDeltaSetsOnDocLines(aceDeltaSets, lines) - simpleDeltaSets = @_aceDeltaSetsToSimpleDeltaSets(aceDeltaSets, linesBeforeChange) - @undoStack.push( - deltaSets: simpleDeltaSets - remote: @nextUpdateIsRemote - ) + # We need to split the delta sets into local or remote groups before pushing onto + # the undo stack, since these are treated differently. + splitDeltaSets = [] + currentDeltaSet = null # Make global to this function + do newDeltaSet = () -> + currentDeltaSet = {group: "doc", deltas: []} + splitDeltaSets.push currentDeltaSet + currentRemoteState = null + + for deltaSet in aceDeltaSets or [] + if deltaSet.group == "doc" # ignore code folding etc. + for delta in deltaSet.deltas + if currentDeltaSet.remote? and currentDeltaSet.remote != !!delta.remote + newDeltaSet() + currentDeltaSet.deltas.push delta + currentDeltaSet.remote = !!delta.remote + + # The lines are currently as they are after applying all these deltas, but to turn into simple deltas, + # we need the lines before each delta group. + docLines = @session.getDocument().getAllLines() + docLines = @_revertAceDeltaSetsOnDocLines(aceDeltaSets, docLines) + for deltaSet in splitDeltaSets + {simpleDeltaSet, docLines} = @_aceDeltaSetToSimpleDeltaSet(deltaSet, docLines) + frame = { + deltaSets: [simpleDeltaSet] + remote: deltaSet.remote + } + @undoStack.push frame @redoStack = [] - @nextUpdateIsRemote = false undo: (dontSelect) -> + # We rely on the doclines being in sync with the undo stack, so make sure + # any pending undo deltas are processed. + @session.$syncInformUndoManager() + localUpdatesMade = @_shiftLocalChangeToTopOfUndoStack() return if !localUpdatesMade @@ -206,19 +230,16 @@ define [ throw "Unknown delta type" return doc.split("\n") - _aceDeltaSetsToSimpleDeltaSets: (aceDeltaSets, docLines) -> - simpleDeltaSets = [] - for deltaSet in aceDeltaSets - if deltaSet.group == "doc" # ignore fold changes - simpleDeltas = [] - for delta in deltaSet.deltas - simpleDeltas.push @_aceDeltaToSimpleDelta(delta, docLines) - docLines = @_applyAceDeltasToDocLines([delta], docLines) - simpleDeltaSets.push { - deltas: simpleDeltas - group: deltaSet.group - } - return simpleDeltaSets + _aceDeltaSetToSimpleDeltaSet: (deltaSet, docLines) -> + simpleDeltas = [] + for delta in deltaSet.deltas + simpleDeltas.push @_aceDeltaToSimpleDelta(delta, docLines) + docLines = @_applyAceDeltasToDocLines([delta], docLines) + simpleDeltaSet = { + deltas: simpleDeltas + group: deltaSet.group + } + return {simpleDeltaSet, docLines} _simpleDeltaSetsToAceDeltaSets: (simpleDeltaSets, docLines) -> for deltaSet in simpleDeltaSets diff --git a/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee b/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee index b382a439ff..ac0db65b1a 100644 --- a/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee +++ b/services/web/public/coffee/ide/editor/sharejs/vendor/client/ace.coffee @@ -110,16 +110,46 @@ window.sharejs.extendDoc 'attach_ace', (editor, keepEditorContents, maxDocLength row:row, column:offset + # We want to insert a remote:true into the delta if the op comes from the + # underlying sharejs doc (which means it is from a remote op), so we have to do + # the work of editorDoc.insert and editorDoc.remove manually. These methods are + # copied from ace.js doc#insert and #remove, and then inject the remote:true + # flag into the delta. doc.on 'insert', (pos, text) -> + if (editorDoc.getLength() <= 1) + editorDoc.$detectNewLine(text) + + lines = editorDoc.$split(text) + position = offsetToPos(pos) + start = editorDoc.clippedPos(position.row, position.column) + end = { + row: start.row + lines.length - 1, + column: (if lines.length == 1 then start.column else 0) + lines[lines.length - 1].length + } + suppress = true - editorDoc.insert offsetToPos(pos), text + editorDoc.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines, + remote: true + }); suppress = false check() doc.on 'delete', (pos, text) -> - suppress = true range = Range.fromPoints offsetToPos(pos), offsetToPos(pos + text.length) - editorDoc.remove range + start = editorDoc.clippedPos(range.start.row, range.start.column) + end = editorDoc.clippedPos(range.end.row, range.end.column) + suppress = true + editorDoc.applyDelta({ + start: start, + end: end, + action: "remove", + lines: editorDoc.getLinesForRange({start: start, end: end}) + remote: true + }); suppress = false check() From 246775957ebae1212b02c7adc732970d05867803 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 2 Mar 2017 09:30:28 +0000 Subject: [PATCH 07/60] add pdfjs-1.7.225 to public/js/libs --- .../web/public/js/libs/pdfjs-1.7.225/LICENSE | 177 + .../libs/pdfjs-1.7.225/bcmaps/78-EUC-H.bcmap | Bin 0 -> 2404 bytes .../libs/pdfjs-1.7.225/bcmaps/78-EUC-V.bcmap | Bin 0 -> 173 bytes .../js/libs/pdfjs-1.7.225/bcmaps/78-H.bcmap | Bin 0 -> 2379 bytes .../libs/pdfjs-1.7.225/bcmaps/78-RKSJ-H.bcmap | Bin 0 -> 2398 bytes .../libs/pdfjs-1.7.225/bcmaps/78-RKSJ-V.bcmap | Bin 0 -> 173 bytes .../js/libs/pdfjs-1.7.225/bcmaps/78-V.bcmap | Bin 0 -> 169 bytes .../pdfjs-1.7.225/bcmaps/78ms-RKSJ-H.bcmap | Bin 0 -> 2651 bytes .../pdfjs-1.7.225/bcmaps/78ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../pdfjs-1.7.225/bcmaps/83pv-RKSJ-H.bcmap | Bin 0 -> 905 bytes .../pdfjs-1.7.225/bcmaps/90ms-RKSJ-H.bcmap | Bin 0 -> 721 bytes .../pdfjs-1.7.225/bcmaps/90ms-RKSJ-V.bcmap | Bin 0 -> 290 bytes .../pdfjs-1.7.225/bcmaps/90msp-RKSJ-H.bcmap | Bin 0 -> 715 bytes .../pdfjs-1.7.225/bcmaps/90msp-RKSJ-V.bcmap | Bin 0 -> 291 bytes .../pdfjs-1.7.225/bcmaps/90pv-RKSJ-H.bcmap | Bin 0 -> 982 bytes .../pdfjs-1.7.225/bcmaps/90pv-RKSJ-V.bcmap | Bin 0 -> 260 bytes .../js/libs/pdfjs-1.7.225/bcmaps/Add-H.bcmap | Bin 0 -> 2419 bytes .../pdfjs-1.7.225/bcmaps/Add-RKSJ-H.bcmap | Bin 0 -> 2413 bytes .../pdfjs-1.7.225/bcmaps/Add-RKSJ-V.bcmap | Bin 0 -> 287 bytes .../js/libs/pdfjs-1.7.225/bcmaps/Add-V.bcmap | Bin 0 -> 282 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-0.bcmap | Bin 0 -> 317 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-1.bcmap | Bin 0 -> 371 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-2.bcmap | Bin 0 -> 376 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-3.bcmap | Bin 0 -> 401 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-4.bcmap | Bin 0 -> 405 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-5.bcmap | Bin 0 -> 406 bytes .../pdfjs-1.7.225/bcmaps/Adobe-CNS1-6.bcmap | Bin 0 -> 406 bytes .../bcmaps/Adobe-CNS1-UCS2.bcmap | Bin 0 -> 41193 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-0.bcmap | Bin 0 -> 217 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-1.bcmap | Bin 0 -> 250 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-2.bcmap | Bin 0 -> 465 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-3.bcmap | Bin 0 -> 470 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-4.bcmap | Bin 0 -> 601 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-5.bcmap | Bin 0 -> 625 bytes .../pdfjs-1.7.225/bcmaps/Adobe-GB1-UCS2.bcmap | Bin 0 -> 33974 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-0.bcmap | Bin 0 -> 225 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-1.bcmap | Bin 0 -> 226 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-2.bcmap | Bin 0 -> 233 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-3.bcmap | Bin 0 -> 242 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-4.bcmap | Bin 0 -> 337 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-5.bcmap | Bin 0 -> 430 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Japan1-6.bcmap | Bin 0 -> 485 bytes .../bcmaps/Adobe-Japan1-UCS2.bcmap | Bin 0 -> 40951 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Korea1-0.bcmap | Bin 0 -> 241 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Korea1-1.bcmap | Bin 0 -> 386 bytes .../pdfjs-1.7.225/bcmaps/Adobe-Korea1-2.bcmap | Bin 0 -> 391 bytes .../bcmaps/Adobe-Korea1-UCS2.bcmap | Bin 0 -> 23293 bytes .../js/libs/pdfjs-1.7.225/bcmaps/B5-H.bcmap | Bin 0 -> 1086 bytes .../js/libs/pdfjs-1.7.225/bcmaps/B5-V.bcmap | Bin 0 -> 142 bytes .../js/libs/pdfjs-1.7.225/bcmaps/B5pc-H.bcmap | Bin 0 -> 1099 bytes .../js/libs/pdfjs-1.7.225/bcmaps/B5pc-V.bcmap | Bin 0 -> 144 bytes .../libs/pdfjs-1.7.225/bcmaps/CNS-EUC-H.bcmap | Bin 0 -> 1780 bytes .../libs/pdfjs-1.7.225/bcmaps/CNS-EUC-V.bcmap | Bin 0 -> 1920 bytes .../js/libs/pdfjs-1.7.225/bcmaps/CNS1-H.bcmap | Bin 0 -> 706 bytes .../js/libs/pdfjs-1.7.225/bcmaps/CNS1-V.bcmap | Bin 0 -> 143 bytes .../js/libs/pdfjs-1.7.225/bcmaps/CNS2-H.bcmap | Bin 0 -> 504 bytes .../js/libs/pdfjs-1.7.225/bcmaps/CNS2-V.bcmap | 3 + .../libs/pdfjs-1.7.225/bcmaps/ETHK-B5-H.bcmap | Bin 0 -> 4426 bytes .../libs/pdfjs-1.7.225/bcmaps/ETHK-B5-V.bcmap | Bin 0 -> 158 bytes .../libs/pdfjs-1.7.225/bcmaps/ETen-B5-H.bcmap | Bin 0 -> 1125 bytes .../libs/pdfjs-1.7.225/bcmaps/ETen-B5-V.bcmap | Bin 0 -> 158 bytes .../pdfjs-1.7.225/bcmaps/ETenms-B5-H.bcmap | 3 + .../pdfjs-1.7.225/bcmaps/ETenms-B5-V.bcmap | Bin 0 -> 172 bytes .../js/libs/pdfjs-1.7.225/bcmaps/EUC-H.bcmap | Bin 0 -> 578 bytes .../js/libs/pdfjs-1.7.225/bcmaps/EUC-V.bcmap | Bin 0 -> 170 bytes .../js/libs/pdfjs-1.7.225/bcmaps/Ext-H.bcmap | Bin 0 -> 2536 bytes .../pdfjs-1.7.225/bcmaps/Ext-RKSJ-H.bcmap | Bin 0 -> 2542 bytes .../pdfjs-1.7.225/bcmaps/Ext-RKSJ-V.bcmap | Bin 0 -> 218 bytes .../js/libs/pdfjs-1.7.225/bcmaps/Ext-V.bcmap | Bin 0 -> 215 bytes .../libs/pdfjs-1.7.225/bcmaps/GB-EUC-H.bcmap | Bin 0 -> 549 bytes .../libs/pdfjs-1.7.225/bcmaps/GB-EUC-V.bcmap | Bin 0 -> 179 bytes .../js/libs/pdfjs-1.7.225/bcmaps/GB-H.bcmap | 4 + .../js/libs/pdfjs-1.7.225/bcmaps/GB-V.bcmap | Bin 0 -> 175 bytes .../libs/pdfjs-1.7.225/bcmaps/GBK-EUC-H.bcmap | Bin 0 -> 14692 bytes .../libs/pdfjs-1.7.225/bcmaps/GBK-EUC-V.bcmap | Bin 0 -> 180 bytes .../libs/pdfjs-1.7.225/bcmaps/GBK2K-H.bcmap | Bin 0 -> 19662 bytes .../libs/pdfjs-1.7.225/bcmaps/GBK2K-V.bcmap | Bin 0 -> 219 bytes .../pdfjs-1.7.225/bcmaps/GBKp-EUC-H.bcmap | Bin 0 -> 14686 bytes .../pdfjs-1.7.225/bcmaps/GBKp-EUC-V.bcmap | Bin 0 -> 181 bytes .../libs/pdfjs-1.7.225/bcmaps/GBT-EUC-H.bcmap | Bin 0 -> 7290 bytes .../libs/pdfjs-1.7.225/bcmaps/GBT-EUC-V.bcmap | Bin 0 -> 180 bytes .../js/libs/pdfjs-1.7.225/bcmaps/GBT-H.bcmap | Bin 0 -> 7269 bytes .../js/libs/pdfjs-1.7.225/bcmaps/GBT-V.bcmap | Bin 0 -> 176 bytes .../pdfjs-1.7.225/bcmaps/GBTpc-EUC-H.bcmap | Bin 0 -> 7298 bytes .../pdfjs-1.7.225/bcmaps/GBTpc-EUC-V.bcmap | Bin 0 -> 182 bytes .../pdfjs-1.7.225/bcmaps/GBpc-EUC-H.bcmap | Bin 0 -> 557 bytes .../pdfjs-1.7.225/bcmaps/GBpc-EUC-V.bcmap | Bin 0 -> 181 bytes .../js/libs/pdfjs-1.7.225/bcmaps/H.bcmap | Bin 0 -> 553 bytes .../pdfjs-1.7.225/bcmaps/HKdla-B5-H.bcmap | Bin 0 -> 2654 bytes .../pdfjs-1.7.225/bcmaps/HKdla-B5-V.bcmap | Bin 0 -> 148 bytes .../pdfjs-1.7.225/bcmaps/HKdlb-B5-H.bcmap | Bin 0 -> 2414 bytes .../pdfjs-1.7.225/bcmaps/HKdlb-B5-V.bcmap | Bin 0 -> 148 bytes .../pdfjs-1.7.225/bcmaps/HKgccs-B5-H.bcmap | Bin 0 -> 2292 bytes .../pdfjs-1.7.225/bcmaps/HKgccs-B5-V.bcmap | Bin 0 -> 149 bytes .../pdfjs-1.7.225/bcmaps/HKm314-B5-H.bcmap | Bin 0 -> 1772 bytes .../pdfjs-1.7.225/bcmaps/HKm314-B5-V.bcmap | Bin 0 -> 149 bytes .../pdfjs-1.7.225/bcmaps/HKm471-B5-H.bcmap | Bin 0 -> 2171 bytes .../pdfjs-1.7.225/bcmaps/HKm471-B5-V.bcmap | Bin 0 -> 149 bytes .../pdfjs-1.7.225/bcmaps/HKscs-B5-H.bcmap | Bin 0 -> 4437 bytes .../pdfjs-1.7.225/bcmaps/HKscs-B5-V.bcmap | Bin 0 -> 159 bytes .../libs/pdfjs-1.7.225/bcmaps/Hankaku.bcmap | Bin 0 -> 132 bytes .../libs/pdfjs-1.7.225/bcmaps/Hiragana.bcmap | Bin 0 -> 124 bytes .../libs/pdfjs-1.7.225/bcmaps/KSC-EUC-H.bcmap | Bin 0 -> 1848 bytes .../libs/pdfjs-1.7.225/bcmaps/KSC-EUC-V.bcmap | Bin 0 -> 164 bytes .../js/libs/pdfjs-1.7.225/bcmaps/KSC-H.bcmap | Bin 0 -> 1831 bytes .../pdfjs-1.7.225/bcmaps/KSC-Johab-H.bcmap | Bin 0 -> 16791 bytes .../pdfjs-1.7.225/bcmaps/KSC-Johab-V.bcmap | Bin 0 -> 166 bytes .../js/libs/pdfjs-1.7.225/bcmaps/KSC-V.bcmap | Bin 0 -> 160 bytes .../pdfjs-1.7.225/bcmaps/KSCms-UHC-H.bcmap | Bin 0 -> 2787 bytes .../pdfjs-1.7.225/bcmaps/KSCms-UHC-HW-H.bcmap | Bin 0 -> 2789 bytes .../pdfjs-1.7.225/bcmaps/KSCms-UHC-HW-V.bcmap | Bin 0 -> 169 bytes .../pdfjs-1.7.225/bcmaps/KSCms-UHC-V.bcmap | Bin 0 -> 166 bytes .../pdfjs-1.7.225/bcmaps/KSCpc-EUC-H.bcmap | Bin 0 -> 2024 bytes .../pdfjs-1.7.225/bcmaps/KSCpc-EUC-V.bcmap | Bin 0 -> 166 bytes .../libs/pdfjs-1.7.225/bcmaps/Katakana.bcmap | Bin 0 -> 100 bytes .../js/libs/pdfjs-1.7.225/bcmaps/LICENSE | 36 + .../js/libs/pdfjs-1.7.225/bcmaps/NWP-H.bcmap | Bin 0 -> 2765 bytes .../js/libs/pdfjs-1.7.225/bcmaps/NWP-V.bcmap | Bin 0 -> 252 bytes .../js/libs/pdfjs-1.7.225/bcmaps/RKSJ-H.bcmap | Bin 0 -> 534 bytes .../js/libs/pdfjs-1.7.225/bcmaps/RKSJ-V.bcmap | Bin 0 -> 170 bytes .../js/libs/pdfjs-1.7.225/bcmaps/Roman.bcmap | Bin 0 -> 96 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UCS2-H.bcmap | Bin 0 -> 48280 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UCS2-V.bcmap | Bin 0 -> 156 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UTF16-H.bcmap | Bin 0 -> 50419 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UTF16-V.bcmap | Bin 0 -> 156 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UTF32-H.bcmap | Bin 0 -> 52679 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UTF32-V.bcmap | Bin 0 -> 160 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UTF8-H.bcmap | Bin 0 -> 53629 bytes .../pdfjs-1.7.225/bcmaps/UniCNS-UTF8-V.bcmap | Bin 0 -> 157 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UCS2-H.bcmap | Bin 0 -> 43366 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UCS2-V.bcmap | Bin 0 -> 193 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UTF16-H.bcmap | Bin 0 -> 44086 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UTF16-V.bcmap | Bin 0 -> 178 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UTF32-H.bcmap | Bin 0 -> 45738 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UTF32-V.bcmap | Bin 0 -> 182 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UTF8-H.bcmap | Bin 0 -> 46837 bytes .../pdfjs-1.7.225/bcmaps/UniGB-UTF8-V.bcmap | Bin 0 -> 181 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UCS2-H.bcmap | Bin 0 -> 25439 bytes .../bcmaps/UniJIS-UCS2-HW-H.bcmap | Bin 0 -> 119 bytes .../bcmaps/UniJIS-UCS2-HW-V.bcmap | Bin 0 -> 680 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UCS2-V.bcmap | Bin 0 -> 664 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UTF16-H.bcmap | Bin 0 -> 39443 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UTF16-V.bcmap | Bin 0 -> 643 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UTF32-H.bcmap | Bin 0 -> 40539 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UTF32-V.bcmap | Bin 0 -> 677 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UTF8-H.bcmap | Bin 0 -> 41695 bytes .../pdfjs-1.7.225/bcmaps/UniJIS-UTF8-V.bcmap | Bin 0 -> 678 bytes .../bcmaps/UniJIS2004-UTF16-H.bcmap | Bin 0 -> 39534 bytes .../bcmaps/UniJIS2004-UTF16-V.bcmap | Bin 0 -> 647 bytes .../bcmaps/UniJIS2004-UTF32-H.bcmap | Bin 0 -> 40630 bytes .../bcmaps/UniJIS2004-UTF32-V.bcmap | Bin 0 -> 681 bytes .../bcmaps/UniJIS2004-UTF8-H.bcmap | Bin 0 -> 41779 bytes .../bcmaps/UniJIS2004-UTF8-V.bcmap | Bin 0 -> 682 bytes .../bcmaps/UniJISPro-UCS2-HW-V.bcmap | Bin 0 -> 705 bytes .../bcmaps/UniJISPro-UCS2-V.bcmap | Bin 0 -> 689 bytes .../bcmaps/UniJISPro-UTF8-V.bcmap | Bin 0 -> 726 bytes .../bcmaps/UniJISX0213-UTF32-H.bcmap | Bin 0 -> 40517 bytes .../bcmaps/UniJISX0213-UTF32-V.bcmap | Bin 0 -> 684 bytes .../bcmaps/UniJISX02132004-UTF32-H.bcmap | Bin 0 -> 40608 bytes .../bcmaps/UniJISX02132004-UTF32-V.bcmap | Bin 0 -> 688 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UCS2-H.bcmap | Bin 0 -> 25783 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UCS2-V.bcmap | Bin 0 -> 178 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UTF16-H.bcmap | Bin 0 -> 26327 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UTF16-V.bcmap | Bin 0 -> 164 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UTF32-H.bcmap | Bin 0 -> 26451 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UTF32-V.bcmap | Bin 0 -> 168 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UTF8-H.bcmap | Bin 0 -> 27790 bytes .../pdfjs-1.7.225/bcmaps/UniKS-UTF8-V.bcmap | Bin 0 -> 169 bytes .../js/libs/pdfjs-1.7.225/bcmaps/V.bcmap | Bin 0 -> 166 bytes .../libs/pdfjs-1.7.225/bcmaps/WP-Symbol.bcmap | Bin 0 -> 179 bytes .../js/libs/pdfjs-1.7.225/compatibility.js | 639 + .../web/public/js/libs/pdfjs-1.7.225/pdf.js | 9052 +++ .../js/libs/pdfjs-1.7.225/pdf.worker.js | 50501 ++++++++++++++++ 173 files changed, 60415 insertions(+) create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/LICENSE create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78ms-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78ms-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/83pv-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90ms-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90ms-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90msp-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90msp-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90pv-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90pv-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-0.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-1.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-3.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-4.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-5.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-6.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-UCS2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-0.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-1.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-3.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-4.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-5.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-UCS2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-0.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-1.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-3.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-4.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-5.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-6.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-UCS2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-0.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-1.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-UCS2.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5pc-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5pc-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS1-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS1-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETHK-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETHK-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETen-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETen-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Ext-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Ext-RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Ext-RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Ext-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK2K-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK2K-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBKp-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBKp-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBTpc-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBTpc-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBpc-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBpc-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdla-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdla-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdlb-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdlb-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKgccs-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKgccs-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm314-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm314-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm471-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm471-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKscs-B5-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKscs-B5-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Hankaku.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Hiragana.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-Johab-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-Johab-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-HW-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-HW-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCpc-EUC-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCpc-EUC-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Katakana.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/LICENSE create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/NWP-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/NWP-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/RKSJ-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/RKSJ-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Roman.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UCS2-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UCS2-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF16-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF16-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF8-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF8-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UCS2-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UCS2-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF16-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF16-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF8-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF8-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-HW-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-HW-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF16-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF16-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF8-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF8-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF16-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF16-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF8-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF8-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UCS2-HW-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UCS2-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UTF8-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX0213-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX0213-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX02132004-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX02132004-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UCS2-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UCS2-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF16-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF16-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF32-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF32-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF8-H.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF8-V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/V.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/WP-Symbol.bcmap create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/compatibility.js create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/pdf.js create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/pdf.worker.js diff --git a/services/web/public/js/libs/pdfjs-1.7.225/LICENSE b/services/web/public/js/libs/pdfjs-1.7.225/LICENSE new file mode 100644 index 0000000000..f433b1a53f --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2655fc70ae706c7ba52a5d647cbfdfad6072c697 GIT binary patch literal 2404 zcmW+#SyWV47TvdAJ*r+6RRxF)G8F|XpkSd0DozL*KyfC)0pS@-L>YX5;1pdiNgJS` zL=Y%uFUFQ8f-Z~Eh|{myy!p1b$i=bHX> zys+`=ji%a~OD*o~?c2SXo4wxc?t%-A=Y8%IH=0{~_08^*hPNA=t~NHQExrp`wt~7k z_y6}dyPJH?zNXf1lP7#Wch;suC58JBpV$uq9mEuPwC72IzEbHXNYZPniTj*hqlSv? zy9b^WRK9;h_c*@u*1JTx7ix*U7ZnnF&#SLHey>!|EdL-u&xrn@*&5w$*NfflDK2+= zkrwuXqTL7MnA~22Pf9KA4fr?~%bt+->oAUIcL2r-sbdR_la`KcFv>|sf##T_){a6L zZz>&SFy1nCRKTb(b)1E9TI#5Vab|sosCYJ_)2Z3#X-H=>j7lt*z&MxFxdBF1Os5K? znsnZRp`!DS7QR5yc^Ag{L_fj2D*Kc1G--`L4aVDMe-VreA^uVrKH@))*=&=)9L7b- ze@e40Qn$YnMh&K$tX+cWC8^7XMR$0Y3r1~Bmq(SCsM3`${#?eYt^)$EU{}`}E&L@# zcPxy$knT7b^=rCQu(H|Gy$41^e0MR7M!EYUjH_~YJq!)qEijtU-Ks^sqNeUP7|r3` zf_Y15zzO4;B@hpz)f89@qm2a8VO%!{HsZCz64(smhCPrE<7P-e6ul({j>5RD%CBie zpj>cy2lha%z&qF(Xw_WHRJkwOeAjk=HyD)rrC=oHemQ0;UH2QoOmYvvB&o*&W;XYP zs+JX+-4iZyG9r441ct!gQz6g-rN^f!29ReQNEi0ZYj2)4&qthisov>87Kbo+0Qh$=>`~j8wQ^3-&*x>3Hw9>=- zcY6s*N`t`uwl zJ1hsAweX+N_@Hq1h-oMq>}c3f9AU@ILs^8KkcPH`l}kfA2z!$Z?FFl_4HaUk-ZFGV zbNrNAhJ^G}&Y^0s)A2)B!Ol2`g^y>kAUv%!4GW9Tg$<`_j-OG}u&7jJ9o`OBjbTAg z^$ZKU&W8@yg1sF++y-{RI%3npeois6iZGvTBnqqsQ~4MXj$I-nYr$%j5iuHDe6<}sNk|Fmn#UW714D_*&efd>yQ_i2~OPOauHUkuj&1aB|`CO7Re_m7mPE89T7)~S$Ht^iY1qXPZcOeCQn{%ODQ~p827A}Bq zPhV(7m(#MC48Fs;m;s(|S=^zLZ$3wVhU)l+Zdlw$)+{y>Wyvm9l2ziFj!tF)!oDx|dspKQGU!)^ENB-zje1rJn-dodCW^Ovqk+2Y7)PjD4}- zg_`Z3H071Z9I(Br0)NB&>I!&q+$#-%Z1586YnMv?MJr#&XtsY-`|DQlQpd7*1_xcs k5om7%Ka{$hiq3Rpxm1<^LpLp-6zwQO#)>TPFtC#SKLc+9MgRZ+ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f1ed8538287499647d923d7d8f517a00cdac4e3a GIT binary patch literal 173 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVQ!)88tSa;k;uAm5#wHeUdFwF voJ@OznOOFQu?X&sb`)LsaBps_Jp&^YN;1fUS!@iAMpy(B8JB)#+{Xj}Q4TH^ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..39e89d3339c74cbe06e7e4f76d60bf3556b0d4b6 GIT binary patch literal 2379 zcmW+#`CAjo7Cn_tlXOB7KxC0E6;J^M1G0!Hh@b)rDv093(r8qa#RddiM!%k!=Kz6- zAR+9oPaY$vEGl%>eDkNgKjqcDAL=`OZ&%$q=bl@p|JIdvKX}yBe&=qVJEy3~o0aSJ z7P-rAb+`H4^^bb{e4V}Ss;-;eJrBBj)IQ&>Y+G4Jhx`Bgd)+<0USCiDKgoKZ&z*hf zTvhq0+WJ$3P^#}Vsdh@6et)EU9RIrVD^XsATjF2DgvGz`>igTdVHlSz!$)8= zkl`}TkwdM+YY0@hN4GKOM$Rv%dnytuTKz3?K2= zVJ*kxZ-8-I@?X_#dDQK1f^i2cJ=Re{^sY2&!=^iO)CHqGZq%d7`BWJ#7Ju$x*XU`1 z_i=pmx)xbLF%}P_BWx@IM(3WfRP5wh#!6vyC5~0X=$6NB!+0Q%b;8gv)(4{pWBpo8 zAvKK+!03$}6U_U<15OwZErCQB{ieWP7y~4b0b|e{IEbGPOCT4ULyiuS9%D7Kcim5y<&RNNLKbV5?M_@Ml_!BUD z#Vf07Jx2Gvsu8;#zczp_tCci!d=JC81TT_)OJ7H<^R4ifpq^T6mSw`ilRIqex zcDbemt&GU2V_=zN>O9y1=TsfoLF-f-SXT5@hvqs-6M_UR+Zjv-JLCvvgL&oPaj+a) zumUXC9K1l-VL5mOEFZyU%~ek2U<+6Qg0~4PB*AvViX6dCu;QHHQ?O&w^dYe0@^l_p z37Ia|Top87TGT65rmumWz_bsnj7$saCoz2wtX!Jzz~5)(X$|l5J=23)!YPVS0$7C< zN&-72hdf}X!$KKgXDp!{uu4nlC|DHr(K(@ZSbg@~C1!Y-O;vI(n~X7a%rq?x0HT_!Upz#45c<=E=9 z%$(O8XQ*XHNWbcwX$8BMIP(DPx^q_ecmo^4(Qq!!c)MA}20&B&r zpr?9fgEM}u|Q=Y?I}N%O+r2j=-|&3Tq$UKp&&^B2K--1CiK zy-D+rv2)nG5D(TDwvd9q4&u!r^Fq4jI!6yIWPv@jEeKEg%?r1|2FOAO*x>GkZmbI# zkFaO~dyGY)@`+}zp%IIAu&0TO!joT2i^X8i%!{Si$#X0UiO-`KFR8X#nz7hUvX-Jv zrlkr!)wxtjq@_kemYPWXQmbB*xAYiT*pK~hyec_gfVBZtu00EmY{H4Y7hH0In=Rn7 zrd*^6ZyLeFtZyEITTE}BgIn=d0$03mWtG&?rnd!}Qcs=lqQPy}cWK~u&%11Jhy7h0 zxHIZqi%PBz!oOeLb%}c3^^oNEF~IZy;@=nOo`m-oNZR{OvggAt-GdL=2)xNT171=RQ}dVa*r7lYVOePdNhaj=@g8o(E3NgnKlljVh}#;AzFH6fe85 z+KkXeX|)x6uXEL>T5i(x)jojlgLN%g;C_MWfd3Lw)^auF7L8pKT~4>J-N(|6#5K`| z4C@zBFVpqKt(w|Bc=fOlez!{6v#}_vi9QS%Fz7{Bl|Mq@8>Ux`|+@q$AFw7>C4I6kt^o9ex(7TZee#E)apegrh#KtY~qKu7xj5;lw z6#S@jGZVbnvUyY`9W|KBR2?1kz~)J^XS16qTXwNxbkD&pH%Z*8CD`g9t}QVumaS(b z>br%+eNQ0!zUK>nzTZ%-9qr)9#LdU`tKcO`;H6?hPUuI$%fw)uj0Z2*Y!7Ja50N=- z`_Te^#{A|N;KN^GfuPhQ2Wn*@M_1lcm`)(+ff)A06&+uoraMN ZWxHCHd+DL=OQIb$$lQ?y)&e^@{{yR6zuEu* literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e4167cb51f66c60ef7d9500b450303b5da175574 GIT binary patch literal 2398 zcmW+%X4)d#tmFZT%e3CqAV65xJ4VEnS`dH zL7+EQ*O3^3$f82sn)^Iqy?t_}J*`zImsoz3p0` zy|l8@v3sw>QE9Ke(tX)&Z@Sal=kDya*LQu@-E*_MN9}W8DKXb}blCqN-)rx2_qu!f z|99EscH2w#d|vN5biC;h2nIpOpu(y_p41TXQQ54v6J!szwG#WK!8X-8s5t+0hZO($ zz+kTYO|+EuO)`HR#>Q_Njyu22B+1`iFr|FkYf2fiwA+XBVr)ZoByOlliyd0PkQ@3b zai|SHHAq8U_%RKexlu#6p*NO#0li7^mO(!)c@IE8L%g+`#jBXSF6d`v?=k4-4Blqw z%?9rU=wAxnR_Nz5yl&0v^_YhZ&@ZG7+n`^>W;%}}aVdOB!8^{_tuf_R1*&}zMcSMb* zL+{)+nuo2u(r69zu8h$m(7VOatI%(Xqn*$-jP^nA!Dzo0Golzq2cY-HjdK2d(SAPN zEy6>+>9)I`SnL1m2J0X193?}1vjKQ^h7-*f13i6Q!NKQT@i z4cQYGmprkH$P*Q$V4_wf{=Z?hP!;`u1-05hZ6cvDouF}M(0DCw%ww6jPH2KKahuR2 z+r$IVl;}wwmujBO08LArECAhRn&dO23zJ7cGtwrHsp7a|nr!35GqHP8!FR4O&Y=ocE^)T?cgup$`0XR19f&UY;AettCt<2&aSA3E@o8Lt;1=^l((T z5cD%CTnc(b3LgZmCt(+8gE4%V(4#{57?xV3aHEzs=@G)b&oNWD1&b$za64XC2;nZ! zkbJ_T@7*F;%=6J7L<~gogzj5v==m44HJ8?T{t{badoI9A8K<{Fn z4|z|MLrUzt1@wN#Joo2o!#p?lfpNYDTlFq9BR4uc6XU`7c{)Z~bg{-hZ! z%Jk$Gm}GeJ5X^+90+<~4R8-0I&j<~u@e$AcrztMmvqWNgmQQk@l@L5@B<5#Lr2JV6 z$$Fkl(w-{9}^>Jc)-K&c8SHRMYVB2!Q(s{>>N0nfit^7y#=&)+~s5oEWCwbpjk^SGdlB73j zM0(?J$!`u2;f>3%`%S${KK=(=<*M=H3$W}1VD=8M93x@5n*4W9!J7fF{HmoKjCEn@ z62hm1rB<-*wk5YJ{j3x$^#N=LOv_mucXBKMe5Zlsy_)>9r((GbtiZB-0}B^2mT!X< znpTp*iegsms^uR_%8G+$?E+TnITk}+Im&T2QdiCr*Ge}(mtg-7`&`Z+IyCD)J;K{v zV0(nO4lsxGwj8W9>#Y-PulV*7SlRx!Zm@mwYL+VfqF|Ntczg@y)goYCMA2#m=Vga+ z^|B`a;>lTU!*mu|GlNwmu5lyxJJz_R2W)F+RPk3OcI^u9U5UcAeqh7~vYw+^e)Wj! zJm#Qny$GzTZ2cetMcdZ9!K&pA3)m;}MzSjWrW9}3d9D+&8^<-vZyw7=3s?;{xTZ?V zMi*FZ{5!t9pQgS`2XpOsSFV!Z73aGPn)!Fnr|K!Rk#P zVpQ^n;{1@Rng8$8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TX>Oq#ygOX=*YO&pO=jMENuV) literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d7af99b5e2ae9a21d534f1965c35a2b572143322 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVs4@9k;tm3#JJa=mvL_(C)3_w qCYHTnEP{KZ9Yqxr_vW_RGcZD-B!fJd#m3NRgheosQMHtD9}@un{3-|l literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78ms-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78ms-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..37077d01e26f9ee2427592f6deebb145d628e731 GIT binary patch literal 2651 zcmW+&>su379)3?IlVlPI_nQO=7v(Aj5fH&R7(l=(3boRT!dN4sTpU0UwHkd20)c>B zl5n?bS84?+7Zv6VTibnh{|&dhz3ubte%bx9{j_KMVV?IlGv{}E-`~tRn)fx1_UpYJ z%}rOjtT}~+w!QmpwnA&krS^+XYi)05m$S9gTG{q#d&l+m4yns|Dce}m(qjF6eW$g< z+3D=){{O>Tr_-9f?}JK5*~!{65ZnhL_eHfB%z{z!J&v^D)zC+!d8NaVwML)61g zL)3t&**cIMWF9CbAp^Cit)DM$7idCtX2BdE5^wI&L^3mynek^WK^AjaN>oayL>`K9 z3MU6XY#>S^b}mCn!Oj&Zd$4nrC~4SfAxb88t`Q|0JMB6phk4w^J5ClJx;W(^c6yA; zVf5WXUoZNJPN_gYh*B*F4=iH93FS0D(1dTR^aE|!iNRKqZr~=Anw&vEspST9p?s(x zJP73s87z@agQ8*30p%lM@C1~zn!!3Kb(+C?D4%eHjZn^62Ay)?pvyRI+UAQPZr(=a-RKi;INDH zN1UAB{Ym1ze#9>dHgPDRKNsV7j2xdfX0MRq=D`-Ot2nexrqu; zOU%Rxi60XU6YS%mao9T{GmHm6X_d`mF3<%1WGbjNV$ueh7(aOoG%0Da2{c)lG7*}> zPel>Bhnq@}O^-x=Dj75l8*M>TnV{(*Q^lYeWU3l8(>zrJnk9!kav7#Bg6_3VwSZ=u zz44&?0=?OwHr{&}G{@*=Z0*;2PZ65Sd(VRA!Fxd##zo%S0Gbc)WkL&xx0%qwKridN zDA9XIju>|Z`BJp~pG@2`o40 z{WWsTgp2dDJSPnP1}vT8{LOfg&-vRxPbT?0L8~>>QJ|-Sr(+2{t)0#$w3eIB13kk{ zA0qT4GA)AE8K)iCY}HR!OZrJsKYf$x$ZQE{OWyL9sj*vZ1xOZj z@z$-KzYN+#=Gjc#jF@l78Y8C{3wqF7SYS=wmIa>}ykG*oV_9JOe5P4o;@;IR9KrSh z?LwJk^0^EPRm8sVA=$eauF))(mYNqU2)9^A$l`etv)Gt*VDT0(pNiDSHi`JpV5LXW z`36Dn9f68$qLOl`To6>P9x5*j(_-x7I;c9s;~P-*n#cE`8t?@NRS5Zlm&nWy@Ug9C z+I8oPD2Mq;I59j)AxTfN37*st#WuEQrKD3nS;A z*&OyS14!bR$H~WEwmIy7sE~x2YN$p5swo+2U?5a;KGdN5F;Ii|Kn<}#4ShhMhReoz z7t{#ja|6^!|G zF)ld>mY81tE8v$-lcuFQhy5#&O-m-ENYPw-H5^6@!s#P-mO^jN#F|SNuwUS{L zgw^8=_ab`rBjQ+XXLdFUzB%Bqf72od{@umB%7nU)du4-a)4$4tniK!Z4s}2O>H^f< zf>%zc2ZXhFN&lmWHCD%?8!)bA01G@a*78|hR%q8Q%EFJX#I+{O#FKR+)co*uCS-wa zok@DoynaUFe-eY&FR|Q(NMG*;hRq-wiL&V@7r(*Q95QcYKrPDMIE1N;T^sFCi-k=S z)WgDNq{RI!W^G!TuN}dgCuP&mF4JZM)FaqroQhGKZBR=>U$fyo8vQyJs$_%p#y8C4nD)&zs1>nqWO#C*RvO+0N#s}2{x(`R{_4tjdlqU{;1-+o z<3U@Y7+@NGkg}D6p>$!ZN+SRIFZ$Xg^3M&7R!Zi7i2JsfBI*eQZu7*l9medF&~E2| zd|TfaYk!wYa^GDh$G+R;uzz=vw0xha5&mc)nw>IP_)TP{phU5F>>kQdD2Lc#h@F0t c-la;q-(1!2s=%@!^LOuZa_4*AVfvHif0(Q+AOHXW literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78ms-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/78ms-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..acf23231aea22e1a95761f7eafd35f1d42ea6b84 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZElfUtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6ERIW@ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/83pv-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/83pv-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2359bc529d160857cce4c1d1bfca1322290205c1 GIT binary patch literal 905 zcmaiy;cpXl7{{OI+O^wmYtyl`HDmR3WD>!x+fX(zk2fF27#QYSGOjrry9(r-~(pVo1{Nw?mtLYJ4UUE`k0lkkCo*kO1UE(D(}Ha zIX$MVRMvM&ErC!&C=p47ic-|WsE3L1&Ed_Vp)Ij3En2goQt2?lasb+wwgN2;Lt;6| zwA_i2WgTGY5s;UQrFk$;02m7ZCI-O-t-D+~RMwf^W)!C+rc;Y3P7~9a-6+nSV0x#B z;@u~h&i0`=n`3$}i{kw*rgPg+oO_k&gBcVbb~2ssKyiMW>7z*$A19bDw4u20BGV`1 zC_arcUEGA?Vv6arQ52ttm@dgEF74;u%JB9>6;J2#3n;#bF|D?uSWPosc^1W&VWz81 zD6Sr0`f4AFuf2cP{3zC#>6(h-+M*UPR}ZZ3Otn{i7_C0k7_RpF0@Zzp)zK+0oTa^* zw4u^B0>!txwbtKNy55iCdXee70*deZm~JFd+{iNhFpJ{HZA>?}qPRK3^iu}K&mBy+ z6co26nSPl-@oO8??Kq0t<4kv+!-v;5Y52z#{B2@hzN>;4wmsUkBG4YIH)P39qY?Al z&-;u-#D2+V?9k-9C&B0ku;<`WW7q$+Vyxj_#Xjl|yL;UscaO{N)9#?F&dc}K;$|A` ze8QXqy8u=**sp^X2K#uO6#={Gx8h?Bj%vT*Jnrmp`kY>;$4NTfPM79$M&eedr~f9j zS?YYFb5gPx0b5+mtNTAx&)Lh;5 ZujiWNPKIm#2-aGseD|Rg2PkC##Gk&38VCRY literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90ms-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90ms-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..af8293829c90ce63cc4c5eda0318003785ffcba1 GIT binary patch literal 721 zcmW-eTTc^l5XJwq#gw8#R@%k}Gf`{k zMMO~)MNz7F#ryrXv0C+m@CEc;pImvE1P@4ZMh0a$e!5_#hJh!c`*BVy;Neh zTkWo5mpv{y40IUiYAY)$v->KYl_e^qm8H6=e}1|X^yMOVNa&R!*CX^Qk?RA!TI52Y zyG8CW=pK;^oAnw)aZ=<>{nqqplU^rs@wxhDkvt)i10n@xy-}nD=&hzZk)D1k^M|e31e5HzTtO9tf zi|}eE@HH3Vcq#Dse!}Z*z&9L(6AOSR{De1Kfp6IfCvCu!&9pYVV^v4ixO00S@Es@N z)I#8?0O8%;!1sy>@6Q9izmxDmBk)5D;iCfJN2E$w1*a9@=~D-cn9ek)@cWNQhE@3W zR*W>Mt{DX%Gw_p*giq^$pT-HF#ekpJ629;PzX%h)3<1A#6TYqnejOxy(+&K#g7BRT z{H~MmeLL`nQo@gmfIqeoe%cG=pBD)D)}AcI{0gYeAA%j u^{--}Rd*VGj9%#5gucOu!1#H2euZlOd%88>EDV>zJ*#d2{xOGaKc#=yUE^>7 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90ms-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90ms-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..780549de19de05b6cbea4ccd4737351bc9ff6104 GIT binary patch literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZE28OtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6C)7)p literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90msp-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90msp-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bfd3119c62d9976dde9b1e59c572c678cf5811a0 GIT binary patch literal 715 zcmW-eTTc^l5XJw~VoNEO2&Pqmx?BQ85Gy1Kg5&B40vb?if-xX2vLIS5w2cHZ5is;3 zUQoQDs8tjNMNzzg8>r(=1dvVfUk4O5y@0Wb4U-e!1H*~A2RJ`p_EmhUK zs|1K40Wc(gs}%5L55S7NSSf+n3@1T40ZQtSjKh6U6fCovgKDBFc+P4I2F&J=F+qf^ zjh0Zdd1J_~mn)$$R9BDTOt6QW6CGiHq9bDMk|H@Nw#a^17jYkvhNEA18d6O*i_N*t zY3nuEb+qf~Y|2Q9qDB-#>D2`>}yh(Xyh zBIC#a@D(JyS^<2upYU2Q@bw*pqou&3KEfMb;G4ySV}-zDX9#a~0^iOfypscbr;YG# zEATxh;dnam_;JGfO~4QAgcE7N6ODuq8-O3#2p?O4AJ`z>C7g2s&v^;od4S&+63!O@&vz1jXb1k7L-e=3qL;^Px1}0SA^g5iYfXXF1DY`JMrWSXGZ@Ro2m> pIdngIFSLC^+oeaK|2#XMub5T`8{&0BcPR@0tE+*R*O2w6;V*K+;HLlp literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90msp-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90msp-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..25ef14ab4af42f4b70ccac76cddac8f3b22d8813 GIT binary patch literal 291 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TV`-3ET%a4|9qgs+k;vS*f}u5; zfuS{tfw46qk*(2@aj!owG3?DvWNLI~IN-y;a3IK0v~kS= zzs90gM@9w+lw^69KH^V^*#(jJY2W1%d Q2{Ig%O=N6uVB9AH0G^~w2LJ#7 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90pv-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/90pv-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..02f713bb838a8cd46f5b262c934d0edc8c6e8fe9 GIT binary patch literal 982 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a3065e441a0e1f1a65e9109ec9bc4f826fccac24 GIT binary patch literal 2413 zcmW+&Yg<#t7JgTDc9NYyAOwPxTexVs69h$s#!VxNsHort6_ss`c;R9I;draTQz>^5 zB-}yKw$@sywYJqgd*Ivo8$RvnH=n29&!;oze3<>NJu~k+Yt~xN%$Pnj1Uj$X=(^l` zsmEJVQQ<4x>ho22t1on(4|*GKboT_?yS@85zUb__*4d@?1TPfXtJ~VV|DWIO?Fx1W zyL$iE*%%CZi;55I3)Iv%)_~9tqJGt=0zKYE^g(@B;gL7U}%yTf_E$7&sr%ouPqC<9T}qydj;K6ArB9ZcM_-~V+gdA@G8C4Sv)OB{4u z_6}ynI0tu=Yq0T%_p6on<)%1`Q*oxb(wu!Jk1##LOgoVhlj5w&PRx$0HVv)}2JzSN zQ1svv=U^*%l69~TdPB(&pf}P`DflNC+7A7wb!Z3lV>DD9iXKvJLjmZ=twRUFlQDE0 z`U%re6L^Ygs2TbxX{ZJI>6D?Mm>RYZo1ix*4LhNq!Ei40vt`5i(9g-k8hEN}_!9IM zY50~V4XYTwD^@*^su2oB4~Oj|e&`o0BX!V&@<;>pi`gS5p|>g{ccEYMjM|}J-ZYx2 z$s?*VS}B-U;2zy0@G84aeD1G1$MURD}9&~}3tu@a#Q3Iv5M$O zJ6L5#P#irE@kEvn2MPoShY0M3Kl4uX$!?oshCX$ z+bzweg4M{gnP7V?v$%d<}SB-25@H^Xc=K z!7kVq?4jss6$@@+LHmM`Xr%?Qp-Z%|8SJvMAbh_PwNMInHFlvoUaZsPh-zItBz)_Fcdl88sIc}ZlZkCxiN{^3~?b$kQMRV{XI5?o@L1T7Pm%NSb#gtCY1@-Ts(Dhc*=LS`-4+SEBY}OH z0Cu;74B7)jih*Ia!jSJtFf8In(WIIGfEV5qnJel6FAgd5s&h3ShTXQB4Z{(&S_JNk zU#)@>jnxJ*9Ja4E!f=9@l&!YFhymZa`Dr3}sq3j_@0!2!dQ2P3h+07jA+PS(r|v*2atiEq1C2VUOq z1K$x+R>JuHE_lWM7lN8+}oo?e^C7|Zd2S3l@#;CAu9i& zh0+CEa& z_S2@dK8#}NwGW2R`g$9T zlFhIEFiK-z2f=swUiWFz$GsQ;aQ~)gH?)+$RR7O8l=^ckee%X)^1aC-=bK}J*f$rb z;7u>dzhu$5U-Bsats_wI)=RN(>uJl|a}@WhmDFF81O8u|ss6WQD){Ycp#1kuB>#Sd z@_s)-(eEUReHTZ?@3I5M?~au$E;rrIsR73IE0M@*l19U hBiJ~FjYe!VVdI#~IGtd0&_=Ch`g=^e-y*oZ{{`ID*(m@3 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-RKSJ-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..040014cfc0880371c20a89212942727c5dc30a78 GIT binary patch literal 287 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<(QJ98{{4ArR$N%-RQ`;*Pnsm zfDaG{aWn1>~Fdm56S{nsR6Mn5Gw+)3Jb$Qmev}EgS-IcxJ}{! literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Add-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2f816d320f08b8671498299c4d00e4564d2ece6c GIT binary patch literal 282 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>X?$E>ygNGht``8&6_OUQ99OMMjtU#KJf$^YlAa{AfKF&6QHh#7?i8gWe mHX)Wa;Wmy$_VR4TgR($XYCxDx8|p%l=LmHM8lDo74dk4_$_P(g(w!-Hg>R!685l< z1014^3aY5#2*)_VDe5@GIWEvZ6D?e#jSjAGjT_wJ4)^Hd0grgXGhWccE8ft@07Hy0 T#ycjM;sc-f!Z&`z(oFmT7oB|o literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-1.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..03a501477c91d8156723f0c274a37d397ed65bad GIT binary patch literal 371 zcmW;IQAa~@7{~FmUG^&eZ(!@RyK_0)E=Ic8c?GTgwb(lAe~#GII?0+zl4K@HGLs}p zW|AaHlF3YxOp+u?l9{CMiRbhDcsy4>e>V}aa(Oi|o_55LVd#O7t{WnpvXWAmdE1d$ zTf`^FES0m=s3TLsfp8`x{{L;Eq%GC7cQmCG!NK8pBsOBkd_GNc=L=I&qQJ~z4n>qu z#sU_xgk`K?6%|ymhIMRU6I-aEj&1B<7kk*p0S?hX6Gu442~Kf_b6nsOSGYzCH)x}S qTioFu59s0%Pk6=)Uh#%^eBcvb_(l(X{NNYvjJLc7T(1JRsQm#8LY3P9 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-2.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2aa95141f9f5802818e34b0aa626e34e7cfee805 GIT binary patch literal 376 zcmW;I(MLmJ7{~FmF8eFqf1vHu-MQP$xfto9^A}WmtyrDyJxAWRfH^ z$xM>WB$*^hCP|WHk|gPS;`uy39?#XUt34QZGdVSu8udl5WtlyFrfG>-(jAt<$$7pU z_e5f1#8nwr4f!$|?vAC?;{V?hN_tXF21iFq5svgH;`V@JheC#-XY*N`$TL%z#te#> z!#ozSh$SqegcYn}4eQvzCbqDRGIp?wJ?!HE6;yGEBh*mGF-~xbGc?e|IWBOC7OrrO s8{Fa!_h{n*k9fi}Uhs-HyrY8;eBuk=_`xr9Ay`2JI;cR?K~xuwKLRC}r~m)} literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-3.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-3.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..86d8b8c79cfa3907281aa3f25a46f178b87aedfa GIT binary patch literal 401 zcmW;IK`TU26u|K}mcGN({Q|~g_m$`K@18oH)xWONo(l2>)7#w>sV2{J8=76$Q^{=5sg+*{Bi$FO zOn+Bk@`34ybT(0+%;nVoeW;8MwHdTaUu%_UY|W(7ZGJiya~zo}4zw_eykU%>gi(xP z921yC8Pk}-Eaote1uS9-%UHoG*07EZY+?)B*ugILu#W>A;t0n$!70vgjtgAk3fH*7 zE$(oS2UPHgDr$JbGhXnDH@xEmpZLNze((z!vY#y=Hi6g%Vk3yHAU1>84nl~yl$}3x CU7_Cq literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-4.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-4.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f50fc6c14e67a228c4ba9a61b1357c16410e8228 GIT binary patch literal 405 zcmW;IK`TU26u|K}mexMN{Q|~g_m#NRlK?k|s%# zBuSDaNs^>Vk|arzB>7);fA`estp0Vij%1K8n7*FgNHu$&+t}i|o=RkbF0K4R80r2{ zrE}eZ$p@x0(wTUDBAZqJ_n|U6)Mn5weXUizsV$vMwfm`9%yDG8IMB){@`f>jQH)_6 z6PUylN+@FnvzWs?7O;pVETe)ItYQsStYZV4*upk;u!}wH;{b;^!ZA*8iZh(!0++bL zHEwW=JJfKG2Rz~l&v?Nr-tdkOeBuk=_`xq^$bPnf*aTu5h>ak&g4hgVJBSS-C8t5k F&L0K8qip~H literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-5.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6caf4a83146a60a2db652647b9cfed5fb71bd97c GIT binary patch literal 406 zcmW;IK`TU26u|K}mNve^{Q|~g_mN!#-X5)|zBpQ#PGx_A`luPwPmMBxy;KBx#c*Ns=T< zk|arzv`LaANs=W0qwepXI-RF~O|>;06pCSYXIE?*JkPCbbY0J+azVQ_eldz|Ph_&a z9YI(K!nWAvlC`OP-u&N3CbW?a`*rDCYm)WN*>tAG&m-sM?B#fFL=cp-tmD?eBm2E_=ODUrv*e4h&B+7AX-5*gJ=iQ5JCxG%FZ9F CgrqG1 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-UCS2.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-CNS1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..69d79a2c2c2b00207ab27b68ebf4404aa17c6f2c GIT binary patch literal 41193 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 R!5J=ag&W-A0Z)>CkuT=vPT>Fm literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-1.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..707bb1065c76d69551c287141cb258519132ef8e GIT binary patch literal 250 zcmW;C!HPjq0LJmd(o>ur8(emGDOo64xKA)R4P{);y(uf1rfHfqO`0Z2k|asfBuSDa zNgD6qQRYv5zs=X*d(Fh{N?jKp3$BcqrV)%9hACrtJFBEscU<-4$YeQZ>x!)(T$K;` zVx^M2_m0%cQMz_JEu~~AoJz(MX)EFJ2ytmt{X#Sw>=`e3#T(wy!UsOl#uvWPK^Hyr kF~ATbj4{C!GyLEeb1bmL3Ttez#SVKMaKs5`(G2{Fe=CDsrT_o{ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-2.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f7648cc3ff02c44e9594ccbd71deec742e253c2f GIT binary patch literal 465 zcmW;IK`TU26u|K}mOjP(0>)!E%W0a$lq|f3HRgsI^TvBGHLGzXNs=TL-VlZ{f>DfN z921zt6s9qQS&{5KST4 dLNtbG4bdE;Jw$_u77-d=%W0a$lq7Fsi@BkOH{N@xS&bt}k|arzBx%w#BuSDa zNs=TU}~*Hl|me!dX&bah9j!F3aLjfsS7l3BmQ8m|yWwl_4H zzD_^L`$2nTv+>$wE@%GlLlfB01_QeEtTplarc5f`?4@Hd$C0&Se;cF78^SO~Fp4pZ zV*-4l~8|5gz6Tq;Wr6vm{3v&eie4&Qnn@L%5OOhl>k|arzBuSDaNs=T< zlB5Yqk|arzT(^3E?^93D>MAPKr?QAtrsV)XL*F@Qk~ zVHhJA#Tdphfk{kZ8Z(&19OkirMJ!<%D_F%E*0F(2Y+)Na*u@_9aezY{;TR`4#Tm|V zflFNB8aKE_0e5)7BcAY#7rf#P@A$wczVMA7{6c;HTtH4BH;^O9732(Z2RVdXLQWyK zkYmU-4m-=_tMvz_6R8WHFJ2IRbyaP#C_M$ZFh@BuSDaNs=TCWD$wYeo5lqC}J;_`Sr5mYp#8^R#fo5_alnIPHG zn2tKrQGGUSDk-XHYYYDGGeHz)!l>KJR2T*&r8UXQs@halK|w60mt0p5BggB<00uFH zVT@oDV;IK-CNYI+%wQICn8yMZv4mx;U=?dv#|AdBg>CF$7kk*p0S|+(wQg*OBwcedIuLAvuxUNRA{|k~7Jj ijwRQUbIHBrU~(}zncPf{rl(l7o@0OOeg}^L literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-UCS2.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-GB1-UCS2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7586525936cc5398b86d3752a4eb45b15825b25c GIT binary patch literal 33974 zcmbSyg#^~;Dq`SLCNL%sw+i2N{zNG!^ z$?Yk$5++TC7EIHnbl@j zL>j^%M!o;^j0oPervI<+6Q?2wVGh2R4+reFD~3GkG$FYsWlU|O`ryo7Cx}AGcZY)y zxsPa^R$VF>bccxgAnSh6i^M5Kw40o9+-AI+wOSW<^;T!D3K)+#RruRmSh72~5X)V# z-T|%ochcM4uxZZv7+gyHqKeh!_-lLDY)7n!H8Eo%`FO!4GknRxko>LUi&DGoCuy}s zfAX&z;xJptdPg7;|?<=Zs- znM9ir8jGLO2K){r-Ozd>nt4A?g zlM(Vbk|{oJLa=XV{LRK8tzHA77?akx>58?KiL!3{8tsAHL;kyru_^u}qty~6qGoG) zWXmSP3#+77PeXmua`g*Ic&)V06D^fD7WKFdv4ydxV^_L|0EtGDStAtM!rM) zw#F6Kfq-AL>LhWDj{$=xvV_GEMI6d}Gy~g$_r#&qw%QZfXF_Z2urmU;TqlcaopB}x zha?9LCiBL;rmQbUU`nrDeOKPU0jQbTA&yOk|IWQpw$vFXTp`M=VVz4RI@NGW_m#p% zSIPaRCj^8O&bWTne-wsl#y!PTPE8W;)v-Sp0~Cy;)&;z&JS>mnG1%yEKpy*i`p3d?YxKWwJqxHWdtrs5x!9#vjH{k`K)eT>ep )hMjqg! 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 U103N5XSl!>Zg7VOJW1|FzIH}ZoB#j- literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-1.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..dad42c5ad7dad57954fc9a051ee7e222e83bee45 GIT binary patch literal 226 zcmW;C(F(y(0LJk%m!9Idac9QeF4x+{N-pdPuoG%*&RJ?#Ymy{Mk|arzBuSDai8t{m zKI;43eEnmeg6?_&uT`o(&8Vu9$|{OVHQOyQY6Ze)bwSNW+2x+gi$1gExaK(Y-wVo_ zV7&D^Eyk#v&Y8NAw+u-lghV0Mh7NS02Ynd85JoVD2~1%Ib6CI`GD7x@CoEK=wI literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-2.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..090819a064533f20aa68f562275556397683ae81 GIT binary patch literal 233 zcmW;C!HPjq0LJmd(q>-alr^r|-KAuqWZ^!6;WQL3=iZc+NRl*3(xgd}BuSbiNs@RE zkK#{#zs=X*`$$FYa!u#IbFK`VrV;ow3{yt3_Lq`Y&2d%Hk?~T-)@56#U6l>`B87r{ z_m0%cQM&p%Eu~~Il!!-TNh{{@2yw4h{6aM9tce!d=%9-pe$dANLyYi?G5#>Y6f?}R Zz!EF0vB4Jq*kO+YjyU0r3$EhhCY~ULRonmo literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-3.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-3.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..087dfc155860e65d2dc828dd432ffe88239fde23 GIT binary patch literal 242 zcmW;C!Ab&A0EOW@?&>M-#%1H=ZkB`0VnAFpPf*Pzg~>bJ83I>gL_|b{h=@pth)9G) zNJNB)MCe=iDE;OXBS?d4* literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-4.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-4.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46aa9bffe576e9a8b714646aed7f9e1a4e99dfe2 GIT binary patch literal 337 zcmW;CQAa~z0LJlmyWFREzd-BM-MQ#uW*1|2(fI_`UM;qr?LEiX)ig;aNs=U)B$;HA zWRlEGW+pQ;NhZlmk|cH4fARco9)Is(HfX1FdTBB4$|=({CZ-L;l!2H%ucVc8T$OZW zIJIEww5{h{74!Q7iG=*`9jTS0bas4NN=g4@BpeJyt&qnf#BV+`BgAr^6|jO;tf7c? zY+w^x*v1Zav4?#epoBvl;TR_<;}mD8;2amY#1*Qz#tm*!Lmds=p@|mSxJL(F^w7rx a9`S?$p7DZL3^BqR-tmD?eBoPIKjIHvDu)yR literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-5.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Japan1-5.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..5b4b65cc6292a5ba7d89e976565bf08814bb88b6 GIT binary patch literal 430 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 BxW^%pYjuN-9#jwV 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-0.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-0.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..cef1a9985191f53c4a8a35811d1caeecdd1a1820 GIT binary patch literal 241 zcmW;CK}*750LJlm9s3mT#ba}M+i{E?2I0Ydf^;t$thU~bV5eb3M1+Wlh=_;<6+}yI|M2!7c7^j|X(nMGt)pFvJLB jOfba^k9fi}Uhs-HyyF9NeBuk=Sl|as{9=Vak*&o)>2O)q literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-1.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-1.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..11ffa36df8404ab970df2a24b2d80b1dc6348436 GIT binary patch literal 386 zcmW;IVMjwz7{KwnUhY$zFR*p%-F-PT8QF{OC#ZI;vURs}uh^?~l4MqrBuSDalO#zd zNs=Ts!7SO2zVPu$BF)nH~I5FL(VM>=iW5wWz_Cxu(|1DW$h za=719c~A8QG93-avRUze?+Yb;sYcAwl~P38yOZ%m%1wkqmZhgkg)T;kH->RcU=n3i zFpU|^Vh;0Iz#^8gj1{b64eQuI6`RR!J?x`~103QA$2h?$&Tx(kT;dAXxWO&% wP)7szXyO5nc)~MUc)=^)@Qx3B;tSvS!7ucv`Ah+A5@^#vn+Tc;L%L%90TF_m@Bjb+ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-2.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Adobe-Korea1-2.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3172308c79d57147cdbe05930228043faa48ca54 GIT binary patch literal 391 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 f42+FTOpJ|eK+FZid_XJ }}!1;lb046pnFxKb%J literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5pc-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5pc-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ce0013167f852a873b639e301088c094d468a750 GIT binary patch literal 1099 zcmW-g`%~0q6vodN6a}qhlS>5pun5Mq5J!##vdM@Bf}@NT7m;gd^fxrqTR%L%JoC!)l4};NoKa|MO+K-CAa~m;Yy` zTdjJ8G1Z)yv?e_XG;o5ZH6}Pa2(*7(bPX13xi0#9ng;QCPDf*cZvnXeZG=E4V1^R` zoRvxy;O4Ai+72k&S1{ECpkGb4=2BAudTmq=)uyA=8JOxyQ9dy;?RWuYM=I0Kr6@a# zm_A*FvdfKWmj&gsAg0|K%I*ZFJ®2-Ds;%-*{dpuU>v^DLBo-c0)(C|^V~)q7$@ z{aT1<0Hy{bN<#_Lm#HZG=P~UsLiy@7rUPy$2a=c$2B93xXF8OCa!B3vwV)jKXF9wU zz5g(KznM_BQqZ}<``gR@4u?0-WN-(%F9AX;RGaa9ga(p$@iBOaih3t7U8K5x( z!cJ~LIW>#vR6fe-K&I2xDBlrNlRvsQZG!Zs_nFSbV(6JFfF>(MH3zZYoCyKVmFUyr z4bWm#ih#tHNcL)R05n%X$XO4Rvr$av7NDFerWB1l#fLaIWt>s{7^F{x*Fn~56 z2yaUP&$bGt^X|C*e2VhQ!L5A}Q~MH>b_>(@D^V_JOc!!cE-L@xHk2RYm@d77a%lro zM+{2GM@&B|SeF&7%L>*{3f2_`>xzPPRl&NdVEwFMT~n~GS#W7*5I}bZEbB~TQ!#G>3#<@hBFz@ zM%>t20?@00cFW9kYcD~&Idml6XmW^`%Ri^t@ zD8IkS^uQbCftv9!8s(v#>5sK2k6vPWv<0=k*I`qik>BW_2Xp&XCjAQLV+HeZA^Qy^ zL(o7zrVY9Q^hLn@K~;vq0(@&o6}_Kf@lX!aP&LjSCde30VR{mP<|o+zV++AB63jGW zLK&%Kucw&+!>b_VX)%V5E(93JgQ!tr9Q_dHjClb}%IsOxnO}JO%^D zQz35L#>*$dzIW`GnjFD7QmDR{H8-t vrdKjO(@~zOJ)g&;Jm1DKe{F<0GX}&NKY$rerFbPXc+3#E&b*VWK6&oH7Gi0w literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5pc-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/B5pc-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..73b99ff2fbca40e7ca5501f61e3f2f29c1fc1af6 GIT binary patch literal 144 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=44ustm~1;v(TI2l^-9&YkfwB h*M71;l(nECj@2Kr98sav2P-`~e{wDhU7p literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..61d1d0cb001dd484630e52eb7e47eaabbdee62cd GIT binary patch literal 1780 zcmeIy+gDU&9LDkA-kV{N7%VIoIuhGKu~2XrO+`8pQjuoF2qrneFl_OF49p-n=(4rp z-2+WBSyWb*wJk$C%#4~H6s;_^QahLCDe_RpU(xgP!rQ!QtuDIxto6R@z54FG9(lO3 z)ZZEktY})^t`-&*IrCjkXOUXc=x@+ecPQAdtq!W?Ek1vs)gSP-YmEh|CC$z1)%QU) zpar!+2Vc51O)Z$dpuDtfp}UME(n(RGrfKT?Jl%&K*Oa8ISE@wWBNg?MT02tVv+_HS zPj`6q65WyCovl}Tx*ygZ^LwUBa!;r3%Pa+^P)YbG<|i>x5{)Dr6l*1sLt+_;5XII=qKm{NMXV<=Sutdab&!!vB3Cj} zBqL20Q)DAu5_uHsRE!ETsz^*zjA|13$wm#uQx(HY@w6mEqqt2mR#Lb+XpfpZOiOq% zg=;C?Ac+EN*hg`f9A2gLc2FWi?(ItI-H_5}p~M(UWGa25DKX9xNuga$)<`-DCq?XX zL{<97k|`G=D!S4IO9+lYu-d_s#&IKQ2G9BQSW&+^53h;da_#us134VMK{FDoRPGTCsFZY6z zw=(O&sT%O>9B_Ip(+BSGeC5?)Mk^<&5Nct^c?LZLa_74z$_-g%xPCUH1lfi~k>h>l%Q+0o(|0 ALjV8( literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1a393a51e079d1b5e7898423463fac5e87170da2 GIT binary patch literal 1920 zcmeIy`%_eP7{~GFoWo_^SS+j^bOnx!Vxi!&+J)#M5fy1jtYA?KEX#@)WZ7K=7a5uZ z-?Pvrt3_pHS%)&T%d&RQ=w_*1?0&x)S(fcz(dXG8`k9%gnSN;Inb*wu&hyjz%sk3W zeU-mE9NgTosYfjDp%s%u@69_ddT88nTiQ(_(^a+T4!l$f6$HPPXY%xE?V2SsgiR8_{TB+8Vr z0`s0Cd3<}w5;G1NG`*6>chK}IX*`_1*CX$%pyRD{GDqIOQ<@+;Fh`nn(kY8q!}d`_ z70%%nw{U58w_XM!bD3>mWDOX-2;7;;ptL($1@2nJ+yQpE!B_=|&1d?+?gp@DCAj-M z#t-hnzj2Q*1NY8hI>3F^;Qm6eS7KVg16P6vZA=(Ev;pk97(6_W34lk|f&C@m(Q}y1 z;IZq0u>?#gj0Ze^HFzSA*$EEZ3ZA?aOkTi*z`>irp%vgM3$qnGT?3w33Z6}8yqdi@ zUO9B4!5#0!_tcFbaUnRI!L)UUWP%#P@7xMc6WB24|Xx8 zY35Ho20e9rXrB%2sdE||WmzF8D zqL^bn7bOfE!Cp|rMG$>}M-|Zz=*<^{kS$U~2(ra_!hozx5jVl=kGhX&4r>6cYhaBq zY<5~<$ojc8p`_*^SH@F|d8s=ED-Ot&L#{$uDTQ36BV7PL#+>OAKp&*tJgq9L2LW4^ z)#{?PI-Z$}x*9atYlF-!*gM8D3CBi=Z+5`1VfbCfx0cv8z)m6C^}`=msN=MzqCYvL zV~{Eot%Ox7nIcj>#7YBk&nYp8bSH6NliVd9=)`IV@vu^|Ks@Rr*4l{2`y~-#ohH#U zO~jKz$r$mpi+EN;Y%s|X@%$w5!YxS8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=Ij@2sOyo)qo~91%8!qshLNF; gfw7T^iLsFlh`E564~T_;SPY1zfLN|EgW;7w0IZHEdH?_b literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c89b3527fe57ad3b32061f36b73c756ead3fb071 GIT binary patch literal 504 zcmW;IX)8ow0L5`6Ns=T<(sPF-F)m3)lCgy(%}A1wWv;C;ce;0)jHG-a`#Sc0-}im& z!>4eLH@_FB^Xebsx0I?buh!Gm?H1W4lbo3&%O+vAtL=)gdUdzbr;93QhpM?$twYNk~HkIwOJ&|HsTmI*hZ_tSQ;1)BX%%R z0wx6+0#nUkx&X|?6AzfJ2Xi@KKAJdzuLdlngT-*t36{#hvH`3FkruF82-XrvKUi-7 z8@XUJhPc31E!fTgI}xNC>{fui6tEvcTERgPI7}o1;HVKC=Yf-0qJh&oaApMOk)#(~ zRD#P?a1~10!F4gXNg{*bwh7$jgZnt*1`ihSD1)ac!hX-}_riXD_VcsfEBn2%-y8eA dv)>2%eX`#t`+c$BH~R(HFTj33=$HJP{s+tZ#wGv& literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-V.bcmap new file mode 100644 index 0000000000..7588cec83e --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/CNS2-V.bcmap @@ -0,0 +1,3 @@ +àRCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSEáCNS2-H \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETHK-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETHK-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..cb29415de4f5a669c1b47e34ab889b5fdee6e428 GIT binary patch literal 4426 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 VUn5lgC0;DLe}&hDRI?#j{~y^L&k+Cs literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETHK-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETHK-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f09aec6318dbec88491e3e488526882eaa930f37 GIT binary patch literal 158 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^EnUt?Oi}>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q09TwZ8~^|S literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETen-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETen-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c2d77462d298cdb261f5e2eed5218fcba35cbe4e GIT binary patch literal 1125 zcmW-g`&ZOe6vfY1bQH7_;w1qNhb4%_41%&6h$BY=Az6ZfV9H5>nS>Pr!NhA>tPy-< zY6h8_Y2qsc1xeEk6EqM_%``zCBG1qU{U5sZ!~SKjv(CMDfA*a=@?LCVQAKgyrd+Fj zvB?w~5*8Y2(zCfR+oDgcD6v{Lm*^77PG;L^Yiup&zI(^f#)x{RsX2feB@wQ1F5HlUhRlx;3d+lo-O8<}>zg0drtY3Cx8oq0^3uRz(Q zW7=g#`NE%Rw}!GihG~y4${u0b8-!!;IuV3&BA1;{#sk!+LGa17D5s_~ zoytZz?ZQJ6V>x;>xdSvAl?)Ku z6v}Q*R)EGb2t4bAayE?V++37%$xO{5=u=$@o;CA8Hx&-h;tIY~kxWzXqrC8BdQpmD zFPG*!Hs=G>SV7-h3N9_4=-m>mW<4OJB>|jU%9zeO;+pdb$}0t3t1naQ0+d!W(~rwh zE@(^_HlSQo{>3dQKSeQJnul^}Ez{))l*^wm{j7LiQ9Q3Gp1&xbZHi}`;(1l^ysCKq zs(4;gJg=E?QM*4tXBsSSPi9kx2GC^!hmI(e4poxtJ}B2SnQla)+)(BDEd!%FRTk~5 zz_(Ln-D$-cUEz??rQUec1?A>yrfwsy>n;H3)i~KTFsEPjr9TJX9#9{lmtp?E2Bv{3 zoHa<0HkiQl#0L|fWCD!1g3C|<(~t>esGQxNrUMMFfWW8u7&Pn((3b^a!^AlJG0Yrs z0~p%~E+Z_$7eu=kfZbUs SS}75n>;w+>cVXen+8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^B!nr|V>@>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q0BE@{TmS$7 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-H.bcmap new file mode 100644 index 0000000000..a7d69db5e3 --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-H.bcmap @@ -0,0 +1,3 @@ +àRCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSEá ETen-B5-H` ^ \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/ETenms-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..adc5d618d6912cb3a67e4745b63764120f93d17f GIT binary patch literal 172 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?HZDrms_msWUA}o$hOe?l^;Xn zWoOQ25yqxk#>Oidj7*6<3u74@nV1+G*?^b}i1~n62#CdiSPF>cfS5@MD9-?tKV{GO GP7na4qA}0_ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e92ea5b3b99b1f20d31c9760481de0472e72685b GIT binary patch literal 578 zcmW;HX-^Yj6b0a!LR#wJkfLdA#QItYF__k&#-$pgwHAR0XbY(^j9ToQiYX4xOdvHz z^BOzU4fhQfs9HsF!Cm{wpW;vPT)#Xy_vC!JuD|J|F9gk~~n5M;9B5#aw zmMK{_pRicpnUjV&X_z^i=c6kU#UlH^x0uN-Zcb5|;haS`AM8t}1~Vy1mV_j`W*7F< z5~8j%Sz0d&CuDX^6mmYamwIXm{c=f!SC+Gir_7t&NfCV zHDQ96hrp{Ss5KL(!Rub|rV}hS5@X=)UhpnNoCixs!TTNHgP*X$$29n)fn}8_g3tZn n%SQ0kP2|D1ec(GIE`T4S;O9>8YYj04eh-UqLp>(Re@6cS^@+ph literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a7c183228dfdc5c236b7914ca68298520ac60a1 GIT binary patch literal 170 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>Kf{->ygO1a1rBPe_qDDft*Zx sgPB`_!~OsLz3v`wueYcFuf=+=*PWVn zy}YQTs=kB}N|oa#DU8z6zYh`Dt1F6VfA!-q5nkI&;jcpi!e4uo({-;al$3^_qm|^) zpL@-rqgJKNJsRh9j~0)l6(|pYkpM&wCn{pWa4BL&Oo~`DavB&;fOTYGM8>P9z^ftP zH8J5eBol4NarS)Pwc{KmJzCY15S0o}^}IenEh9v&mPkqq{?N;I55=e#YOQnhK90nI z(Ltzn>0^LeuOB-H^@eHeJk$mJP$LCDb2vV~tQ7$=Ge8-qeq^LcNtR z#tYpJ9(Tyr3>q*_p*G>D9BOms_!+1zVdE0iRx); zF*d@N2=$J^R}A%TfUg3om-yzjubVmrb%0DIK^-(q zoyB*%X(|Kikaa2_>eGNJUi6uMss`$F$#|XyPc?8Ze}i?Zo#P8!nCh3Exm1|uZGLH) zE&zitT>(bIrW>%+0j=dz?8@|tBm^BdQjGeX0 z!bK{~o&gIIX0yS9GiM74JE5N)Bz^W1%~=#)7bEXMfO4Hj#9n*io^z4ge}%M@=*z-Y|dQZP|`%eTe} z^H##*jq{;|oz~CC%8o*6oR0%b#6g#Hp3_PSn!f;+Oy;Y>&N$}lz|NZI+rUy>^BuDD z3XNPKV5yFU7_c<^LMoWYxNs3H-Lg;&mSI?^A?%!S;YYA6EHul`B5GV{0n5h1J;HLx zLOWr(_JvNc{PczAU>Ed@XgTE|&Hff_)#&~0*v{7byTGc9{$4rgDvk1UORIHDput@(BBZEL{d`v@8|ju+y|uE!#_}X^D%z=~!w7`zdPaG1x7~GI#Jc_PLu)x@B%o zbKr8kY%im_WnQVpyqpWxie*ku5|_DAZMNlhuscD^17LT}D;7DhoMPn!VP4Bh2-tmW zW*IJ&OSD* zR><~i6sz1?*|=H@*5h7n1nZ4neTw6AhP808KGRw(-lZAV5@qLgdS)#J?1^QKThVV= zy9YKv);hojPp)-ik82phx(Vzl*15!IvbB;1u3N#LN3C;1{-#^c2YX>yzl7sV`#RV6 z(zSj=vQ*Ke^>&i7;nL|gij_FWMj6p>G!nAWM8Y>(mCDQw{+(S*K*BqZM5?o~J0KaW zu0ca8(TH*in%)V`V1j0pg<2Ze@_&X0vS;L$g~q>!3M;H(Mlfa}d4+$#sK@n>{4veF(5PfbjR(iWvF6 zhQz<`BoV)!P(=KiN~(VK5bFmhV$%nkBI-UoBsV{F@!!Tj%82EonGY8+esn8h=*QC} z_~Rww`B*PmZt(k@${@5rE+I%MfEHX0?ZikrG}mxGw3Ak7AjJb$Y*oYmz_?WlElSvGlyuFx@OS3J_fm4+rcGOIoY+4v^Xs=` z$jR*-61QDN%-g++SiAk4SbnQkM8j`Ck(}RJ$;nUQ#PrFdh{C7yME|Kscl}ejWNNN~ z7CkINi%~M5#h!=e4#9Djk_n9(h$hNH8x?j!pvC9!P)v7Wry2fQ{Z1>iQ;r?4WV%BW zclrSBG|am(91}Pu0=^rF-OZ4NyEJr{w>{Ci`v@Diqjq^ulFXlZy=3QSw-n~3p`Shc z)EVG&ImfdQK40UQf}GDkC}RBY4n9dm&hMFuc;)vFK1qZA%U>rvFn!75m=5cg0!0k| zQo$z~Fn(#~cn&#Vyc{zj?8V4JJH=ii-aN7FC1c%a+slTQ6}49kpF3`^O%@(f-F^U; zW5~V*TDEK74lT#C9|!HcW4}Qb9?`)4yU=oz_WLp6Fda~6d5(i*X!)jtJc)EvVm?`N zbkH*gS4hM`HxUl4e1s_C*+VypI;>$oV9vai(3ljX*M8dvClG9(a6tU>*Z4&m4 zNko6%BJ*#j@=&4f@8HO9H=DLc41D)&i~6 z@a++_vdC{Trg*~2&EK68k!jQSFxk>Wt>62hRoIXCi*n6*6pYaUXxHP9;xV2i992l< z`7^xgmdMj=OqWZxUYd4vgLkeH$;U>HRlsq&Pi*=lK@nYl8cFG&5j=5!^4L}W=dw=t KcNEe6tK@(8IPMSt literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Ext-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Ext-RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ea4d2d97b8bc1df2abebce0d4f8c58789f723eb1 GIT binary patch literal 2542 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 n1WGc8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>RM5v>ygN#sKmI}pMl|k4-f~j zG8_m1(*FERdxM!+_J#r3kw6>*#Nj|3#vr&i+EGF=`+zS48-q}zgLHFIt0N-=1WGc< ggIR10jYd!*Mh1jnBC~2K<36T-PyT%@0*w1a03e<=y#N3J literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e39908b9844939a3c6d6baccced5771b8c1b1b2d GIT binary patch literal 549 zcmW;HX-^Yj6b0bvh=x@^fcgdPo2C^bbR!B*V$ecRss^bX`N|ESR}dF ziYT(U;(|CJ$SNud2>cj-3g`OeNzTp5Nv`@Y)R0Q|8Qq;-8R6G7pS#-U(?lSVit8fW zXJ+&VrU>?Qq>OaRh-LJIr!bIAivN967`mw&y?hMoy6|{!1{)fi!;OkfA;o61EZUXA zrr7tLQB^4WPDMWP#3Gg@qg3suI<?M`$=f?v}^3bnaxfB>#NYMU^7k zeoSNs$ZOA)=ecs1NV}1XlOHqWu#XgvM&(EqIpotqrVET-1<#z|xynSrSRHs#&h&%v z2$-k=lVywnrf!3m7?rPznS0=M6L@n5yv<|c;N2B4eVQ2r@7uwLi{Rr4CIdc&z>E)k zKFTD)>~-+vEU@sWv=U&h9?T1JMCOO6LVj&UT(|%hOPPn@+byu<2FpcEH(0p_R$XB2 z5EBFIm%;Z_%mCPE13zlP&*O{KFoB0odEc2XC8swyI@Z{ E08&E2d;kCd literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d5be5446aa40898742183202ce0624b8acee5234 GIT binary patch literal 179 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;qIjC8tSa;ktnio5kreT14D}) z8$(MN1LGbEAUm9ex5dqlVUJX^5<`m<8)J(L6GMwFBf}nPZpIb|AT7hl(Bdr3utyfi TmIJaQq#0U5fOIGW!yb76lc_S5 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-H.bcmap new file mode 100644 index 0000000000..39189c54e3 --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-H.bcmap @@ -0,0 +1,4 @@ +àRCopyright 1990-2009 Adobe Systems Incorporated. +All rights reserved. +See ./LICENSE!!º]aX!!]`21> p z$]‚"R‚d-Uƒ7*„ 4„%+ „Z „{/…%…<9K…b1]†."‡ ‰`]‡,"]ˆ +"]ˆh"]‰F"]Š$"]‹"]‹`"]Œ>"]"]z"]ŽX"]6"]"]r"]‘P"]’."]“ "]“j"]”H"]•&"]–"]–b"]—@"]˜"]˜|"]™Z"]š8"]›"]›t"]œR"]0"]ž"]žl"]ŸJ"] ("]¡"]¡d"]¢B"]£ "X£~']¤W"]¥5"]¦"]¦q"]§O"]¨-"]© "]©i"]ªG"]«%"]¬"]¬a"]­?"]®"]®{"]¯Y"]°7"]±"]±s"]²Q"]³/"]´ "]´k"]µI"]¶'"]·"]·c"]¸A"]¹"]¹}"]º["]»9 \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GB-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..310834512ffe49cbb7ca903abc2dc1aaa934e6f4 GIT binary patch literal 175 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;_jsDktm|5#L!~Tz|dmH#?TVR zz_>>O$PQ=WZE>?>*dx^plyqWaY;j>?Xt8Bv*dxu&*x~@BWf&P+oTVA|$O74NKz4*Q OLrVyd4rO52BM$&=>M(}@ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..05fff7e8254c995031783fb3b4892d58a6b176ac GIT binary patch literal 14692 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 U$d&`LBcvHxLV$EA1H&G90L*YQ;Q#;t literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK2K-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBK2K-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46f6ba5967cdfb381f001eb1193f17b43d943962 GIT binary patch literal 19662 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 BHq8J4 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBKp-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBKp-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..5cb0af687ee20a10ecc367892ae49d7b1e74acd1 GIT binary patch literal 14686 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBKp-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBKp-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bca93b8efbb18a13e15025ad41d23db8267d2577 GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|Tof+Gg1Hm literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..4b4e2d32294538b5093ed3870bb9de37abf21599 GIT binary patch literal 7290 zcmW;QXH*n#pXTxFcUM(+lY=Nmf`TFj5KO2b0xAfKSws*}f+7k9iXw*N?DMSToO6Kz zLH&dBh+tQTst)wixN&B~%vzC1IE9Y95x{uL;X|aJ#a)s2NN=m}^#$;uro;-KyBnYoSBuTH9^TPGtK(ZRp-G3@_c{UYM?{B@@rycWZYv^llF?3GSz1|IDBwp`_aXY;}NX8u=uaCgEQ+Rz6#^`|8 zSupOx>jD^ebFYhF+=JJpFz(g8z5`>7?sXLzWAVBU#yIx69>#d~`X!9}(ZIoYfNv1Q z9rF^`;7P`VXz+*eFf|0im>@K)h4Ba)Hk0uv8bX;dQP;2y#$VXWgCvtfKHG-~7Ztnmhn&$vdd&vVvT4C4zlYGq!c zu^cjl#tO)U#u~_s8XrOCgvKY3c{IL+ETD-X>-Z)PvK~zyBpcA=4cU{Ld`b4Ara;I( zXj%)|7fr#C{e-3sB>S_baB=&BL~`7Y!v)_jlTv(#J#Ih!?W#`C)7$4tIJEn3gZXyGAW5n6PRucF0= zg<~lF+)DOa_nE2r_x{t+6n9qxB$6K4?8mCSTTi6efRaJx-;$}O>=E$ZGL3h;n@}h(@w4}45nzVEfS_(y0&PTc2is21&^h_ zFzxvz{;K*_`Rl>2`@brF-TPH81}yzGwI#w7M{UWRDIRU7U^+x?=`bBeTP8ClP+K-k z$Ix~WrbKGH3{w)?u8G0RlF*g|({a{T08_G0+ijRmc(iHU6tA}DFr{+so@7e%Z1;!h z6l>oM(`nYOsnUh^2+Wpn?Ym&g5ZYtK@E;Ou*P5L{`w^Hjsr?w4vZy_oOy|&^2GeYJD$x-NQfn19T%9HL&p^|>sUt)%m#Gi zF|!AC6!KL}Bh1E`})43#xdwP0S)I_k(ALLDzSa~L{#m?QX39n6u`>CMdB(HX#* zce2iP%)EznZYFcAt}`6wIO^O9b3EU{J8E?ahp|Q-Q{EnV%?RzWgWU7dssGcJ&Y`otj7S$4%XuhOBD6^!?Kh0tbrw3 z=m~~p7uOTQEW4>E5|$XgCyFewtS1JRIP}DmC0^(`2+INVB*Jo#>p9L@4x#6?7_La@ zN!MA9QqOsVC57v`0ZS(9DI`l4dP-n9hn_N6vRThvW;xG#Dh10W^gMy(I`ur&TXNCM z^Ojqz*OOVw(Cg1z%F(+HmP+)l=PXs|-NIQOa=lx{ZK?#z6MgRvSn8-Z7M7=cZ#*pZ z_)%x*Jp#)!p*M|Lo^!otVFh|G!b(E#WwJ8r&4ZN}dJA9`xZYA&b-LbruU~C5FX{uVKIr4b5S!%J$HVH&^{s`~&$n+Qtp3y&4Qqg|Zx5`2=sUn!*HGUP zScCO_iLkDxzEiMn5c)D;-N^dRlXVmIU4eBA`f`{xg!=Nx8jij~ShtDm?GjldsIQo} zZrAl`mR+n*v+PFSV`klhzIs?=(f1tIeLj6JVT}{|ePNCF>DMUxx&8=P4|w(Og!Q0D z|3NX-A$j#Dll73$e~zpPT>n*Ak5c~)SdXFqCaj6nUr5#@p}&|}lllJpu%@zpZ7eOI z|1nulvH>qxPh-Fj)^r*OfHi{+1i^ZS8(0r(CI+^Mdz=ytgut4GfpD^(#XtmEvoWv( z)(bSSldKonz#eA3%m(7gdW{ASll3|Vj=_2Z14*#v(Lge+`4~tg>rFPGB`TzWGq4tM z182#43j>#6Efxl}P$e{w$E>BoKoM`fs~@N!>jN67g|!L;b+C#Us28`bXq0ELRibrjzKNd3mV)7>q}v9FBEWt2cVG8 z;1MW{4Q4QfV}seG=rDL0iUEUHp?J_>ju_*Tpm?&u8&JG3SU`$58@vU@mm4gF;zxt` zp!l=F2c!h(25U%JgTZG|)^dX{psd3X2PGIo0+jW-Aw850!jK=7jTl-7WfKjphq4(% zo1kpL&=x2mG!zOYR5!F0N*E1AlM;?0&AJUkv7|(BL-A0yi#z@(v7y6E*@2-XDA5>7 zCS?~tlnP}J4Qcn-%MG1_vd?4a5|lVLbQ4NE4c#JTKQ~lL%0X_Z0?J`-NQ9Drp;{;om4hBfO68V-b#g5kB|4!0x>Yw%PytYOnI91i6qKfDdf zDGcu<sg{0(i!x}UX!y5FaF#JG_T$M;E;D-l7rk%565HC*=-5;ti!7 zBO3Fb=SUEg3XFt7xsMSo;{$#q0!k$tiH1^z5ltqtkyt3z7}*b{hDHuTdFVTm0Ob)I z$snZ`Bj=d%L=62Yd5v6zQqPYRKzYVSN}xRFM(#p+K_d^KyyQnjsKCf$sN^wH2bE!z zXDTO*8ldWE)DNnjjRulxz-Ta3Pmj?JP`&uk2&mq|XtcQfZ%J%4mQ){%9)RjcqlY-v zpGFf&4Z`RNsOt=)sZfJy^eoi%+~|2yH(>NC)J+)8fx4NE=5p#5VYG;;;TSE48iCOY zQX@S_E1~YdXg$;@Hu@auPK*)MXu}vs>Mk+%Z%f`|zEJmIY%|ooG!_CihK+@j8jG>* zP~&JU3TiyYb}@B78;gN@2xIY357XEIQWG$iK^#)dGt0{2F7xsp5e#xpk{Jow@A%mV|SpQ6F2=Gi5shcnyniX zNj=ZTo-*|!KMqo_uyH-qYr?n})EsU+5bE`{<66vI8s7``20y+JY97W9LCrUeCouIU zjh}>CMC0jV)Zdjzy@l~CsKqpX4r&P-zW}wAjbCAE85_UB)N+g$LA{Uh+oV1)jF&RC zipHy<*3kGPQXlf;b)?qnCIIybO&Cb6<0rgHt*41KP@iLB9jPxcu>m&F#3tB?CPJ8v z@e|v`-G5KQL=?{V-tH|)AJMiU^B3ZL$G;Z;wafXg^48CyfJYSHXk-|8a7`{ zWWwf$iLn5^c3*aZN!4}9(CFvq;iJWu=wj`aD3)^u>w_r;aqyAK4 zQZZ~NAl+fM6hW%sY$r*oC0hohr?6!*=^1QUm;~9*a+8`d8*b?VJqb(6JaY8qyJ1I+Z|yt z4YqPjY8mg*q?WOQCeOompG{ukY!7Hs!&YNbi&;aH1+YEjCN=mYOqRh`OOtoW_861* zVXG4+D`9)8pVa8}n9`Cy#}tF@g>H&xwwE;J3p=B!0J3vzYAt5(>83V_JN|*h*#(cO z2(o*ysaV*(gsJ_odt>S->^_)EB)c!0N`~E^pGt#0fTqsC9>`Cfg?$aCE-`x$Ohp;-~JAeG5%h!X8Rf)npIjr)rsftGMYON^I%{?2+sZ zWA^QMV}N}p-gt8MXuRw*Gc;_j4{<*}xTXV!-;PLJv92>pf<-@TF@5vKL*DxdVd^_-Ryk|bL`Q*PZu}-rL^&VHXO0^{vI6r z==}pY;`sL>bHoep>)<%ZPXmra`e_{;hiTf690}a?8gd*JrZ>Qm$W3d*Ni-b^$8k0t zMUG@~%RiCeNWt`8-jPbv`^k|mOdp2h3{7jxncQ>=IkMJGr^9hhH(dxvHcj7w<2*mD z&0i3vwYy&Ar=P%aiJN{wj?3H!9*(Q{-~q=qal=2Aygqorkt2Lq565->Lns`%o*%UF z8~P9X;K;*=Bjm{EKP19YVEB*nfTFA%{paTJ9P) zqs>3W%uYBSv6)?P)Y6QW{xN3a;CRAj_QO%f&u9UjvY8|}>iL-zG4QXXpqbO;c&3}t zEHCskrEt9DXDZOg%$|cYz+?6boPqpoA=;ziT*J+lVQRfF zTS3ksVfG=M>o8jnXD~PW9M1Ll$i(1(F0qdsoEz9jO|dcHqnC$s6Qq*{XCyxEgLAL` zV?3NOhL6X{8Htfo=OKJ76odYSgpWmV9;J`B;XKBFEQK>s z|FHtjB)^Z3);W*sK5d5cs^L=voY&Z=z2wZ{KWRtj@}IN|-4HkbwZuLhCubi2DGkn> z?9&Dc|GWpzD(}w+;S}*%+o;9~+%v4yvbh&nd5n36l_!|zu~KK4*J0%;&HK|zJ?4YNP5)NH%5%^8by#^J%x|TY zmza-+i@fG{!^JS402fE|N8#eV=9AzO*nB2jI>UT6Tzbr3Czk>9d2o4R{w7>rm@f=) zd5ix4PU2l5n14d9ZTk6oxFS8i@NjMS{^AGM4*IeMt|)VPCJpb$#vE zT)1+5zlw0(pap^}j}|m(zObMdL;j-#*G*x;7p?+fVJ*1|*@7m&g@tgqZew8^T*X+3 zgsX&G*a255E$k*&nSLRbTzC0}BXHeg3(0U*_${Qtb)R3j0@nkNg&X9mG<$eax_U0PZ9#9*6t5Zt(=%$-2c1xKGgH z1-MgmiG-0(jn ze(5>6>jIW}a@XsZ*TemsEo;?Y@XL|peu?GXv`WHq3|2W>K8RJ`u$(}vf^Intt9n|_ z!m7croQ+ivTD~p@{ZEOOZ(!AvmTzL!3(G}V^`_<9SoPtSOR?%p%lEui{e& zV0ANoFsyFjfABG@A>#V~CHbzNqaW$CnvWma*#){E=dfDH|G0|PBK*js)m!XG0j(CZ zAH}p<>iy#`R`1Y{$LLM)`|%X3cgg65)pCQ;S4{ZdlCXLYjag{&MALd&7111oX6?8d zG}qGVL$q8%%L}a5qBV_HAEWIUt=6GEm0PVx$1beCM8`RF+@+sDmpA=n=o0ahr|ymT zsr_3o7e96Ae(L#CkN#Zr=cB(I{T1l1=6?oaFc3oW7E~8R^_cX)&xj(!|B)~i4*ZM+rjCGqZr7eywAWGE^EvQl!~X?@>N$x3 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..38f706699f395dcdad5c6ad93d1a9b6fe9f66c78 GIT binary patch literal 180 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>FyMw>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2_QS1g}24cj$w~fvl2s#6B}cT3ll?&EhEDoX>P_A2OurO$k5^}&9Fxn U$d&`LBcvHxLV$EA1H&G90MDZ`>Hq)$ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBT-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..8437ac33771536813228e3f9c1cb6c35af3acc72 GIT binary patch literal 7269 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 WM;6GI1F|Ee8CpVsbSMME9(e#*4Ku$0 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBpc-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/GBpc-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c9edf67cf6d640607080ad2775c14760df77dd96 GIT binary patch literal 557 zcmW;JSx*yT6b9g#5sk8Wp~4N)&xVRox)HTbV$ezus|KWvvDSQMS~>x=+B(ya0BUlu z6%kOt4Hc2GF1UglxbS2ABPP6unKL6=RYgKy|sm^&HD=; z+9wK$t)ehQepj)s%u_r}`l(`yg7UVH+^&(zQA3V2kz3v=XL`Ztad5W*jA@Jk##_Kd z9Ww~-#lii9U~)TSfvGcK8b{@WO6C%Hcmh1y4IY;=1Zf!{oti z6ubz4xoRc@UY-Q=dw_$U(n*6?$3RJtJ6^g;jq>$5#5V`P+ilD>@U9aqc)|M$rVo5* z2OmA)(*`C9J|6*Jb}~a?@jO@xfv-Cl8+_{m-~Hf66>}N8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|To({Gim?; literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7b24ea4629d0d4cc9f0cd5852edde324156ef0b1 GIT binary patch literal 553 zcmW;HTTc^F6a`>fNJ|+U1WZdKHfIVU1k*BRx(Q8g4%)hO%E=p&pZ zbEd^7Ox8PjMK`8&BW>|axS~6oW&igkGq}l(87h;Uvv6yFZ!CT`8Fx4oMHIF4enru4 z=0tE`J|(&Hyxf(akmS7OcH5<8CAK8mJa(nqZ+l&STNO*h{HDE1f!7`2 zO)W7E7S4gi5O^yQV7GO1K*p$4;PUEKTm>RjJOVd4}m{N!QVP! Q2JBoE!O~)+#IZZH2g5hHiU0rr literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdla-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdla-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7d30c0500520d563d0e5891c8f4781c61ddcca5e GIT binary patch literal 2654 zcmW-fc~p~E8piLJgoLoDV1iVG#EWdQB!Dska^Z@KEGiKJt6VieWR+b7OJVMpTBmj!JFV@ww9{?uR9m&JOC9YvJu_$KuQ_Vzd^3MM|2*fO=e_Uydjxkk zm-X}x_qVsU4JvaA3e;J-YIT7UxAZjWl(oYHgStHf%8Kshp8npRe(j*HB|8Flbt(V< zen8o;8_@Od`=42>(l)3 z5_3C7W8#28sxAh9N4WMd$)m11OH42hj!JPI28xLDHX45P6A}5PLQrD$ZsAaCQO6I=ddkoZXMn>rz{cbfRZ!j3W zu@jQ>ynlWKk~fPmdh0nz-r9=M+xd{Zy%(c*cv$c9u-@fi{ho()froX0hxHy0>pdRU zA9z^r^RV7;fy+Kf0^rgXkn_PNTyT*A;Bo;FUMzy-BHw@y6CnAp5u=X^A^C`J#vdDC z@g;uI4>p3um-s_o8iZk&^FYJpLX57&LUKie(Nz`PcC{OTs|;X1uE6NyDo8$w!03}U zNdA6O5 z0B)Cq)E~NF`W+bn-)ceb9faYXJ|MX(2jKoL5PO%u&s{Z6y*CGdAA5lOUOrrMuNoBH z>%q(KX8`GaEhP6laq^E9ApXZ*IRAkZfP39w-GcZ1 z*f5LIpX{hHKy!>);gx&0*sJYz)=EPI+r=(0R|)l5F2!`8f6%JZ59>$tNqY5!E~K=V zTNiLc`YkgW!xod`NL;gnjCYK`5N+346rMbn+FWm6XX(^4292RReV((`ImqQXdXJC!_bHv5U)?UWD{U!X6n!SL9x#vjlBPtFQT9el&rG6k#4*p2 zVM%hYG&OLW9L%vcu6bNb7avMKw0NTN)YxRx^79mE#^|#4E2O?df~~r zN72z%SG_l%O*s***ZJU~hG4y=V6w<5*5p4e{YT;HQ7>~yHd$itVWUh5&NyeUUgcjg zHDYY!P_WhC@4@audUp~1d7ro0v_>$!VWqRup*^ zG@Ihd^E7$(dgswfeU?6DwPBq(r-$EW#d>|WVUMBLH*9DQ=F*rwmMp76AmBzPvbd-{ z`UrM~p(|U+_DhVN?C5m+jKa9nsh~~nM}8Y+vHUq*G^_qfnlDpw%s&fU+I_IhwQob9(!YiX*+$GL+{kvchE<} z^e2(Xw3o|tByvl+PEE9o$X%aUSIvD*hb200lQ$u^I7Yvj*DvsL4eUVM?hyZ#(=BF%-SwbR>N z&sWihQu=VtVs{Pwr<{I1472&JDDSx02)CG12S|>J&OGMUP#zv#oHbA4y zGWT3_lx-`u4pUoGg+)V)G$p^3{yIv_sW>Xes3s zwsnSZw^U`GPd}`nA4dhof&%eiyF|0&m(Z^(U;j;DwQFggC@3`47%D;?LXj}sD4(ti zcNRKxWYQ>SyyJzCa;`Aet#zgz9t}6{rI#i2vO?llg%s9G57Rn6dPL&Nx9<#=imudM z=}HXZU?xq@4;0PRICnY~GtxkuE8VWU6LUuv0Pg(B4VEzHMpni?XO1z5^;Kp?5W}fz z{VJQ(u}0#kHH?}wgXMvgnRNSzYt_tfFe(@w7}BK8mOh<7UKvcDIY4EBy)$d5dc4Y~ zz92oNpc!euF>KQJvkPfwgd|KF>rA(&POqm~(*?A~FB1yG4pyG2^=~b6L?3R`GP7;W zlTM9%wu5q`u2ycqlQ)&=UrSdy)2<4y3Y-a(rH1YXM|+ge*&EKL$7^J>p(~rOFP~CR zCHb=1N`I@T(Ssv=g{EQ?@)i5CeTlZ!_8no|3O@Qx=3l!t>u2Alzg?jZo08a;+tQ7T z&ZV7>v}M}Xu;GqP&TdO8C-a2~d`(=Dc`2JD@GgoJc%#Bu#H!fkbd2trO7{*er=qDG zuOQ!B;;uI?vTkIX&3(pjM!LhBo?^ QxJF!^-VRzcnd;s4Uw8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lc?)ts_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~ljyD=Pp1 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdlb-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKdlb-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d829a231015161e107123e211d4a78110daab6bf GIT binary patch literal 2414 zcmW;KX;hO}8VB$j_OQsJG{|PSK#(=aRsp%;$|5LKBC^T_S%M&IO_arj-Z$Gz_5=fj z1VX@Cs}=3EQ`_lc+tJ!qJ5D>*+SPSz$IhI7m~(pO%=EPL&V2ZPdCq(8z3=n;d)?bp zHZnSKsQ*BpLb#={Fgr6RJG)Sbdq%os!ukohLN+89Ru6ZN92y-t)Txm5WCh~ELE-B;W z>=~{S^;T8=(q_#RJ5FO4i>c5VZ75m`ou9Nf8*`oVGS$>tnzf9nTkfR7MP!W81!^;V zwykXOG^!MuZoU8P5p}fETA5h1wR5Hhvv7sxWE7|U9cf4}_ ze82Ocr+9vyre9N~sWy9gv+J$tb5(N_svvFbeELE5|e?s^WIqqRpM|qx_izCj;nF%}(a1GS}GZNHzEwqh1&}Ri!&HKhz|Z zSW2ntIPEd7cLmYNA-B*NV3L@MPPUkeXu4bCiB^?qTB~$2O@K_U${6xr95Dx2kGzzx z&oLd-$5U7OjoRs~)mD0`w|~v|VxCoQNpg1wdB%Oc)&4F?uvugq-leYhSMR4EAEnp* zV$=<)M!IQfi?rS1`DId7YR)Iz@*=7gD^ur4noDzY5u5$HD)gD)`w`{X+w}(%ssS~B~R?k00w8Sw; zu|1#ONT5IXFnu}+D`Gc=vwK{Tt|CN`JYGcT%;$g0I zv-OML1bO-_y^KD`|Ftpp1dHwMrbs$z$TLU+)M8r%*XS~OJ%N7Ita*02nF(hHmqD&v z77sF_W1e)nV=>2_NuxEPj8_ZOd#;fQI!`P$OZ(Zw?%LIW9-6D#peJ;YKAz~La!+Yg zH}L*Z3=$}Sdnp8fj&m6UeslsO20+3{FjB_BXk{DEOF2dXQq@DEj=)Gg3W-LHkv0Sp zZ4E|j8YFB#M$w!d{h>?K@iJ=rDV>~2Af|02hwwWdYuuWlPZi2+}6h;;W zB-UJvY~e7=RtK_X07f%nNM?pHI#~mWJqROvKP0o8F`Dy(WUd0E`9w(OyD)N;LgL`g zS|E@(V=;10LgFgKXi)&kVk1UNd5|p0F>*^GSq{T!c^Ha3nV`VafYC}YBrCfxT1|yy zwGW4%sszBZ7o?wRhU9r4jGpg;7u!0bz6|7V^*R1NCQmF?z8GroK1*>Na1_Y?r<#9XpK*|}^Sc}@Yq*)fpvQXnKR(Qe2tekADiD5Q45N#D*l@9mn;ijuFUMo_axx?@_h9t9?U1~} z!|0U`NM7aUuO5Ts_r(~!wh@xonlZXm0Li7p7`@J6y}@CQVMkyjMZ_i8R^x>|(M2N95bAjRmK7`9#;2H+YG@II`@=)+x*d=!Y$ zM}3fdoPyDHUr4T(V{`*Ta-$QYPb83hass12wLx+-2BVu3ko8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lceips_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~lkWD=Yv2 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKgccs-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKgccs-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..971a4f23f791f75d4e604ad717735ee55529eda5 GIT binary patch literal 2292 zcmW+&3s{t87Cz_yhk+4LK)HmV!xluLDa-%_0}!{Q89xgv!bn_%)-tr4wyp+MR&IvNCGYw6h3((wIh9R8} zvURRQ=(1v9R}@;ik`TL!a#Z(9^u8U0 zgKvl1;C2j_+>Vvvj+y-LWSA!0DMa5MFGiq@?uo?Uo(%HoDZ!AQN{s4x5>0m_G3YKy zue*=n#Jf{S-L02?_X^PWUK!f%t)Nl&2jj&1NmAUeqQqZfG3FN~#joC^e$AB0y`wbf zUBFm47J5s3p|{iwy^8fR9ec}l=(QvCRv`8+w)<{L6UHVVnrUpxDnX;oPXnWEFqgA! z$iNXWa0H@mv<2xbg$x{_1GX?3wc}c^LkBO=xcU~zd~k+?4raE*fG>En91Vd`%pO11 z%rJ;wNnm0f+3&-r9e1A7TxRLNv)yGuPOvacFpE!oaKS*R9d})V4~E(C#VWYD!k)gX z3|%1sx+_f6ToD?&Mk2VP2wa5dvT3?&H0v=MxMDSL*EkcnlF;l**1IQ*?08$Od;h=gnkWrnKzNb7v2f4%>%n?LppLuwh(6yYa-H zw6MjdCb0mc~m!j6(Xn<%bB-I)uMQbgoP4QB+`IBnP zm11)&sm;r!_)Qk6EoLdURFe9wO^TtEwE){TNb$RQq@E3t z;@JjLzvn647D#d1@*!?JNU=Sh)b>?U{2`arbG}kMx17`;$4c?Mnbh+cQtYsi+EF3J z3u&ZY;JbDzQoACg*tM3_i>XrV4kfjFt`sjNlX|IMia!;QdO1Lfmsio4J>wx|Pq7qx z{YdSdEyXJ_q+VGj17FPq*i!`KUY$>BpGk^+6{KE^lH#=ur2Z_V*dIZb{UuPie~A>Y zPo|jHn*jDZAn|}rS`W;H$OCIA^k4|U!FWa-q#sO>!3P@v4m3ja8-qx_ktoHR0i@o{ zlj6|$R%tm@4baj6)qz}&iWKiXMC!fyQoNr+>is9A_<)=BAvfzoZq{G9Ss!t; zKH_G5%+30koAozt)+gMoPbw+)s14vm5llFmCsU6hz{yn5kMT-5#uM;qB&knJr8qvB z)N!7Szt5v-C-{RNodY9Ia3N1Lkk`p1n0Ior6rTl=`m8{TQ}ML$)GB~e{N?;SM~cs9 zllo$i6kjYO^^a&NzVssXbp8A{+& zDOYP`a{D;2wA)FwSIN=WavWXjJA!TVMa(XDWRTY-#ej2swrOMrfBR!b8ck6#XZ%bRP# zX|>~?1^R#E?G?NC>F#`99!0z$ikav0LRrAPkWpencPTH3GF}vm7!_=*)J$#%$F49% zxmO~3hDh=RGAC=`NkQ;TG=panbE=M>$;?w3yevI}&@&x1kJQk^OUIMRayIA8W;vJr zb6Cz}Uq0tOhPtPS?ekgZ_u(mJR$8d1oO2r4zm|EO)I1wd@6!!r16b%Gfwd3d0ynk%qAp{S2oUCK%2jX)&DX{IlkK6wz=N;1I)E zhyjLkG5Q$J1`0KtPqCvp7)Kk;p=dFhr*TMgmh>^2=V7wZyomCRmSFTXT9(L%jTZh7 eV6=`zFQYYve2mt3Of*_2X?{j)l{Um^UGsmAm(QgD literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKgccs-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKgccs-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d353ca256b54236a4acefafdbc08e5b719892014 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctrCoLsEyWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxZLvn!hb literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm314-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm314-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..576dc01112bd7f28c30804661f546ece203c53d8 GIT binary patch literal 1772 zcmW-hX;9Q>62|+_CEy8y9C8dzGJu2|ML=I^i69Frj-ce=RRZ<=ems{ZVz@n00OLs6mXL4yS)n(eWt+g{b8nYHPhBhV` zV~s&}MupK|AES5C?@aXe(gzPD%ZWYP%&}bo&G9<5Xj3W82dfrZw7-Togc}@{-JWu7 zce0!suUp)3Nabr8nU|gmbTq$cUTuyws~vn)ihy3niMSzcSCUz+KiC@68g0lk?AJ@h za;+}3ccrOb^gJ)gEm0~D%SBnvXkD!LvKuThq?$G~d6{cYDP`!Y8Qgg?O0Q~MI<&j3 zWZ6MN93R;%yHT`+! zWVu+bG87HI+*#~p^c3-5M0_JTTK@HOFq|re2r#5W94vrsV60Xttx3ODFEG|GHYRLK z8~pu{o1L9&S9w=`cTV>qTbt(U>S6aTKe?bMZ#c+M))Cgfsx`&FHMJ?dBl3j%2}P4% zr&^b;wzU?B8R-DeqQORPa#k(3mi)5ojjf$==A_QUo%OwmW#+BA!tui4Ej_lKFP~k~ zRoD%SCOlL=){%dvtdP^Y)-F62+*3ECv3=oahH-Vr^2y-Iph>0Kf3S3{cywQTWLv1N zPPuMi?Lg|lMzxLgQ|a+akRJP~oUE7TqZ-RPv>iFkRA1A!-B6--uzn%7DFk@DQ@mx% zUVwiyfO&fn*rRf@UVBo~Q{(2`AK4$&?%YB04u4aHIc`FERBhyqPL0YVTlzAMp8MUc zkEGvRM7|t;wud#O@0??=h#hC-(I^l^v6QKYT9uPLM8C)i6h@Ex9?PoU&?*KSV`VpIa z9{FTGv3EBje@`Oz-Y(?t3;+E?$UjIV_MsQ@4__ko(Hi6*RTKMzpv%XCE*}fJ{87;5 zoS@4&L6=ViT|N30u;xjL70l&-Q^Dk@B{z?qwTuC7IxhwL|Rm3b2_==?rz#@TUO(SMa zM}F0r*wrHBUjz~R(jNJjFB1C-k$KhBe@rJm`4MCrqf<8Bk$op0b1m4QS%-aqC z*TZ4aZ9%WwdvM(yf#n+n{&#i}yK@*F?=r}~yP4SczL@rXF2IxyiI-h}Qi56<9Fqia6^HFzX_;UMLNmXBpVe{_ekxKy8fx literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm314-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm314-B5-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..0e96d0e228e0608f77f035655140c6a235d4ea56 GIT binary patch literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctqkY-pnEWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxb;p(_9Y literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm471-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/HKm471-B5-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..11d170c75ed8696f0705f9fb9f5afcf3b0aff4c9 GIT binary patch literal 2171 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 W3S-b|;bUNIW?^7zv1XQNu>%0E(j#{O literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a45c65f008e7d6ff34edaf53af15ea471d4f6d90 GIT binary patch literal 1848 zcmW-i`CC-i8OOixy)y#?3=?IQ2uv?U1Z7bx1Vjvs#IU1aP?TlFfka8h8Nemd^tlqE zY0{)i(l!C)+;eVZ(YZ5oO(85Me?Xr;PnRG1OMmDOZIdqcZ|Ir+a6jjH&vMW5e&6?1 z{(8DH>z9aSZHI+weYU+K>S3_5VzP>wC)4?~Vd~I)yg(5dXk-&8DYE@eE zYf=pZr-eS649DE_8slzhYA6a`Kh#!yh# zPV0XC#L&G|T|0VjoXY3+>6&}a?{v>~rR2>Gq~^_q^n?C)Q}o8}cRTbW>U;rVzKBxh zi>YhAOxK3yXLRk{dwqK4`TGa-3g7)%ukS(O{pz6yO>*%4{Yktn@#6~;AJj^Gn4LsK z;wQZlA5}?woRP#eiJ!hI@v{RGKX)W?MdBAPOMFt4#H_@pgA%`dN#a+zNlZ)p`kcgP zH4>j^&Phz_TGc{3z_Q_3xC1N>!@KYf~RQ{cH^jl>Rs=Mg*TK?ST%UH z!j6I;13ON<7Q8-O_D2J(mUx50>Qvqc?gwiCKdrJ8;IF2!QxL@pYbWtNh*GdFhd2On z7_6H_rBl=>q7JNw#7Twql4u6&gYZMh^Y%mZtKu~hmmo$}c3u^;WD?j#GF2xV3^e`8 z7-FMRAVw2l3?rM%7h?xOJYUyTUI2L^IOL7wePm~eY)8?<<=f`+8EKqBmdKE8Cu)RG z*UH6N;BgJ|#9i8FW=S`gl@ed1C-H`^l{`8FtQMp2(RJWa1NN=BaP^Y>Z7;A^E5BR1wr8!54zIOIBLe5zOHI(c4R(IO z`Ij%SJ$$blJ9TqS*gW*085;rp5VqRGd4D%DqE`@&P&7om%^3}YcOZI;c$X`B8@wkq z`Xlf@SgGLsu-xG16)O#VK(jo=2O<4v)qr0P*Z#u*A0g`qcz~>9;8z^haqu9l28B<+ zl3u^2SdGN5E7mFSkjrWTdl^<6@i1BKV9hS86MR~+`oL$%dJX(0Sr@=s$QlH{1?w{S zZL)^I-v++}eizmV_$;hZ;_tw&CMy6zu*M)1`9x%0g;2qy>|TL24&iiI6XB9?4Tu!g znuJIt>js1yA{|yF>2~2EYYHOMW6eN#5mT`{p~f5#dmyruSSmygV(AdMh-Hw-qnHPx zAT8#F*ssP4APNyHf++IFiV-b!#j3-e?~K-1Er~O(*epbwl&&MLLUbUWn$%!i?%hf8 zG>ERS`=5q0o&nLT#`i*;EsEzt^p(etKC9i|IrD%mfu$sus0J}tXF3de-=fli` zT>vx3VZTUbzGC}eN^?KiCB!bf?NXRUF6kZ9M|LetjqI0TexK|HGD|&nBbjBe+hJCy zc1OVd+)&KQ4?SQb@3p|F)BP~=yf7-#U`)?|%^l||SZ2R6r$vNa)7#a4(iw_W7k&Y_C! yV!7M4%-TEI$l7s`XGdn5p&eNauv8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^gB>>l*5;>yaq1a1rCa3Py%~ zRSXOV8JL*%RRh^|EZqC*bs6?^H=8o-=V4>q&&$NHpP!LozW_JuenDx5{o+8j1Q1I~ IGw+uI04wP+sQ>@~ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b9b22b67879d4043c75b617a24f96b0bd47cf4ca GIT binary patch literal 1831 zcmW-i`Cn648pfaZ-Xstpq{U(4L1XORb!_ZPeu>guX1 zE>>69d7H-P?uESmXY&i8*?Diaa zWmRWeOKZ2kmB{DQ4+Ft#K3^cDYuEJ_{Yv0Ps;*spF+pX^r*zG^++uewccpli2U0!D zbNbnqZ&UP!?r%Hv3+hTfVWp5#R*I-=rBv4fD~r0;_nlv_xb^akUhaLls3t;!n0D?n(UlGl{m8S0;@K7)-O=bdYi7Lua5xhgXmqK*0npY8-Ul1P&RUd)G>*DSCG2yLGDwfC~usdX^b~YGn^!oyAR0?FX5!f6?HkU8P&VqQJuBkj9@IxPdH@A=^$=3$Lz~iJQRNYIwwRI%Q-@Hy9NX|4vWhfvy$5xdCh!q2SFl z@TMN8ww!XCtzx>pC1s{=1K1is<+e?>izwK>M9%G-x;D6dSN^sa*r}1<6J0y8Q%mP} z+N2SIedjT-JByqhshghNlYkjU#;(*<`tF<@=||)4b2+mWAHA)Y=Xl$pYyNj-l=|-1 zda)zw0Nz!iKPsI+Fb*p(Xdf!U;qZ%Y9Mvv2V*lK$ChP_Eb2w-ZdqTd9=siRu6rCg9 zW{-x!I}m+Byvq@N3f_|%{RZ3*GZnlarW5>@Vy1x)Xr_z!AfzA7YVe_O&4dqpgv<-z zK{79a-?N#Q!9y_X6+Q`5dVNYU8;DOU<~8s+huIAF8O%1~VKUpnnjB^)_<~~k!57K= z68tflx51jp90Y#?a|rw?nE~*xz@LFXhdBbi1ap-5*RZO{3_=jhF$hII5t-u^5^UTs$e|mZF+75UFH7f^b5l!;B=|E?i{JLu9(lMF=-yDvl@Bm<{3tM3xdu zg~&lH9U>R83=$rSxghe>Vs41jYAhe30I@=dLU*hP(Go|jD(t%NYmL>AxZ#K`L9|Kf z+Ttoi2jZzo4aVi(ofJ=l=n6X@`0Vivh+Z{*65?iIJQu=W7Qc*Ne&vXdgfpgmMezy5 zrnQ6vBIrt#felci7Gg|I)Io%hxC${5&YSiriAIR~lxTvOLPCbj4A||=#B~x6k&r?3 zNJ+>D3Pa2*i2)J|YGM%L2_=RV@l@*EmKcS2UXlofOJ;mFD;Fg_ux zo{SQg)j&omtacdXs?`y6&iWLi;zt+Q$al@ytkqkv>2YJTJPn%*E8SR~Xu(>;ax>N^ zgSOd+*qQvk8}G&%5KaGK5nH3d(%DbitR8Z|m(`%|eHma4Lwi3aL*yq%65|s8Y1Xxm z_q=pvuYuIPr@H3eTcXZ=naS<@cjStGwC>B4`qOE+f0juh@bhI^C=Rj+2NS^l7*Y-< zWvV!sqs&7GIS+HF{IE#wb||y=~ivf-csQK7Np5q&`=XgZdQa)Uz L{tvCv`X&E=BnB!` literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-Johab-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-Johab-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..2531ffcf41acc01338f781c845c7f50f62fcc84a GIT binary patch literal 16791 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-Johab-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-Johab-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..367ceb226ab1e33624b30512716a3b65feb5a100 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l_>y@98n565GC~(t=abE=^ z!@ep8hJy@DO#7;V>^c_ief7Ew`?(uU8TRwAG4AJOV%X2m$gp34n{~gSG{b&zAX@^6 KC3TtiO923;%QA`p literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6ae2f0b6b7238adc67bd9231668d9853ea3c8e1e GIT binary patch literal 160 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>K*K?>yap+sKmIhf{|fg6$8UT z1}3I`)j)O~3-`WyU55SK&87_ddDs~D^D;5)=VxTtFTl;ZUr?H1zc`RB0mPEh%=@JP DC895z literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a8d4240e6adb3ac1db859085b769a0715be03c72 GIT binary patch literal 2787 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 P^z)@`@$;3W7gGNZsUm@q literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-HW-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b655dbcfb123ed06c7eeb87dfc96ecf6759363dd GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=N;^vTdW)E;jHTsuIrH~uy7IM zz6wT$eN_w$2N{@{_EiJfbu8Tb>UA0Rb2pnZ?B`))+|SFzu%DliVZQ)3>wZCLhW+9| NwgeDMN;B`50suw^GhF}x literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCms-UHC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..21f97f65b4a61adfa13f55d5a096ceab45eb485b GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l#TdW)E;jHVCD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE*uriJS literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCpc-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCpc-EUC-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e06f361eb6d429290806b9f9cd7a0aebce22be4d GIT binary patch literal 2024 zcmW-i*H27iO?oT*=I*WEh>y zWZwfw)x9+eYFE?kLGTF?ZkWX&sp}x1yUFzOj=XcJL{@hkG za{2n`g`xA~u00hMC53xSN-A8{=SKQ{uJ-F=KpToUWs(J`+TmV;>Nm~+UE9J5L641UahVi1pSv>ge>ZlTsm4xiL@ zUR92$HR^%xThXer_tqfgPo=AheX7Q4pK6Lqo$8EEof=W|YCeim-OV30sC(q;48pXN zqNcN`X*yR`x~C^prS0Q(weZC4ooa#W_GE(VPUh|6?mJat@RRKk+z|NoDS=PR1U^fO zU{v5ctpeXI68K(R1Q!Lqe@x&9I|Y7diJ)KLM~4M|?2KSi;3r)IKix0zvy=$N1%BQp z@QV_GU&c=f4691fOg*3_!7_6lnC(Hr%m7Pp@|W`a?N=-A$JDlSJ!h)XdoRZZ$n^{es8+ zT#}v752-uc&wFI&i*4fNMWr0`;%c*HL&}ghqK>#XVrBcrG0C>kCRsO5OSI8jo4(=o zxHoRf&X@aJ<6m}q+%E@Z=c{aWN9ik%+US0DMRvX}?TC5Z=5fF7mYr`hI^{PNkTyqa z+;0xbDQ|8R#BXldVcB%myEk*P6E^$T%kk{2-~L-2^Xa&IF=;+SFlD|Nvy-v&??TIV z&A0h8ey8u99|KE)<|b_?SSo3GR+a{>0D(M-Il&ZYyJVIPZ8umhv_fJ9(2BrzOIk5l zv83$HjCKe-OVa9z?*Pw%)@0#3 z!FNMzCSGXeB@!=()$LY1y#wucNAF2Lgu|oz`aVO-?xix?q}1f`yvwL z1pxOuQM6zY?F2FxO3A)(TvfUj&WO*p0*hthxvDB#7Rzb(Vx2HXVO_ieJa`Yui$dBh z54HlPA8`+a>|-B{h>;FdJ-8`m*5aLqmEs%^8&swJQ9eaK`j(n)3)p~1Md%1Py!6Mv zAe`p4{^@h9_S|a5)AFe*EbqEgjVE4p7gp;1sejeu0{sY#QecEwoi*SGYe3*Cu_jyK z8dyto;6t!>n9*PzFzsL`Br^uAQ!yRHx*+^$mVll0m;Fr#>m_p!n3v2_uzriV56lO% zQes0eh1V}irkmI$$vgx$VlzF^4#TV?<|nfrTD8q=1RIykcCZODPl8<`^At1>nO$I4 zVV(uMMrJqI4Y2EAH(~aIO~ULW_5s4hWO~5~<^Z@Pei51Hz-4GccJIO*1h-nuA%FJQ zI(U?94ueONc^TXe9t(3c;&$#Ja|}G*VNQT2ASh#PNDf-Sw}2-~!D#Sg1Y^Nd5R4<9 zNg$PYdy zg*u6k%b_mts}$;y_%)$(OQ;Y0W=_cG&-u4*3CF^)!HA~tJ1}D8@K%^rWW+%`L*Wz{ zTPU0cBN5>Y7|E9KHZszrunUGTw^KNqw6peb4h*MFc*k&2xD19u;r%eaLE%a=avWhd z8Mz48!zhr$4PN_OT`~$kb3p6;*aN*>t%07J0KFgv`uKD+W(I38>z?vpZpdqS`yVV0 zebS6a18xLjKb^q+K5y<@qb}S+36Dj=s(73agnOVo9uOh&g)M?}0>AR8%C;viI`G6z z@{?<-lJI1b8ka?}u`Zt$D>_iSEVBL=+mZ04NDAFw?i00aC6TZ)2rLgEYGp{Iij@(H zU$v2aHJJ)lv&3$zqOd$oLgG^kIi8A4)BRM`E39RbXU#&XYez-TTCb`^Jv&Gp&uWGB LRYsqvzytpSc&T|h literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCpc-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/KSCpc-EUC-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f3c9113fcf0b02e1deea8246bfd27408becc8401 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%k~kgV$(>a6RLD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE${4#z3 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Katakana.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/Katakana.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..524303c4f0c20e6cd19aa1d35805e98c2c05cb7c GIT binary patch literal 100 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe y$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{bJea$}HdW(NS2fFFMV literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/LICENSE b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/LICENSE new file mode 100644 index 0000000000..b1ad168ad0 --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/LICENSE @@ -0,0 +1,36 @@ +%%Copyright: ----------------------------------------------------------- +%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. +%%Copyright: All rights reserved. +%%Copyright: +%%Copyright: Redistribution and use in source and binary forms, with or +%%Copyright: without modification, are permitted provided that the +%%Copyright: following conditions are met: +%%Copyright: +%%Copyright: Redistributions of source code must retain the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer. +%%Copyright: +%%Copyright: Redistributions in binary form must reproduce the above +%%Copyright: copyright notice, this list of conditions and the following +%%Copyright: disclaimer in the documentation and/or other materials +%%Copyright: provided with the distribution. +%%Copyright: +%%Copyright: Neither the name of Adobe Systems Incorporated nor the names +%%Copyright: of its contributors may be used to endorse or promote +%%Copyright: products derived from this software without specific prior +%%Copyright: written permission. +%%Copyright: +%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +%%Copyright: ----------------------------------------------------------- diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/NWP-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/NWP-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..afc5e4b05ee6f4be4f17eb616742b59aee4c5ac1 GIT binary patch literal 2765 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 K#KF2yhX4S!xj~o! literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/RKSJ-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fb8d298e9bb8e090139bbc5e958f11a237672825 GIT binary patch literal 534 zcmW-dVM|kS6vlV1!_6jlIAtre^(Q4FZ7qdzD5oo@Ra#hW!6IgQZI@-tuH22r;(#pN zc3YNZS(fEYv$QPBvQ!BADC=#XqScEBemwl(fk!HbNFU1>Bk}7gaWoL{A8z;i1EMFU z4{IWvNv5>Xr0BhQO*h7LLrrNh->#lSLj3oW!qAeMaqC|h)->Tea;}$x{o$YmELjUc zR{7a&frS$QWo5ftfMs7cJ_O=wHmj={)2+bMHwYicfu9^8oM{H0876!>2>i@TINJz3dxh|M1o(xUaIPMBE=2h9Jn$=- zaNYqt-$(7G(`^H#%Fe=N;MX3)#RlNTFyYb#;5Saf(o zt}4K*<3p7z@0?PlvV!j!_(PZ4@LR#PPT;jP;l~v4rw+n(Kk&Lv_&EXmrIm2wAn-<< p@M{eCTQlLN0NxxV{2m4V(MY(p8+a>1xP1xs@6@aCX9<2q{{oKurl8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7UUi5rR$N%+UUr**PoYhZy+br u-e4w{y8J;XlZGnYh++xso>knU|bjRFGekSdyBe u$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{r`}Oa}lMG#?cJ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UCS2-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UCS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..d5db27c5cf1f5b0e66e16f6314d042a4ef707222 GIT binary patch literal 48280 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 Jqc2`({U4}20Ez$r literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1dc9b7a21bc59b6540d55b3d8933e5a6ba9f8947 GIT binary patch literal 156 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�ksTLal!IJ% zSM%na{~u!pzTFIdNLsq{-7t&4ZOgeu)SU7_Z<;9_^=HC#(4i)S#l_{nmFLFlE#BZU zVRv^>@!L+W+=G-#WT5h3v{0~v91S6R`$DiJV$^Zehhef02K}N%=6m+#VO9PO@d*Au z?x)@xhO->w0 zOFfHq&zG9q%u9_9w;kAs9-Mt#P3T9P$k*$Elwi_w5D~Z!#(Xg8rQ=H%;nnb0gI^7z zUkA~zdqP&3nR0N$*<|=@)JGKDi@Na^7s0emStv0TeQ!r1ONLA)lLwDI_Bqw(XKF8fAUg_See40be=ET|^sV$pGHHQ-JDJ$T+P#WR7cFkI`uz4 z$LD+ksoJHkN}G+DaL;!R`9iJzLdVM8fP}({)HrwGC3kYkjlmnpCC=#*Y(seB7oEvP zv@7PSR_dz~8P1!0KFH(qfnFCDkPAySS6tOsT%5^9oCh-SX*cqzUk@_k&Re)&pk;H9)-tk4J7?Z6ogbHF=W({p}HfHUSuNiI@O;pIW+Up?)M$=*J^Ut>2h&1$0k`G(-gUsss zWJ~=5`S4SX{p8PiWsP|E~LO16wZ7Y92cuN>B5qQ3TxfbfX6@G{fdv_bXE!|bXATdTJY^`eo>&8zb=T#u!8e>c|UOkc}T zx}7~J6v)PnAX8WfyG^yw_|BmHaehUUFl9!acX2@X+yUdHDQ6<6lf{KQG1R>#$YtN4 zZY8Un&2yF2zSB(`ylfmXIs{|i!7Q0L|Dp_Hn;24=9a5!^Jl;n*)`Jv9p$~8*Osder z)b15qxI-&@7b?2tk0x}YrgF`M%B=2HI)$k>kAelkNtk~;nX4KZSLheJ!6P?BpWDsD zHpI;uMfR=Km2 z-8E*9er0JIU05{NYyX^XG{U!Xp{i(#YvC$=g(tElt|vxGxfzNQiIip%N(P}fSN_m$ zxq;m+l27SkVwpgSoqAUeaj#UllxS6zo5=~Ct1(nMq$ZebstK}8;mu)6YjyzDY08Ba zQm-2a@5Mbf#gN~1mI3Cqwn6gGsj!z}~1~?TD=MIVLBO4X@<4N^m zk~iGBavm}CAV!p0IXYlzSB1M*#<&*hNj`G68+>v--Sb082^yS_CDouF^5#xx5hshx zRfveb;$i4>13ZTv94xtyTUAA(_B(G*|~5i z@}~qla>X2C>=9@jpegRBDW5`)tRs~pdCMF{#XzYfLo~#>8hiU4?G=2mr($0((Yi{1 z#5HE`Y|njC)c!ON^K_bKjyAx&+ECc7cTsPT^8Z)TcL&6AU3=d%+n0sig@s+pF1`2O z5g?in5&|J4goJ1k0z{FJgg`?0%*^(MWoc?ivXES4J5J&+jvc2s`Rr7uzSz%B{Kbh& zVmp43?ZjzT@jILEkD0wQbMM@}cWycN+~4_~gmB+{;N`S9+jxX+qHS|a#Acmj;nWdp z!G5Qu$dixB?)|$KLo+U<6nM^N+IpM#Il1Rh6B_F-Sa{QQqhuijjmuTROJ^{Kh4bUG zxNiILM74rf82G$+L0;ksh+P~CVh7Z0vngovP{l@4Ha~n|ZI~^_nvL>HQi*L~&&HX6 zjj_DdBPKo#^*peR(Uu!IA!2#qY}Vpboju*K7KMlH6-T4mZzaa~Sdve1$j_VP#0-O60a(v&Pgu}MA?)3g{VsjuFgsJK}hcQY~Z=KfH(WLOwa(ba4W2j6N) zUfITH+v0oI4#+Vy_g16MT9jfdm$C-iff?6~)Xj3thO26}7Ms1^5qd2()S97krV(i< z$pmbTG~siZj?^S_wR4HZT+*@|{p`kYLUmv{E3>$Ds^wBly?WZ{>#P2vqeMBimBXoLb4uUS|>+A z#SK=%fu-dJ1}z2}Zj`0k3c+z!>zhe(Bt|Tph{5h~nQWsscw+~1lF^r<-!2mrH!FCP zbu9RL?CA9rzKY0N*0Y(TKJtP|N1A;5=|W#)H9r|)i;P?C(s{Fz$r1{?*%J9!ies*` z>`|Hx6K@Y2$_iFznJ<=x29lgMyA-Htm6Kp%pU-y~jIO;gi!IFA%N&i&7Rzpolx*xZ zxSI<+0c?FgbL?f_!Q28)h*w^Tl&)1I@@m$`7KRzYVeKQ#*Bj%EPIg8x!m)b@jkuTk zR``>VnNN(!HUj~3BsVO@H^Plr8RsI5XnpqPK3ee_byE2wmE2>}h-G7{cR#a+$bBJ7 zy>TtcAgIIFN-g3{nUz+&Q7#E1@3A%rSe**8<$-69*3%NX+Cfr0bIoS+ebM&VOlx=e z;t2D~*|lPJYk$&>Y3=pA7~hzLpGfA3^Z%5>QzTp0S6o#Rem{QmBwO8K^k#<;Ew+7U zj;E2k9;5emNiUS_SPSgD9MJmZ$=2l%{nFtwl;rZeD)_Elcw|_z%R54wCHdBXo~L$? zEq1UC4mOgBQ;}Uf$%O4{p+U7)&g@%_!hVS_k2xmPm1GdlR*$pA2DV_%SwG5d?O+Ra zN?QEz$7P-&<_%$vT;|g->x6&sy4K1rosnLz*Iw@AHUS<{0u33Wg1OsO>*q=L%5a1U z^aZslTb0@q5ol{=tNoG<+Ws{u=)>5LF=rohBr^McxS9}rGj^-cK!VRIE*uADu!O~s zw4)*R9hOq7j{;UX=%0z>DhzRQvME#r1sX!=F2#(~oAjo*5`UOuQ3<3Lk%s63{v&Dl zrGx+_aWl}ShF`)^kRF#L4tggkrRnUy`j1paVNwoJ%phs7T%#ntHeKuFL4DUzA9QLap+A_pM6#9L56+x)NIl9`MB13#X!&k6@WIp5IR^v=O1H86m)ahHzO_ zRv~jKJyIw==t(dO{YKl=sH4~7E8lT=%vphr&dN|{g^>~ALk-ip%E48Z$a4Jb4@zfr zp3{=W^v;7-&K?yjbxt%nC)I*n;vNfj^cFddyPYN~LOe=saeLVjS`iw>f^L-cySp*N zH!_M^1?u92HZ)tOv5JK{YuG}RgftL)aW>Skb+^k>?23-J@8axj2ZY%$>pAW2NZX-q zew#|L*yVz`-P#(xaE@=ni8jw!y~|X9!1l9jES9&5?P~jIgb>v|mBXi33Z`wY(CEef z%*9AN=h}HljLL9S7Fg?oh5pcGMY=l!lN}RN3kS07H5Qh{`q&tuyjYg4fFHNz)5Kns z!WWYQ0y`J-mG%=#Yn54uO9+T}rZZ=RQ5fv;4(s`zL>G~W5EYW&za-Zji$Vk6A{d4K zTk*H@1_a~gj@7uWR7$S7>fgkVpUT-|r0#4<71&GI!bFIzn@}Z;Z&QgHx!A?7gt6O) z^|yNz7v>3h!WOCnscZ`*`O#EoR?#*G(T4In<+gIR9K+VPtHl(RGd9psq;e$l0S`xo ztZuDHTkjSLbg25F87>TEsMCZdyh?R zTG=t^t~%^4jee{ETQ8IbOG-O%+ZIMu>fLW%D39U`qaTi#xY|hjt$c1pY;17cQUo@0 zWe=y7JiLR>LOvxc{! zBSE`--j#8M2WXBqiY( z^NIpDvkd%Xim;DnG^(@MHN8fd4Dq$G{Ky+|8c%kSU`kyYwz#V*ePQg8d3K?U1aaoo z7X&h2n{>68v!-(^bAjGGQmt|QBYqtx-D{BAsu=BGaXUUDYrR2}Ez>lJ0eBL1jzOKH zNaxDIJr~&q4+-l8iqS@MQ;_bCkqXIJB9vjT0t7{!J2MHt*;6hgI<1U#0Hqdhbql9nWoCQ$6PB?UGW+m4eFTfDtfnsU$qqEOq!+@qQt3h%SSQr>E!n<4n!I=kdo(5m^CUu&^znI(uVV+bz}q2=tS*HN zW({PbVW(Kt!k=K*^V0YpuxD0yOPP>=f+X3+l7iJkNf+zP7i-cU$qTs!;ZG3yHMP=S zujRL4qALT#7K(7_N-`=IrG3^Y@aS-Cu{vu7DlT_RIFqA;EmQ@rSrS(d$uFqQ7j|Ru zx-4n6PVLwmbz?U1`aCHYM#PW|uLk88_wM1x6K}VSIcBn5!v;^9?ACnrT8G+YD7ik( z&{Vk6q_>9Ztzprtd)bo)_GDzBrwY^UYBN8{SFdZCs*Gfu1ZG*NowQW|7GjTm1e?2+ zmv%%tD`bnc7`{B4x-v}|xT$3Q%HHtx@w}%ayO)zHFP^BwsD_oHLM)EGT%IOmD1>h9 z!xl7b)c3A81$oA?^rn%8W|_{eo(Nb94%j@T=2OFQK9o(|IG1rfJ+Li9hLewnCCPZj z;}XMK5X1I}<^7}{eiZb2wJXkI8}_@8vQO(=%IFIN;52e8C7e6V;F}^hs?0gfoIAsN zgO;-;x5hQ0f!Bxps5OU#9bm3}w$jAbD%i#1LNSYxP9!aikD}hoE^m!@ACdV&q>dJL zk~Vg=gpRfj`X$~P63qyD9qAzv<^XeV3tHJ3FPvpdql#NG(c-spaULQ+ZKZz+< z19EM7$&mq`W)ioT&dQdKBzVeo^2lrBHP_}@urWmGX-@MrhI$IpJgLFls1Ojm(FvEf zrLBzf9fD5KF9nosN^@$BOUb&WV7!^OzTLtbxl3WpGpEez6HNN{q{ZYwZ%YO?hdWv| zuB<~(?v`rIs8lVgjSJL)whFxjh36)N&^5Op<4qVNMDyn+LiwZ4a+R%QlHX=InX@Zg zu<){#IGkH$YWHF6z!uy^qvZ}k#V6sYumx}L#6c~7NXP5nyD8(>_wfrf* z3j-KA+leL>F3(7!?m-pKor|wa4B>{wp&~5TV1+dlE5lg=E2BsQG}y+lLu`aJ&BRl& zpW#6!){qfL^#MU9%n2n;_ETZ@gl2nUn%I%f$H(E3WIhD7d_^_xV0<#|DVlg=Vn+sx zw(e7kiF!V;fC#IsSz>@S8}sc^C+y~U5-(#pyHbipSfa;L1>5<2-#%oL<}&^DDMoUaq++N`_88EYFJ z>{;AnFTvGn+wK9<$+DOp7{DnCYyvO0j_HJ0kPCSVolr`@&Cl-yOyU4j_*zo;$yFjP zk#Gj}fQQM5sY@_Li+R;5VOFi8TAcu%HkJ71Km{My1$@J@nG;O}S?p$%F6h-q|x7x6H6f}DKdNvwS!wH~J55hk~F5Akc2dCGXPMMaoU#srZ8@|cbCFq|D~PNtW0-_yAXtdz)Jw!VvvNuTD>F=Xp^tG_ z$~o@Z*<3g*10>x&>gX`h5k-fF%BfTUrg2KXFNou5>`oBc#6jRgH5{+|+B`W=&I8-z zUT|eGVzM)WHJ$@&5+O5Z1HgJd9c*(|M7E7(u#``mELUo<6s#E$V3UT!(rz6%ifh28 zkb&4M<*d1c57UQ%qkJ1&n92vomSVWFi+nf~k_miZ39LqDgFRfvxej1CIQ9uaaHTg2 zu5_osbrYV1rI|puGDxt@i;>s}7h^2MyB7uaq9AaSZM+YJX%OdSVBZ4Zm`?|L%>jZk z#KXnx0&vR6adMmj78M#;J&*@Z6@Q4cs)E2)O5fF87z3-5q==|&BS+3UaF^@@cR4xR zi7>;(TA>)OcVG(G+cdCdB%N494%lkXgZmJ9tr>3zUmMoI#i3-_NFiboU#AH!o*06) z`e?B4C(Y|d&M?>ysNoXX5cmcSU~7&et}ioqg6yZjL%US4He3eF652e8GlP9n2lkO< zaJJI$o_rn_&)O=%IfMbQ9ufqXns_~swK6G@!}#5B=|BQpl~5k*$(ghZ1LUw;F0u8H zrOk;9SWhP<(q094Qy6%YG_YJ61M4}M2$#lHoHxA=mbYr*s%{Gz7vU&)D^UekV=);# zz0=^`8V25aY=Nr<&L+58KMa?nkTiIbBJlQL0bK3GY*;bzt#CnVm%-K3{2Z*5Rl((U zehVxq$Kje%%!HMe1h^LM+74H=4)VVfZ-AB2V7RcCzG8eJTAzf?LfUZR!*3iklOjkf5|~9yTWt6500PpU4Pj;hsqc_P1~jVCrZycGDPSZ0 zZl{B|w<4^LzLr*o?+q z@O*bPd^w^Op4pNL&ju2<{E0LC4tRc2EQHMh1AMu6FFaerw{Xuk<9Y6xDVrIdJ=P3g z)lnOG_G~tMBZ)r+kCa!!?as5XIiZ5b`nJF~YWQaOdI-Qbng-$jG!Q9w$q;;Fhd2wj z`}t6~sc46Qdahe`Ib{coX*GIM73(0sE9+@tJ+v6?p^@(BliUtqD zS6gcd%Eimzg=Pc1&=LlZvRwEYZOuKW-wt2xpi}qmFyd6ap_$6~Uv*NVt72 z4W5fmf#>4*v+!_TH@tAR7ar9G!xJn8zNsjNCnRO?TnW~}&DPWKWPAxcS1#k8t1O3y zyC@Tj37*QNM)hzHhQbq?5O^|!3jFXy5ImY51Iv7c(Mc)@U;dZ5uVzD=ipY5Fb0oyZigqg2>>@rv~Vj!3AfTxh`Wm9zT2S+c(N-1 zz7k1G@+T_9Y@ukuM+UDOi0N-kM z>EK)4e{6wo&gQ^3=a%~6ThUYSt+WB6^6Pm9zTGB9!?%09CiqS`tsK8o*#Y0F5qH3M z_Bze*BG`7qi}Cy*yqGB#!Hd=OAzo~u@XARXfLG3=0e;G%1%5eTrSvCb;FqTb3e5Or zgu~CkuTBjRh+?XT`>zo`1^(-#sONsI5)x54@qLk>d>`zaQR6w(jHJsGxuNs)V}stGaY}V?vN|uNH*B8?#g$ zuQpoXH%cKAeiJ5yz^kJMAdhDI;MG}C53dpY_&4Rv@LB)|uPIgVn<_pRUej4m!f%e* zy5Y4}nrL6!r9o~vDzy~Jh9(XHP0q^ct!iO?@BfM2s1n>5n;C;CQ zKCsAu_{C1ZTU$f8x3i<+kNX(>@gNZPI)FTk>EX|fLJGWlQU&h^(%}4dxhoFdZjivc z^YpUad?~y&77XwCt#;mSlfZjasQ1Gi^!LW7eg9r7g|~-=cKCg8AbfZb$ndO37PPY+63=qP}1LTQ^Gr8X85pw8vb9GAcsF0Oz>e82Okdc$KaiO5NHv>e{qDuefGg?{+`IVJol`WU>|B1FOOLa3{~zmviH+oIsZq%in%DZdN;V5ay3 zG%vn01n}MjHLwp_jNCipW_WL^jr&8f7T!Cpg+C{^zyXoQZ#{!DgTMr*r;v{@9 z)dKI4w@;1D4%b+Z2%VbT9{oQ3}-_=ThJm&}dr+(%`l?H|>s;G<%0 z&;Jo|e znyl{(g7nT23Xg)~&LnVmW$WZiG@oidhKZulQR!{T4_Kf7?yrVNn0= z1XKKN4gx-tLH=iYuzXezVV?~`>}O{I{%)ot226jC<8uC90rJ0(v!uVD;gSY;9gT4O0AYbxX-xwq1wb(GVh^^AL>=-9WxiAk}g zZ$uh!IW7^~EiMK7 z??w7U7Jn#N9f(U=v}{@;(GHiY=u0it5};_Q-k+>dNy)Ym3*gdDf(8!kr#@LQhdw1aobhSmC}faG(P#2MrC}F+ z#A1lPczUxhnLd;+RT_-G9QwPytyDl?BN5H{{G*w#RYsS)NqgbjM-ALZU5y+nspwuW zwF2K!D!FfzO71%mM3*!EWOG!GWuUanWZZ_!GWsveD*t5wrCko9w=C<3@R8sT6bh%N zy&Q=%a$L@#idinEUb9^0*d9u)mF3`aA2rmKs19n01yTvRimBPSDrf|BZBbKbic_QO zG`-PH1X}1O8U}O+$vAYAXK-|zX}oolQyO&VPEnLvod(_Y{&?;F6bCdEub=XCAC^*- zVJfzJoN{xYfC4`YV-&eyq3OX%L^!w-PnoZzk(u{OAywImf9PJR_J``Iuq!Q8h?OD# z;{wprK&AGy1IYt4 x?csufALFRc5)hf(hAPmNNa8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7n+yp>=scVbr0e0##=xK; zT*1I3Al5NZfDtDxR{K@zi-U3!yHm(_c-s?}oq zcOn<8_wK#t%$f4eJ9FT_E685Ae#gcY%a(6W z>^E#!dY}I3>BADUmaJP;oH%XArp?7`HYJWc7AZ%W)) zys3EO*1*AO#l?wfeJ763&Ye6h7Z~hi>{q3aMsxPN($WV%j~3YfmX?;@``6E-6B#71 zEc1uQnP?XocB6k1<^ZMuY9!3Y1voMRs;Ah;aRE59FVorQ<4XH7m3?`Z{NcGj4G`=_ zwX^MWtW0oiw{EuvWo8Zds1)m#fFx@{f>4zXBz-7-($l9j)(s?)j*DqP@0cF5XF#GU z29o41kQBsm!EjgzJ*BjWRNKNVNMt6utS6HhXEX-}woN7&!AHu1q*4cKbvQ{Q8!ZE0 zm)7q9Zs@`FAb>%OYA#4>p5)3wJwvmArbz1y+ZtYAB*tXzVF+mT5w9+ zEYer+Kf=1TFcLFIz(`wF&-%E6xYvy}Rtvr~b~AMgHFb;pmfQ76@3_<-gDR@2eONq87J-U^0N94yN%+mIBw>5!dyb+TcOsH|~#;&+X)M)q=x@e3g{`G@W`!oSy6O_Pi6^aZ_t0a6B@s zEGybJ9~ZcbgB*h7oD0=OLPLaX-;OyATiB@#IF?NyAmgF&IAO4SD3sOA;Eg%Pnk`bD4)n~vPOcTfI$f-eg(C~(x)RK-n#o;J@g9b| ztKuTh#ER!P;U;&Ebod=!Jp$)78bXegsMXA4v@LV5!9~ZHsgH~i_h(!Asr=xhG1|sN zTt6D;o?M`*U8*`5EuY!Js@F@H$HQ=&wM4zIhkQ20xSZ#p#c39uy-ltu;3_elS`2ld zso9A0Y7Js}sOTER>UOCPrhv1zRq*8EM(bvFs9Q9y#e%Xhs~MAGY+0Cn#u#?Qz%{BP ziP5f+tf?<%SBdOkYH)bW5j`B$Vc}7eP_<5|n~HmCC)>8$hX@tJ#fm7YvbWJ?!etl6 zYh0$dQzp!B9K;%X^V9td@6P4*+hl9Flw`2Q;8aI(m?zy>8LvIr2gjc2E>^Ds_YSF| zo9g&*-GNDPQsy-(v)f>^G^X$}*=(B^Uo`?Z)mWG(f!FsFY&zK*BU|^N#TF^L$BOPk zp(;+QO^5x9_`VTBMHlW_DcPc!&B!XYs2oew_E2tHhMD#>;owSkY_`>$1p6{H`^MVl zp3D#DVb)>#kv1IfHdup?EY_A4@fxF**YNQAX*jNWRM5epa#d=ybs~;yNC(F@%@H9v znEc8*=3Z{Xk+!^Al?nHR;0{goW}GGB+R84em1C^hy3N9o8N7N7ZnGuJ_T^B&7T2Di zW;b57;QVZ4|>2*8VfgRd$vbCFJjTJzyA1qoWO;rqQjK=Jy(T4JOV1F!khRPR~ z8E`!o*`WKS!B|qi3yTjWNJUm@QoJi1b1TxUMn^Wd`*(E@!FiRl#eLmzi*0!y+X7rs z-ZRL#3Fp_$k59pwIaae<6;cz0D;$PMBhGPI^p)#_9FwK$AQ^Yz1oy6ZGzM9h%C-n* zkH+cyCYsNs>YbrD(-RV5AB?+Wa9z5gBHy;%wmI&=Mq%G3EUee{iN$RvR^zsPJ$S_+ zbyXs-+>TS4da$y5?o8#5FetZl6QDc+v+9gi!8MX=+kq)ZN+ z_lFpq>z7H`{PZ^~4a*su+$Fz~JZ;?noDbmCv_wTcq3&gC%tvalApU?AN1e zIBuyL5?VPDb5J(cNL>O^N7RaOmHDKpaaiK%6IR||C?7yaRoqY>Z(C*^YE7kaT+-=btIdWWBvk+`@c!ec;o>)Ey=a#Ql z=YT__b%3U#2Y9CA8bL4P(!?MfjD=XtJ>yMa*LZg7ttDX*haC-S(9Ym_JM2)*e=Inwc&O{Tpt#xn5 zz3wfzs*J14nCyB-R~2CuoSC?q+e6*mb#+6?5b|XqNFV0T)_4XAIhcz(gq(QCLR?;H z2(8P*B}vvaOaq*QQ*nB*OR_E7SfG1z*L7us-z%x$;ZVUg2(!1d-W)h-;?MwMlgpN{3M1?vA;^#pg2v7@&b8Y5 zM9i)h`IWJ-lOb?VB9teyG@c)TBOnR3-psi^FvJH}gD`ijs1G$H9WvsiLxNZtIm!zogD#pml_W<1NOzS$M%4$o8;=sB8^x3u?L9-nm6ws_4IM9tP8^4 zGp&c`TMrE3g2nLW{c~mE+M2=g{=Otdf|ZPeR;|)vchHLf@zMZ`_RagZf4vwdT%8oa zm!{rK1EL_v1ko&X(>rJ#$?oXb$8+J*Dt>h&PHvhPb2=X?w(#Ra=&ARwxrFA`&0FN= zJyFf;nm42C9UA)m`!3Ez7Kd4}syLEQB#U68q!FYr>k^0&RFeL{J4BlqL*ttpp^P`;X8SgE?n=g#0R$*Y!03T;8j;3ba@cZkMH59b>GHdH5~h zw^B1GyL8QZBYo+it*jdtApz3FLC_O=(Ky;jgI>@_M;ojW}pmi3}HHxQ-mlV}qR2mzzT{N_>34Hbz;0+~fY6pLnR#zP!k!6*e% z79HkjAxzL&$ytBQ9|DONvRo?6v zQ<#Ond0c;UE~sgUkN4eN?p>wwF7eLt7HPbzB13{S7CL;TW+L=q@k}jtV&Y6TqR2gQ*ulexuf*x-B?gYfl>s@1W?jJnN?uuC_P;>R8Uqb zQzN=_rMEH&KQ8%kL|m*z(^2}~-EQ#RboefpQOa~{GguwtG5b|K$;T%Y=sM8xV2sum z)4Zp7NAsSb=55U-&0Ey;9ISmXmGxoGD**lD0BytI&rqQ0z=I9Ed5=%iT%w7Nk-{y! z15YRyX2S%+^ zWGb>y&Q-F#fPq?4iQwF+a!}UDeWNim4OTJ%us@B#YNQuV_qEOpybO3T;| zyzw9d5^=J7CIksaAq*&Y5@Z%eLlA%xT`-7T>siXQAaWWk;RGFzAe4}0qJ&pN<5Pn^ zpoc2YbT9|-zqjMRM%*jBH`@}` z;W%xd$1oafnc&>a%BKOwi?)%1H6QF<1CkOdjF{WBO6zz>sF+V9s_Y8Kiou$wu8C*P zp6aGGV4EmdO?u~6i@w8IdOAq1FHl)G3N=8&o9P_CllFw)6B;T*}To%03h|pH z++U0}U9qN*GE5SboWOh67Iba)WO*zcoxH+g|lWAYhKO;-nlyIt>7-N2E}EWZ2NW2fSvmZlbZea%k`ZxO$Vp37Sfg)1B>O zxH}OPTIZgy6Ivp1f-(!9jS)Ux0MA#$lWBB)>tuTFKZXHCJxpVVL*Z5m%ZF!X_G~kd znCKBp=n-&sUbh@~9UdUmkF=;d%BkyVl3zZT4&}vqrqjXHRk5Sd+u!G4srmnYCX%4Y%g0u0`$v#kN)YnZ>IWn-| ze2VIP54C-T>d<`cp*~V=2F}<&9*zwc8um)IHS+%cGU)542qNKL*|AqBn+&eeM*Dhv zr+h}z^;ljrLp(55vi1k-P*r_z98)9eY9u3Sm}8Jwo5N4-lAMJys849&ga)Up^_;l} zkkMD2`XH+%2%iH|PJvr%E&B&qOa3sTbpU>}+7jAPb>l>^aDTynMU7(*YsI4*APJD1 zC*!gwBj6teN0H#{&adZ@nu9eHVnIiKzv|}i_TcKqb!6~W*RVVZ^Bej?#Xw5eO0+{(g#epPr^r zbGK|J`EdX(>w#I_2|uVf!Cxi|A*2^IcdliUth2cg#DY~CF^CkRw*22y;p$|#)~&$U zQG5JGn&92y-OeLKy>}OO?sP7|+R-u|Sx)1ty?Ud!Bi-M}-`_t)(JO{X0u6FU?S0R3 zP=g6A34vfikEwnC1|_u=7_!JYh!h%WiggaGoJ~)tEB9>CcsF`i;M)RxyNnRX8f)p+ z!wLANSi(1X*f@m7RCmy`k>NK>*$I6?SV!IQTVhl!Udn7RVAE9Z_~>qlW_1^DzSf)N zo#~x{ALQT%bMT)@G{U;ux0uR14gZ;fmzH^ZdB+d}D)NrCs5|OQE2mQUBV5IGK=?@% zEMiB!?PiHikkzVSi_}qH{#`O$D}k%I{K|AqhmaWGxrZw;MF;(-%=G{I{(7RAAyxir|H4?Wl?$$;%cF%ug$ zK=Up_HI250?kbszA0Y@P zSARkf-7%{VX|a~Vs72S&SovT+M6($3Rq7xOH=5mprBEhfRuBogu^#L4G$&^0$^=%q zShA);xf-nLQq6iA|2`*T8a|uaqJFj^)z}j5S?XC3g>H`Sh)6?=t|gJizptr@L3apZ z5wu#Nq%!;7{a{v{mPf_5^lj1qXF5Kc6|Z@=^4SiO`M&E-W(s5)l{WCjTOUl)c-CU3 zhQ&f32%yY;*Z#Uiu$#oId2nP1vl%eQ8eS09vEOxQ_KPJiro9*}NJ%f&y?7_$#n=}! zUo3u6sOMNVxy+2E!|2mcIyxB}$Kl&<7GuZ$cMmNP2(QD9b#P<3Y?56Zbdmuyq~?;E z>A^sv*?;0UTG^mB$({nxFatMXmVuC&s0t&y*ni<)CG6k~;^;spoDwBR7LGqUo|dMm z`t!8bF8FBfn{0LKu-25;1asi%p<}_VL)E`qiua@Nac0f@M#G5=x=qvRe{E-9B`|*% zXqTA^UYY=Jbs_CK)BD^DH?X2X3EEq9+j$w&w&;vP`Z3 zRH8jL$U2jQWSuQJAP`MOkqSA(DN=C>69ci7trhbn?8$v*dXIbPO!GKso1mBx}wN+$j^9 zNB>ePY0i_MP9T_0(^m=zi!0MeqYk?sY$lKC&Qp2TS~5Eh+<9TjGmGTJxlH-7xz~Dzg$4CHdI(gwWB%6wp;l+Byx*L!&vpnZ4HsEtSJVJyGI|zTjR; zbGSbr>UV|gU#fi&$()PPax?^zcpuV$BkpU{l?BRtNtwk(!Jy2i(0Jrs&u&f+q>_f9 zr}7f!Iwpc+p2{&-rPb>w;}EnWPIE?6PAYI`GGSaxYR8ciH?kz)VKj!ooCpe1^-2;& zrbbJU&e5G~MTufe2nm+pC1pJU(!dlH1+M9d-D!W^U9uaSe8V=`FQDrU0r=~*qVrCyL^MVPp^Bq z*SXcFj+H|wI2^BesAvD!$$m-|@H)Y#vsvWLjvxA%^FN;cv#jX#&?g{7nM$Y{1OF z4HV9;C&Pc&^@HV`EYI>6Q$^j2d|5}&f4BC~G6;qjnebu?yeJA>wExfw;lu zC}|y3XrM%v&}Gk#cTfH%k$jwqhskPY;-2A@%W5biOyFwF62L?WrIyw=ff=c^r-d$b zrB;X&-FcK2swsaIC2}BSKq|F+CFvIF7g{JGA-BRUK^^a&|EZW)M@SyRRC96uK`z)L zd0iBgPuHL8$6Yg}Q_I8;2g7-lc(@x*sTfZ4JXv+t(i!@w;-dA_b z$W9LkuFa=}eSL+RROKDg;P2 zk*h>1Z*l^Jfs^;I7SdEj@@SdF2&gG12&8OuCE>3#?w``N*1nQ$8kyLcBV`*ze6txF zQ}r5Unk*_qjmkVSuQQka$q1dExl*n(;+JZy3JUVBQ6NE&`!gCw;4_1FJMmvyS&6XL zk0Ydgw)Dm{2%>MCwcVJ4Rm<_qc_E5P!lP;U?I6j!*}KELk-(>9(wHf9pKYq#!t~56 z6X^gViR|pY8~LJRAO#c+i-%-RW!H|g2M{+DM0T7#SGnE0)VmnJ7>+FoPbPOmPny$! z_AYu^Rt1SzmEkGE1F7B#-ibn}cMGNM=df}Q(@D3j|GSVB^^YPuWMSwS zPirod5?!cz*vmcCQ}mA#e3j6W(=QlH)mX{`XAXR?#XFP4mJG3%3aN6_=Py%fEiRnG zhHL_>VHELN5?ISX_Mg=d_(pKYg)1MFM0qw!FJ?A?(Q`-n~SyBFovDh&8J_H=-BJ@z@2aWWy`O#+&#bC z-5!Xqcemnx6=iCd>m6i0YQRF-5lTVI-k+SLAUY;9XCh&uOJyhe2HX~KlVhW7A1V=V zCfElFW#e$HgUmeG6|Qq^<{(#Ou(CatejOJd`g+6Dci`!=UpO=}DlOSHVkkol0ixkP z>drpuMOOGv6a3RaxE6@-4dN#Fdw=-*5c*8zga5|ZvW5JE47j_P&;k*BT&HpAG3U&D z?$`?NZh(*S;PC_+ZxiskEr4@j-`wy^LzyjBJi41!{qnVjsjl=-BR`G9OC~(B4L|Ps z$64N0GYU-TzACjUxPTt+jSTfT5J|+x3==jw>gs#9!zSa(@BF#bpp&G;~nL zG7TA102-)>P!uHRcFgpRp)|P zy(EOz3}~H17q{j>Yc4m?JI8W(oDPrsk(dSeW-WZRODvBkx`uhXFo%d^DuF#;2}(96 z-jyCix_adTT6a--uaDU^lQ|1woRf4LFn2R4*_AukFcudZ$TY82d>H(3a{2UMP4mkw ztR)>!Q`zj)-sZlR;T_iwmM4mT@6XY`hM^4pp4_S@wnoVn{uT=@xvV`{c)S8WmMCeN z4=rino6U%<7ci%#JITPijXUzeTL9i!+?hf?CLru=P%;=%Rj=}8UlwbeND~#@DbTV& z@Z>SO5uVLv#EAHZl3pr9cyk&hS7WW=L=*oa(O-D;fmG#{N#T|8pp2tcyMFl(0{NnA zhp~JmyGprN20tpJxrBdS{t#e4!drNWRsVyOm)4{&2AiU$oVWhs2#|x1f4QvLT zcZe>9CQQY=g|1nw+VI(BzFrmQVnAAp%mB*h~DNhhNrjGO2=1Ww6E-*_Lby>N^t5)RBZ zy7a{UBOg?itf1i;KLL$P%~yGK`M1)C9vKk22UDzCI!+WssyMAJbOk` zT4<&oFj92xnM2i7QAg>Oy5r^}tVqSN4U9E_!MzZw7YeRbp{HVnW2?xZZr%BO1y(P| z>Ukkpm4{WMLyR(^!Q1v@*&OuL)FBXfzg_zIl7O+0s0k&|{na9IdX!5s9qE5C@$4dz z^#QP=3w+n{uYpqed|uWs>~JQ9?%QWy^i~_xpPN4K60A`hG)7Ba$L+gkC(_plu~1Kg zQNY0>b|sX*Qfx_P)JNq2XdVdGXn5Ke8WZ`ku@J~k=)sQOyk;PKJ6u59HeSn_cdPJz z4>&UeTDD@&V5STap5-%TJX6N;&s5yI2NZ&tMDc<`>6I1~9nlDmk>pps+ld?U?&Z(d z20YI&@|7+%_(n2c7R^E>y29bp?wIvy4`^A=T2?^I5@=Z?wkOfamr?LCP{9xcPhr5} z6VF9R=Jw4OgGl^kl>IsP1dIpsRc=}wN~rWt`yBwRe@i$nkCtDxu=M}*t(czcK>=uK53v- zKbKaFICApm_wS)Kn}R6Ed@-VaVrYFXoU%~3e^_=Rt3CA9=+{YKF2-ZMu|D^QuJ{|O z>6chmc06pjLHH~aKFEUBwea~Y;ZUgX>3DEYCqwY?Kw|!+7ue&$oD@s=oAMqam;=@#yqXBUA>^GU z=1T`(D)}m3fAICCGp&ngZY{HUOA&lN2VO?Q%NTeW&g(bx_7L!I2mfy7Si!!ftKiGU z&>0IA^NAg~P34~Xf^Q=KJcd;1X)FYKD(Obn9`vhu5ZJB(K2KS$e#xi=&TsJ09DP2S+KoPX>AyJJK9| zHEQqrh*(8uQFWHyDj!Q7K{;HIHQX6bxrxRS)>(Sv#$NJvD(*-l3^#^)Pl~`fhkRgI zpaqx04{?D)G;>Y_=RD>t1ZOePfMRFqb+j(jR4>BG^`lj1%rs;?QI+Bhb?ThjCo7#3 zpU-e6I*IIbhCf;Qq}bWRV(7%jjU01aX3$dUo4cq>Sf*A}K_^lLDwq=!Vlj8(jazeZ z5=A~vG0P25wu^WVw=9%xVr3hdTg7P&gg`~dAX2ry6K{P#lkJ-;@7s+F4(CXYX}nZvJ$nuSaW!yRR=<)cF#lExglK`fxS4dlwiwZMKIi-O;Uc z^s+D79qW$pWw#c&!`$KSzJbeXn{ox`iUMP&Z9i5F!aq;&CHZ1}iN1cm6s+itUruqZ zRJF|i-;$qFEmEiLOrr+yv&|GfJkj9Dp^@0GHBFXVCV#%bxvizBWyY6#JgJ{Aa|vS0 zqJK>M$0RL1!d}`m6P#=55q8^$IqIm-C*a+ocz2R>OG{qt+wFL7p-baj{&|Tdw9{VK zG>eCc&W*HQE{Qw$2+qBND^yQ)NSR8S)PU;T%bh#H6~tX8aQ)(HtGVcz&-5f<`+S|C9^vNNDc| z^{dz)I6OCie`nyUS5Az@d+YJu3jan~rEOi|m`M?Vjz2gtfiPLNM&+0&I7SnGcZ}qY z0g|Mll5nTvo-ZHV0_Li?n>ZI{0Cx$v7m6yP9o+ zL_^geUKK&keqT{RXs7e+i7DSKecj{L^!6~`u5K5;+@lj-jeYfwdtzDtKh8m~_D^%Z zTJqH@x`p#W>q7R&IqNXLG`=lS$_0Mz_E{D;&f^!E=+I8YTxp;Ba>lC3gxieOF(Wos#r|VjKSMo8P z;|p}1u3Hz0z_h0Px#Z8g|FH4*qyL)u*DUO6N$M;sy}Vu3JOx^MgKvspjio8tVgvqe zexTwk@V0pA12eRn2;z}rUo2Lc2Kt5bVRjwiRsK*#FZAFE(?#ny>G9;lPq^DQBr?wYHqYBZ4@n<;oxwT|AY$ZP2|)`=9M zjpSNXJODSf7S`!L_j4G@z*Fk(t}MbsMR;g~G7JA$h<_ZU4Am-&IbGwaxE@4<^3(( z;4NZC0#1xTly?I;bMGSX?kWiGEJtjdYOP;~?aQ%!9sYR{{&|qu5T%IT4Pi;9maTrX zcdmC6>2`S|+Nh%OXEG;(8FAp~%JJ)&Qd4F@SZDdgTbsQb%v`Ogm7wSO%4ny~yTs_- z>)oj`awSUEI*p_$6<9S0LPaw;!@=226)DDfVGvIXRndg5tg!m=p_Qb0;x*;qT?>`J37OJEU_4$LI0%7%Lb zSOWAWC&qyig_Wu#T09jb(Eut>{b#JorKe@6y!CL;r@dSuREMk0#Mg^ezS!iz4IlqJ z0WfXQOgr8>- zDM0pJUD`Ac{}76en&fDYy4~Pci~f+7)ro>%N8Wdt5$|%mtMNlYL}zv5hqGIj`DL@I zWtY^lRQMjgR~cH0@teW;&8QFb)D?Lo7VCz1mbEO4{Bk=jPW8>Em7*FaIycK2YRCx! zlS*I)-7lLZEb*PyS3fKup}BX0Cx*BVEvT@-(-pdstBzucY&7Y+o>I3+3Vyvvo&)(H zl6na7&t~o!$vr*jy@q5_eHU%Pyly@mokTS6xTE7pqib$p`D}E}Y7T2od)ez{Gh#m%R2YE4R8s$;8Ti<(^KcM%lZ>s-g?fRo&DVCLkOjN}nw1nK~aqoYC~ve!O- zN=26-URENw=Yo3%8DD_)pd1E*g%CK}gB?wW5N_mdGih2~B|4J@YX&{A?&68%6r=Ft z&G>7fJ+{4DJpQJuC8)FR(dk^0a#jfFDOeb2hW2!@kD{ufy{BMLr9n_{j(r$eT;0PL z(=eAyDq>|{6c)bvB5ZSbHcU?mNQItu2cata=0DHMDvCUd;Q#Gi%=Eu<;X-jiJ#2d}rmkCOpE z))BA9T!9{?%IWah1Z^?!?NWv(2qP6S%16i-Q~E%oBigui3HTW}S4;mE;dNj5&mx*% zF>4F{Wg@Z6y9cwL%%Ykir^X~DPbOgDqxveeE+Nr+y7E97lK*G~X9;smrh!n(jgMx* z^TF_ehS$y_Vv<>ti1}&Gppz7U0x9G~dP_)B{B$;Wmyk(Pw}p2xL5+rM|5_v-48>WM zab~UV@FsS6EzT04ZX9da1+}JLRddvpv$3FZE^m^IP1=~c!L)+=%CUYvd7vh1`7ZBV zjo!OV@13aej`vRY7E?pULhfB8n7s=GBVF6ngtmT!Jev;R)@Xm0@u^wm-KoZ-!T4>E zS&P6tfDA%0BaWomM{RHi8fJjPR^j|-t9nT zc%pMHmt>Lb|9~BB1BIF)yk)&WF{A?=e{uYZ`R_SF?eN={Oxvp zZ1BlG3EK*>Z5{!#0~bEr3va^VO)~QbQfd|W)ubX=x*71fL^0sN?WUdT_7qPaztFN% z!UhZeegp-OgZ9G%M2(;ooSQ`FN)l{<$s)ENxRdDr&V!{NmPnp>ftZ~@|0XqfQ@e=d z$qTH8${nanNSy~AXkDZ}G(fm2t4?*%RBosA;^1Yh8;AeXw>@0fu4&h{Z^nmGyX+tA z@Aqnf>h)m3Qq+0Kemajp2C1*!KA0+Gw$-$oiW5*t;W(HWMxi-dpl-jGmGDU}P*&-h z&aDeD+m*=OTJiEAuoEBB9lQ&u7p{Da;3{BF0#ow4^_i^W*e8JSvh7P&9t zE&khGCI&t?_XjoR5_u8m!5v8w3s5(cfjpc<4!(K@hBQBrz}L z?+eLYBvJK`l+imCygA^V!@bJ`uq7L)4CXDSuDLAla`JU%`l0-90bwUq=VAPa1@@H* z!AB>k8VG$wf-~Kc*m>~bi^cTpCtES|$u{zQCU~9%2LyP~iduw$)f(=W zrSlUpzhaNZmCM|M>O>K*93x(vDn1#{uB|m4wBRIH|5(o|s2xY$4#$bbRU_?kqKJI7 zyh8G>7tDAw+-jZYEsCJ_p+$;B%5!vog@GC%2^o6lP*;o0yh{PAHVP+ut7_+wr#*V* z_CRGsB>pj;nsLGuv!YdE6eIO@hxVX8`Oc${|FRP^zZ*dlO#!Mb5``l}5*tJoajg9I z$dCl15)oqz@5=)R_Wf9RU?m2Os{KrmIEd_;G!~koi^aL}ZykqC9 zW-FEL8!Lga@@?QMp1Tu-^2k%Y5s)<-N%7|z4@a%?x%5MBR zp9FIJ^t~k%mLX6d4FzQ|y$hz)R!34ie)HZO13J>H=i-}Hva&i=>8ru7y3%;xEv?&puAsdKcr+7_YP4oO z>DGyQBDN!WkYo&S0klS|G;jBXm{h*-S1VpmZd2i769xAZ_kIc$8Yff0J847PTx{EmA1D5?N6!d< z0)EjQzZl>b{gOY4I0>Sf#6 zK=2O(e|KV(ClTZ_kefSs<$&HF?Md|HwrukAH2-M7tV;AJg!S}mg@W+TQ>AEIAlQe} zrYn2DmTmr=ejMvL)~ynO$a27ma`v=!OQ^SOJ#|WDh;GyJOV7F&ZnCGnFQB%!u2fJuQDCktntiM z(Z;QuCXw4_6!hvmUHfDtf4Rks4}Gx&-g1zAWtWa@fmpFBdpRxA*o8@W@{z9Vz;8(#s7mm(%}6FQ>d5K9tt#OzF=V z3_scnU(9Dnv=08RuYeDV_%A#!;d3&cGxbkrz0Pv3Z%Z8bHvDaFbld2lg6PgON1qn` z%zqxy|AXFmcwt+7d|Pf?aNB^kfzfSQZG;=c+WLnX-fVo6)i$CnFSm_)9y`z6Kei2X z4J?{$~d1dv-QU| zg*s(1R8o-!pKW+LRSZ^_6%kI-5K30jw(VqscM(L+cMn|M_^*+0+@h^Bs1E394rgya zONdMOditc-i+THq_Cy`|mvg1QJ?#b~-pKdIwGaAorzJ+)J`6t?SQpZ~iB|Mn^|N@^ zK7_)`x%v~k+q=eOj2+ybi&w@pr+za0lM(IRRPFK9<)!UBck;v*vttZBo0^TNmuieY zP$A;9!@2X^>1S~i5PA?E(wLb>jwY1dgHS}Kn@G@cVk{p)qBwUR8+)=_Q=u^*jz&qi z4W~TV&W->=y>$<+4`a19R3<28; z{-OI*-k;WSo@97Em4to%(b?718Yl!@<@w7m*0X3iMqSnwvl18~ecBvE{Vkp6uVcj` zihfsC;MglGRSk2<-Y!(Mse6UKKNOG8=}gf^b@uH{kLU~{W4UkuD~i7!9n;wb@0xt; zRGlH6p`G2t&fZb6=ZBxqC4YM1()oF^AX1G6#}I{054do-J%f%=-y8qs<3+4kCLK?O z3NybnRDCs&tzUGs50vFk*B?o!%X@#0%0%C~Sp8Li^w6=lsem5^0RF|MfAqW-^|p_5 z)ZbRW9rSjjLFX7x&gar`$9%A>S=nl1eWc2{Jb<0a1TUVxD9hFq18o$Oa2)-Ql~zlr zHF~tvE-p9&o52L~R_?Cg?#A2{+E$Qw?uSaJo^>Vb83R$_HCklBSj}2 ze-_QWsbE{fZA+=agEWt`V@cBCT){d}z=;A<^2TrG!+VAY0q&)3s%C zGLOvXqbz$mFV~zDp*@4U#}P2#{PjHc$0Fz)#J-J%KMaAti0}<{{!bwOQT|0r8!rI9}hgRU$KBSD--a9Vb9AzyF z##wB;R)Ir^O{qptUcsw4D z_fWEx3}t{~QL?PgSgSLJ(&FpyyQfnhpoo?(0nUXwbYrCu2<0)fL(Rm(SSa*mY8v15 zyVuisBIek01p8vjlI;`0K95J!?mv4vvv(7z3mfct^!)4h&~B8@PsIhc9A4j_@WqV_ zSh3EEns{%2?^tY;u_8(d!q@rudJ@$WOr1Awzc-CU?43rrU7)Bw7UFm$Dc^kXt^(S- zLPuxQ;?lcF@=Wi!tJd4s;O|%BAEFc)_vPch38_63D9xGZothLu&wKB{dj*cI{$8>- zM~#(>@VEVf;=(8Zymz{y8#%rA&b~L(yGjYieHplKmk=H0?NuIH-p!lu-9fJHy<1g# zg->Qm)P_?K(s{G=_6!j(rQ@YO5&tw@r{Ad}r>#Be7vl3}N>5`KGkxXe{;D0cOW8m^ z<7U(C*@XBw7YTIsWPwEL=Dzns3!*x2p86phpT^-ocj7;biJwz->8_;rQ#3DvE2ez1 zP^SzvE0S3ms`QhTB&DAcPoDJ_R&9=O4g|F}(5n{=akL>cY;urPg{*b?Q`JpD008IZq|i0i&@GHAzT@p85L=W zqmkV%eLomaTk!N$lSCU43Y1NPQLC&CynWIOKii77gaJBbR(KD5lZFig)Z{~NU)X09 zdVs`3cpxC&zW8Vi$a28B37xl3VZ~OsvP*YmC+Ym{JC7#$60l`ET8D-EcKhZA`Dlkm z=bh3=xoj}$<{kS!LsV!lU;iYtZ>+($n%3t|^`k}HH^b-~(>F1yyDz(6PhWSs)19M@ zCBEK*FWWb8xNn^=$ETyPap&AV9qr~*NhV*kug7oJx(EAu`3BSJnZ7}EB!ME}oqLVD zX-Nbe&qG|H;M@()nS>Ig&N~l28V&A#Xz9y6a%5oj?mWW!B+R}sm6h$Fa!}b^>5P#B zVYR!*KC<}xX#8va#j?)iFABlBk(C?JzR4eF@MriJ`nLx87yI-4eQ9;>-aXJA{OiF# z0sQIQ-wXWVm`R=F%%4ErFMg3)Fa7<%KdvCI^IqkFVJ3XO2*>_sZ<^V^?K${Y;g3V{ z$I;ll{GS{AyZw`+g8d2p6jicc=g(0Yp9}s%e=?2z-jxFb2?j*tOr7jZAztX-#gFDo z0_y@E4K;X@JCJem1kn@VA_nnvTBCcnzndn#8;|2_)5Hrq2;0BE@9=_G-CqrO6^r&X zv@d%(FYJ{*OiX(<>eV>&tJGJfm%C}9-oJ2oF`-$y{K}KfRH=v!i41=gf!=iV&UzKz zS=hPa<(}YR;x+G=J}C%(Wqy_PN*6*KM5UMOqr0~+tIY6mPq4=v{i?^y zt*^}S6>C3TPP%gc((zax!6Qjy?>9YJE(k{2)A-*WxQSac0k*vww00DChvAPyqp@= zwu6-5LEY0`(6)l)LOXhXZGwg(_)jmPCn?~Aqux;Iw?V%R{cVsQzbO1UwXCFU4b9`h z`Qw@-RaD!`gtkF#)7uvFWc*^!zjvEs2y$)|`-T!<@yP~92}$;0saJrq0!Eelw=2p0 zJgj=U#m$4;SG6wBBQ8 z4RU}EGeV$F`taCFi-v7h!+)O+-t-a)b!rDs) zWsoEvm7XmD{4^AP2oy3N*-z@)3)`o)XTIt4rvF!&Uzz(!?W5_|k7}MxU;{`9)DT1a zDcW-hY(F}J_F=R|As-(O3H#cZ`nve_&e!X7uQ$5px~6G^l4C>p*9l)oe{I&{rOkM0 zHx2mFz0=ESD=bkmL@vql@jF)GZp z-j$siO|_ZFjpu+zaaq!Gov5W2DB8?Kuv`(&YJezp0BsXye266$}9ivGXgKF8)B8)OOj z1}{36iuQ2Hwv>tVmuLD1NMkNhhqohK4pe3Wr8boykqqb$QaRHsVc+2OYg%qyPk+E- ztbGZc)zR8eIgHpSRR9+-BWP6v7NP+Gfo2M?W z8L(j^HWbs|d;B2uugTh=V2k*Tt*P$+v-BQtQC(a6@IGxiy%!MyJNDjTM8vMx8!GmO z4NZzwp0VT)RBNzA+64K%NAcm_11z}~&=i~(xal2}5uOPz{)VtNuU-Hw&h zk|@quZ0oPv!|~iA7ufZ5(;Bn0XRKI+ro|F~m`PWzDy{geNne%$B?v zp4cxZkXD7N8H-L|xKn(`^>6pnaHB|bfaSp*@fPikKPRzi18C@lNM5@&Qf1K@3pdgF zoqtVe>en>9X&N?&Z|bHJr1l<7{a?uFwL!S7uIAWG`_x`Ya0CubXbAW$y7Tv8=>RWH5EB8Gi7Zew zGjP+uUQl8{bQk_FgsGg)oY_rMf=K>c_Kqj>?FvR4OQ&4z!(AT5r24ZLwnREw^tn{K z;`f6zF^;zFc@-mdw`1G5Ut;b59)D_A;~YWlYtdJhb%RwAsV<1Oqf-F6imMZqBM_=# za$0YQOu&A`UyI+-dXP9>;6P)9!Lu4q1s$&LW6_^#Sc4`K6^}L~n4cdSM2x{4I9`k! zS`u*c=+VS?STkZqIpZiphrNP9{Z@){0Qiq+alre;P#7Fb-3$h03jxgsoGNJ^Fm_Ij z2dVx~7fB{zGZwKKW9WjjtCc5X?b5f&PcI^+z3G%{XW99=eAXsXx>+dQLQaMf_<2jx z32P9YSsPg#-#D3u|JC)cFnWKICdn0RC+U2;6MrF=+?~RtjwQ*%$&mn3)M3m?q+Ptbq5Yf_hJj5Ex^=0S&M% zoM9bRgJGfH#p+`)y~e6b@nV((UM8kMzZV0~3B~{f?32JiK)_`&R{TANE={-Ri+4rZ zTTID!Ig>jl`OlXB?BE{Fc^>~T;^BF#`p~b z_RdatXFDVfpaxC?eU%7OFhQhnsHXge^^zj+OTm=VZU;C_bimjxrV^Sq+RkXl=NzO< zGJ3dXtj8=RU%fue?8OOYcbU06YxXn-M1`SA(fs4hBu-NvN2{wPrTo~uC)-8FyC{bD&ET9~$vr>M zp!5KoPRjYa5*A7`;DkKcrw^wu)}>7N&sI)Q%Pc9k3&E!bwPhu!N3s<3)bEn$b~@^M zz;aR(?t9>_OhJMPN_dPZ0A>x&&>?(x#6%$}yjuA|2eQ0rEXzTZpV?|v8~hfhztnC`>ZPluf@tY7Cw z>!LMD!=8rW3DR!Y%7J@?)X#^Rr)#brcBMCG)0=CZrB1ZakG|ekzpg7 z+DI?X8VKK?o^@S~Dzhv0ZM3Cge?pKd{`Ck=*adf*emtu`{fj;A^Y;{b1Wm*9|32{d zK35lW;Qe4+Grc;iFI+Kw9*$8+zx2O-KXvsGXo@RMar-d)!=z8WKJ}JATJ>lHRzOC= z9d{|MoJs#Z=?sZa$-7TSk4?%uyy@#*^J6#(NAI{krGztn|&^H+$a1;At~&m-VJ76$yZ@?JSws8V>w-edH3Ju(t<5@vu?)I z3W}U+JXMD;UirI#mIHzMq1n?8m;Jed*oJ&&2heeLS~EC;Q!8(_n4%Up#(GKSt2J zRWFyTy)8M~k$u;aYsMQ)` zr6L2K*KdPJAUa)BBGkPs*=K7(9a81{GbS{ez%PWD93`S818eLBtv3!RH%Dx9$UAS6 zG*+nF#ubf|w~W=KAV?^hK*RF_xGWzo6;sRQF--Cz zCWlj)RFWgULdIT_v5(8xD=l7urnC8&uv}C1^q=NGi=vknW$dQE^n0&rk=My#8@WX( z3+!~h@-$D@upX&B?v5zwM0*z9Evy0EF>t-PM=!hB>kfg;4<0`RaYPb34S_)+1{XQ( zm_bgYkyvtzscy1!#xU^9>CBYPe9;mt%)Gq2eH$6>N$ivT^!Ze(pYdehlfC%b{shc% z0@Kf{xZ4w9g((=3Qr@}y1DodXXm@N{A~;C6ruj{aWxK+Rt({@%~`mq(IOpWldt?(j*cIVEAaD!40!;jquE3 zEX}HTqc`T>9?1y6M5s*Q4|I}YI4a_T<){YTReZ|spp;nq%waT)Zo+ULOR03HKP))W zEpzZsbAOsiYrEU#-F8>cvK-4jy@%MA5Zh8>i^NW4$6Dm%_u1t4IYc94UL7E>u#kt7 z4-w4!e&i1o`NN6%b11JJiXvNY=1455pU1UB#wGyNeHxkwvi&4R7r}S<5@T0l9>N+n zkVnz1NkN|MW1hs~JKN?>e)J%117#WW7=09H>H#y>LwxV6wd7e8`L-vQwvx1Yvc?0< zQ#WFr&7`>!yoO#MK-J0E;`@NsAQGZQAob}2Vjd*@atZQiz3@DSJl_iO9lV``$O?uz zj_CZ!%l_o$5azcvq;n$N__0fWZdTh{j#d2Kha?`5riAkuo6rzEDP=8On^x{9;{d|Y zc|@KjWlwLyaxFOf%SKZVTwm||M9n?i0|AL$591IK71X5<#d<>WN7YI}g&2|eLWo1E zcD5AM*7}Mh5IWtCkqBtkmtYe?jZr|eGVcsb-x$Ccy#yn=wJ>3YDgTakIua)&Z)K9V z@X3p@$rN6?Gmw)#+98!ZTJ&h~qYaOCJlgbV8@zr|`mtE0el&Q2a8EOdK9o49m6jsy z-9eDMfcu0jgvl4(AY!orl^7UnQ3BPiWHTaNGiJdt6_pqHI5e$mTHG|RX@yeJ6m5)Q zF)BqDKcX+hQdCP*d)LgR7v|DOhXBLMTa*AC+z{RsYmbj+b$byzp~sx%?RDO0$kqlR z{YA8=cC{2Ipb(D)8JV>mD|!nKeu}$3mbu`7B7-=l;*vwWA%W1O9j;h>l&0C^lEvq! zZY{mx(HSA{oZLB8DG|MDNr8Sn$qW)QyA!=PB5N*r0e)M2>oi0F5XOfo6V;q1f?a|& zR($P0yTCf-ewhmT{w#7qMb6A6-)(8S5z{1wi$W@Ns`LqPhvI&WsfX}(1Fl{SxW$pUQ5L2gnp_NZ97 zW4e!DqlN`++CGxD3h|zpda!3AxvDur)oiAiBPsKpsusXS~#yt9IDWSs5Dsd;=DSVRx&zpn>cllrR>`CsbDVJ6FF5& zL4=i(?-lIVp67_NO$^&$dF9&L0bKnGP(hGl!bPIZke#AmQnC$CNenyFKRq zta%g=mF7kN-u~}B@<;n%oaL3d6M3RajR3zW6jL`8)=+-x&IBZ>u#Yd+$ea3Ome4?e z^h>noax@@pP^BVt$?n7E*s+kBGx=hdtH^k`;=l3#J&d8`Bn}^^+d^eR$5;eb6(t{| z$Q`U+!oy)yocwt=qUPgWwY@qcpRA!bMs?2APv>kK#aG_eZ^iqKcij7 zqn>g+h`Bq6POe^uX{$K@Vm71Q&S23bLK2fsKOV;%jln>iN=jMHY0{TzOm5V+faVLp zmu_qTtaR#V)*1$Mb|APz25)h0 z7^R#SV*=URqQ+jv-WWo_AHrfoR67mp_7AtDq&Xf0ZLYtgC) znvLaj;>Rslw*D)Yo|*7+Dt9*SPWMMXoZ8)TI6-tOKXR&?G zB8VP>9&R~(ksd({$csL#jX$!i$ z#Fy8UP37p3m1hqc2eF*7k06n%`&z25SGe)o06IB|u!+IsVRzw$v&7H?_amU7%CXuA z(&$GT1M!_V4QCoAk(SYVk(Vnk6ap1F@;ore7^0)ggPjCnSOUrapFj6lqj zi5W71yio-~G}7Qt8hSGgo}|GA#X%=a)s45K*zzfK%I!!+lB=ZDjY;w+N!|GLXg;|g zvzR2VP~~ivoQ$H=)3=d~kt(Cm$$+T)$4j!pf_U-d!StWQC~GgUx`I!0A*U zc{^EkXFO7}>a#Sh7fssHw2ht!y5AR|nY>|QLu9kO8L+ga`UXwwO~e1YifO?pj$~TK zkrtGaEH$QwTUy4ns5!o6Ld#(8PK4UQQj>FhE&>Q1NSp2u(JPgrmLq^K-7Y#=KaQjf zX63xjmDMRRiZ!`FLKN6Tl*B>mDNTxI(LIDd0|hUq)5M$P1vJkA%D2>1H{1v`O`H>&qoC=f8|{k@~iUYP-K&;`VaJ%Se2M$zINVxq$yG z9Ip7>#pg>9w1V(xIagcRw=>odTJ2xH`yP9DN9X>|Xk6rc!tEM&s#%7X zBTp$?O{g}C9C3lugrC7Jy@SFIOOYC%+`?QEQIhk0Nc9vkyb;|DDGp<3=5pBmO7Yd? z(`>v#1JG28gok|YPG~w%)b!otFG5bE{k~)tYud@{dolm@B@{Is+UiYcDl{?PjwKd5 zENiMKxH%~?uOj9p*g0A9c@g`0HM#G=H24uPX2kD-_%2|fHg;n`N|X}gF6M{6gr4>z zbTw({idH`c3RlfuOtX|U6VlB5zwaE1u`LneK(mNVUkqoPW-(V+lB=u8)n$a{dXcuV zc!=+U_?z3vJ#TW)2VS*p452ks8Co+R<|{fi=&5itWhJ4;0pz8cNnQYtt3_L#<-%on zMTy3ru0#<5#|j+keH5$#%cTpJZknx`+tcOgGLsLL(Yw<$iHERGF5NKhCmI?}Xf-&R zha&?mmlM)w)vu}FjIZT#nNS~9zgj<*csg93AW3EHuw2kW zCMWts5JlBPh5PAWCw8Zs#3g?v|8Ezza6aA4GWX}nX#{g)4#x0m;qm1yv!70Tx~yeY%et23EkpnA z0|@16MZHtcC!?RZ1m20H1&5_AGwoVdp?|v2l@@x5@X*z|;~N2Jx^eDwvW)eBrkv7p zwf5m*#v3L*5p7*a62&M+!n*Ta;3jKRsVRmr;33&_bD_Y8jH5R9?Y67i+9o*4+k(Ff zrsb<8ZR)ngZQmpdF@Mk|~h zWL~(fx`K*8I8ct~q}pJBgLU~$UC`za?k{Rt9EZ(Ej_IpA_4aV2i>0pmc}(Xnzs?Pv z`{kW6ovZoI?G|}wZ0Fj}y;85v^>*I4xoZi}<2tu>uI$`u;X4mIbRO#5+_?thbuFvP z35xXyeE!#uS^>>* zm8S}ll(C4Uu3dbw>i6}(uX6xD`}ftqZ_uuLH<^1Eab8RkuP3|`hyUFa?qfW_Ri1oU zOg=0j=b$29>VRRto@ogHb>a31_S5uFb3Xe)M@Y(k7K=eQuNrU+#Zc1dN*>N&4KrzY z8I)`+w-TFrFa{B)yk0^x$MC5@r0fV4d&L|GT?Z9##MHM8@1Se9f|mEWD(8M%{qaEQ z$l}Ex_9rf&mvGL1Vk0jn#A4%F}S~- zO$|%A3w@O=cJbS1A5Ubh!RY2_8)=;Siun-!%e-F}TgLnz^ZQor!}P?VA67hYX>+Y# zg$v!GSqBl~86c^|5mk;WE_5g1hNuq4aYj#sf=ZMajXNbdYM9fVqR&yd@jK=9UP&uI zjr}yPZF1XqXiPjC@-kk01Z~NTLt>7xd4q2?=M1e!oMb zB^oW0%ck^B3A*q2&RM5IEy^C8kOf@y%P zGLth9&F#$7wTw8i#S`z)I|k z5964J`+*U&a4`?#uyZ`zh#U=wDM*PAwj)}iETG~^N@AMLnx?6pt%;{;S{SPvA*Y+^^jsgV zRLP_VvFA{{7ZE_VY!qAI=3we0%{U~M-cRqQQzb(3p-4Nc&UE*1<0wVr(8dXk!@u`R z4Qw3V*bgG))_E8N2#l``2LSwNSt!bjxB-Rz25fU$Kc?!mXfyahArd5Zid^Vk& z=3!5q(meU}70Rr&m^4E|WhDKPr$5St&KSOPU+3O`h0&TJoltAC8d9q~Aw;ej%xG9% zGgi%54Jj=$wbW|JXmjOtP@rJ6QTUb!G2bYxLc@s~$&Z{S)nAhs`rhw*xAdW%n`otj z+SO_}n=J~E=lYQJ@xqBd1d6dY=QGA-G&E%_gLzGb_)>)UTO>4zEOR%I7?-j5Q(7-3 zH3)`hsJSQQD%PpK9z#QcU1fVqu7wHTj^K&|ND}%8tp)&Cb0kMr(N(#~?yX7r|E!|# z2Am9Qi))yBVRKWMeq}v?J8M$;jR}NidNcF|(15x=Xs|>i_hbV@wcW+HUHr;Z$~H`6 zxrUI22@N55htW_3(ctOcxf`V4&nJm7%&lJJYcI8zHR;Yha5s=^AQS=KC+E=yDQ+#8 zG6>;hK-&aUp~p-yx}l`XnN+#JaI4&flD1H(*rNlox0JLS1IwUjl3O9 z+;k~rUp;H*`Ea)!zx-z0H^U$9an_`GEzky)(w_XjTf!`nX7UYjRa>tOxH& zGse>P5fJ)6Sijxb2XKo?Rvk<0y7sW6IdN$tsD2eKiNgX)NvMSvQ98)vLG@D&3w|Dl zxlT#`8%T9B{M&lWSxWAWx#qdFZoJjOa=@}tZdF+};zm-A-c@!~^ z#0G30N6bA)|44gls^P|Bd-Fjljty{8nrF$)YV!#am|C015jS{*)Z824zQ%zV zF&XK>jbdF9$0%rMPe>F9*3>+jwp?+07OC98ru)c>RFU4+G~GL(y*>@m%7(Qon{PHh47!g97@y0l?#!}f-K4U0@YOkOSHTP8N3OlnO#p2uRC(@x~ZH-yOi6%DHz zdbukaR?`dO?WfgzH42dkFQdk2j<#UGL?hS7U6GE~^n`n^aAR?f{8P8a*#if8H!f_1 z{0057|L3Ix)G}*&=Dpzzc)eOqum>4^=(`?c%p-= z_;IK1c?gZOo;nU0X1`!pAL`TyktNxJbC7=2jfUMlxu0ol~{(hL16NogrP@fFf?g)q^C72^}(>I zvl?c!9JuYM>HpQ*htbvj{}Vd8E*hLOrTRX@s6@KOpt zkNtUEkZZq|> z(#x8od3^A;>plKdD7~@tCt21^7k=sl7eV?N%+^(H@ok4CZJX@do!a|L+K1uOa|$1? zCp~bf5hQ}Ncf)eeDJ$FC7Ty-xt{By0n70xZl2e0bV1IaB7p8qWsocojTE~9&VA>WF z+vrFK>yd<}aNazSUY_;J&qJkn)mLIivz$wP>wWxS)JHO#rvE4 zS>ZLHg+XoqI^7@H|JVD#o*%qjoF?=E#|*P%<1;G87YuVL0iD z)$WO2GgK__xJNF%+Z*X@%}r==?$3@u<`d*(ky~85bnfX~qd#o$l?INr^cG)`O>?Hw zpBHv+@_Xm~PH^$*+%31b`vi}17F!Et*4&E9wb)-Y+exB$E~VxW6xBFqLwHo^#2gtpG*WE{o&gzx@G}e{FPG*><)&d6lDx_nd)`Rd-{b7xsPw7OcN(BQV|4Cpp}*AGO?O}G(X*C5jAk*pIG(9q zOf(L73D0W8LL#D9hNq!QCM$qs%x4OGg`;zblPj91k`56gSd0kE4872wL5{3sk~cWH zVAhUZq-onQlKB}o_I9Hc_Vn{X$P9OpIm^+KWX&(k9)TJ%m~Dvqq}KeR8+*{(;D|4G z#I;>88TrTmlBrVTv263tay;JR~&k0U_2} za58_UOsdp}GYa5Wq3C6_7M!>@3B^2|V1wuXQiziwO@x*{CQpuLGhDsk98KGSCoI%H z*y!1O(2jdXns+rXH<1(igTbGY|%9N4hb=kX5n+{sUcO98&{wP#0Db>0vEOIVt;Tde%xu zH@UREYrAL1{*F!XB;NSBhtyALCu^V39vlRVDk^`{t9@E~Wc!@<+1-p@#sCMjd^#SF zg?A~s^u)Ejcl*5d`R)GgU2M~hVC*o~qFXd!68>6Dn>N_y>d32T`G=SfyOj|Aw-%>X zggGJxgNfT&i_@D{BNpeNjsIm)VxW4G0FV^q=w{`t#mUqVP14tU8fW2ti%u2glk_;40K?|wZn4J8Sc>jj*Y1r`N5MKF3LnwC&pL55x$ z6PI+D@=zH|U_6?CX|0=WwDAUX%4>p?tN1zs+Aw&KJ4eX4~I0fh12~{ z57ErmEYQr*gq4gg>OE=vr^TNZvFhH|<5z2X0sR~ebZQ%ETOujw#r>Z^(xXXz9G3|M zb`R5v^LNNoDWjjwr1&9WLmyl^N;iYJwk4!-BZ1;4mhpb(=NMpAk37gDF~x;sfDZ=l zk@Nrm8>xr|N}x_g8g^niI1XxdB6$uypq1OD7rGL#E7NA%&t;P4 zaaD1o&`xGtPUjcRW{YOQ6iy`P`8<|AwtH+(%O%v8R!nF(_}CEv;)x?)&1u;27@B2v zs$UL0@TLFh_n80N{%;oueOphQ$@37EP#5W!NLjUu^~A}qq97|IN=Ld1CZv7v8W>yg z-tiOkIyjj{6*OORq#W1v-J9)!IWQwDxTc z`Y(&j^rWV=3$Kd;;aNoX*y^#*f>zE)6Rp?84z3=E;#9Y)jg~y>Ah84kuO1` zDK-rOg5ew}KniKn0pbpt8Ve9l0w_-`28ur!0+21D@BspWnjmY^tzmhrZlv|BZavYh z!{4oh zr#tP)M~-~t$wz^F5QP=r?_mBIPSBPA=Ttm8$D>ZbF@JavGyDcj>&0mDV;81<9{G9* zl8IPSC}(j{9GBkJGbdKSG!o|_(gQI-#tBM4gCX-Y2@p;p2#?3qp!=s-n`2iFo_8He4&nX^^|7w{gdF^!sp`HHeQr&Md|VY zKsXM7jD*q0Q?-6S`2K(ek;S_5cAyXlqG-92RYGjLD{yU5td#{<8wUt7gt*ZNaG-eb zb9vzDc8qQw3;H#SUVi-mh*@G$pE_e^#Jv#DN{kX3`3;1&N*16yhvGL@!qPM+5EXdbXul&7dpv3n9eEM%H498-s+0=TUA!tOTxN% z%W1JUE$-IZ2j08t{K+nioCD8+MFSl;2q4kGS}}2kn{d`2PR)^X+C@kt&zx*laSFJ8JH|og4N2)q&_;C>rvVo_ zQ}us~?Jq(c%6isRx!)3j4Wyf8g=L;)vSqAHWtdY_BIAuu$*9u zgauqU*RoxlZ#=7R4UQgzD_K}Df*5(ufY%^)yO`Iu1{5K`!l0B%^sBzfar9vreK-jt zeeqOYe~i}uTmM+>d$IpqEW3%**@-b+Ve-VSU#$LT2ezz>7mEY*yJS!OpW^(cr|#0H zUFGc4fTtb^6)q*@Z^eg*%vStI!aK;I*1}sarTl{z~no zIM-J8eJGP3g8ewh6`c(1<%w)E+89^^OQ)oPUe0rhR7ZFz-4^VLgRPg!pDe&+O3A%m zO!^Y`M*;SVy8;dH$NtRSgS-xeDS)J;bS5dC%jeMkokrCfQn^&) zTs#G{Z|KF|U(O|gvx_kz9ZN_D)O9dFe$0oN%!j#Pf|}F_fO$YG_M9=C$I)}phR1Tm zkRY@_Ocy12IVO1$<8B!L)$(TlpMrnt*FJ=%dlybXMM*159EzR!>Ln0MllKZ~;2P1% z2AsKsybHoeF!ZZeZbF0*PhgAy%Z7)GA)uiS#MX)?Ho&^3nHcY@7k`t}8P`JCjQ+Sx zZT5HkhxiXWqzX6tr`<7sPXmz{)|Nn`j1!q<@XhF*0Y-?5M1b1UT6_G5eqRcCB9JVe z(<171gU!USGSCndz?nnP$&L6@996_c&}9*0;5zz`fc(8K)$G#jO3%-bwyy*2%7Jy3 zDjmI?+xIAh_UY|2*+8+P5h5H>SMy{oV^p9GSjIr&M--nB zKbyDKRsJJm(tESXTU2EOvE;64D^_*Lnin(-vaCSlVOb{S?t0(#fakiF-Li-14v^Oz z`3+kw66kBkss_GhIVV@U-**4D#opz&UF>ghzwQ4m{-=>Y4bs`ehOeDHGZzRuu8CG5 zoSjPJF=6R(4Q5=1r}Mjrorfg09xnd2BYNm>LA&7F;*y{>%~@^0^ORxI^HMoAUcz`qokXZ6|`Byj!1g$$_U||rmDzGxuFlq?4Q z9#e}|dE@eTT^x9qr-4s{xTifuVByB?;=wcwI#`C{V|gs;$WM%3rwzAhJ~BsOEgdaH(-Hq$i*m8xPKpR=5~hm(7)x2w-AqQP|LcS2VD5j8!zp>PVl*-w)j zmflb6kQXGv7q@TI%y0tWnugNr;Y4E;TbVEqfRpYRFKnRKr;4HsXgIhceRxolI#1`J zNg9Vb8xAlzz==uPof8=@SX`iuGb%*g@IWlcO4d8a>(H3Wa0(HmzmxyZGz9Q>E@v+` z?^QgqQ_<@nI1hP5*hh?cC$Co75)!f(;uFNI%RyoYL9`%;R3X+3U}nLVpt*^2l_f@u zHjf0*mXP%KO1Y+cB;I!{Zy4*|aOklUFPA-5JeE5>R;iV?gqi{t0U&l`46?vscd{3w za1S0`DYk@aASjqW8O|S&(lDatYzdcWx+8aU7@hfjY^1%78h@DdtP4l)45oLw!UM~i z4?S~3es~?RlZ_rN4Z~xKg(ndh`64OF!?Z9T1OPJ6JL zFrt~kY9a_LF~B@IZ4lB5o=p_bk_LAMB|W%hn?~1ikQkJbTwm{_AROB?H6O_TEN5|O z^IqtjF+6TvQhvS@{$iJT`6e4>Mpg3WQ>KV)9JMJX1wF*tEGnOnau(tGL#o zypyDLP;0QDP)gCZX46(QN=W+-Fqgy+Jk!V)P58E7`%b&|&3yZ&qzxSoYI~dZ+G$Um z2&^FA9VE#pY!ib*BzW+KsY(NiM;rouWH&H5UB=DctT7TBAaXQh3b=KV=ZH9$(?p9O zRM&D?fCJV!(+~*KfK<*V_92>?@)}+$M|n9bTvk0-b`;GHHr+*YFxxsxN^5ZfjT_fG z63lFyKJnyS4&_b^wpNYV)h9IC!?by`m2*gPJb`e9LBOAiHE-o2O_qL>j@5Va$dO53{p3bLt!|2^v=#~>~NvQ=0a-qH|$C|dc zC8c~f1~<)fPP<%vF^>WYPl`xCQXba^nr*qU=q6}IljsX)Sg|dd^|ljxiwnmbU*6;az}^mj{mz?&DcztrC^8HOxdMNT8DbJ&TkEG zoz}W0(4loe>$*rgo9VcDXn<7Ng>wvQUC|mnNYXk3re(T#a)rnr!g5w%r^DcyE;kN@ zF%P0s1Z<&rMGZ|yvLpRw1<7&e&~9>eCk7x{cXHl~p)b0>kjU(k)+BAS7kuo7zUcD8 z_v)srIHuEfGf1llO8+kp!w z*WkoK<7m=;n6$@`uOMY&OTPL){LRH36FbHW0Ue9culL&?9C~F-(N-K(vOLdfLx>it z&G2?93C-)sAmYyTMzR@#FAlPcs5F8X<%s@B6+Z?ul9Kp-J%=)#n=PfNd0rsf(aqhV zBfvLlY0L5swtY(b0ls4j&FOPa=lvq0J8{s7W#!#IxZBk8r+eb;9&A;q zmp=GqDrl+F6773>;OPm5?uLOquLjd%P@-*V3GJ@s{xsXkvfx$!>?wKs4WVbcI=se7 znzpo*b^*igLUfzS^$2o#8VQW_u%+cxO?d79x~skL+V!>DZ-*+vD<;ciRin?(?XY`2 zSgKR$0_DEiSe+9lAnk0`Bzk`&y+5u)(IJ2B$G-0Sx<6F(ZRv?;R`S5xY-zRaQW~KP zX1amF*A0`CR`Xf05-FXgjY++>Fo^7=LkKrDbm%Jp?|fxONo7nlpip- ztISK%!!1z4IyWlly`JwC_}q*Fs)=BZjbPQnnp~fqVf7mHJSVv2g z^tm^E?twx`@qv_;YAUtmo@oSHPF{2;FM424c+s2t4PBw={O8cK*Af1uD^Nm1^gFRB z5@I<>EIWy153%g!3=I3rIPy9O28W>&1hgW2gvZB+y&puVEBS~lAG=2!z1WwzJCvb| zh}nmjUB%aOiT+Hz2R^UfT|5%FUi3rtAXG`7MB~pmfh&fW)K?kR?wSBbj=-fUVz1^eUov zBG3B6`i|ZB5DXnU6$_@VU^`m(&m0<|>FuiPM>pxl+NI7x;FMcM4Q}+HZiCVkK{uHC zxtRd@9SrPE_h+s^oLP`ny3yjB6x%UhJM&GH1gkyZb)fJ%_;v5s0cuxU!HKGwNL2V+ zJ|qXh5N`;;qX74iB0m=U`DL6g1`Su*nPPYecmWBU+R0W>`s-RQl~>$@N9IfsfD3_k zGRDDF4R$7eWRrICc)tK~17LQxg3F(HIy1)+i=eRJ!xWk^z{*-V%K`2#d)tG@eor-Q??S3~v3WHO!GvMf)_yw2b^7Pk!Hr;De^FBs39cGE0n*4i-^+qM{)pKUE|l zN!S-*q=_SSy-3{vgkMRqc*x?s=Di)$I>Pk_uE?$+_^ljHGbUPj-S*d`UJvG9kHSNi zBxm&MhWFDMs6p9^tE(13&DIxTCG}@R*os+_LWN8l=amCt>_`UchMH&^QMOh@xlwp0 zf-Ly}kBl=)qJ@abB33TJDnWK5RZp@NSGEVkmH~k=ggr5j+!#xm-3S`8Yefv~{A_Y| z3b`a9m!!;d2ybsAxl?FJE-2um`5)a#70*9M`vJizj~r7skf|Jl|3NKR49Nuvg1p=r z43H}nzP=tSJ->=MH;EW{Qsu|erR=$BOiC;csl`F+lUdVBsVRb|h)a+5Bd>?yoKyt& z9Jzal+}*?e6vh6u9@z?j7QSH-xxX0;=bWhYeQpk&W?-=wlqR-Ll=D_ES~mXnltf>y z66b_L=1EMcO0%n$@tXcHG7yz*rFp-`!uZ69SBnpXyDdfK9t~c$(vzLTK6a%LH#7?L zr_oI-xIdQCa$jtsrRQp#z^e$RaW^MQ%8&;@K~enRi?*FK?z_IMX}XZDfZ3K_p(ZMgpwi8!RkDwVbCpNdn)B7Xd4}QzNImAlUU2SFBvkTqp=Hmto3O?V6EiDs@;Gm}o%1Oo@@X)8wE(F)Uaj8itwF*eSClVRa&WXNj?FHc&AtP6>N0aK3u;`(BTBueUl zP;?u_b&TrFAq0eIoI(PG4gybGS>ortoJkZP7P#}{?M_OWlM-|Xkn5vF+u?7pTxMUo zNMo-^_hr+&c&FpcFNUN@nUr7}mJ-HfyGk?d*tA&~n(~ZS``=IE-p|za`D4Y0ppQL2 z259zS_$qQU2B0C{-d0`!=JFp(CXRfLV7AcRkM@(g5boGC++o&G*5HX{+p&~QjDd$M zFQVz=K?E?ZpnLRjvK$x0N)=WA<594fp52-*<6d~P&w4%!c-E7B7KAA~MN8xCb$ju! zC_~#Su9-KB8w$hYfsqO;7~@RL2a7^I7Asy}QTK5gmmEwd>w1yX&ajbFM^5f}q2`4b z6X_*KddcU-$QPmFuS-tG(qB~fx6<^<9T4xiHul;O*v+Za&tSu_?No@P7XL*$Sbe z56u(aPZuyWm6to%_fy`_d_VX70!_3c_s|Wt!Qo@z$6&03s>*Ei0N73^RQG`?aZ-vs zkXa;Ev*W=$_J!r1rk&y{7yoI#RPq3fim*AbDUL2W8LgQ5OS_}h7(n{QA)m56jp8m8{8`&}Y{`C7(Iu_DX(bsnyx+29s zL#x)<>FgP(h%N^*%3K*F%O$*?NK8xYfCuYw;v4SzOv%k5fE~^xv`3&JfJ2HYZYP>8 zEcU2GPv%T4e`_Ll;sEUY8@OA}xCpBW1R(sYi)7C2Mr4Mc8G{&;aOA7)H1w-&a3JG&Muj_DC2zIU)M_!zZvmQ+Q-fxG?Kc9Veg%kBh|4h6XqNzP>=d(K8 zKzrbL%}T^0Acx>HzycM3l8LvAP!8SZ;w`w)5M58A3q~y;)PLLgjQ<(UCx;8C_HxNM zUSp;UM0pqGVMH8F3124!TURF0}w^b(JWKXvR%ls&LbsZOvxC)W(w|fIH`2Q z{)5dLo*b_NV*ry1+{}|yi2E?lEx?K_Sd+NvO8lpzZ8hBy(+&SP8|Fxp0%3oDI`WvAn4_e9)EL z_O-0U!QM^&dO0nNuam#trSZcSe&tl_j$~(-w=3Sxdpn=z&Mfx*PHyM+cG}x$_{b}@ zF9UGd{*Uv;i}5OzHj%s8ZKS1UXEW9VEMa0pR~L9`*Dhz~M8 zhtqt3QETSXP)!7CXnCF_uL~aQ>Y4uzbUHDfs?*0sdf93XoeSN+@ALgcO^Bu^>td$~ zVeLNI(WE6gBZN=gKKXJEQiY=r`krmI8@>X-Fzp zAxye5gw3AEC#@rf02m0$-MWQD7l{G8c7q!B(n;BKS>SaVd8CW&dd9~=MH}DlfOK2Y zrhI2w0funMh1F>+gk|y&ruh=)aGI50 z@-LM1CARCgX!?8_o(!RCmKY~^8$;{~jP%Ck8o$5B5B|IrqK7nd_o-lmpDCthDb>fl zw8PxrOe@|mLfGPuhMEa>1~2G#s2yxK696!Cq|A@Y_F%HzNv1#sOG_qlDLYA75XtL{ zZ3wriVyJhdr|ss6UzDgxN8TKn@Aq^rAp75$5AKQaABKGxsM&zf?o+={y=XMYW&4Sj zxp9Ip@3)f|Yq9a)(pVKV>Zg$FfmzDf=)pA8BVF}2O6RJN(%L_^$4uSIDwh*_X$$#! zBlrq1k6Xt&CSDkSVaj`l_s-mhQ6GkW7(%}epkMcdWny{Vs;Z7f`bE9bMLR#O3u|!Z zblat=0${aUr$5eSjwpHT;G9Gw*2%=MkUG*?87elv3(-X5=vY=qq{kR0`w$H4)*YG( z>F@b<~yyifP3TsK=ao&`P;_%@*=W3(|HHS~FG-cXP%U|zn(%ys z*8S*=fC(qbMr|4 zK6(CLjWbU}h+DE#&@HsJ-%^Q9VqhQt8CA_U$_t~-(I zj@TRWSKH-BV}&dtoUBO9he}+A_mP(EXCOHsK zyWx0FOpBQ(F6!2m&AT?>^S+w$8Q_&--I%=iWQ_-kG^G=bSn7J?HpdOHIIP#&Zpv9CG=NK4WJD9o`yal18x( zRn&`747X{pOvub_Q_iC= z{49Sijgv{@dUK;FapZ^2C)?AnWYC4rxxbkj$TP$R=Sgdb9BJzq5WhGpX!Y^n+2`J< z#Su$pAv}2YsW%T53f+UnsgE1kVmw<+pftc)rgOG4asr}O&DHxPEVg)Vtd9SbQ(Vx0}rFZDkb8aw39K z-CTxhu1YmWt3%UV73~@Bp2%bqSu|yg(p)9Gzk<2flZ7Um*v=-lv59j`A{ht+e0pN(Zp!2Xq)7}H(Ru%$re&eG4dNptPYy_vbUtH|-GZmx?s z3tQU8mbU-D)Kl$uxkFEbIQAmLthx42$Wc$@i!r5^Q`M zP|HTPXktHH;ma)3P7zxs%QAYIW@${lOh>?$86HrFQ1fd2ml|lLOQVpcNa0c%TgqgU z^_tl-5@(h+v!(THDVI`u@6txYR6d&-WlOu+QgP_)0XBP(I#9oKjxF`Fr5^QC2i0Mz z=U+#ZYM0KbmwGk6>t}RJXR$+1S{w@az|{Af+5J=Oew&uQU?01GMsxohyFbA0_x~%U zJ^uS`?0zRz__LDq*!!*2vwQFNY46voeYZBp-|y6G*?n@HMxKPT)hzOdCXMHm->W%9 zu6mExSkKHx(m962QUob~zg^67mRSavrJqt#TzqyE zVbJhhWQci`Ea8b>s%=B$Qk3d%JHu>!v>(SvnORD;U^WUTyPMgHLTrTu3hHJQ!QN6C zi!naS0P@N9|EK=8a7IufTN10$ndFtr?Vv#X#3(^OOH=1AV#^gjJa;!+btjEY6i_VUjXu#k-9>er?tz=l zSuQP}aBOE-YM494HFIOwcqKrqWJzQ+q6$*+sJmz3O1{|RisjnQ2$5+%5}3DO1~|iYn4HzNofe6xM6+fIOT$Em=s+` zPRL`+v5A_ftJQb{*T&2p(@&Izx>|7mbR=z_g)VN>2y*%C(J=1?hHO2B8*^;J6CyFm zqQPU{t8})DSdRgQDV1oP z3RB%P=`H)U)}uV~Mj&%ms;15o$0*ZImZ=j%aTT62pI>3$$@nR3wpQp#|LrD#%tTOR z2RE6p^X`Davq}O_ynJ3WorjGW6Jf8z!;W0G#V`_d&(9ut^(Y?BT6J?Lc8Sfpi70NQ zRu^55VOD?UJjoofd2)@YM1!AqR8@`bN>5*5lxv z%7Eq6_=PS!W8WR-?N)YUROqb{Fqd6BoLycQcuYiwJ5rg4VzcjL z*T~sZG%Wg)suj-(t(tUr4lQ#WU~UzgIl;&#yt#@ALb4ubZWeNFTpz%!IySSGc?iQp zD9;I_jtcWmHeVSi2V;pfP<-m`0Sugfr zB)uZu8g(O5sQ3A|3gMAgyV+!D&@&-;6gz{a#_+sn zK$EIlpqP@`co1V$#hfkl;)UCV$+y$6_4cuFhe~vap3EQ)^Bs8jPD#epUR$p@MTmx( z<5~<~cc+w4VjDBf`6TF-n2+-<_F>%ZU~A*B>Y9PgB(0gPB9fF9uB`I2Ws^r&5?I*` zW3yw}ZOy_{6vk+dCC-`HttNJ>16vA=`D`ogDF*pXZjrODox>xx#%NDa=;RrdU4y&k zvvS9e8l@uY znXQ3QpbB#myVXge_7SXd?8|fd(>}>DWZy3NbQtD>@RlW0Rdg$;E3H$Us)B ziVRX~?{1gwsaH%!VuzbpQmED&st?8^GwET%5IwU6Pm<^K5mI1<#@bbkV)2?OiqZ5y zpg9+u)h1^-)=gK@0+rcE*6>EGwM0 z`nYK_G}zOMBdEeNoR)LEmIvV}(V^l&?#{sJARJKq#mQ$X`Ra)(HZQ?^2D#3}g3D)_ zC^Lu>znOeyDT)-wRNh=>?KN!20yhztGi;)Sx#HH&wzE6?nQOOx<|r2OGa6?bbB8kP zI_3>vO0SQMUO&j@&Z}<}o37MI3jlZZKvYZCF~?!Q*^6wB+y-?rK_A;hJ~4L~oGXmx zgKWA0hEo#GNLSx8Mt+S(Bftgvb< z7py^O;?d<(hvY`CS5jw2Rn}mo!qzI+$T1>LG;T7hlyh2nO!OUOdTv}P&NtCYFcwG7 zWEc2Wl|aK4b^e*b8HCI^E%ZtJAR$KkGa!vcin_prSX~p-3gtXzkjD3-C_Shz(R8H7 zas4(dJcpCpl|lKi9Hw=Q${Acc;4V2gzX7u>gGvA%!xh%BBbE#1TIKX+Gt1%0rFe0( zZ7hRj`=Tg$()QM z-iwM#X+9mG>@i>hedtPYnukQoabl7h;V9&Xrc;z^Zb0xS-QRA4L`ck&VcAYXT$8NA zp3nO!`C>K>H;OvcSWV_2(S;@*sfU_Gg?&AbRPlDl5gg&f;6)wZ&l5y7)+iTDl`-ae z(OPq3SP8M~u~#(n#ykXejIB|IwBn$AI8EL!>IQgDkLZvO2wSHp;|X%CXyij7qKSjK z)*2)COcf(|m>Bhh^riY^iz!mHC^ek)3L%w-hj;GZLQ%rYMWkrDlX54wSwt@EpH42q z9dzld|IEQ6ktJCY)s8i)9bnnaT)m;@IyS9kyuwco(8{&!Y6M$q#fqhqx=Z71TE$!i zMyjKW1Ttb0aelOyMP5_+0j)WoO(wG0GTbL;`q`3<){TDF46FamSgf4hDTgcNIBf04 z(=6b|Mmd$NAkTyl;oBoRa0T#P%2{55t#Vq}<#9=g7s}8~4|R8=Y;5Ae&7xf{W><#r z{Egl0#$N21+bGUiHgoOgPNO75D=U6N8H56pU z(u{TFG}_auUMj#A9N_-9HF(CdjVItx2-%w*^fpH`9gngsa4f$xQ5bb&%ye+G8Lv6@Q_vKHUwzId3SVm+2j>}?w?aMLfQ8CRX==>q z&Mi_uT(m8dn%vSL&1%(i7g>@2!#giMO=gy&B}!ag9VJ@O-*Og%7E*(5oeL66eOSF1 z&@j_+aBg68k^bSGC5k*zVbo4_Rm|qZh^H@L-M_jb2MfYRZ@YMa59b7Mw{?7 z4*225NRlQ`D-Ar}Y_jzpnd+r2t07UF%zNVK5j5$FLXEL*PVvDtlhu|s8m{P!*Tpz{DEEE+p zz7$5I*1x3F1n#rAD2}W7OjdOuF%f#kA?6d$)Yks5?e8VIen7Bq zQHcd-ka_h)0rpG*Ubs@HlA^3t%(Vme&%~!q*K02s@WiD`WoTBDKD`_FS&zit8o|~Z z;{>3}mP7HhJ3!W6KElIkNVG1Mi*D=i8hZz=YqK?X#uH|$$c1Lu<{Lwd5LSazdnk-n zc(4+YFnxqQ9mYsx-S6BXue8uBc%Plkn#eYLgnX2x66bRjias;N1>Indw{)5fbprRy z?T@i-(@Ye~(UT+CF*U@dQ^i0=@YE5ko$bkeE=JT%rsLS>i4S&?9fT9ZA-%&{ z;AxGe?|wwO#;UtdNah*R&L3Ved5nhhA_NChz%({ydON0Zol}0#E;X&u9Rwh!TX4hK-l+$?p z+D4dN4d&($zLoJUWL`X3gYA}@fce$zQVF)rj0anaeIZ?~W8`U@(Td}lF*YGF>vm?) zJ4XB*!&r1bJ8Jd_lLs}TLy~jU_BQoYr+#)lI9rqhH^>F2I*2D-9~Ldw&&#p*Nj+SH zU2cLMVV~=8n5#*%p4~2`6=t9D>IUIzFsDeeh76BmoUP1xoH_R5fvE#2Vw8EhbaxW5 zp1jkKFVrUAI85&2;{0h@aC#;yTvuB0Ue$9WKITzbv{GIyG#w8LD^g!%k;uxHFIbvO*-$CHzC?YhZ3Kc24!!!$gp)!sCx4 z3+lCnc*K(t^GInff;q?ZIigWS1s}#!6B$N#IT56N(bj_j_8d|Fbfr2V z4)uN$20Y@TiOE%>p(ym>y{9O!=-3xDJW5U!362ZBSk2q-j{1qqoBJGl<9Xg%aVXju z&o$p`!ZGnfW_T_Qt1RVsNKCGw8Ry5-EnQ;g^kN{U5d&F#We#2GVygF$d}C<4bE|5u zs6&pz!{TMo&8oHHR|99JlbT#D#XdrJ_a06RQ|5Cwzl`p#q5-0KU%=@A95%;cH}6-v z%s~=g&(-n(8!@k?R=daO?`XRyxxZf%O)<q+&Fj_5IouqKTWHBR%v>i~ruiJ*M{Gq-2W|p6DUp$Ez*8ATIkKmU zD$6NR%_($Mn3?u8&7ris48SPiuHiNEYN58AFb|}Qi(Ds#WrEj zTTfjEOqT#N?c^=?h}Ms^$;SbQ890ja(9ZisPIr9@E20vMC=_NFmB=LQ?pR^}D z8hFXKPe^hUVX5kvB**DNZqWioyP_C7pi(441n3C>Nsc#2e<6`6BFNcv{ty`N6DQ!T*510)_K|7e_IV`D#<`*Zh6EXl#AE} z<}tiT9^8d80-p79DqP*A41+?jYA~y#!BZIo)=eD1Og3&HH>f3L9U&=$Bfy%^{ov97 z4uEwh4#Cw!6bxhol`$K67FeP+lKnV^(y<;TAC6ZWV&Q5Xw!@7m%USRY8{uk;HI~#7 zW*uBkL=pt@V!^Tz4}gQbMtH$J1oF5BEIR?L<5WeZ03@fk!F(p+iM%yYaJgT!!Ax-iSdNho z)%mr)b{;pt9PL?ywn29U+!)x}lroqN4TQNp)?jcJEB)Y(u!q9jacqHWDmfZvGq4-xn&~qf*QzKo z4?$k>G|aA~#ygMbz@5p!ogM&_Td)CU*UD)y*F&+2-7C2oCW}mPEeOZS2+z_5?(MQ4 zTuV~gz}dhzfx8H6z+G$(fNOb+dbn0BI^asIPzJ$Dwg%unDd)kp8l@MeqUpb9Y(sE~div^GKe*myUJ2I+rrxUrl9$bKfno#;0!i>SQM(EG@=AzrKOK-P z)d`mlNK+8W4F`crC=;&++G`>uAN|N5d>^O??u?0~&D>AAqk5X?0Sb`=ruF0db!|+0wsFW50QsDEOMIF2lElcqE?b8Xc zkYG6jpIbqM?}eR?4p=@vuZD%ZF!)@<%qi)G0dchho)7Y@guD4T21_+!6i8pa7w$Dq z4LigZthmbU@<5JmT3hH%PK2_+XwkZcsfOl!OdFwq>J%U z@XTuZtT#_8)vz283QwvRU(K1+jjaf=v% zr#E|h;F+D43vegU-3^O1+#jCa>jb#9*#vi1>ETW`&E{uoeT`lU*TK`Z{_y!2D^+Nl zw-=sn5(DsTLpD5j!qx$|8n8iH$~Lcnds=Yw|Bng`D{I2k;bF9STcU7Uoa-Lf8@-O`l)&Z}R9motUC z9A4fiN0FQ4saAMVS_>~%d-uT0b#e^6Xq+~}%Y8E~@Zv7=kNx64aqA?!c-m}&7e}!d zzLY*S24C7mfxW&M3h<>pH15B+nP%bBlkjC7^~Fn@DG0|)w1*2X z?GW=+X3q<8@P(2l?YnpzzOwIr5PYT1d8r(}JhB$PJSJXig0CddZC}Z5ig@>x7vSG2 zgts34?c`UY;H%NIdid&gQ3YS!HED#e9uef6=2f_Q0A5Y8r^2hNz31T70va{1?zy6c zS9_+8!>fZtDPBFVhF3?$7qj4N`xty}|Fb9HYu(cleC?v}_`%nW8u+?_c-7Zqn@Zk! zMZh;3#WWCNQU(8|vFE@y&l6Mn&lErSFTd~j!+&g^x(NT-FD~`Me^l$>d-~Zx_>Vyv zq~A-R&;9Rb=Ptr)8AM0El{y(FeXo_i=J(oH!)x1A@U3zQzO|Q(cwalMf!B(OLcdl( zBkNmLvKqd3PF(GV*TyFpd^<)3-%e7_!1vcrO7Qv`6}-MN1ioEprA$87!?!Cb_x&0I zmVLXC$o==*=1#&74EA;KI_+V>>jMnF6HFZG^>a83-y!P$gGeE|;Pnw_y7Ub_m*5)# z_uAnH?XFh%&TumP;EbgWzR@Py;TwIy@Qogi34TbpC-`o>IT^m2L^SQYY2-36(;fof zj3i$5-5omkA?XWa;kyTyj>0z&>EXL)%_;ERi%J#zrzFS251Xgy8E1(U|L~lXa>GsV z+u0Z3zXqGs@42o^|J`Y8hyOn736_53=WT%>MK|TVd&LPqFI-N6pVv;Eh5xxxyw(W+ zvtb_KCmMSU{3Jj;Uj;we5CuOeAg1(_LSmagDb~U-Qd|wvFLG>y@QXY$k{J1n8ex`TT!OtR`q449bF!))f~_hTac; zwu2%-zY#Q>2R}P~wGQ4mNL>Go>bqy)=j*r;e!hX6xV&+(sqJ0)S$NZ=fnSe2-3Pyc zaCmp$?TgZH2o(muy+Fdio6(LsczZvwt~X_chmb@a9%xP;WQkQFu?QgWtt#;QexOuOHql3YC7dhK9+zM;W|(0?2s6pW@~P z!|zL7?eO+lKX}hb9N;(kOHJ^b5*55XP7kcK4a1w=A@B~xWrE*SsNfxH-Fwlus^Q&k zngG8tso^&r!hINi6=H<C+@ld-pjy4();z!)$o>qD)P=My8Bmq_3&0i9K7Eo zhTwnII<@fIFuL}BtOW13IZne{>z#q{UZGZcKVE5-el?_pw~93IPNA4chF@KvIq};B zz6#zccO8dchSHpT?*N1M_Qt~d=|tCmzr`K|zmB7Onu#C3)duiRFAcljl}Ac%^~AwD z1ENCu^(GU%bIt_6&k*JC&M?n}UlxmDc3FY}I%75Q#b1{N!*7c<((fwF ze(*MJalvm7TGjB&0Xz)999|1=ufb|~du24dn@0s3L@~U--MkilH$V@5dl!Xt-yIIW zyQr4lFKOa&Z<$|)KdlxYmPvouio-kpunP-9|47jCKWviX{}_e^8~?ao3xC+){*>(1 ztni}yaNbi}2GQo0CUQIQU*OE;=$~z$d$sUbzr+hcb7b*CO zqEYEkNuokZ7NL2R%~+6wO1>%pl`bqaq0fHj!AeMeuvQHZYH*k4K`p2rknr@N1=J5t zQN9aw5BflQFbt*#V<3HC1o(h#4MIN%1N{e?p!r}OM1Me!Rex|;rT(B6v>%*QsXk}} za;62L9}I!?kSz9s9-36}Fi92gFdcLc*MsRHb)xQJxhm{o4QL*oRv8}-sMLQ}(PRFs z2mPOo5cKB=i2HMf??f?#{<#cN|J;BD0e>OWhrfhC;9pj#BL0$1SO2n$PL#shzZ}8> z{f7YYWb35+kbH%Gn1=Ci|P>P^99R-!e>V7VP}n0PYI@`+CUydkMhb`{>bs?}y00k3q~oBCsI)AGr|v4+`+5`o|eC{^K01 z{3i{Ro&Q`%!}gzNB<;u4j--#*f%@YrJOv-u>)_+&AoAsRfcOMjs;zO-BQ33w9z_JH z9!23kc$7p3DU#|@nojp)}xa6{@6swIn?{N`+3S z;ZZ9VNRQg|(xYy@>d^pQ9HNt>AUzt>z+>Xak0~7UV=We`ABU)Pk0Vvm<0Q58I2HUJ zXMps09l+x}@PE7!E8uYn4yqm>qFbs1;qh_0a#9PAo7C#ZtyHp8t$N&z1#yqhfcl9E zRy-kZdeRfR{|Qa?CtEerlN}&E*`B*1^o{XrZCl_gL{D}nc3E7-~q6hUSu`2B+DG>Atbz;yb`E;Tjq)#eT`cJAQ z?I#3I|D+uZpPZ%v`^gZfKc)HpX%GZ_8bQAlEYy9P3;IvDg7oQbP<>iTzcPsZ^dJ`M zKkcT2b99lq2cOc=RC~%#Jfo)%l7=;YX!a+{U?yZ75_49enH;U7d6n;Qs|wIuprLc6 z)Z1t-qp52?NYsF$t4+g0~ zhnOd833uGP=K-gKrj(n*$KxNMzg{OqhMbwh`rYlMOGra|wOm-b|Hn?;slLrkRcI1BBLh zR}k5DSNRU>h;ERF37sBkokeB3e2+NmOK7Mf?VPL7;{#E8^i-M@orQEv&aTlD;yW4R z%fU(bneK~KIIt0CIY2C{XwFS;6}QX6X*{!ZoNOdYi&LaRqba~?(Ax9VDztB+ab@2| zuA1#Tu^JK`5l39tkwTx{v5wY8=qSWP z0q7|9l{`$favTq!l1)?zN2{6&bx>Cjq=S0J(GPh(SFSo=)TM$jw6y`*J(EW+oJt`} zSe(k%sc~upb?Vf1YUosfFSnceffO3`l%6)xyCy zo$Kkvq(}i=x+OJ zEY{;xXtVy|%@@DwYm1nnPykLfkuP*=zg`X>n-$F~3g literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniCNS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..22a27e4ddbe26664c57f778a864b6872f6c2ba03 GIT binary patch literal 157 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 Uyk~SGTv&9{NH!N6NOao&1LeutHUIzs literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..53c534b7fecfd84e465c8943fe3adf500a4444f4 GIT binary patch literal 193 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY*)9BicPk;tzg!q5^X z$j}nrT*t6SW_C0~i#-EFiybR_iw6T^OAsT&9w{L02E+l)b2AxQoY)v!T$mVIY=JV; k+>9*_j-3Bx_sB55H!Wak%8eoOCt*p0P(FjU;qFB literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF16-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..b95045b400a77419292cab245f9f66f6298dbb5d GIT binary patch literal 44086 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..51f023e0d609798e72d46bf41309e092d72ccb07 GIT binary patch literal 178 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 M|Id0?+kYqj4{W+_`v3p{ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ce9c30a98541e23244876fef9dc67c2639fdd746 GIT binary patch literal 182 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 W-NpY7&VvC#?^62*GzIJ*TmK)sASzq{ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniGB-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..f78020dd4028d56497c44b7afa94985f0d18f8ce GIT binary patch literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY(U;%1@i;UxH|VM5Yq4M+!U_+G%+;v&G<;s5}C8#>Vd literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7daf56afabf65a4707d7bb06d829f56b247c9e80 GIT binary patch literal 25439 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-HW-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-HW-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..ac9975c585ede6958758980ade161f687d40d58b GIT binary patch literal 119 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtKtsO>ygO9pkUpY R&cJYlpFy!nMUA0J8303WB^dw! literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-HW-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-HW-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3da0a1c62f19f720590b54fc1de7b027af100945 GIT binary patch literal 680 zcmZY4T~8B16b9gTW_C-zEKrO{Xki;z^rld0f@uiR4Ix@Y5SLOB2rjVUBlNpUP=hJZ zdv1(>g-o)Woy5N}MSq0Xx}bOFeWi!YTCQwVdLmXyM5o#>UP7ff4B)v+t$V>7V@)mi{{+VJB9MW zeBMkKX3fd;b1MvOy0r&Plg#y)x zX}a?kEYdC`e%><$20DDP28u4w=~n3;YfUN!NqxPZvI05?&-otvW_;5=!}nylUyt%< zl+mDX_+Nh*P#INNtw$dr{1ChXUIIS?FN4>>tKfC;b;>uvHz-@HZAgi;yP{& zWD?FQJ`$vs2>#XphHs|;qU{Wr(w_ML#!@oBh)Y#C<^_Wo0+Cb8kt`GOtNE+q)oMTu zssZYjYJJ(5D(B#;5O*QMkP8rfkc&*df=E%h0uh2pKo%j_;C90e5xD^|3b(hWWz&#b zRBl6zLD~>8BKP4&Aj^y3Hq)$ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c50b9ddfde9da7ebb2f67eba68d58fa2cdee902a GIT binary patch literal 664 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 UUp1g87AoR8lAx!|poMAw7d?}<%>V!Z literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..70bf90c0efb66da2a7aa19a820d766cfe3ef3183 GIT binary patch literal 643 zcmZXOTTc^F5XWcEIeWU@mZfZql}p1S79^z5N>bApgDXKP7qONqiI&*X4WK}=trCdA zkfrgJ7Xyht_z`$)Hfb#%WUGFXdH~!%YTOcem-5?-7jsfZ&dVHA`y+;jYbo? zQ7Gn3J-uJ9nA>GNxwBR*?G{V9idh&}jIAyGYQC(O%(7Yfcv(!FranHgker@*nx6Ti zW_C8`lIcih`Ee{BnKjtpNi`1=Fpvzl?yF}Q1*S5f*3?k}2)KY49L}4IKaqoG`Qku< zr2IqQT9x53c5B3YqmOC9#u%lIM~wufsbJV^KOvOJf`NbW4wool)bNDEc2OJ?65`;c zpP)ef6jJW+L;J(!l8eaH(1-h*q3fqC44xbu@4*4W;1a^M^}xVY#=%>S0%g^S|2rMo zWBMgv;0XDp85sT1o=4jFCtG%qf;F2tH(%3e%$v{Ku(x8K?N{7}7y(CCw>vVo9 z6cU=DzJBn720cg2BSyO~0?>^#LgnI-v}~-6~Uex?ZdBe ztS?FK`WnG{_A@qTSFu5??_F4bl~bcPvGuOHj!xVoIWwF(&yYCF9G%yUIC+ZBhD@9a nq0Syd=MzEakYUSZoypkR&at6$Y_Fabu${D4-0ek>+ADtn7bS_K literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a83d53ae70ca3d81cda827cc224ec8c5efa4f17 GIT binary patch literal 40539 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 TSv}^!0%Bau4|_Jjy$rZ_2%S+!ysBd@ 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..7a8713539491f51c52ba3a1525d181efd32c1f0f GIT binary patch literal 677 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 Zk@2$oe=xv)=QA%Cm7k5@(*(V9{{Wi~yy*Y{ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..808a94f0fd9c3b3cb0267e5cfe4dced2e65ecb1c GIT binary patch literal 678 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 E-=u#IHvj+t literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..3d5bf6fb4ef94b452ed1ef0df926fc2bee55e973 GIT binary patch literal 647 zcmZXOTTc^F5XWcEoITxcODS8ha%o(|f`kCAn3~2ITnS3Kh_zHn6k?$pK!IXgB@lxl zOXDjq1`>VnBk)KzX@w86RX<5RfNy5yQNzGM`wl2!b8QOsDDF*H1#8XJF_8ULea zH`gXp87XylFgy1+o*0}kdG}#u2^8RTl(-T{8I&ws6x>*3k}QSDJJNt6yp{mv6cOqJaD7jFxN7$?&gjXDK+OiIXu z7k-$4LIi1V^r7?NV#&i)GL7D@v&hv`Hii#(54K?!p?enL%G%+^WhTI1i2?D-@c*5r zg#-H1YGNPzrJET0(U?m6M(A8WojiSc`a&qGB3Nz1)JIxtN{bFn6wsRVX6RsHQthLu z(MUvUMmoD71Uj_ubDtb-J8y+H3@RNIhg%{b7{-+#YC_?<=vV!H{q~XnJ!)ofBB&Rx&Ty_M)@* zHG$Px#amrwSY7yxXA_H9WA^tJtiH+xV%M?$uCjt|!l$_7g4}1w+&O{nYtGyyLU&bV oZkdt0&C&hD(B0!$_t?iO);Dsz=L8#z$9Zg|?0Iiv29(D9Ur3XRZ2$lO literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..09eee10d4fb4b9fe1e70a1ee56825a207ae8034a GIT binary patch literal 40630 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6c546001331cf4f2f68563229f994b55730dfdb1 GIT binary patch literal 681 zcmZXSTTc@~6vxk*GdtZbrIZD%TpAX!R6>9P2GbaWxIrlwF)r063Q^h(pg^&$5{SW& zrSX*)1BpKP5qKn`1s-L7z!8bGc&6%9b|D2f&{eEudws-UEt7}DLB$0>@j>h8& zV=|jtu?=gtP_#D-Msh2Y%WvoMZ;N(zNSoZ)Fs||oM&2&i`A>DHW!uKk@LbZIdTLGm z(NkONGf7KI-5pFVJ{}t#oHjW?&rxXw6yTtkegGp>PH_Sr zg1l$QyhVZDYtFnCLT^oFUXhWv!_oW9(A(!&^*JXhRyQ;9qx7C)ZTTdNwWO2w*XBW~ GrT+p)28xXU literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF8-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF8-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1b1a64f50d204b03ef0c5575233687830a1b053a GIT binary patch literal 41779 zcmYJbcU)9kmM^~c-shakMFtT8(QAUz z)*HN6y61Jzyx*H&Pj^rET!rqr_uAg>e*I=Xulx5tzg5m3?}OASPMvdV@3mL>uJ2k~ z{=4M3wDhcuGpAFpgwI>HZ0@Z2bLTD#k3E@oJSBWb*5xZH7cPfyym%rlBRwtS*p-x% zv-Pp(&xe1y{&ILm%H@=dYwnXfQc}Wa&)K{&E@A7A1YnTE*iY`fSi{-x?%WyqKWha0 z@y?w)&;I^@)`T;d#MVj&k4@rW0DUZb-NLqeyzV%6Xm!C!^vypKv}U&~Ehyk2v0kqq zS!KxI0tGw4J_EvGK1_xgLc(BqNhYni`9P7@waK9hp$e-S4-gi zWC(x*VA$^SML#xQj+m+r$Ew2-%2(O?H%i2cH_IlxSsd|oh{qfAc8@RbVDnjZc!eJS zax3`F%!oG^g5UTUu-6}D!}d8}mj2Bz82{%~`t)GwoC{9!*sMR}g?~;`@Xx1$ zlf2%n)?)9GfD?xIbM@~o1iT9leiIWB5*!k&K0kneUg_oSgMZ$k#EP%V&j9{)8(uVQ z_j*(G&HMoG0N()r0PH>cwfEQBuXSJRzczfWe65KUZ$3jO*I@5C%nIIa`lj@6d*4rd zA2IP=&ija@82x*VB)z*4tN*6?Z+l=Cgh3FW4iZd-xe&=Rwi~|b``cn4U-Q(dp`IA^ z{>1y^v4(G+{@n|39_)mTOaq=6i;DsM!5`i&fp`128{XRfwrrt(%ez_cZY{uIoVM=0 zi1m3pd>mxlxY}3Cw&00Xd^wl_*GjkoIPhQ%a22zCyH={%#+;YN_vX>`8;@m>e-wF(}B-E1Q>0v^ZoNc~baMPmeiVFW)G$&Db< zlLEO9nDE3@%Ta5(=_eaOFJu{F4gZjb&O}+ufCi!u@&`%s!+i!&I5!{o_Ku3DAuqzX z6ztxB>qvoTgUt`L%ytQ6n9YJ97=)0yjmE0Ot@5Q)fa3w^X6CoQF!&3J_ir z2rd2M1_OPehHev+&f~7jbS7&O6H`&o1rx6hf3}r*h-)ly7#fHW6+}wszcQvF5|4H08m{*Rn^%5&=jGqdpgHfThnQtOXE~I&PSq72 zzzddW>t#zO-dxEcNP{=?!Yx^9iuI~(t?DNVO^Md5^;}p_qOo!YYP#c^cCmcHEa}X0 zg;_2L>wdX73W`>MeG53Wdi5IEy;#KpR&WqXmq4x$l3QFei(z7&^!d(K7uo!NQ z1x!SR0ka;ISKkJ9Ti{9e$#@WRX@sV1{-Y4IXVF1+HQ_tBQ#EWDO` zFxl|!NOkLu=Ag>dg4J4MfvMp{S4QQW;!DXBza43BjxJe~Z?eR7?ss~sC)&cePuGd= zoxLY+s%I=qhN5{i*ADK$Z#dTa^R~23j{%Vvlf3p@*PXJdeG99v=8LM#W~h#83~Idi z(7V~(yu*5U@M5Ualx^Kmd+b5fy*U+2>XY*qwuEx0?(-|(&a#BhR`=y6&)0tKv+kz!MKpT5 zwz`sN1TXFk?&y~t-nl7jN)oHjF0~%Yos%ChtW}pjUSGCLT~{RjAN|{)ykq&=lGNOo zC$pu0npklVZ^T$~a)WXwSflXeUK~77kfx^FJldvITq#_hJLAbt{;TZ&nf!}m*6@z? zzYONT@^4>!2;+(uSSIK0tBj~fTl9;I;re9nZ(rVdCjGw`&{)O4So!lMKi~B17*=KA z`Y4bdS@^F#pw={;HHlFjzt|aJ60jI&lmdE9F?^nHnVqycV48M zweReAU+yO>CSOOP!4G^vW9IMdZNIn)BH8e+(DLH!aK^I(&-N>_R#y1u2D5nolvE8G zJ(y#LdH%b?%HaseH-gMS_7fqX<#{<^;`zalZ<6yRmOGt0*6@5idDeBZq-FV$5X=L? zv5rpD=aIQH!JhTW7vvqqZBu0qA;1-NHK6uCV6U*BRG)0oUjyy+lU_%o9A&tbj)G&>3llnowMX2P6~VDc?YY z+3Q`Y`aO@bL@T++F-zTHy{29Wv!qsR&DE)Xx#70J+(}hi@Muen#b~L@2q?K2mFMkO z4H5O;c_+-C?@F!z8IsG-t3Hu~fdVgjHJmo7o?1)Mb;Xh<6?%f>`b7IIul%!;s+I0$ z1)6c{yV5+&+doCY?3s9aZbbe$CI1G-m!`|5=W;_f=oQS2VH^+Y{k+88bpN}@aGTMi z0q|=5B2`%}DO|>@QMnEP`wW7JTYmh%meh^#mgv|=!&;R zg!A_Ocwi_tpv1#^aH)qDZ?7}@`LqRNM(Y{88jL9shO#J4*+fhaSXO!(*ADSXEjcnt z9rqi(^m+VnaM@{I4m6=_5xC#aq?Jm*qJ|b9!NW%D`3))$P$XYP^$OKXc*;+sNE+PX zqe#}wO`d*=f+vGxCg2{PJAF5kaF5=DK!(imdR1I-)kOigTR(ZBUdCO3msd(Uyc(?r zRnH5q36O0o@s!OV)x_b+nxl|^7Sr>$tCPY_isfL8PffZi)vV8*5P*AqG&NC}G8m+* z)2h*H^KaB<;kEjcJ_>HsMoGCovn{u0t6V*4iBl(PxQ44zqej~p9f%p$#B8JFc@0yx zt8>Dvo0=9R8{a?8Z<=1Q%sSZ`S{|uZd*ENPt?~HtWc=B@zFqjgCG+n0Pb(dpq31AE zpMm;NxSIsc^QF>EUVUD&o?&m-vey@Q*#c2EA3B0W#{|~B1*&3L!4hcLOW4BWtV9pRI&X&5bL*8E2x&s`U(4ER!{H3a` zP^@QafIHZVnjB29Oae<7)Jlwu9=bO2ytQCo&wAI9iP{!PRf%-8`$0tp6huN{mf7_F zsq^E01C3&$UOk4Jt&&hvyw#IYfLkbrMF7h;;Ld!#+2{S!yO_620%iC*ZXeFlasBWW zg}f6CU-fL-iHDjah!1Cq;cIO8 zDr;KDn$~OX--LfZ5C47v&HsKr+3prKVZfTgR4jeSg z??>wGm)N~fC^dLnHk0+6+53^IkLS$F`;ltQI|aknS@QyK`aTY%G9wSMMyrK*NSAn_pYJ> zucm|ctGRIv$!gJJwJ{4H0=_-=A>;KN{Fw*-LbjacPT48t9mf~xU9o1vd)M8TX|mgn z?rmr7USOLmDbOak;m6t%z)zdHBDWYwWpyY{GEyVZgqwP1o;;QcxjzskU`(#&4(UsSiuW}duj zBC~mOn-^FY=!T+L;Q_FCLhU8FU;z^4dX@qtCh4YFKRwsX5VqC zc?&de_8BoqO)FXRX6ZW(uDgE&M*L_PFKJb7EeY^JF%K)!t;~d-YYPp>eh-VoWuIeJ-;J*5NPuLM^z?1YTzT z{$8nycoL->nE>B~STO!KF|6z=Z$6o99J^CcwNq_A zs`iDbMf34L82;iq_D{n6bZky3IflPpjX%vy){ot(E}5?0Tm1P2{C!eeI5ywDe`6#R z-x&TiE7@c0PHT(#)s45pey057<74PUE3hTTJY($6AhKo{eGFg-kS`wHwN-4O6ah(DBl4&f@mzAv-&ef2=R#@f`PBm-B@Xo6>j50Gy z?oMz_cg*u~%s0;;yEBNLT1k?>3&e!3aPj#S30N~3(;`ZV?%!nJMaj)s&`eg41x<@M zS=V>b{JW|AyJ!J&b2e^lz9mU)WC7bnwH7GJfEx^v$SHqX=EWOq*~ym76fAR zW_)x`z2i4JgI2+EzvT$W=1rx^&v$nEQ><`^R~yv=quF=N@~q`JEAYp7r>DqGkor=! zO*+=(%vdyZKvuyY0bVk0@4FV-pF9f5wW zJhBshJYsmHho&&;XM5PI)%@NDj33!SeJf+G-ke|#d)1hPmFPU$a$MTw9B`O7SP=SPp z@R%naH3y94)nfhxZNES3_tSyCDS!k#I*)&M)Ezy#EbE*ob%xSBowLagJ7>vd zE1_%^@0`lN*rxsNG|eo3ur;tRP<@m>vb{eLo33_WRtGn$wF%AMr8mqw$MRkEi=b#7 z#+GLD0u$70nSB)$WkY!^(HgyHIp-M6n0R z65(Y^E*n1MnS4^s0!__QCNQoqP~=5J=XJ=<7P%S3VQ838au*2aE-2W=@21PO zH^C7FWlQAdvwR&`wuz1)-r>jk_My3NKeMGV`#x59ky(<2JxWu0hLxtmy*bc6mu%iv z^=hlCDL96=3y$hQtM0{Z>OSv^_2zkFHY--88Ji-Z-Zewz82e1W87=O3p|I%IHR^ zKa`DZ(~Tt2IYwx~sC*)L*!PU}M={%E{>2UWcp4t+`N)3uMRu~+n4{rUGJfr+c1~+d zwR_tA@DJBi^;q4}?lg69x@uc>Z-M&oqBGXH*6cCn7%G;a>lU$9%{PU09yDITSRb$@ za_e!hQ_doB_9+D)E4=e+huJvh=)=xq;(HT}Zs1NcsnN)3VT;7|on}!MAQjJ)oC(Ys zpKKZ{tZLoTKe^+&TDDugd$rZ9+U9=giN7+aEfbuHs`avChnX&FZ%tB)Vx^+Bq^IN_ zpztQtUjSR0aPG&orPrZ3gjw}uriC4^cA0f!g`L=WM&nH6&YjG;i#JVEMs5ME?dW!l z>yIXHS7dG7Et>rEFLX-9CcGCcu*pQDE-I@}hk|900p*8y?Iy6!ann!M*{onCs|%5f zHM~2VzNM)3$H`<@MRnMDiGk+JNY=TDHBBKuS=9Gq#ONmc!=AxOGpvWd+xyQG%U4hm zIccouN$XMQ-@*I0;yTXqH+tu9U{-G$oP;LmOqWP_tUgDoOoV|=qz|20yz{zrHx}3B zUxe0eQh_IHIRtG>p)?2V0HwR+t?VXDV7SsOjTOBdzJNO%$zg!0d56rQV@1!fS_e&2 z`3nKRiXqROEdQ`k`eC!|+(-VmbC>vXI(G@_{zWKFfYDuIbf?rb3tYfPa$w{(bME2J z-Dq|(Xo}I4Zj(zSdE}#6#s6%T&%^@UEYAeag zn^Qfv@r;ufK;xX|!-WaulkoRPJCB;9$4VQDW!8P3^~6E*QaRU?7yGb#as1v&4X|DV z6dz|L)4_3t0&?dHjO|>`a`%WlZ)VGevO|>pi1sVI%-d8Jpmok+-m=q7xTat#D+mKG zFbLA=Aj$=ZVY((rgGqHtn?D$}c?%5%Nrq6|QZQGOYw*g|OJq>wHB0NUODMoyGI^+` z2+4VvIgj9WGH4gsu;e_%od-QYxHQbAaMD!nGWgimW9*kZ-Fiztv)qQ3Da6x!ec|7- znmw>p!Nz@ZfNJwnZ4=3LlviQ?2IyZR|7HruuhYR5NPhq}#*viDJK6#~@$HqSF#Ln( zOCRjHK}Y=0wZAs?FUGfv%wnwk0alY(9U5@>la7}^!TinmHX9qw{Y%|<86K>9uoN5T zn|F^@+_9a3P9o&yG99P-1hg;mXkV*+unHb*R_uYoPVrk*T+mcpFh_;x%Nsgx0QtkJE5yd!H!&n)JPGcf0-dHi3A&Gx!>-!`WhdY^>y6et zn1Wj#ETq*-H=dDAjB$Jaw$Xg85r{|1t%_`j@&Fi}LYZlGL9NN~)yvuf=$R|Ga;_ z+71rdUbIL}GWvosEOVkn%K z6lc1&BuFaVH^F%Ylbly6KXqn+^D=j4P?G4pO7zTDX9lAaqI z=$fv463|FC{l&ftm%l#-{m1FOpifAGu|F=79xf&?-C%1wjSZWBe+K_)gEO;9gKrn$ z@0U8SsQGiqyEjy{oh2zX)U=(m9Kr8>C=#k6YVW4+Q*d+{{_jxy|4eGVpE+)8@(bquZZu@X-2PeXFB}F8~)-2 z-(Qev)m#d5W>I7xz3KUVI&S{{0`#X!E^egNaZ*A9E}1tO-2n0my@mcX_&!7aY9sq< z12`$I(LsUxJ>gB}yr~_{(R_a$6xKrI$_;P{)}O_{zd`HI-S@gAsYTX}=14zKF6R=w zV2|9D%$kJkQb+|j`P#2eu+CX9dYiRK;s==zNaX*VPs&p8hwJ$3NexN(ALsF-H-7XQ zx%LAyFB@yQ)1+bfH+f|il&lqXR4~!ioe*`$$?Q0YqX!56_oup9*IMp1lBbgor~WY#!as@hFnwOJO;K2obU#@kP` zd)G`wJ4E4S$r8_NKwG$l7jEWSsd$%EybVmW(1eB~(OfHu;&4`*#A_$AGIzXe8F)Tl z&Yg+pWV~fx?F*DUwpg(17>s0zk?Zh-;6F&v;%RE};GbeQ{GgLZuR&v)JaSw5L8lB* zdU6{#j%1VTXmryfEmV2awfIV1hj>9cjNFo1eDy6p;seIt$AL()m-f;hQ?Wh^f8v8b3B>vv z`09vy|Av|$$OYD4GcOryZ)~5(0$~D03t8@%2G%P~y#)=#vrU8QBW{$FyPj3wa(i;E zQoI0)=SvUH!Gp7seHL`hWB0?LISBG6K>c!XnB+9>xW(!&F-tP!MuL4CZ`;R9yr6xt z^ym;gIw%7sJY+m~8`S$j9wANz8csmNVdy=K~#ox&AMk0+=1}5Tx0ZN%~$v;ejfd~b(Bez(~97dE)%N!WZ6hA~M zKTLriqBzKZS|J`SWiH80nz>|yOHx`^Ni8egiajuoRI{_YeM?JL%Z<8yYRe`yFB9v{ zc=v!>Z8T?$bv~?M;D{DgSEQZ=7}ql&Dz1XM5Ue|8o6IY2$^G8EeJRH?tmp>ABpQGH zFCt?x7w!=-`aIl)40ZiOlze8EuCFwpDNj-C3+GxF4Z&=w&0D6>1jI~7s&P{!oJv( zR0}hKQejWv_T{+IzCy7t_o7_Y{ghDNIFUDovc`$TUdG!K{q2+s(105KM58Y)C5J{Y z+}`L-5R^$30}0f=-6gXz2p?&t$+&pB^y_NRd??Rlz-h^2Yu<9Ul12hG*-s zRL~LMZ&X`1slx}#0tmJLT#JuWDh@bO)qB&`ft%zQ`YX^9_vXCXv=@< z>Sq7^na<;8TsYS6EW60qa{C@o1ED+=%7WNKFL1=kH7n4J z8tC9Kupa8JxSJP>meYjFd_|cb8%%**Kj_<}3?{KsA80W{*B(~51s;YmnIxcr$~0)+ z3%xT~OFXwvWA+#d#&z@{Go$3dnk@>b$tDD2D-xUoMyIZJQ&=}u;n?O2cmwbf!4k z$gu=V28s;a!+tZsegm&^FG=TMxWz%3M{*cE0UTsl;P4g>FYfT>4j;GubHx#aR~?~> zBZNDGjpV)bvh4O!TO3n@9MNvji`yKt6vtc-Zgec-pmof5SKb_pWXEEPB|c;QPp~@c zlXt<}<^#V&8QNz^oMfQ3CqR8w)6+kF-pbwk35?t=TkKL=t6G}9{crsY( zD}r1CH{mqu{6vXy(Y@^Go-5-T}QfUjgdD=}+0!7HfZP<9N;j+%xhL(6K&-9>_V z@?3(J;&H#zt=F zN3z)9G(Nf&T6eOqx9GaAksw-=DI7n0f;B#B$+Y~5Ls5NmoP0@p+=D3dl(FYnvxb#2 z$e&L{Dlb_e&6A1i+R4jKv)W)$eo>~PVriUEPqT6#O|uLYMFx5TaSRyVVy490M}fb?E=FX`}OyV9uC zhvCQ-{LX++=VI$k{Ox@FdQXivft`^%XxR<;4}0jBjw6|*^F%U?{$2pVYM=(d14fPk&3lb%!|fG?srBpJ?mN^?1vfg)B`s}B~djCsG>#92W%jR zQT9$)nAK*=wKw=AA|b+|f1ar4ylMqh?S=d#$iD&=CpqEA@-ys-7e%k)Gd$0qR{^el zJPRt1LaV#HO0-GoV%AKiNhE2JCpc$`{AB1zg}M}QWQ(FORvRw~s&e(MC+1}2(QC3` zoIDxB%@JcG{n%q5-S{v|6t058m8`?ezCML(Kg94PksVPIRml9kKjF41sr- z0R|_7ZIbS<8|c04A|JxPz6y@xxM?s_e3;K%-iphM{r#LMSqL8%N-keEIGF_XqWe#) zv6fX#F85V?Pqk*_yJeLr*msgN;l;zcAh67ma5Jx;j_cY@tazQ$v&kCtn z2ah)q6cL0lJ`0jQy9Fmi%^F^_oP2%n1=f4bLJfRm-rh977f)VGa^WI8TDXu{tQVjC zVJR>7B9?&<27@aAJ}h8^!Ty6GFc>boeBi?(7@f)56nZ0lSO_j(?(!iye^_S0O{3F! zn~{G*x-x#Jymq(h4E@F%M}jJ4yqDfF9Y>~O%?+%%To~8rZ(cZlr=@xkG)IdEkwDZ< zn+#R{@I()v&4AD5i@_aiaFbR~d?@*HnQH{KeJx>yOZnhwmOGc{6H~bwCK4|`nMaeC zYl`GWY2b*3$E(T52^dUcWy_(;AX#HrKjk<9w3uA#5v<1u4I80hzU09^J12j37`V7U z8Jg0~VjP=ZE7Sog5xgJ2*Y{8-(PVz}o_i zqtoD*W~n$t*EYcj@F4-sAL9QDHMzkQbIszenbJ4Y;G39a-MHF@JxkPQCLCS*Az2-{ z`Q#M7IgGzO(wgJ`aPUt_gAw?feN_?rl~QlD%0sn!nl!i;dr-~2 zq&E(F4_s4oFPayPTVFJ<$G8-!G>j{vWe2MODB8v~OhYkBtE=43ssE(v7#j=)1C?|K zmIzy{cq)m{7{))kK>(_65%kUe6k6Sco)3SV<@5Lk7lx)Ytmz^FP=6R$#Rj%9g_PIb zF}haKReG{Yw=Q>QvRp5y*ay?u6CXCLG4t`f+Sgu|8(^L?Zl$%K4x>~8il)e(NW9#K zOx@so$z_JNBu2{l;hN-1;DZa;hilxGps&w>ZYri?LWjT4;6jBe8ugdJwGKYyun)I^ z(quxfyP<6lv{47T?An2eu4IZcZO1s6M&~5!$8GhM>FqPsTw(}W_0fJccNsok zUKnLwGj8ju@)d38X~7<*!NZH9Wrirez?*gpm8Mj20sdK%|8YIM*2CkCtSpvlo6r{} zkvJV;+`fgkaB@$S+fnhmY8vk{Nu4nq7x0>uWW8NkxVFffJ#sUm-AwArfVx#mK`<|! z2@RQ4c!&NuV871WcS3C<%fF!cAGf7{SOm2hQq^{0yD99`S@|t^CZOI(B@c-^FN5Ro!j+`Jwr=b>MdU@)5t>^f7Y zQ=1~x+-Xm?JX!Z}R)t544}P_wa2`JQ?_Xq3S97nawq@O3b+P6pV=GFyhHe zJVd^iN9Q$Yn}-{dxjho@xw&wiRAo|%rs|9KLRBR6P9THn^wxB8=w8DMSHfnDub)XK zD&=Lu-Ict1J?madbF8~8>Q1sD1JBJOYbtb&9LIg@gHhuiZZGy+Cy?ECQ!_dT28j$N zvM*Ks<23kV4Ey6WKDd&*&hoY#HadgnoiP1X4{bTT?Y87PM^;jw%Bf%Bmod1m=LBhD z{c+KD3)-@IeTr}$r8m%ai&V>Xg1L_C{x}EzI9qld1J_Z}F1zm=oyps|c)JAJZ?e&u zZt`$+4yCH2Gv(1)VsI0<4hvTbxK1W}jTblnDFdqxl}0w6D@<((R&zbn9$&S`M}4R% zh_6hjKHCnDV%4X+&A4E^c&K%4|}c`Wy>(JY_-yQiM8GmCaT#RrB%9xOc7M8x13O@P_KvwmxPtb zAlqs~$5LHWwnx(yRvBWf3}qD>+|-;PJ=m@5i-W%9l;hW561apKub_!cjMd1@vIWZh zMePKoeGYpnfdS*GB0?Fnju1+_r_`=xClq%4iz>A_; z)dfbNEJ4nl%!)WG^MiZy_`SKzwS*T$K=B5-a|6|Wz>&%v%fK3~bkAqi{=DN16o*rp z{xJDX3Cb2h*=(ufDs+(b`}1}`>2VT!yp2lskCS-)QlKvJibG)AK(!fey$KbhO8d3L z42G!$KDYt~7xMvs$TRZ0oZS_yk~qN>QIrEUGtHjkC6*Uc=jHFl!;U1pHPgcp9^^QU z#~r7994GLQ%psHp3b%vx7&}pNfydj-3Jq8 zr4_4!E7sBu2zTn`uI%6iAR2$4`@}5>FV+}~DHk)(94~gEeF7erq{1V{!sE1`!W|ii zA396-_=8+{Nff42Qm3Pb;>p5H14u+$f{_PPnT%3tYWgcOXp8i?ooJZ=$_D9LN{fpE z{fa(yAbz5J^bkesPYr35RECY0^kU5>JT1weGDn%vp*vS5f`K-cxbx2tcNapId&ur4 ze0t)3cOH3(PK3ELR`>H6ou=?qHh|4B1(|crv&Ksh?;719&An7K(cLh`eWN?EbCYTG z{9|;pn`$CdOuzI^iS)gZ5*@r1+F9YweK$x{#GqkJbl*y4Ec*GB=^uCBe?_mAk^{zT z8@tb`mc>xs~T!FU>9_c77EpWi@?lXu9}Jv$7Nn$D%bO;$CO@N=_fCf1a8^NOA5Y#eU#3N-1nM(?$R~no zEj-|6dA#o7>j+Hwq?Sf7hmY6wqJ29&5W0_?irp_5ya3j|1KKy^T35EQXb~@3NK5d7 zOCLS84`@YMeGF^gDUTA2>pms_>k?LeLwxihsL*~uYTvJnCWz5^?PvlYjfamR>|-zi z+=eGT9=%ho+kPqGg_pY80|L`Y4vlw8m++Qose|&cC}#1cogS=qrPRLy=<{At+w z7aDlrFFy$2F9_+8j<%mMjV@uMi?!{iF#hky*x!$`Q4&)U`OXIcRAQ_Th9bSvJ(a+B zQy<Qumlh6q+qO=y$^ zlN0SaO~}4!_|G92KRO?}&zZWZ_6zm?P_&OMtT`9&p49;fwYjP(M6C-~t0M86&7(Wj zx_S7s{rKm!qSd64%`Hx9<3 zhF{OXcy2b0H^0D|n;6$lHNYI^y3JiV;JU4K5%DvP@}URO;JW38R%9H`{+`ADSdogK zrKz0(YE4S*6m_CH6!k(juNZd@mrmz(C!swX&2@gDUZk?UNA*sg4Mp>mN7wj+BanYu zdA1Io?Sp5>6%Fg!CCJYgoa6;(z)sPB;5Izck)BlPxpO*uaawvou9JOs6Rxvdf55%c zlhu4+8PuL-wTr|6i29Aj`onBw4U9x9;V>Cv%d=U9mNj10G;tOpUQU6R(F&DknT}#- z?*Y*=6M7QB=|i^UeC`UyP3lyFid#*z`^i4pJbT>v?9XAGnAG^bDIU*mh!-B>lO)6_ z)n-yPuG=&-F}esIP_(-(T-k272CnOv;L37CoNLUL=_cdAmBBwQ@O-eA$jb+D^zv~b zd|U+d>dGV>z#hahLjD~_jq9pRUF5r^t|ZBo%0_co`!ey7>e=IM_j?jm^_tqARzJzU z7{3U{itYGi7=Fo~Pa_3vd)Bj^YOBrzxW4ufdz#LxS3$KFp2o4KTPZhcx4oKUmd4wL z(cy>dDKsh6bv@o*@_O!XuYFvs(w2()g{qpwvBC>03_q$l z>B-*X9Ts$i;}@4-2CA=4x(?x&CRI)SsW1MF+~3_x`Bz#`s_K=GtFR&jD}v3D;~jOC zYu&p9p2tC+UV5~Yw$eotquadTRwvFtSsaZE*yrUX>eV}7XP)8K&n8HSb z_~-;a8bq8-H29Xg{tJqXC-HKxmJG?sRfM+?_4(FQ)SH4P?cgPkOFW zW&Vp(uA^#|rf1bK$MW0eobfKaE5YyygF21Bm@Xu_cOLZ46hhG`L3}B!Vo{1Wb?9g? z7MO>kfrpG0&V;Vbgia-?Y8t3(M9oF;(RzRhUFSq*LgI{+$iapUMB27 zdyU%9vHXjy;UxEfdpB9-NvK&4A@XOlz;+tc`Fwb$a&Hgxc~F05|5PZNfg6XHb1lWG zr@lt?hG(Jjv#YFbE3||QZZOGQ8K&Y!jhE;+tCiu=D)wlpqL);IP(c?;84OZs@hrtQ z4JOQ??YF|DXB9VsrSgwc_O8yq*HXtSxFO7=y*N)d%J;zqje{CS0(pE)W2n&QSd8I=bN zh5L!Y8OaJ?d;wwf1D(WKVK$Ql$j9s|b68ech1GJqXMs&_MfQX_A=13AP1Ew1st#6#1z{ z0*Vwy7wO%2PND;8@O|gq<5+eP%hCof3%Fc&mgE*p9MHyP?*o;FxS^SjoznG`N?I1aeCPZ$1ny z*Wl3wC;`@aUiM&~a`$%LeOP%im0NOPIE(_wK=tcYYK*%^<-@scy?M@fzY85_VQ3<5 zvCZR-OPVL)yd+#1iew*;>WLy7nkv6dCui1u70o5ltadYWUlrX~z}+3Pm0sD<4EFJ` zo9#DtoMRp7(nqRG!cerEHLaz_u#U^nk-=QC%(a$xT&42X+blK|V~7y0P&%uWEMRR} z?BiLW&)#Oz>JDMANmIk{Uk(pV``s4&`9ifb2mi2=T=-C7-8_;Q_aIy`RNm|JbOHWd z8JdMZzp7foOIG0TFFah!v1~r6!BA_H4237OMd7@Two|c}AyV5m$PI_u7H1;jQzQtHJ)x3E8VO{TJCNqO*@CWM@s28l->~5Cm zJWpAVyRC3B`^k3PbJq`QQe`3aPGP;FtY#_|`=BjG?vzEtX>i2DXEDmaIT*;G>Vbjy zDpvxD5n8sRx!^n}PFub1+dH3X3r#6X6IC7At7)9pvPI8&ZnBni*?OLL`$E|*=sSvu zTHYTdst&T+`4nXz*1t9*)l8;y+#}4>#~(IgAs0ill#gebYYoAIp&8=iDT={AlQF(z z9Z|FL`@{U>Ir`*dD*JebeM}`c<%$z7v;6S_49#XGNxUROD!I%{HuI7#xTh@z+D`J4 zO?+q`-2yJcKhwqALv*9owaidE9TVOjQmR7W%~sl7r5k@-hJ}8v+3KB}_%IzGo*oRx zpKo@}!(SdThmJpPsJ#GtJ^yhp|Kn+{uHdf}vXko57s|&BfmXFZ6X`k&_*$| zi47&XU%Pk7_DoT^9iGgjg)cd)8%iYOdHe)>FH&ag&IW1Jp5ssYdlS_=TRVePTjFm# zejBF_`l(Gh_`ALMpSt%u2P1qLz*9pC*Y7I1oPz>d){*mv~CpYE%D{SDRsM!O}>)GRlymcLK z-691^dd@}dF{s_i+s(W^mJK8m0#0DGwPFS(G*5@HFq(ZmjeQ-CiQW5HO)7L>)79K$ zLkHxc!wN;iQtnxk@hRU=1YJ$0FNm+V$WP6@RI91UpcF5gm1^B08^+#Da{BK0Mj}5+ zAw>ZnceOj-tuMp*f6n<)tKNyj(xv!1WoWN@$LB}gk6OZH!)1;Q?8Q=D&jOfY>PhE% zqIx^0@y>K<6Kce`{)v6XBee)EC61mK+RHpfsr+)z_*I#}0t`mlTTg!hPM`&!g?mw3rr%62#Cej5qbOARHou^iqQh!aU9~-)) zA4-RsQ-rhM9-tP)w|n{9eQf9;c+gCCQG56JNG{&fxzU81n(*c(LDhX)bmO?I1`A{H zbs7$Brta8M`Q8ro-q|1h@xOVhDwIxc+hJZc?&>H%rz=>>_TrAbV?Je`LAAtnRnjie z)huszXvI0GFzX6#i&9?;W_nAxI=o$RSu`$(hCN36Elg~t_K`SI85>r&+hCy{!yo>#C zJMCw_swvzr^-k0c-jeGQpH3BXdsgmNO5Vda*iX<>uF%gbo zvbVwDgNgJ=E-=lgrA;yhnNxc)eJ8acc`JHZqQ)>{x(H!yqHh<}fI_&(==MI;%fMMA zgmF%LV%_+JHsreFH?^G@CBhqS63QGh{=)Wp`%J(bYNRO{Oa?qE5jHzZ83#ed zz2MI$xDVk47jaL)1$Rjma6ps(?D_it>XE2eX#gaS+w`3hjanu1-9$?}nbzBlhRGv+y6h53&EL&at|c#J z`a~YmBxpmMyM0*;$)?{IkXh&8>lqy<@zFN5ItPDx67OwS8}_RW+4#S-YU9-2P53XH z%n83Q=xze0nzY4h6x(f4r9-o2@1*>F2Fq<;t0+Y|m{@qgWQkGKjjUuXv!6EQ`tV{S z^;rG?G`$C0R9Ut@y7xYz0!7YF-#c!>xFFz*O zQ%SLg@67iQludf;Ok&=_oc@|drfm-7D~pd1C2^#(0A>JR4_I4c4!yRO<}KCdo$)cb zX>UdHq?YBHl7p;tl25TlSK!WSyu7Nm@|C82?0O=L2(ra^**(bha8gHzGK%l5j3Gt4 zS*3wiZu7ZvoF~HPOlTb8*%-_BGy+04jTS60ZXPJ?YRken8?jPE z*gq=z2TDCwCy#@PN?{bin~DE^GW?9|WN5@1kO9*mNft_ypp*F)*$dyRyZ{UUo;ZG1 z)G&wyjZR{oS`@t?Y>qscuhE1v1A-tZun;Bs>hNm}k$u3WP>5(G2^dCAt-+)V6U7Oj z3Dr%6Fbf)_PBbVIE^r>No-sJu)Yghd-+`ig&-WlewvQ-2OeKW`Aj|{_QC8Gx5Wop= zoxu2M+gYA&%Le3g4>2wrC@TGNaX1KtCpgE-&dAxobc$eR#lAeD*k=ML4`zn9=q1y_ zR93i0wbYn3iCPn3mVtl@W5vR_VbAm`&|N^`3RbvOT{Z@Jcs;7^RekjyXf+y?NIYSh ztKS23kCzUApi?yl;8nEQ=rK@K$IWqOH-^;#$J7O4hRb^!7B>hrTc!8i@L~auWt=xq z*uzUzFMJ{i2TOxxsb}NV_iJ!%FkBT9<^$^`h=ExqfyULkKdPhMS8YcO4u~A!hY3@= zC-FmAuz;3oFoSzB7`owQtTq)snc)Ej`k!JxJeVGV!F+{^Q7B3UVkm8ZX=>vsrye$gN*et?VU zcH*NQ9(Gl9t8=cF?ExoLv6+woU?OT)u$EQWngVD-Dy~y|hI|@zWHn5U5qLB3IyWeR z1CECF_|BdD`%TVC|4jMAsr(nBIWQmtCx}DCFF`X zDcC0D>4_tUR^*bJ81h~$f+I#c;OKn!gi#uBJmT&6Dd|=WU*R0Z`qIHeD)ZVm@LzZJ z9pLZg3Prw;HShWHvMu}%OO=9j{+Z^RgK{;=s2ixfflQjZ7;<$C>Dx~wa(y$ozK!szm3YM@8wM&npP&A5s#1_4 z@E^18<#1CvHyyq;_0|Mlw(`L=Qw0gLwKwoudg}U?7yW6Gfn*`GydNo}T zkpF~cscQqu+0Dtsbdt1$lAC*h=`{KeIQfq`9%|s{DA5${H58?RMj@eqXVh5TWUF39 zR6*T(@+P*a5)&_PfS?b$MogQvZcVJEWcF_6@tZ^^s zhB!g()Txu4TG|{;$~`bfP8oWjQztmJl2ZataWd)ziz^?g;)= zT5O)ID>o+V25K*Ngz!$0o08h*w;WY&rz+1!6-M;xjr#^_ZML%`9eOVZQjp8TSRSFb z7E>?7l~kc%gkaw#Tn{8y*6A$Sf+yhlf@!CeM}c?NYpf{dFp^ki`4lCR@?(flQs-74 z?UW-dhfzU`<;NV=D}%jK`5U@D?9}&5@!lMy-nkZDaF&~ zM{EcbE!8(BQ_C1h*(2IlLw0H1s|+wX7_^J3c~F^VO7?WA=7P|;P8C1-)H&KbjQL=wkV4T_*Zs^u>VxUx7Pn^-Q9D?UJh0QgOH3X!ZE0M?Wa z8#4xKi#tYwxkCB`gY@}Y)&B-%Qpz7o^T++K00Ep9+KuW)6MQ_FMipFqr-u(gat}lq z&@GS}5HElvLwPblnt4J)0>Q|F27Yfd+pU8J0pZMQ|M!hL0YaHmcm=_oZMYlkydl zbdy!h2i*Z5Mc$zsft;(Ydwvd11u!}<`%+7yec6bjqYC5GO&3bS;QCZ+5?W3}CX|ho zd=*349GUr*>?VQWURSMyVPHa6TK{V!lqTc&fjY};gsQ?-F^6;m!uJt>aBqkh@Z}5m zVGQAVa9MX1OT4`xBA{RtoQKdu)rIRn{4uUL4S9ikS4028%|ISwfK*urU*bUR6>i?8 zf@|=pnnS5dQv7@_95-sz83U{GJU3he**O|Q6E*|DIItT6M5vBl zBoO)lv>V9YbWEWKPI(%xS93nVScanzGX`oqc=ZVk%XYL#H3Pwe+=r#7Dugf^YPlR$ zII5(9x0_WZ0guqAvMzr31a%0|m2_3J---u#s*T*J{%SUw7A`{T_l9B)UH^zWCPw2x zZ6j|Ff*K8}$oy5(f>T-aR=czkcaIeLC9O)qXrl*y6g@-k9j?KTq~c>$&w#on0w92x z1>UGrfk{!-IF;L~S_)7}YRh5M<2x;m7)2Ewuf7dLb1-k}0I1)o<~;O`WVeCaS9tq@ zPdD>#vXnb3`2S4g|1$x{D<1q`gOq!#yZnqk1GihM!db_D;o)MvV=7;nw^H+7Bx{#w zyGZVDmFywxoh|I+@zi>TH3VQHyK`9&Bd!fb&w<;myk;C}-hig2G_NDB7-}0U*dj@n zmR2qhUC}}pf(ES14Lx=(GinEJ-{b9BYJ)Mz!RVygZ!pv5?mH3u*^VwZ*E0Uc;E(+C z!=9e%_r&vCF57@lNfUU0Y#RXvPdKpj{yvpEG`4-(JVcqXK)3K!&LgxSniMRD=xs6G z870Bu_m*WuH83(r35{($4O(t7^P0)T6-B$Wq%T(ZZiDu_WYU)a1(=X7ciLqjO-!s` zLHlCxQJ1Ht%L7O0yF`F$f+=8Z6|+h6HUYtyzGY}~tBsd!>szL@%~cL4`Go%wArQD8 z23i|SvvtpokY|}tp2@XSr12oS=~^wi;*G*UYt!rXu)m2>9%yag?HAnpqO_IB0vjX1 zcCQ=*HKff{obtg6ftMILAZ!1st-r|sN7Lxd|FVleOX3{{-r){Sr_KJJjy%eeeiS)xU;5qI2uQvl;fXCkB9T3Nh z<-SGq(_GTLgU1!Ze-~%?6o@YTZ2L_|MA<=pU*skJ{2v*83oCsT%SQgy8O(nBgFEp6 zMl#l$z!Q2mky}TRltE0M(8${Fz22s4N}&}-9&M1i#v8?f_Pe|TNG7c66>!}QbQG5+ zKbIw5;=#MdH+$U4GR@#^iM(wC|MxTeAO2|LoxJ*Ra^2tPHqdbeiP@tlVrOuzyGh=B z-8ibDa4LYFAnFzDr@>ZKO?WSkqe4HI6nMq=iRmr6lQ4+GT;tA!y%Z z(ls^NW8jXXc4D57(l|@$(e+OAa^ue;`Ll_-<}J;e`5#6rwY!a)fjh0v3+(qP!bf{p z^D&`r7hnD9T=HNIIQN~-*J&8MJ2!cUhkScB$ny3KhDY~JlGNigun3G@r@3}7ADqFT z1vi}HUneVV=lHj)__MLhm^jdBy>rC9F_isz1mZ}fZ5o^*8lhpT)UX6L6yj?-7!6t> zkktB;+Azp8FBvf0+T-+t3-p5%s$NY*H$YHNi?`3vo4$O-%@C&13Zx4l72vMndofTA z6sPIJG}S1RZ=Rz!vw6aMBj|e}5mq!s5S$05;iIM{Ir zT&4N2{{9LcjoL1b<03o@AT>Nxa7fgFRO};i^J$^^6e+yOqbG}n8#K*l0k3L4MVn7c z4$;?fgvU7!Fg)I|4^q0bj&}s`{m2*s3E^34GLM>E#@8c>Pn9Sr6c9%ys^qyrox2C+ zo#XfyvA1JCi{@X>=H2IcaX2pyb4@V@3_Pgs98aNOmP{w80Q59eY?`TQnx%?8{Gq&B z?ogm2Mx_}5N*2jY@ug_?^V#TgFT~|C74QT2?3-6ej z>^0D38zYn(A${Y!68QTgA8YwPnDQvg9A}zQu(v_Hm4cvuS1caW)l?Zr5S*-r zx%FZa`|bz~nXXpeF;D3cN@b<>JpYH#6nP2mX|38W}JUx-4n``S zFm*&Ba_U&3X`#en1S5KA=N${6`CWI@djTBsAvSTr*@b`P@{}n_W3&k$1hG7Lj)0IKGGO;GQ_G7-f zuknu6s=pDQwHO`ds;91YrgCdmpFjWaz}{`VXdN%ws`oTz4)okAPZS+mR&jwnQGJFw ziV}vHHFr9fJVdrmaUyLEfuHxG8!0_Y3xdRdTSC9tKukfT>l79?W7P}9>h;8fB6$FS zP}(2P8j`f{9UR8KW5J`i%wf`>CSOaT*W!SM>YPYA!+=$l&EYR7eE|##v;ca`V7P?^ z&X|XmJ@qH%^~|0^^U|qx1S|8R$P#RwLn_wt*a}3m>Ge_MdMK8kK(DW+*JEkxD5*6< z8a4*l%`|#*H+g@#P&SX)eZ`NE(FlDD5&!|Lm&7u}#d%<09p$s2`lz5!~#)Fh31(zhMJ~U{6fGrS97M45QQAbg89Ez99x-eRz zaqK|PZEiIZ$9BQ7jX9=3^;%1aW9CH149PK*4Ie?6GlCqG%@L|H=NLyEW5M$S9iw3f z5RGG`;0T2|vO;Brj&Mm-GhQn7k|RLx2t-K3jks0%YASsI%Jd)T>EIn}RAmuOQ14cQ z!)TIuq6jZBG^G7dmZ7HM6x0!oLpb=;;N{B=%TUpy{vhwme0N^o*}fC}^E8Kdvd7@% zB5vKw-%09EQf$*){@)Yj&H>(^&I^=+Hx&H17HRn>_zm*}g z>ZTuk;7K1Kxd(A|I2XIu)9!VcODwY%z!YaA{|B*u_rc2zyyl4HQY(FQK}!%T!@>7j zfYbB@39Rb67}|9SUl_H6m#^@S{a&yH(2Xc`AsovFZReehtFC$R!g;)Kv2b7Dy~}vv z!pCvO$%Fjy-SrSLS2M}g42&n{64>a4l&_~Hk)$X|ZlA-RELJ_at=SM#t`UOeJTY%$ z6#+tZ9I20_w^Q)(yNH{Ul1y5bB9$NFu~)Z}-=C)sR!cyqdL{9bma(LxrVMBWOa#^)5R7*qliP$S5B8I zrx~R|h4YSMDEO0z$BN)PgQgB%bE=u}zmMXdhw;zD`QO7{&E;PP^8Z}b$C?GDMx(r| zZ5H59c*m{dl5$yVj2tv8_W7(pL&}bj${b?eN9~fQEijt>6r*)MyMtNOu2HU42-I%qcWnsb`lIkeAB=g^Dli9q|9&_`8UPN+C9Iy7>hOnNWy)xF4- z#F}c>Xj_((S1UEWxk6<$ZCOAI4$^`wp;_c>doPgQ^SFXF%d}Y|;n;hLRh&ZGnqjaD zy}4RcJ&vhdqsr>@;;RJGvVt{hUr}*Ps5qLeA1uhfH{zqU4^C8U;jeZmMN-eWch)LM+582?%m)j~n{?_m&U@i4 zdz+>z`Pmi6l*08Eo$_dha${%tW-O0_t8bQ)hchJn5N;xHBRtP09RlqL#Ud%V|7IC4 zn9mF5@pq;cFz502cXXds3KNa`!NUCNfUxR7O~E9jtukkvP%)pUAoz7-B}yP_fJ1d3 zEWCU#G6*^%-2QMTf=M&2j7VD|*qvNsG>#oC=;O8^z6z>JvxXo6=;2)Ua0W#Z!uOHn z`?2)v{LhnJT8IZxvV*6hD>q^?2iNS~_q+%0m_M*++$b=Fe z#xYj}DcD8o7m{88BEZi?^6F%=VX&x$TPC+8^H~_hb2T1;x_)vv~hOrC7)RFt0J*s2eP{6z_I31(V++BQ%iMvrr0!wnx&J z`^d{(MmAWS_hz*RF2tFQ*9PjE{gT}ViyQ96`0`)Y@LvEf&*1%;{Fik~&*Xy56%qXV zQ{aHbZ8a06hQstza9DUtz!`YV^$Fy6=g94N@^YiVwoEp-&mPa+NadT=tRNscvQ*B2FzcZGf)FyikmbBeV;lE6Ib^6sQ z{>yCMAItkuEB}{e{FfM^YlCtpNa-B^FoWMVf}NCJzLx|qiX)zV;!dodMsctNbG4AK zdbo!?Ol8B5F6rlYrmIGVez4S9xcAd-92HnUPEh)%^m#tq=nAWd;%~gsgwpP!t-@xb zVX*Ytd%<4Uu$*NLyLJqH)KC>M=nfCrVm1f;DXsml^V;qV!$-2F87vN%nO8{a#ozZE z)%A|aDXV^y^nD`#WjXI(*L$eZiQ+l@n~=1 z$!_}fEcPE~DbJuUCW*fv#q2P~(}d@74Amg-Cu&=>XzM27_ejCrMXDo6#|#=wukA;U zo8Uvkp~I1T^Vz*+%!vZJfXyR~Y6*EYMtr3;gdm5cb290iNBzW4whEu@U}FU>xdo-- z)((0Na%icTt}Qz!yx3+OF<5q+TjtWn1h{Zk5beWM$qC0p2yu>J&JZ{hoFfHisQ56` z-Q`0nCbNo3d}T`l?19F$5PT2!Q#J~&yN8FxhljKkqlJnQ7^<>c{LVsPBeY&Ro{9Rf zhz-N{qnZ`N(#_t;EsH-#fyS8jb@wMKZ6Un}6zg*3<4BC5z2&~le-ZgFo;@RbJWzD} zRyzOFT;tk7`@@1G^z%sSMcSkI>h?L*P43r-iViMku{wa6H?xi@)XQzE_z5sUUcxt* z2VlZS2Jk`CGDrk)f41ev^HM6u?L!^irM-78G3cMP7lQ?YJ_pd zp#1^2EM*wdhv(rcT8UAg?cQP(Dm-Q9T#a)MeFPsrb$Mu8qFIZPRCw~JM*>v&N3t)R zi(o{LJjo*uEg|LSsmooJv$km6hwGSgwZR#Wtwms>Hm>IDU0QAVX)224N3beg?owl{ z-WjjQ&Lhs@LVnOdjQ)f6E`BE-Za1}D3O}PAi^uaMguK+GL4-T;>Hp`KQ|qwkNT`fi zbDC?X@ZV0A@8f;B-u&ki{O9BR=VPD8V1YTSiu`E9IxJhK?fxPX$RHhwXw(ckt#9@S zk0yxaX=3?aNYUOj`gu&U`=Ij%FnB+oM?RbKK;}Q6t(fxZg%Y>M6TEX3?_Ay&Ru*DR z9CSXuzYMZMQ0@v|l(k@PBdv`l&Rjju+>y=gc}~>kD3dk2b~}o@J-0NI5`j`qWYylKRa-nig3nn z>=tG4YnW&2N4t+v8?K54ovIh9mMCmu+^jl%QA<)kSg+J?QB1q8j_y6l`wsKILpTBz zWVr~&QeRyaAe1cQhiqGE<%Ez{jb}}|)`EhT1%@dpJmDyag5H zBM9E2NF&@m-O4>!xj$UkfO|A~7}pQhmvQ?TRG=rlN7$~JBoVHmJHUrm-eO!KkO7=oTBzi%zjZQ*U05EYe^S=*sgtq_XIA-$KrS+Sm@?HO(@dss^~{Q_W~`0Fc~mi zz_Mx8o&a`(ZeyK;9Sz$~II5!r<_A_L`l`35;#M_A2aUP84DiS&vE00r_okq}^8XX9 z`v|72Yrf_=ui;N>6&9rh6p+G)j4%#^3JbZ+AfcHMiDp zW7g?{^#Hw^N^Dt@l1q7@Q66l5gm_KE3ZZm6%8?!b>mlHL&7HjSoYd#3>GMENJdf)0 zz)bad)9Nv_<)C1XBi&;lhg)p6X~p|{*Qq|dp3~MXN=ry~!gmp(> z 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 StUu@Nr1Glp*C4U(!~X!6rxDoz literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJIS2004-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..994aa9ef9f50495a3ac558630b0234680be23c2f GIT binary patch literal 682 zcmXwz-%b-j6voe)ncZ&xP+*Hz(8|Ubkr1F5gEq#HZUa&TftD%;Q7LTz1&VEjKn!## z=uIJ*lt3aE-gw`5MK)VT^@u_4q(qZw=&r4_igcOe^qVeVGV=x+(Iywja zzTPLn-aqxB#km20(1^O*9vbVr-`?-VAGzX?%=C|Y+hO2<0VkXF)LuTsC@?z%y0f7~ zfPe{z%;~A`#ZeG^0V(#gN*vo=5JBP^5)md8@17Nw74BHt?5T3U13;5)R)_2tZgHi*Ph2gGDy7G|gsSPOPV z=E20<%{DMJ?9j6*R6T&|J%fh^4-C8pJx)~L2t=JkqP{i=8H^jOD1KDe)4!H6Kg^l) z(**OA=?yIQZ(hd&$^9M0{6yGZP90+D?ZFIc-BwQP<*7D;L>uE#d%=hnrl`#ds3jF2 o)m9j49|&se3`?fmseq-0Fw=K)Sb3Q)N3i1Gy<)Bm0aqFS2j0}QeHI+_hb#t%0 z^sD3GC; zUAp1EhZJd*5WDP|h6FltwGN67(3xiOfz+ImO_Kb2J8i252+IbZ1!e;?0WU)R-Fv-F+$BYGcZ0(sh`VKz#}v0Q zb1)ruSMix3xkT`{1~KwyQW0&XA<3=D|8HzL{fl^1fook!;KLwddO4Djcz>% literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UCS2-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..c148f67f5e9fe4a108519eeaace89e708a51f8f5 GIT binary patch literal 689 zcmZY4-%b-j6bA5bW_FiuTM!Bnkyf_RMQ;j~CYXj0-H=905X4dtf#3ogfzW^3DnSeh zf!=dtd<`$jB)jQ6$SnF0UgLt^nUi16nQtbO9QO0=Os#(8?tR>C8Bg>1Y-S>x%^TKE zZObuAN6nT~X&S}qcFnEVT)XA$j76=31LO96({P=p<9@ygOO9iVjn5Tl3iGAHukLbn zZ?;&+XyjjiqN$83 ztkG*eBzzyd23`R_0Iz~K!0X^H_!{LK;Omrs054Hq24AB5olVSX$`2QH^9BEO^J^E4 zurMqVeq!sRNpw;`XE^jAlsqHo^j&NcZ$Z_)?eH)U;%(UEF~wEF8pFA)5# zA&lHk8shCNn9?5q|Hf9bzll#(c%^d&@c=|lF2-_9Braz!S1y+|HKJuo$7=?5odWhVG zAA_ty)*%KV8xSeTeMpze7Gx7*n8`y36Y?0o0zX0ISNL5JeMFwXk0YQ6Gz5$UVR+Bh za>oebKoAQ>LpmUov+oh&ty%hY%B!SO;r^-NB>IuS(5Vu$=ykj^N1_(Fz8@6+0LGcP AI{*Lx literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISPro-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..1849d809a679e56414f4e18dce8ca3c41109e84e GIT binary patch literal 726 zcmXxgT~8B16b9gTW_Js1`H(_H0)?8W@dl_~pp7wxk}41c(hm@UAPXCT&=0m1f*8^Y zB{3-mlad&NSH?>dZcLhy-E{PKOwsKR;4io!X7Xgtyl3WIjPyG^kW6jr%P*HQzB_?{ zzx%G=AMo`rCRNQB*-U4&c-l9VSV-!rq&}a~7JFR%tE;|?`)Qx9r8Ry1Jd9|Xucvop zXdpBi3H_;$C63r${xUo$uOdTF-gd2JtbyKP`36C@+uU_ zP=XCs_N(z6k~^P(XMem85@^@%6ewyyb6dIiRVlB_L1OJ4p7yB@tC%G$0K)Fs9@-w* z`fZQGtyZzXo=}O_+PW_H+YUvdvZPVf^yT&uQ_6j zDNbX-K8=DHv-Xptw>b3#+p5_kV*;-Ua`R&Z|5h7va~Gupb$LG|Ip6!gm77A>WlNQ- zJKu>(6&R5Z1K^z?qA%>O7IwI&G+df2O*oWV#X-%u-drubS40S=0^S1df*1jBh8UH^ zIQVrcqTo*O4v0yJDVU8gokYxl-+Y&3?q?y^A=2ROlGp&h39$uJhUp>V4a^$wCL*?B)}caCaiAiRiXC249o79G zsMG-!x6Ng90$e^8gT$B)I?ql%8*#7K{tj<$x&zJdplw%n2kF^Kp*%udL2`ETsS^4N DWh&!c literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX0213-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX0213-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..a83a677c56df6f1ac395d2ba71e60a08b0985e97 GIT binary patch literal 40517 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

ry6~E0z8>XD9~7$zzTJUQY|Ybl zQEm&$r@T#>j>5#v_#DY7uZ`Stu-ZniQR|$L?<86yEHEroO%wV0q7_B&`MB_3F!*R}}ZDRaflm@~mVVH-y zT=b(vkD~5i5sDMbQJmRMdA$KcaBdk|R_`hLU1H&w^>f>F_+o~J4%9D5#OFO2jQSKY z0q4$$zSQTPL2(@KJMW5_XkgP&7%`*`E{yR8_dparSoi#VXaXs1j$mK@~Wk#K+weWi&-F@i`mnS{NiR*a&dP8uJ($nW5cNFqHFO4$}jE7;qX9Zpf|6t;j2*Q?q?il z-{7j~Am!H#7_w{T7!+Q9j9&|I#?=@+cx@c$=UOz{eQgRB(zR*Gh{msFz))~)6>7M) z8!x)HFB?TcDvDDOocMKTj@qvKVw$dpV5qN0?nW^Ur)^x12;>-ojtQWWjyN>GV;)BrJ2KJej^%ME)|gO04B;J{`54AK z_TwcThe3`V1;vq+cZOjWJ0n1Jos$K@BgPiRLRS=vI95dGYD`V%dVU<`em(_XoIzJ_ z8aepDO>fNuWdx@5<^;UvW;B?`%_);n#By(xi_nUji^V-lFuXU@w=#Zng&^gdXE5en zIvW;c*EIB}YZltymADo~3WqM#wL(J+yC8V;u0tHP!3NKW6%NJ96D|7*h zNPiR)1tYw*zzTkQ>xhPzb?Z)`5ZtNT8^hA=ix+l>S@ja{UVy5*7jckm_bNfX-Mg$f z(BZZbI}^X{i{ZXKW^ze4XBotFL%>L~RjN$ENvr(*Ck7CCLJacdnyB?j#o!FzW2oDs3 zr0<;)#Tf|jyw?}q>J3KKz2SJMHxjhc8*N>LG97f>yBsX4cMYbhH#-i+mN^XBzKd|R zcLR!}i73vXhCV4Bh4T@3HGY~wN7mDkt#o7~9oa)iAWh~-BfIFo;M}>*Iq+=!tfw}J zlO?cC7N1dkOT1Lyk{C5!OI|>2sX1^!{JfcdnPdIe$-W{Af5tKtg~P5=>(Z;svFEV!WbF6r!{jK!IXgX&?qe zj>cDB3?%yCpWq|8q)kcqH?HbmQm5dX*?e|3Gqc~Boh<+T+|2Fn=Qr0kibgzcFf zVhLj=n_IIDYrjymw+lvcCzH$X=JIcgc6Lmi+1fI$@(V`ZF4+0Krqi-*V{CjeY0f^i zX8(kjcQ)sfRysBjpB!CIJ(`>toihbM-${85BoH8(3V;!*q(B4(aA*1`3k-a~Oio#s zwGwb(Rv4iFTfI0qB5n-@ZgdMxua0nDeOOI!Zs`C60rxTEOd)#z**mhtnc!v%MF-p* z6(b=k*xbiC@Gu95F^DiAH0t~TVTGPgUG!`ssWRhQK=kw<;&tJ%rBFU_}ZEEE0s7mb`wDO?Z zs;2R9lJZL$m-Fq1t@&KTlAnp?PiF?Eh zF|DKfPGRl}GWQL!Or(jDAKk;RQ&?G&{FMyD%F1V~&8=dUIp5o{@+uRg$KS;I`|>(^ zQ!SD=D|7D|GA|{g_gXM-jia}rFt5nCR}$!bV(1+TtoxiZ1?$@x`YQcDv9WrV#YWOe L`x{R{YNY=HNrj7y literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX02132004-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniJISX02132004-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..e1a988dc9e80be9a0803e22d021b1e81fdcc5b94 GIT binary patch literal 40608 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 WYzZKilxEs5#lWzyu91adzbpV2cs2|G literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF16-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF16-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fd4e66e81f3507b190fb2986a26a45c1c380e302 GIT binary patch literal 26327 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 literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF16-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..075efb7054901b1022af68e723647769cbe1d556 GIT binary patch literal 164 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;$~>3>*2_)AhxfT zk9~fwLi5~Q1}+vx1|1$o21W)s^F|h%M0N#X#(mZEa~StkuyXEaWMbS`-#oX7aX+sB L>wZCNru|X?)N3(k literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF32-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..769d2142c03b10680800b3b6ae883e27fe04c5a2 GIT binary patch literal 26451 zcmZs@S8!FyvM88YRcmd(<-HIxNC~kbzNCdUp8C48k||bWyUT1TS~aM+?WJ(sxlzbW z$@HS6{C3e7UE7w$>$v$nl zXS)RPkO1-J8vxiZzt?_kILtY-U5P1BnQuwv%3|AIbAjtLsA!UEkW`r*^d=p0daOa% zYEEHg4CF1kIF=u8FV~r`A!kfwIR{zD<=v{)iI$sMD*zW(9k3+JbFf^jG&d#LuNXF! z6Q(n_|Hu0vS=N{hK$8Z>)XQmYEI_W_syW095_a<3xDvi5Wj9|PmtVevDl)Arn2y#h zpXn$~VHu!i2@v=9G=XI>wK}1~+GsG*w9y32NPQEM)ut%m>^9BjI;B@Ay+_3+8W~L* zLKfdH0auywfa@7TmT4dIOj8EvKoISu@(fUwX8~-2_q(|%3rle)mOfpt4qQ*@}$4`UpHrOj6P=)5FFj@n_KR2 z%#wtC419H9c@3{1coW*Pp)Cg@htO3Ahq+~=u&skY26JXZN3OD|H+^{bpuNz1VBFw% zZK@kOyLi=Cw`Qs0kHM7wR)7BJGpz;Qynj8pXR2A5$Yy>w$|OuTO;NX0rXq9U6>d(p zrI$<8)qmb|4Y8mrpM42X zLnH^58|cpCGY054LiiPJ+tIT)nZ!o~vot}!2CR3n>kWjS2saob8^znp()R}V`4mo{ zmc4JFe>GY)(qawv9EQo4V16ury@-7k;BMv2(LoR7Q729plciUZUJ`&o8H92rOcVff=#fn6TfYTZ^xiF0sBhW3;3Q3 zi&ZdsRAo8EM`I=TK5&;Z-(B|U3^S*KV-L<(%Q8eZ!SF`#r9npySa0y)8=M0^p9_`? zFre1DbQog%LkraM`9f*@sOqQ95IGKG&u}mu22~Ka1|}UW++VR6Crqo+z851q&~b|J z*_SK5*RzQn7~cW@W)Z2Q-octoeAb=CJK}jyE;v)6Edkmd>I0=x_a^W?W?fm#eT7fv zbMrk2zd^?_99;unR^ik^oUg#owcy@{;W7+oqw~1vX~c;P_Wl7*HAHvsf%i;uZG!oW z>bF|d_TrU)-iuEv$vx8IZP4^NA%`X;E2KSD-2%3 zsdH@NCVF41d^fr42%E0KFA3QGlACqlY~r6zGpiQ5D$%naKWD+mTX+SBkHdH&emo9y zH{dc76VDOXh0fZ9;Rg`t3gB*K}~zgX0B8uBd)0 z5Rn>{`4n%vEca{%Q%men2?XB=(^GI|q9Y%B@5wzn*;d2fWkc^CVcLKl4|w=CEM)M{ zMZ8xln{&|-Bembw{qz*O&T`8k2t5MFBNo_;qcQBFdPb`c@lIoOPlvjqSpY67|>};V%^{ z(VnB}d;%T&q+9az4zwI#6Q^+O3XE{D<{GV;(0d=c&#}eT#`$#k>mBhg`_Z=&f)a#d znXQn0yu*fHvbHp!KHO zZ})>M2Nsi5UkkZ;8yiZ3HVxRGz-YYesK&t~qN^6$wcG`&Kr@(+iOx4{vYI*1s2uyz zc8Ys;@L#t>;3U|easM0sP7CjJYM-9FcY$pe3#Nl3O3X&X)B|vq$9})Sz8f%d3CCYz zcprA`Nl-Mb9q2UVYs3Ey>~sVrQE;VNuf zDSI-pXCw5k;qEmO9mx>^A2)!x4$Nmc{e7Pd3p(g5gTV~^UIf3b2m3zgJ)*D*{{!u8 z9{h(C{znCTSqT$QaP&Obcf$KTpb_V?!K&7Ltw;A+>`jL-NaHtI6;29O*9$Rl7d&xD zTkh=>?0?3)lcdqDxNt!Jc}Jpi7YRgfUtwrBc5rF*J`82RVjb(dA^9Il)+hLD3x-?c zMmKXmGDkeTmE>>7!~qe$$6R}$H=kMc-24JUx+LpkKKqJ&Z55wd;E%1`o1?O|YU*(` z33^`3V^7icSm$7|-5b%H$|H}}U7Mv;97<+AR9>l6^1uyL#St1$*;g z_6+`%4Ay4`M+^9p!E_nTTj5_HX#O=Cdr}~f3*knv>d+=9egmAksPE2@{JU__z!pey zK^Que+*=E6t5nV%?AI4sMJ+FzGZO9m0A$xY= zM6=Y}qH-AxV@>Rr3*5U)-4jD|VAI#IGcIcSy4sTro_lIKPr5JjfjG7u#}0{IB(@Do zXiAaa-&OlAim4p7pw-U35OdGbSt>pkF#jRuSqB~!e$0Rm2~oe?Vn5%+pRRG!UH%~r zT`|IPR{mTe^&ODfje*`W+aw?19EiWC^uCx`&A6Q5(CGvr-pm0H0=k} z6D4R{0p5J|yaAjlv3OsMG|GNGI7--JBkMBq;A!kXEPsn;wtd(ahXc3S`=j8=6&c{J z5^b+#*Hs9=B-KV^N`bak7=MKpZOq_H@ue8rZh)td(Ykl+!=894SSOtOaGpqfD~u&! z5WsqenNlQow%iU&`dI^x z-)7Civ4;(8Vm){1+z@^l=FVepGI-Ak^Ifn-5h22d=jx9SaK0H`8!_+_ZI?AY*O}ua zuR@Cs&3g>KGjb@4^)vce3^^(Y?{C>2hw;th1BO zlL{T6cHT*+?KGT$?n}aRgLx|ALsvzxkbSO9`?-Rf8*u6=bgj_*oE|q8m0-HUoV)d| z-4MCLetiZr0*zo>k3E;MeJgY{K!%>p* zBRd*k{2YErf-h&Wjg;4XuuIU@0t;GbPeR87=-7pxLKwRw*|xz*7LLT?phh-VGV>wU zM*408*iMm748eNrJPi2|AuUDpM6+P7q#1YZ=aF!ptt&zmbKD(SJ=fvpezE^DvPYwNR%T zJ&7dx4n7l}JnRxUScvlvh&Tzcd}K3*b|v@jmj_p>?Dus8Brr*|Ez!4LGjv9Z8~|GZ zv(~ZC#Eny6^bH0}48a@dxSD0-(Ds7+ZYM_`GDkY|rzX9VIO)Tt^~_O+qh%_~7K6!% zok!4j1?&}3wzYy}q0n==?GjiESY#!b4Xo!TEH=Z!5wPxIk!UvZkS%P7u|p8n!ALc; zXr3ApY$J`?gP-C}r(Q z%)C{Q7$~Euj4fti2Z?Eg5-EaH+5GKgTqsfbTEPAW`s!dhLo&zmz)ES9Br8&oqa;TY zGworX{d_DHECsyp8I0aW`+fMiUhUc}&jO3A0na7&_AvbQkTg%i!$oPKS@dneb=VsR zb9%64VdM==KV%(6+_qT`B!WqgKQ*d)4smyhSa^)zck3(?{!)y@YRz|4j$-&J7A?ux zRV%m0bK*Os-uUi=BN4nCpsNT*8<>4BgbWgCqJa~vyMc|<+BbtMnNMuT_8K;N1wN|a z<2gQ62|Z`PRVs*cxk!KAFS=@Q{3>)t%Y&<6E(x61xHnfG(cT67ar)N1Blx?Dy693+?L%+;Nu=z7pSGLq|DuUI6zlX03)uJ_;a119) z*4%!TeIJe&YrcRw7AMk}e-(7RhQSnL7ikDl7*1zXf(@7p4a~$d(z3eFv)*%Hx`lJ=;F}DNZL%#1 zXCJF(QZbj!ZU^5wu$8mF68)*zhgddVjD2^dsb^qD>8EH2#IfK@2yRjZ9`oK*<>>Xw zY~Ts^J|bI;t4TAO#z;x=Xh@TT@MR3$;`2LrUoP+2!#yZSmv-)jKQ2KV4H5&9eW~u_ zy7`TK`Z#>424ef}1bkP^CYoU&O}6X>dlLq3pl=nJwt#mn`W}Pz91N}Fzn3Y!y}gKz zCiS~gK6D<3GNJu6`<6tO8`Z}H;J6LW3oy7t8oCVQnK1Pj?P?5^N#4^UF=6Bt3+0O7 zIcAcXJCB(ULw6K^$HbTG@a>jN)al&7hHB7~0f9Ztw?FEvRLA`hfnx&a-9VyI5o z4ud;|bb98v0qf9n8LXtBXMtii+J_Sx6}@=m1eZorB{+){EIZJ>TDVT5>oxSp ziMDL1{h?-PJ4~+9yVTr&FU5XU9hXLLYb_59BP-PNcVT!n_?SGX&&9|VK6xyzt611~Nr5`ql?A`;htKQS}$zEKnf14KPwBhWFt@8JPBB zXAwB!CG%eHKM#u+&|Zdb&kH-_<#bR;&YNgSMel0p+{$_@F#Lk`zJj+WaBwegKLO6y ztZ$dHv$~?tbAkCEf+dc7E)$xiz$$1;n50a3+hk zbet-NzGx9RgBAw;tPX zH1w6gSuj0=p*0XZg){rv*a2ui#d~GweU6S@FmncGPNSt-6HI0Q0pVX;AyEt_pmjI+ zSBOXv^yEXU2-UN|b^KVWcD`Y~#hh49gk-qAV(1z6K4osL)RTx^8nD#k*UkE2&KzmX zLyR?9CF=M2MJab^XyXMrbs$&&J#B#|oH@Wu4E-taE;;6X5`0T!E)0|0SjKz zecsFLb*vIR0%msN=mQ85btXc;N&xFP7Z`PWbf&IG>2l+fuk0ryoP00VglP*Q?2M$JCBh>R;cWzkyq~Y5bS@EGfIK z?B|uz+p`#s$G#Q_trcMo9Y=&a8ap?`;(2(Dy=rtcg1NxpC2Jky)+ThPp!KF`t6{zA zcphd8Fsv3n0~yKX(JGjIAa(1x3FJ^3I7k3#5Y{r4yArze{9^n>r8=}tZz{pIW^IQ- z-E$0viwTSP%|N;{jF<7Ld#F%>QS?VMOCkm;$zTWm7OA@cf8Gf8<8;)fnHwbUAsD=_ zUP#B8J+k+#)UigM+bR8g0K=Io(o??B`B%x_pGvAH=`z}W7H1o9Hiz||RCy1|&O2z< z^TA6P$QRZo(z39(9z$DW+U~NkB5>b=(PPa2LjL%QPsg&+gYpQsN6rT4^N8u8bMWUVv~9>ReV z@E-=t5wHmul)!SGx0R?|Z$vNw9P3!*HFp&AU^awaqx~i8eFm>|=0x=Fl&r;3y+z<5 zVf8GFT*Tq$EO-$6n%KKrgnZuh7$(S&7L6D28MAMI!Iuz@k?oaHi-qvZy|kIzvhN=H zIhxl+xn4zgZf3S!;1yEfF!o#nODrr(x{wy_$-;CL#|l~3L1vZ|HuKjF@F`FA?l6uW zW2U{V{Skh=$GzD+e4N=ILhu4}ZG)aT7!+tG-jNgOMNfHL2?>BrKq# zSqiRVoj1Uy0(-P%^Em zC{BaP+we;nP>@CGa_g1&E!V=48%Y zxWLDbGEWk|y$#*PV5@-sJ1|OC2+l`j{%#GZ<&KvsdzC!+%;0>$eE$qyutG{Em9)t*J$Sw3@$ z_f>Ll?VOBNz*GOdLcy|m;t024y`;wTi6sr%OE)cv%Wxfj~4A^K{AjLYhbDc&Tj1069RS$Tn`Fv2WoMwNoz--R0jN zv);Afd68*t5?{B8zdd8^CDFDF?A(X5+ce%H9MsCcJjLl|)l8+Tr@bOjvc4aH&v(@s7}*8>%jnF+OUzX$*{kq}BwEC0ZY&^$`Tlk#K?@5*QL- z_%3TlAd`1k3uN9gt;F$MF_#S8mC#XuliQ#_OZJs%+Ad(b0f!plX9j&KV115$vQh7V z5XWwTsHoXT%$>&kZ zzg%TqbO!8@oG6^@u;U!KE7;E)z`Y&6Hp_D<273u8g;pYsa#gdyN>2VZl=F&PQjfw4h_|Sa9A|^%Uab zMfmFz`FjkSb?p1OR7<(e79%Ftv5qScS$o zwanU(^x-a_*bANA@nG#}qcY>LG_N`*3T$R2z0fgV(CF>#%_kO+=sgLjpJ3xMzz)!a$h zQzyAHz`TQ*i{X6={Dq{XEzlK%j$Aqb*vMVsy{Ml)D(uzhIIR122|}l!`!R;j#akQ6 zVZlfp^6z1mb=dV%vN1mV6sXOYgV4svSEI62g6}E3t(HC~z^9#T@HmA6bu-~?Mq3Mn z6EIvF<60-Ww~5IYY;X;G-++!2vZs*+6VbT=Y`1Wxku6k#cZH#XIrBw`cHID0SDs=mA~en0}a%vVgW+m`;Yk zJ#@z?X5LTNz+8dv*Wi4j=53v>lPM~uD^X?It(jEux9hnnNAwhfcO8aru--)WNyW{l zb#q&JTO|u`nvUV@W(+jKAo*}lK_5|; zB)*ojGT!l$*&3mP#KvtfUksu3!d3;&2Vmc-4xI%%LyLe(qWj&91Z-a+54ONyj_N}* zkYk4wl(*L*lBtQb7%bJyaTh+8aSB`+i$&8a9z4p1vSIiI^hU9FTDEvfvhFrgP)z6^ z@4usdw~CLY;n*!rn+`l>eD(;0UgAUzG_uJebkxF!ljv7L|4lHuVW+W&~^ZQ71C&>G~EiW>#TbZnu(Ok$+4#OCSnbA8PuLt6o8;It%cEK_=AM* zEcUKK?c2jf?nocAHJwc?bb`C%nDab#tJ$msrj4c)&w8A^g}=Rs8QIMT>$&e3%(upS zvtZ!``+O3|PNAJKcO}kd;#{rH@{C!Nu=gR3)nZ$z6xuF%PV&$ysrxGLjHTmO-F->= zw2w@#d^(<+o^m@1&qf3s*ucX((58Xu+nV+kidKMOt{RKS_E)6;tG`}llh3)e0J>|D zJTWuRVSEEK-(!=EkM0tV91H<;+=?GwEsZ5IXT98&fnT$@lRVWK{E5zAf|dt#&{F(K zG!e#Z8TOt6_e%;Wl1QqWJ^+1Xq7}TG$WjcQ57CjJL=-vdG;hxdhrmCII0X&9PiDPE zoP1Vo`vobJ7M0?Q?^a9pqw2_ZPRIS(8~u3j`8$T`|mYf&aWw ze0w11tn-$Doy^^jVDT_H77am;)0;>EQwP!0)pni&D+G~7dlfp?C=yTa8}?2u94ECyyRbi7 z_zT!@BYYL`wF%7Rxya}4*RpTDcC1AnuHfEUw3VU5NHRP2Jz?Ivl8sDELVCLnW^Th< zj^iigadHK1RV2^f4M-}X`IIo7Rrl_P&Rs}ug`s5p7^VKb3}z0(LG?r_Ogx6UQXJFC z*2}_Mh2F9l+XbzMW8{$P4;A=NqyG%_r*qd8jI5Q~kLzvM&`RMQP25u=lhw}~$EF&v zyH4s|2Y=bkzQr&SHOJDSgQERb;LvTH-@^wt0@;p6D)IdZn0N|-8gxI3v1EaD6LwUA zB@4%!IJudAkB6VmD;6?m9Sq07T$RQZqZ{1?zhpA^O&B__#3OYTKwASh6&YSf_hz%c zC~kX%&UiLf2Aw&IC37$nEG@EimpsJKL2FHZ>|Iy~oq3sGuJR9B9@uLb%!Pqy9%)f^ zHQ|s}vR&id7vyOJxU~=}jyc39Uh|Jy@cP_fRDoU zwxX*_P^3g4LF$Qz#W>0I97%?nZGcElDk-Q_`^1NHa`#O!P^s%qH@Hgq+kMja&G<^*Be6Fqf8a$RLXvh3wEQYJ^wkRux>k7557 z=8eUv798Hp?X_y_>lnuabTvugGF2!k-uwvPkhzhO^)6h5{vEt0jf~Rhyo&B-xmN?e zjp#aSaBe0GHV$n;uUZ;u79Tf=vHMb2x@LHb=vfJ$nqjJzxgRCEZn8>Mmlo#^vqiG0 zc;{6JTw=}(I&-C>F4=d)1~3g^}pL%DPksK0I&eOJ+&$rqlAZ?f8r(UAh|xPfHd za~p*XqI_gWEJj`sYLTvarQ)du%HF}qguHHpQSk`EO%u@^<} zF&H|)M-C!I?K;WpbAda^u9X54Cq;N88(l3d7qG)1-fh$bQ=s#>)K!#oWvwCo#o@JS%|d!^%!}I?i|^r)tZw9x#Y(;YkIb* zyH4TvZ7}ghL^7eRRu?`b+G2IR_b`;pd^e>2i)^eaweJC)taJpb0^9V~VkCpeKpOLH zgz;wn3%OR0anEKJ$kPt(Rk_!b6I%6=tDIMvznZytjO}prA1|ZFDtUjY!oj>0<7N;Y zQ8;)GhaRE5KseX4YM}Vp55;WIh}Jh~Il}uD)seP{!cs>mHYN*)Ht{dpz|CxN_v6ze$< zO|}Zwu@4rH;=5|ub_09sWcNk%oIr9n*dE|)IxKF1iD(==$oqG)nd7qMq3p_p@IC0r zle?F~TKxCOH-%=Ib(5AH%L1>Cgk)@cAtuO%AH(JiK=BGe$?_@5e`TQ!b{;;PpE zM()|b`wpob`C>8whEB6D7j?fq!e1KsVkw4eMR&RE(R0h5#QrKVaG1QFhA(xx_qQnQ zKsfH}DH7a%lD*pn?rSjf54HpeEo0xFvC*BP?+&_%=OwFM6^dYL7vxPL2O-Q?fm;tB z%3-2Ho=E|h8cha@h7l7oH>Zg<4$c(_tm_JRwu_z<(7uP;(>eKYKWs7%MdQ#O=E~dA zmJEYQva6N7-HH=?gjGv61sJ#uJ`K6yqXt`q}f$h#Wojl$GJ7sB9i>^sIR#W>iggbY#K@W*myI}0u{ykz1ig&M~z z5v3&W1}Oxm6->LKkHXWNv@;E4&jQmmw(yiqY~!I;j9g`dItrE-u2N=t4rGRpyo9eD zzmXPt0)INJxXXu55X8)N6x#MF!QFm}DXYc)J<`H8ZoUncYM9ZmsT=G8T5dqk9rVW{ zc`ySiq-zWvB$6G01u~o+RvaQ7_mr(|yCB>vad0EI9_H=m)o-KWXNh?!y7Dv*l#AXo z@M|)BzRbHGvfv}N?U{P)Oq?^Dyn1qYzi7Lt8n06IzY(3AqdL{hevMDOG5A(W<3=%g zDsgxx*ptDz3Op^)`2zZHbBMC#%M%p&bO$5J>ao*E*80fa}}Wb4k_u-u?Z$O!gLb3Cy=ZkbV-~CMVS4JQQ};Y(t_#x8X8iRT zpFPCq=uS&DZ&zub!5<|seUJr?3wtZ?e5o;l`Lfo?hPG)eXW-|<@VQL->4EqtV0crp z>9!awQ`?ex`(7T_sQVcYrUBXZEOaPrlARPyk_X`x?0d78qQ{AZM@XdK0UZ~ZkDQ=8 z6;o#KE2;e!bKSyma=2fGk6U5!nP}UlvT1?rMYh$@9*<)J{x~YpeXXf$%)SEp4&tl~ zmK=FNC%;XU+jUZZ8YlYwjCF~B2`lGYn)OM_p7S@8l2<}MnoS2e5n-86l z-(SJ+b$q^x2QTa}lNYxDhgqySgYmerR}`|rJe!eZfR0UC(i;L<&~a6ClB9c8@mBPm z5q*u)w=2-M37zY?i-PKP!dxhMO0m006)~hMico%#wl!pr=@P%T!&(#z6{BC;#Vh=Gen~^7*KYL-hvo6o0sC zn5@8_EZN)?Jy8|&Ym)FZOY^1ByFu+Gvrz;7^h)*HZPoWv`0Y9S?JG~e`o~U1wQ-_M7>l**`KtFO{9Xznk-JlQFviU+eqSB7$3i4|HmJRc};4WP& z&~#lB-StwWB)+{igB+^9YD4dK-GGL5<)?b<^iz7nr(N8%a@CiYtTO>UNo?|Dlr>r3 zw@2MxrwdV-r_o?fFc~OLttXA#jhb*G*tTOt8*AY)j$>MT3r58bo=f=m&Pnh#DES8{amu6zM&UHFA zd>?{oQqOI%a9Q77k!o%{8n?sV3gBB2E3J0SnA&G=|N~7bA)Cv7lQ=OhlsfDapb9z!M`M=j0sYLrv&q`aP zQE3+^VkxiGs+Za(2?jc~^5#nFO)X?0$x3fVtxT=bj0Nv!(;F+PZ=^n= zwfXAhG4(>}f%=uzLIp`Ql8#bkrg37qHO)|_NEygp8lB#j;}hkj-Z|Z?6tGsEq(De; zN736fHnm%ZN=vPDkh9dARw%PqpjXB>F3miS-cMVqO;hUymD1dmkrcfB=!0&D%899h zp5wH;WTRerpMkXWygW-~#3g(#!KTzMmD2^wWjGX!EkU@1SEV%mANW>!TgHO|iFOH- z%Q#J2S~U(w2`&Y`IBguPrcw3OUPXN?^Da`JMfTre(2G2RYk76zsAhR3wUk@NkCDd8 zqbI_I_RqRF%Im3Sd2N?x6Ah{VnEQ|U{lMJvoAMHL3RJ446;?)3=w><1*Z+7j8YQ8u zRa&%uX>4U(l+l&dGRgvSXdQmgUjg;;V}*XuBh70G=NuHOQs$ukJG602SXM?~hFHnv z6NP~Sixwe)VyKtjil$Z7!`da>>eXqnNieH+m)B6? zM$7G&Y2?R~lI9!pgtCwR32WLP98RfU#<2pY0@sh4WvnYyySyX*e0v#l3jbQ}Q@hl= zf~jSCOdt&YXuS-d!sC?^L3mJRuh5~w-~N76beyJ(`6pET(eAhe{v;dF3Y%A_=PfS1xIwQ{5|(4 zoJueMjOXQ@uLk2k+Ar@R<$Nb9T>AU}!!egy(-r6?eEbRd5)b*O8T^9}5S?;rt+f1e zPnE9*m`nbTuM?72tX*HB)~03X^~Tt=yjbF^$|)HguclqF{TM<@ep)8NaT6;#jj+B- zDOOm%B-2aT`=1!&SFGLtkS0vqublYv;{WiU_ERny;BDoxeM=kVpT+pQB zlFOTAS*=dXu4-0#J8sgZt)+3Y>9t()YmEHoR%M9X-AhB!DjI2a`=8S)P)7>ai%qV2 zqO?$+5RRBcQG?P;G)=E;Y1U`cvZ-^^(ir8Nfx^cBx5A>cG{ma3j1}v*Ur3{&D8Du> zUwMxvoB{cV?S<`qa`TA%hy)Vge z>E%%Xzu^Dgs$SZ?2}*5t)$`@o((>|4jPV2?U4{QO{D0&sv%h89ma=N&38g`Ftb)r2 zrm~cL<+A(t|MFiG%5wmIANjv35j6TJBf&#cT3@23|6-HVR^{(j&`*#LOt5+!K>tv+p4t;yJA+OKq3o(b?j{@4HZc>jHclBmO2gtCVU&_!32L6=rZ z>1{c4Vi~~Y>D8L3E1Fwg5fNEAeH!E6{vVTRkJ6Or<({cfK~UPNDifobE_J2ML0xUq zD@3V$!r?#vVX{Z7wF-SJC{O^ZHAO3Jx1Ut-Tb>2*Ki@Yw8)K7|`O}nXtV_#yPg(AG z88s=ZifCqO`DyD@@~9+##oFU00xpfHL{GbLdks+-QNX{$P`v%##|uBj{maJR$!too z-u3os%QegPay8Y)&*$sO;VA3!!L&Z58dBxN+B7OZH{4*p*ZsQt#jOH$dxfti(qcJ0 zRWT8@bCL}nwG{N+=xH%Ma>~wK=9N8#wqrfT7P)*4z4vwVzrSg{CC{b*SO z<||iee?VpfUbQ}^%zLySw$(>l&Y*0$rHZyRp=^Z;$?+0aIys~`SA8kRdmJA!d_*Az zk2yB#NIyP8x6e&AXuBtKvg>LrM`VqqJP}Rn5KS9QY*77=vBwdT98^mZ# z4JtIfiX^b>lBSj6lXWNTwT4rUyq#OkH*k$5DacI}OW*yVy8N~1-k68(tp?^UJ zXGJ!8vMIk>P1marqGy{HJw>VLAv}2YsnAnSw@Qvs*->h9g3?pubURCR=Q(;Bve0vl z${V%Jb6*J0L(a%EAw16odclZZfy^tHFfR!fUL&G6n$lP;dI<;KbgIjsYci{{k*=Mf zcb$rSs3*|7Cl9^*sQ$onqyT>Oo~QB#D!WSg8K3tD!s*o{tvaM}+5Vpyw+Leb=euo0Pvx?VBkj;`2SpM&BzV`tbz%^?B$| zqwA0gxFKt4sFeM8N~85>k9D26E_L zU!aI0HTNKWv_lqw{Y(TZ1qN!g7^tQ4GgMwDW1zkeDRd44*Hjp|Nk(kKa^Nogn&|lf zwP~R?Phwc$MK%i(We4Rl3`Q9-7?+2^B#Qi|0fQMT3}zQ&FuxFk1yol=bvr5D%UQ6D z%%uk?Uxh4KEs^(}@`T(VAvZ|K4PK!4FKSuvN;U=wxxq%NyF+EOfXbWzrniXoAQ zA=!u_trkN>QlV(ZL$MNu5|M?HWelZLT_)wTDW6OEHF+Ymm0_re+7=7CIZSnXsE$Z1 zbb#^)DPKkT8pheA3=;yv zaas%~QGSI?_e|)QormE(3Bzk-7G6hnTM)wqIt&*w4DXOwm=F@)OZj~z7$#~9S5p4) zISe1CcTQ5@XXu@C6&Sus{oJ7X+s`pfa|l19=Ql=-a4kku6soI17SRh9iJ~-?;z1G+ zBebm}Y4l8UiDXhfmu_3GO~c40rbHF+NP#3riX@B>Yl-aFGKwL=$PvNm))7W(Iggx* z!pM2*r=H3$$}Dn)`oBTr-KF-;)bB&;_i-vlUeNO!Ew*tZwy7x9$@IAca~#5UUQZ7(^ty^*jTjo40~!Dy$?dbJy~u|0;K6FF;7pQ&H-ia9anJnHCEXUsV(Vs=cUju;yRRG@0N zwj@}!`=-Qw@9lor-TAn+^|s!d=k5+slBg&mNhOG6WKh`O`Ox?LLwBDJ|I~fX>B~Gb zw75T$W#;hQqs7d(ECTme^ZFgH9Q*qmd%hHo`@2}z9^gK;{r+Ky`$sfSJ|KLW@R`N9 zPcwg?X8!)wT}Tx{NY!qn2CPKtpa`UL{8NXA@e2m};?!|OCh=wTDHb1U6P^W`%E3>i z+NUl7AJ{JD>otTae5o5WQa2Oc&d(nX@*2Gfsb^W?CBiYAkftKIP0X*;J-mh}kv2>t zZG;~PvLFVa>MUmK1zYG2xBmfQY4 z(hd{KN5}KjFcodA)crifQa@ zJm6qHSWI|1d8^1cwo5;p=fcC~e0SaFQki32f^T@M%;~(&aUpXNuV3@sy={bdLuOuc$wwG2 z9?U*^Z1lfU=` zewn~D+`=y-zr`=1Zu~MiZr8BCu85!S|JM+nI`)_0Q4G{a&BNcu#GSz7;3as>km&J* zvEuQN(Re&9F4B6uJwf>Y?VxiP-(&pGQU@3lXZ`P{sJr`JuIXX;^~CKH>esEN^*nyP z2>g24vVOf1gkKqVW&t|O(khEaDU0z|)*$$24UsAi>^OwrHw2a zz%1Hq6Alo0vrfy~j`&rooi4TRy z_DU-|Osj0_WcDPcsj#!@fU@TamCf)z`)kscLuapKp7n&cGVNfV-K_I4`KOrodrM}Y zWu2FZQ!lfx!=2+2DklH~at6T887+{*x^t#L=S;WkoVkRTGA)NEXC-+%ft=k^h@Z_C=$`=s%jEVCDp!0)-$RAAFP}Tb#B!4a3`J05w-%DN; zdC{aDBg}T?Q<3t2WV%ZDhVXx);C&J-@MNMbpG>pGlUWFTGMD%^h$lOspX}D^$zg>j zCoSso3In877_4O>9b=)FcqrV3qYz%mIV_~i z6;kF3w^(-J9_FXRD?9?b@VG)DmA&vHX;*;4t3nrE*Q!XvQ`8T-Xe7KvoU-U(`BTwZ%hO~Pqz_1j)70lLX}z&r7Tw(2)neuQl%W%QU;!-qoGS9 zAWNq(&kTW52A-w!EUR>(R;ARt($%hkr5i{;O!^U_OOM%B=~?2Gg;L5wX^gg>35jQP zNzeSDpY_v=o(&Rswu$%_OFr8{{$BDA5kE}+QLUbxf#=ypc%J*Yf}e9u_nhHt@>aw9oc(`(8IjMaOE0ECyqE^{B2vf~bK!fj5Z)IYn-^D@u0g-JDMXou zugqVdjGGH(Q-m&?X4z$PAj%lKlr4iU`$qVeeM^|~UAB|>9<9ovng1m5)5Oo(qU=Wt zWwaq>*P&m!w0h|$@G=O2FZ)a1%aMdBKQB2hFIQ^oz0Xcd&}iW%^)n5ksN5_l_? zD^anZ`J>3E-dCJOP{jq|dqey7hHZE=4)&XgO1+s$cs|o2;!CCdX0^hbO_ud$ixzKo zTjI@r@(z&~P2TtLzPSWZNqwjs1WzS(v~nU7ZGGi*pmGlEO4`Uu&RZpQqjD8#>oB^K zGF{1_qVkeuRbFwU3JO(H$ttBqRRB;GBv3`0UFCtU8cbR!X^i8l!Vyq424kzH6W&JJ z4$G?AZCh1bW>+00eq89PlUh|>AWqq=x(d7Mh7#2_P)+@-?uU@-VB+HlPjt!ZDOy$2 zc2v(pP&H-0dM!NFn|P&MR?{w4e^26 z61rv)yfrJx=lIkdL_p19s2cj=8jep5=e*_`P%EXX)dIEsAZml4YX?}PYq|KTe$x0CB&C$Rkv25jwT^AAJ4KvvNZk*_FKborf~e;nS3U1n-w(2WAXNPjh5Aq>>qlu>Kh{D$ z<)?l!`O}!6TOakjUp?M{A-sWUGXmW@pS{s>usbSH7+E5iS{+F zB7U5_lf+NkvhkuV8W{^T-Vpepg!RFe_&~Y%K)LuZfV82)`@sv}2X483*iQORX?@`M zemEr5hr`5AFr7x^hqDN2VvN-^A81-=SxrlXXj%c)#QQaU2i>&ZWjE0mHSL3^iMFVT zvfOkN;-i56sD%H=e(-(_5%@TRw692;EyTw~P#>4V^N}&l$DQOKAnz(BedL%nPZVgL z4$&MbW%F$5-^@NXuVA8`YF-0(^G5RNJDM41G#}Ke`2_K^wrr+PZ~jrC`5JjQpj)6- z3;jh)Fht7$pk)wbONbUNBP`KE``j`bc1r~OTNwMc&?dHU9o({<^lw=9cPzV6iIyFf zY}vyy2Uv!-w&e(U$CYlOt!-gHTVfPiZurYqDbPweZ>8L|_S34BKC;ydcPn+db(~bK z>{BcI)Ji>Wokjj);_Oo^``@~n_$J~zi0_hCE92DG!^AoMt*6L8L->+Vtv~Y0c%{t+ z-NwVu+uT4~pi8zf#%mi$`e4$BYSrc=PW#hF`D>f(C)>Eu)5bAuTL`OdNw8>JMR*N) z-?97_*lmp4+URTB4oKM+f7u?Sbh`(#eHc`G zC`9{crU-c2=@Z&1=k1H7)xONO+E){&ooT1fYTwMVoU?Yu3GI}TcE)1uXM}1$2X8xd zs)N3>W015uhWd$)ky3Sp!|oWbR7WH{9dm{1SWEs!rY+DN+qLRAz%oY=+;I%5gX7Y{ zap~kS>zz`oPB%QA{h>QY!`sPm@1&3Gr0jIAvFy%Ggm*E~4|g7byYnddv>%hUnJN-2-@KeBI4> zt();ucO(SQB7DD5zkZv_v>HLbF^>D~ zf*kzYC09TX*LyufA$q*fJ)uJMj1jVDoJ7wgrF*8?Ru64o59h0gcBzMUsfV$A&wBE< zK=$m0uV=r&XFzHX?!s8M2c@lBT*XOSZuMq0<7Uts^f8Im- ze&#zym~r>#a|rnS1AJd-qrb51m$A@a#%uLu27l=hqe*Y z+}Z&$_F$m7b;yA(IgD%Y7$aGW31JDoLN1J<)inGQ2xWNK7g2W3nBO75n6)fswzC4W z*MVr2jA0094C4V~uCYWcy|amBC}(16_f0GX&BP96zF4ZQiRB!a*ztnUH26#`!$T9x zU2qdigKlDXIu$VVF|nLO6MI4sJ?+qbaA+|OjSkDi-XtxKA%KYs)*jvOFz7nD}Aj#*g5Q;>U7e<0-2q zelfGef8%7K+cEKn99lHTApR5wF`i+$iRV0<_#Yj{RZdibAR|GuL;`~tlMrNCCSibO zn*`?`33T`-A)J{L#tMIv!1caKnC;N!Ij*3|(;WQci?p2sXXL=H;BPNjnsY!GyO>`SkWOGCr&38c9f z$y)9?YH)A9!&vGtmN}WfacJMMRrfZtRrhGr4bOEHCW%`OCdtvuBuAN&9BE2&q$$bg z(C8ct-x(*3ZrLQ!FPkI=gNEna@nn7=plleS_FzGsJ$r6DkSrJWUG+>gw%);l4wn-kTNSolGTtb=TNQX9ygPqK% z!0-b<()h^FB(G)l$=oq8$s3(o9KB3-rBcj>PN~tr)Fm~Qnot`N6b>V$~Gy{{}1@vwo?EA literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF32-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..bdab208b69d287128195eccbd084c8cf4ca658c3 GIT binary patch literal 168 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;%025>*37Jz@Q+u zua=K}ey&3E+*}4O7Dfgg9!3U6208Oa7Mo;tpu8~SzUuiojQc8BIrlR%G488xo?FDY OpI3l&zo0eKeklND@-b-u literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF8-H.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF8-H.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..6ff8674af772af896d7d33c7addc37c57822f8a2 GIT binary patch literal 27790 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

    UjdU>!C<8eSfmt; z0yl;*-o`ow6JeYNFo!T7#zjb81=B_neCs*|TiB>B*adf2A)BmYx?z+HvZ_W+>Z?zOYxx z#Q^bNR3aA}Ir<`I;$k=f`*e|mq2^*6<;q;Z7xo>Upp6PD}8Z3DVOrQ zPK93FEc%k7gnC@=sN`~2pL4mFPhIXWQI`h+v(u$6 z&lhufk!tkO=qpOe6-s!;FXl=kajrC#7FW0h=DX5Y zt1ClY=L-Jfm9dUo!Qfw+4AWE+&81LR7K2y{Vg(Y`64nE6By5)OD=e1_aXkuyc;>Y* z#5jdav4xQ!qQqa=R>BLr+1Q}M(IC*yLbS7Rw(BcgOe&_%!qws{T&JaQJB2LV3387} z;XY*wDezSzp;sGu`!IY9+povQTJ`M^s_eRYLWSK~!rrGQtz z1-Zp>uWt9Lt9u=F^?;~rBK~VG)x8#?}18q>W8{<;6SIl+4sOwD#O^HXizUyto zf4vjL>v*u&X~FB%`}zc-4+1zD~lfZxLPWiYg{`aU<~+H`cm15~V1{5iV{g zrnsXx#XVr^qof!=xOlMZ77sJJcnmb2%nB=>4q+99)yfpF^|{4cfYF}f-7xI6N><;#0T3bLBRM>h||y?gSWpr-70?!NeP5 z5AH-b(RbQ_Km+g4c6Y|pG$?Y) z+{4Sc=M!_!Z{%JWRlV0tLhrQz(On|%eFei*^1U}5#4M3}3mttAQ*&=6sW3J7)*5|p zD=_Ba9xZuqzbE0KPws2g>b_6OeWvC69mU-5LjL#Z==+0w?){-KjMj309K;C_CxM%3 zN9+6ZB0ZdY3@h~?m$UvF(uJPmoU4QFf>Z~0QX~OtYoNm zN=8a#$r!ClmN{<8N+TufDNG60rDTf)muy$j50t0}?WxX#PU3seRqF@+Knx)a2aa`o z4<>4PFw>5698=6kI>~uwA!O@ zL2gxnkC;FnD+zzBG2o9|i9BxYx{uo$^|+I39(NP}S$NDg)Z;xc>}Nx=%yD#?QBu}WR2d_ptclyEj2%X&jIGNuHXF)DI&RsR22R-| zU@U#vbl};>EnDbF*)pnDwt`fvj4s=#8kKF6@FxM7g(ne8o^%p<(nXmk4Bsbx9sQ)A zggzO9UOkzr8a1yxb<4Q{q{DF!O3Aj=A}tRTyZNyMiUW&zKoP8Ca# z5T{keI>)WpWK;#ZSh1T#jM|EQ5>$Z${@hPDJf~ltqleGK#5@lN8KungHo%yd=Uu>c zcYV+MDS1AOGCm&xVwBO(>8t0{VV()|>_-0Q%NZxnH$X%mpYJ6lCieM3ab6hFFECy& z$l(Q={sK+cFIp@8qCG%Ykr#a&{Q~hX7?v-Ffgfq~iwRir7gIp4gJA>6O+M$vPM>l}4cXf7x52U$Q^`avsD5j{B0Y%9CO3Z7mu`WR5Wa#iK&jWmMZb=cW(D)FBxR~V`E%v&XzQ@O?GRN|jh zey62!KMV)NREg15%w$y|^iow5k*cQRRD~N=)yh>>%obJc#8=f(0;_QUs|MkVRt*c5 zsxc78k@{;=&(NxBzUx#iMro^-lWHZz)ezTdQ-#g1qV83DwNxDlbgCT&RyD(=8ilQH zXmoW`CDoDQuf|?fcXD(!wX3Ff)!acf)%{@@0fO39(;n5h{?!<^>iNJ69k+T3N>PpP zUronUZ-ikp@m)$+^R=QH53D9YOpT*djbEgu5zSD8Csq>%p&5kcM%P3GW9e#8*qZJQ zoEmn@YKG7hHN(WM85yE#CP177aS9ShRVv`mJ9=-!>NWww?Ij zV);YfG8W!4^}a>1-cE9TZ)Xx;NWf2ci(0;2gA%`84-+QoEhg#hZWCR{n^jU5BU0Di zb?Z9$q^_ryx;_Lpnd$}_UB}m|I$X=Tu~e%L-?EOyT-_WAshcm&>ek}A*D+Av`9;0M z6Mq+C^t%WNd&eaAj%Tr*cV9{9yMYq(ZW2tJDE>RvFYmTBaNg}#`aP?w_eRY7Cj5E} zjrZ*Ua01`=CE#GcAEct*kHpfyU#jH&Dv&7Z`*lja$ESV2T|(dQQThXev*m|SiTu!0 z%m>e3{V-jEKj5!^*zPp@z|8{?9CUKcgO>G5(+DLR==npX15*GoAUFVf*=@gx4!k^(_dk#MHMj zQr{Vd`mP{)5)fD4Pn`OpqU+gNu18(!QJ4BjCa|7Qg%S1G(0aBT>UTT3evi>#m@dCC z{=eWGeW9J5FLdyiW*}RFh!XRqEpTVm>(EC_Rt`YJj6o|_sG=R9{R?^P4#dy>?p?` znlDfm3rXU<*e;K ziP7*Rj)5m}oa5TWiI^&zIL$+{sbam4*EVsXmvE&AuA>jN;qFEYR#>%mshHb+qNBb}0Kv&1)md9$^__ zkMJ;}wnsWhs6B$J+aq{d_Q*J|ibpUu_DGzEj90`q(y&KZpV%X)f<5w`N7yHhJ*pra zHHbZmCuWZZ<3ih`OSc2j@5COBf%|9&6=;vL!(xvP@Nk1X96QjY9;<;T(<(=& z8DeuhIrBY6Mw&g!P_svu89*vShU-*+dvp`zW9>W*IOg@*F@~8v*4smR!jE~vj}7&3 zOk?)gB<~M)*&dtji8waPW1L6#9b4crE)$S{XBcJlZRwkZMit)*pq#cbJ80&Cx>{1SdTE;`!miHdlGNLo}5A% zPtKAS_M|tx*d&3ICux;U3Zhq%yaAr%4a6i*?~**dON#bzT|G_VUI<9m88!*u!6xD9 zTAt+O&v>epG*JR=67G>r@>(m2dzOw(T27&oR?*o>YrPozeKu*6N8aplZ$n*^z6Y1= zFhG+vYe<{i7-TY@i%pJ%k*9f|H*IoX57*yuZ1M=NZpouP?(rUlZ^1Ts zGFc_FMPrj^c(S~Ko$P5?GIOgQ0u_^vi( XDie!M@tP=Qo=5R?GKGx`n-c&3T8mO+ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/UniKS-UTF8-V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..8dfa76a58eb720dd1992c2cc9abf1dd4b39c5a66 GIT binary patch literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl9jqG~;%1@i;l%x@VcNc0 zKKADSxe6P;=Q41yFf!=yFfuSQG{%{?u-GKAKWdoFxUahTe-7im3Rcejj7*IC>Nk8Z RV%*Owz`9?sv6^YW6ad@#ITio_ literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/V.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/V.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..fdec9906621904180f42bd5c91f377397fd6cf95 GIT binary patch literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=#j{(sKmI}pOXoN*Dkx{jjaUT-^bqy(L literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/WP-Symbol.bcmap b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/WP-Symbol.bcmap new file mode 100644 index 0000000000000000000000000000000000000000..46729bbf30f3b2f176492d907fb8ca3f6a1e3026 GIT binary patch literal 179 zcmW;C-wMG{90&04*(h8{xuKNv0%qLpa><2~3lnNLW=^QFb+%;wBoDUVIgjE|#O#wbv3o&3S`2gr-Jo93r6xVAssnXnw1B!ZT0%WQ!k{%%Po}{NAH@>d0EGtm W&}LiN6j32_>FyT<6+0XN literal 0 HcmV?d00001 diff --git a/services/web/public/js/libs/pdfjs-1.7.225/compatibility.js b/services/web/public/js/libs/pdfjs-1.7.225/compatibility.js new file mode 100644 index 0000000000..df626a7eab --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/compatibility.js @@ -0,0 +1,639 @@ +/* Copyright 2012 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. + */ +/* eslint strict: ["error", "function"] */ +/* eslint-disable no-extend-native */ +/* globals VBArray, PDFJS */ + +(function compatibilityWrapper() { + 'use strict'; + +var userAgent = navigator.userAgent; + +var isAndroid = /Android/.test(userAgent); +var isAndroidPre3 = /Android\s[0-2][^\d]/.test(userAgent); +var isAndroidPre5 = /Android\s[0-4][^\d]/.test(userAgent); +var isChrome = userAgent.indexOf('Chrom') >= 0; +var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(userAgent); +var isIE = userAgent.indexOf('Trident') >= 0; +var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent); +var isOpera = userAgent.indexOf('Opera') >= 0; +var isSafari = /Safari\//.test(userAgent) && + !/(Chrome\/|Android\s)/.test(userAgent); + +// Initializing PDFJS global object here, it case if we need to change/disable +// some PDF.js features, e.g. range requests +if (typeof PDFJS === 'undefined') { + (typeof window !== 'undefined' ? window : this).PDFJS = {}; +} + +// Checking if the typed arrays are supported +// Support: iOS<6.0 (subarray), IE<10, Android<4.0 +(function checkTypedArrayCompatibility() { + if (typeof Uint8Array !== 'undefined') { + // Support: iOS<6.0 + if (typeof Uint8Array.prototype.subarray === 'undefined') { + Uint8Array.prototype.subarray = function subarray(start, end) { + return new Uint8Array(this.slice(start, end)); + }; + Float32Array.prototype.subarray = function subarray(start, end) { + return new Float32Array(this.slice(start, end)); + }; + } + + // Support: Android<4.1 + if (typeof Float64Array === 'undefined') { + window.Float64Array = Float32Array; + } + return; + } + + function subarray(start, end) { + return new TypedArray(this.slice(start, end)); + } + + function setArrayOffset(array, offset) { + if (arguments.length < 2) { + offset = 0; + } + for (var i = 0, n = array.length; i < n; ++i, ++offset) { + this[offset] = array[i] & 0xFF; + } + } + + function TypedArray(arg1) { + var result, i, n; + if (typeof arg1 === 'number') { + result = []; + for (i = 0; i < arg1; ++i) { + result[i] = 0; + } + } else if ('slice' in arg1) { + result = arg1.slice(0); + } else { + result = []; + for (i = 0, n = arg1.length; i < n; ++i) { + result[i] = arg1[i]; + } + } + + result.subarray = subarray; + result.buffer = result; + result.byteLength = result.length; + result.set = setArrayOffset; + + if (typeof arg1 === 'object' && arg1.buffer) { + result.buffer = arg1.buffer; + } + return result; + } + + window.Uint8Array = TypedArray; + window.Int8Array = TypedArray; + + // we don't need support for set, byteLength for 32-bit array + // so we can use the TypedArray as well + window.Uint32Array = TypedArray; + window.Int32Array = TypedArray; + window.Uint16Array = TypedArray; + window.Float32Array = TypedArray; + window.Float64Array = TypedArray; +})(); + +// URL = URL || webkitURL +// Support: Safari<7, Android 4.2+ +(function normalizeURLObject() { + if (!window.URL) { + window.URL = window.webkitURL; + } +})(); + +// Object.defineProperty()? +// Support: Android<4.0, Safari<5.1 +(function checkObjectDefinePropertyCompatibility() { + if (typeof Object.defineProperty !== 'undefined') { + var definePropertyPossible = true; + try { + // some browsers (e.g. safari) cannot use defineProperty() on DOM objects + // and thus the native version is not sufficient + Object.defineProperty(new Image(), 'id', { value: 'test' }); + // ... another test for android gb browser for non-DOM objects + var Test = function Test() {}; + Test.prototype = { get id() { } }; + Object.defineProperty(new Test(), 'id', + { value: '', configurable: true, enumerable: true, writable: false }); + } catch (e) { + definePropertyPossible = false; + } + if (definePropertyPossible) { + return; + } + } + + Object.defineProperty = function objectDefineProperty(obj, name, def) { + delete obj[name]; + if ('get' in def) { + obj.__defineGetter__(name, def['get']); + } + if ('set' in def) { + obj.__defineSetter__(name, def['set']); + } + if ('value' in def) { + obj.__defineSetter__(name, function objectDefinePropertySetter(value) { + this.__defineGetter__(name, function objectDefinePropertyGetter() { + return value; + }); + return value; + }); + obj[name] = def.value; + } + }; +})(); + + +// No XMLHttpRequest#response? +// Support: IE<11, Android <4.0 +(function checkXMLHttpRequestResponseCompatibility() { + var xhrPrototype = XMLHttpRequest.prototype; + var xhr = new XMLHttpRequest(); + if (!('overrideMimeType' in xhr)) { + // IE10 might have response, but not overrideMimeType + // Support: IE10 + Object.defineProperty(xhrPrototype, 'overrideMimeType', { + value: function xmlHttpRequestOverrideMimeType(mimeType) {} + }); + } + if ('responseType' in xhr) { + return; + } + + // The worker will be using XHR, so we can save time and disable worker. + PDFJS.disableWorker = true; + + Object.defineProperty(xhrPrototype, 'responseType', { + get: function xmlHttpRequestGetResponseType() { + return this._responseType || 'text'; + }, + set: function xmlHttpRequestSetResponseType(value) { + if (value === 'text' || value === 'arraybuffer') { + this._responseType = value; + if (value === 'arraybuffer' && + typeof this.overrideMimeType === 'function') { + this.overrideMimeType('text/plain; charset=x-user-defined'); + } + } + } + }); + + // Support: IE9 + if (typeof VBArray !== 'undefined') { + Object.defineProperty(xhrPrototype, 'response', { + get: function xmlHttpRequestResponseGet() { + if (this.responseType === 'arraybuffer') { + return new Uint8Array(new VBArray(this.responseBody).toArray()); + } + return this.responseText; + } + }); + return; + } + + Object.defineProperty(xhrPrototype, 'response', { + get: function xmlHttpRequestResponseGet() { + if (this.responseType !== 'arraybuffer') { + return this.responseText; + } + var text = this.responseText; + var i, n = text.length; + var result = new Uint8Array(n); + for (i = 0; i < n; ++i) { + result[i] = text.charCodeAt(i) & 0xFF; + } + return result.buffer; + } + }); +})(); + +// window.btoa (base64 encode function) ? +// Support: IE<10 +(function checkWindowBtoaCompatibility() { + if ('btoa' in window) { + return; + } + + var digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + window.btoa = function windowBtoa(chars) { + var buffer = ''; + var i, n; + for (i = 0, n = chars.length; i < n; i += 3) { + var b1 = chars.charCodeAt(i) & 0xFF; + var b2 = chars.charCodeAt(i + 1) & 0xFF; + var b3 = chars.charCodeAt(i + 2) & 0xFF; + var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); + var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; + var d4 = i + 2 < n ? (b3 & 0x3F) : 64; + buffer += (digits.charAt(d1) + digits.charAt(d2) + + digits.charAt(d3) + digits.charAt(d4)); + } + return buffer; + }; +})(); + +// window.atob (base64 encode function)? +// Support: IE<10 +(function checkWindowAtobCompatibility() { + if ('atob' in window) { + return; + } + + // https://github.com/davidchambers/Base64.js + var digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + window.atob = function (input) { + input = input.replace(/=+$/, ''); + if (input.length % 4 === 1) { + throw new Error('bad atob input'); + } + for ( + // initialize result and counters + var bc = 0, bs, buffer, idx = 0, output = ''; + // get next character + (buffer = input.charAt(idx++)); + // character found in table? + // initialize bit storage and add its ascii value + ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, + // and if not first of each 4 characters, + // convert the first 8 bits to one ascii character + bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 + ) { + // try to find character in table (0-63, not found => -1) + buffer = digits.indexOf(buffer); + } + return output; + }; +})(); + +// Function.prototype.bind? +// Support: Android<4.0, iOS<6.0 +(function checkFunctionPrototypeBindCompatibility() { + if (typeof Function.prototype.bind !== 'undefined') { + return; + } + + Function.prototype.bind = function functionPrototypeBind(obj) { + var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); + var bound = function functionPrototypeBindBound() { + var args = headArgs.concat(Array.prototype.slice.call(arguments)); + return fn.apply(obj, args); + }; + return bound; + }; +})(); + +// HTMLElement dataset property +// Support: IE<11, Safari<5.1, Android<4.0 +(function checkDatasetProperty() { + var div = document.createElement('div'); + if ('dataset' in div) { + return; // dataset property exists + } + + Object.defineProperty(HTMLElement.prototype, 'dataset', { + get: function() { + if (this._dataset) { + return this._dataset; + } + + var dataset = {}; + for (var j = 0, jj = this.attributes.length; j < jj; j++) { + var attribute = this.attributes[j]; + if (attribute.name.substring(0, 5) !== 'data-') { + continue; + } + var key = attribute.name.substring(5).replace(/\-([a-z])/g, + function(all, ch) { + return ch.toUpperCase(); + }); + dataset[key] = attribute.value; + } + + Object.defineProperty(this, '_dataset', { + value: dataset, + writable: false, + enumerable: false + }); + return dataset; + }, + enumerable: true + }); +})(); + +// HTMLElement classList property +// Support: IE<10, Android<4.0, iOS<5.0 +(function checkClassListProperty() { + var div = document.createElement('div'); + if ('classList' in div) { + return; // classList property exists + } + + function changeList(element, itemName, add, remove) { + var s = element.className || ''; + var list = s.split(/\s+/g); + if (list[0] === '') { + list.shift(); + } + var index = list.indexOf(itemName); + if (index < 0 && add) { + list.push(itemName); + } + if (index >= 0 && remove) { + list.splice(index, 1); + } + element.className = list.join(' '); + return (index >= 0); + } + + var classListPrototype = { + add: function(name) { + changeList(this.element, name, true, false); + }, + contains: function(name) { + return changeList(this.element, name, false, false); + }, + remove: function(name) { + changeList(this.element, name, false, true); + }, + toggle: function(name) { + changeList(this.element, name, true, true); + } + }; + + Object.defineProperty(HTMLElement.prototype, 'classList', { + get: function() { + if (this._classList) { + return this._classList; + } + + var classList = Object.create(classListPrototype, { + element: { + value: this, + writable: false, + enumerable: true + } + }); + Object.defineProperty(this, '_classList', { + value: classList, + writable: false, + enumerable: false + }); + return classList; + }, + enumerable: true + }); +})(); + +// Check console compatibility +// In older IE versions the console object is not available +// unless console is open. +// Support: IE<10 +(function checkConsoleCompatibility() { + if (!('console' in window)) { + window.console = { + log: function() {}, + error: function() {}, + warn: function() {} + }; + } else if (!('bind' in console.log)) { + // native functions in IE9 might not have bind + console.log = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.log); + console.error = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.error); + console.warn = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.warn); + } +})(); + +// Check onclick compatibility in Opera +// Support: Opera<15 +(function checkOnClickCompatibility() { + // workaround for reported Opera bug DSK-354448: + // onclick fires on disabled buttons with opaque content + function ignoreIfTargetDisabled(event) { + if (isDisabled(event.target)) { + event.stopPropagation(); + } + } + function isDisabled(node) { + return node.disabled || (node.parentNode && isDisabled(node.parentNode)); + } + if (isOpera) { + // use browser detection since we cannot feature-check this bug + document.addEventListener('click', ignoreIfTargetDisabled, true); + } +})(); + +// Checks if possible to use URL.createObjectURL() +// Support: IE +(function checkOnBlobSupport() { + // sometimes IE loosing the data created with createObjectURL(), see #3977 + if (isIE) { + PDFJS.disableCreateObjectURL = true; + } +})(); + +// Checks if navigator.language is supported +(function checkNavigatorLanguage() { + if ('language' in navigator) { + return; + } + PDFJS.locale = navigator.userLanguage || 'en-US'; +})(); + +// Support: Safari 6.0+, Android<3.0, Chrome 39/40, iOS +(function checkRangeRequests() { + // Safari has issues with cached range requests see: + // https://github.com/mozilla/pdf.js/issues/3260 + // Last tested with version 6.0.4. + + // Older versions of Android (pre 3.0) has issues with range requests, see: + // https://github.com/mozilla/pdf.js/issues/3381. + // Make sure that we only match webkit-based Android browsers, + // since Firefox/Fennec works as expected. + + // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 + if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) { + PDFJS.disableRange = true; + PDFJS.disableStream = true; + } +})(); + +// Check if the browser supports manipulation of the history. +// Support: IE<10, Android<4.2 +(function checkHistoryManipulation() { + // Android 2.x has so buggy pushState support that it was removed in + // Android 3.0 and restored as late as in Android 4.2. + // Support: Android 2.x + if (!history.pushState || isAndroidPre3) { + PDFJS.disableHistory = true; + } +})(); + +// Support: IE<11, Chrome<21, Android<4.4, Safari<6 +(function checkSetPresenceInImageData() { + // IE < 11 will use window.CanvasPixelArray which lacks set function. + if (window.CanvasPixelArray) { + if (typeof window.CanvasPixelArray.prototype.set !== 'function') { + window.CanvasPixelArray.prototype.set = function(arr) { + for (var i = 0, ii = this.length; i < ii; i++) { + this[i] = arr[i]; + } + }; + } + } else { + // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. + // Because we cannot feature detect it, we rely on user agent parsing. + var polyfill = false, versionMatch; + if (isChrome) { + versionMatch = userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + // Chrome < 21 lacks the set function. + polyfill = versionMatch && parseInt(versionMatch[2]) < 21; + } else if (isAndroid) { + // Android < 4.4 lacks the set function. + // Android >= 4.4 will contain Chrome in the user agent, + // thus pass the Chrome check above and not reach this block. + polyfill = isAndroidPre5; + } else if (isSafari) { + versionMatch = userAgent. + match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); + // Safari < 6 lacks the set function. + polyfill = versionMatch && parseInt(versionMatch[1]) < 6; + } + + if (polyfill) { + var contextPrototype = window.CanvasRenderingContext2D.prototype; + var createImageData = contextPrototype.createImageData; + contextPrototype.createImageData = function(w, h) { + var imageData = createImageData.call(this, w, h); + imageData.data.set = function(arr) { + for (var i = 0, ii = this.length; i < ii; i++) { + this[i] = arr[i]; + } + }; + return imageData; + }; + // this closure will be kept referenced, so clear its vars + contextPrototype = null; + } + } +})(); + +// Support: IE<10, Android<4.0, iOS +(function checkRequestAnimationFrame() { + function fakeRequestAnimationFrame(callback) { + window.setTimeout(callback, 20); + } + + if (isIOS) { + // requestAnimationFrame on iOS is broken, replacing with fake one. + window.requestAnimationFrame = fakeRequestAnimationFrame; + return; + } + if ('requestAnimationFrame' in window) { + return; + } + window.requestAnimationFrame = + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + fakeRequestAnimationFrame; +})(); + +// Support: Android, iOS +(function checkCanvasSizeLimitation() { + if (isIOS || isAndroid) { + // 5MP + PDFJS.maxCanvasPixels = 5242880; + } +})(); + +// Disable fullscreen support for certain problematic configurations. +// Support: IE11+ (when embedded). +(function checkFullscreenSupport() { + if (isIE && window.parent !== window) { + PDFJS.disableFullscreen = true; + } +})(); + +// Provides document.currentScript support +// Support: IE, Chrome<29. +(function checkCurrentScript() { + if ('currentScript' in document) { + return; + } + Object.defineProperty(document, 'currentScript', { + get: function () { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + }, + enumerable: true, + configurable: true + }); +})(); + +// Provides `input.type = 'type'` runtime failure protection. +// Support: IE9,10. +(function checkInputTypeNumberAssign() { + var el = document.createElement('input'); + try { + el.type = 'number'; + } catch (ex) { + var inputProto = el.constructor.prototype; + var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type'); + Object.defineProperty(inputProto, 'type', { + get: function () { return typeProperty.get.call(this); }, + set: function (value) { + typeProperty.set.call(this, value === 'number' ? 'text' : value); + }, + enumerable: true, + configurable: true + }); + } +})(); + +// Provides correct document.readyState value for legacy browsers. +// Support: IE9,10. +(function checkDocumentReadyState() { + if (!document.attachEvent) { + return; + } + var documentProto = document.constructor.prototype; + var readyStateProto = Object.getOwnPropertyDescriptor(documentProto, + 'readyState'); + Object.defineProperty(documentProto, 'readyState', { + get: function () { + var value = readyStateProto.get.call(this); + return value === 'interactive' ? 'loading' : value; + }, + set: function (value) { readyStateProto.set.call(this, value); }, + enumerable: true, + configurable: true + }); +})(); + +}).call((typeof window === 'undefined') ? this : window); diff --git a/services/web/public/js/libs/pdfjs-1.7.225/pdf.js b/services/web/public/js/libs/pdfjs-1.7.225/pdf.js new file mode 100644 index 0000000000..6cea4c96f3 --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/pdf.js @@ -0,0 +1,9052 @@ +/* Copyright 2012 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. + */ +(function (root, factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define('pdfjs-dist/build/pdf', ['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory(root['pdfjsDistBuildPdf'] = {}); + } +}(this, function (exports) { + 'use strict'; + var pdfjsVersion = '1.7.225'; + var pdfjsBuild = '17d135f'; + var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; + var pdfjsLibs = {}; + (function pdfjsWrapper() { + (function (root, factory) { + factory(root.pdfjsSharedUtil = {}); + }(this, function (exports) { + var globalScope = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this; + 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 + }; + var ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 + }; + var AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 + }; + var AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 + }; + var AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 + }; + var AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 + }; + var StreamType = { + UNKNOWN: 0, + FLATE: 1, + LZW: 2, + DCT: 3, + JPX: 4, + JBIG: 5, + A85: 6, + AHX: 7, + CCF: 8, + RL: 9 + }; + var FontType = { + UNKNOWN: 0, + TYPE1: 1, + TYPE1C: 2, + CIDFONTTYPE0: 3, + CIDFONTTYPE0C: 4, + TRUETYPE: 5, + CIDFONTTYPE2: 6, + TYPE3: 7, + OPENTYPE: 8, + TYPE0: 9, + MMTYPE1: 10 + }; + var VERBOSITY_LEVELS = { + errors: 0, + warnings: 1, + infos: 5 + }; + var OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotations: 78, + endAnnotations: 79, + beginAnnotation: 80, + endAnnotation: 81, + paintJpegXObject: 82, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91 + }; + var verbosity = VERBOSITY_LEVELS.warnings; + function setVerbosityLevel(level) { + verbosity = level; + } + function getVerbosityLevel() { + return verbosity; + } + function info(msg) { + if (verbosity >= VERBOSITY_LEVELS.infos) { + console.log('Info: ' + msg); + } + } + function warn(msg) { + if (verbosity >= VERBOSITY_LEVELS.warnings) { + console.log('Warning: ' + msg); + } + } + function deprecated(details) { + console.log('Deprecated API usage: ' + details); + } + function error(msg) { + if (verbosity >= VERBOSITY_LEVELS.errors) { + console.log('Error: ' + msg); + console.log(backtrace()); + } + throw new Error(msg); + } + function backtrace() { + try { + throw new Error(); + } catch (e) { + return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; + } + } + function assert(cond, msg) { + if (!cond) { + error(msg); + } + } + var UNSUPPORTED_FEATURES = { + unknown: 'unknown', + forms: 'forms', + javaScript: 'javaScript', + smask: 'smask', + shadingPattern: 'shadingPattern', + font: 'font' + }; + function isSameOrigin(baseUrl, otherUrl) { + try { + var base = new URL(baseUrl); + if (!base.origin || base.origin === 'null') { + return false; + } + } catch (e) { + return false; + } + var other = new URL(otherUrl, base); + return base.origin === other.origin; + } + function isValidProtocol(url) { + if (!url) { + return false; + } + switch (url.protocol) { + case 'http:': + case 'https:': + case 'ftp:': + case 'mailto:': + case 'tel:': + return true; + default: + return false; + } + } + function createValidAbsoluteUrl(url, baseUrl) { + if (!url) { + return null; + } + try { + var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch (ex) { + } + return null; + } + function shadow(obj, prop, value) { + Object.defineProperty(obj, prop, { + value: value, + enumerable: true, + configurable: true, + writable: false + }); + return value; + } + function getLookupTableFactory(initializer) { + var lookup; + return function () { + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; + } + return lookup; + }; + } + var PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 + }; + var PasswordException = function PasswordExceptionClosure() { + function PasswordException(msg, code) { + this.name = 'PasswordException'; + this.message = msg; + this.code = code; + } + PasswordException.prototype = new Error(); + PasswordException.constructor = PasswordException; + return PasswordException; + }(); + var UnknownErrorException = function UnknownErrorExceptionClosure() { + function UnknownErrorException(msg, details) { + this.name = 'UnknownErrorException'; + this.message = msg; + this.details = details; + } + UnknownErrorException.prototype = new Error(); + UnknownErrorException.constructor = UnknownErrorException; + return UnknownErrorException; + }(); + var InvalidPDFException = function InvalidPDFExceptionClosure() { + function InvalidPDFException(msg) { + this.name = 'InvalidPDFException'; + this.message = msg; + } + InvalidPDFException.prototype = new Error(); + InvalidPDFException.constructor = InvalidPDFException; + return InvalidPDFException; + }(); + var MissingPDFException = function MissingPDFExceptionClosure() { + function MissingPDFException(msg) { + this.name = 'MissingPDFException'; + this.message = msg; + } + MissingPDFException.prototype = new Error(); + MissingPDFException.constructor = MissingPDFException; + return MissingPDFException; + }(); + var UnexpectedResponseException = function UnexpectedResponseExceptionClosure() { + function UnexpectedResponseException(msg, status) { + this.name = 'UnexpectedResponseException'; + this.message = msg; + this.status = status; + } + UnexpectedResponseException.prototype = new Error(); + UnexpectedResponseException.constructor = UnexpectedResponseException; + return UnexpectedResponseException; + }(); + var NotImplementedException = function NotImplementedExceptionClosure() { + function NotImplementedException(msg) { + this.message = msg; + } + NotImplementedException.prototype = new Error(); + NotImplementedException.prototype.name = 'NotImplementedException'; + NotImplementedException.constructor = NotImplementedException; + return NotImplementedException; + }(); + var MissingDataException = function MissingDataExceptionClosure() { + function MissingDataException(begin, end) { + this.begin = begin; + this.end = end; + this.message = 'Missing data [' + begin + ', ' + end + ')'; + } + MissingDataException.prototype = new Error(); + MissingDataException.prototype.name = 'MissingDataException'; + MissingDataException.constructor = MissingDataException; + return MissingDataException; + }(); + var XRefParseException = function XRefParseExceptionClosure() { + function XRefParseException(msg) { + this.message = msg; + } + XRefParseException.prototype = new Error(); + XRefParseException.prototype.name = 'XRefParseException'; + XRefParseException.constructor = XRefParseException; + return XRefParseException; + }(); + var NullCharactersRegExp = /\x00/g; + function removeNullCharacters(str) { + if (typeof str !== 'string') { + warn('The argument for removeNullCharacters must be a string.'); + return str; + } + return str.replace(NullCharactersRegExp, ''); + } + function bytesToString(bytes) { + assert(bytes !== null && typeof bytes === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString'); + var length = bytes.length; + var MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + var strBuf = []; + for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + var chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(''); + } + function stringToBytes(str) { + assert(typeof str === 'string', 'Invalid argument for stringToBytes'); + var length = str.length; + var bytes = new Uint8Array(length); + for (var i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xFF; + } + return bytes; + } + function arrayByteLength(arr) { + if (arr.length !== undefined) { + return arr.length; + } + assert(arr.byteLength !== undefined); + return arr.byteLength; + } + function arraysToBytes(arr) { + if (arr.length === 1 && arr[0] instanceof Uint8Array) { + return arr[0]; + } + var resultLength = 0; + var i, ii = arr.length; + var item, itemLength; + for (i = 0; i < ii; i++) { + item = arr[i]; + itemLength = arrayByteLength(item); + resultLength += itemLength; + } + var pos = 0; + var data = new Uint8Array(resultLength); + for (i = 0; i < ii; i++) { + item = arr[i]; + if (!(item instanceof Uint8Array)) { + if (typeof item === 'string') { + item = stringToBytes(item); + } else { + item = new Uint8Array(item); + } + } + itemLength = item.byteLength; + data.set(item, pos); + pos += itemLength; + } + return data; + } + function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + function log2(x) { + var n = 1, i = 0; + while (x > n) { + n <<= 1; + i++; + } + return i; + } + function readInt8(data, start) { + return data[start] << 24 >> 24; + } + function readUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; + } + function readUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; + } + function isLittleEndian() { + var buffer8 = new Uint8Array(2); + buffer8[0] = 1; + var buffer16 = new Uint16Array(buffer8.buffer); + return buffer16[0] === 1; + } + function isEvalSupported() { + try { + new Function(''); + return true; + } catch (e) { + return false; + } + } + var Uint32ArrayView = function Uint32ArrayViewClosure() { + function Uint32ArrayView(buffer, length) { + this.buffer = buffer; + this.byteLength = buffer.length; + this.length = length === undefined ? this.byteLength >> 2 : length; + ensureUint32ArrayViewProps(this.length); + } + Uint32ArrayView.prototype = Object.create(null); + var uint32ArrayViewSetters = 0; + function createUint32ArrayProp(index) { + return { + get: function () { + var buffer = this.buffer, offset = index << 2; + return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0; + }, + set: function (value) { + var buffer = this.buffer, offset = index << 2; + buffer[offset] = value & 255; + buffer[offset + 1] = value >> 8 & 255; + buffer[offset + 2] = value >> 16 & 255; + buffer[offset + 3] = value >>> 24 & 255; + } + }; + } + function ensureUint32ArrayViewProps(length) { + while (uint32ArrayViewSetters < length) { + Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters)); + uint32ArrayViewSetters++; + } + } + return Uint32ArrayView; + }(); + exports.Uint32ArrayView = Uint32ArrayView; + var IDENTITY_MATRIX = [ + 1, + 0, + 0, + 1, + 0, + 0 + ]; + var Util = function UtilClosure() { + function Util() { + } + var rgbBuf = [ + 'rgb(', + 0, + ',', + 0, + ',', + 0, + ')' + ]; + Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { + rgbBuf[1] = r; + rgbBuf[3] = g; + rgbBuf[5] = b; + return rgbBuf.join(''); + }; + Util.transform = function Util_transform(m1, m2) { + return [ + m1[0] * m2[0] + m1[2] * m2[1], + m1[1] * m2[0] + m1[3] * m2[1], + m1[0] * m2[2] + m1[2] * m2[3], + m1[1] * m2[2] + m1[3] * m2[3], + m1[0] * m2[4] + m1[2] * m2[5] + m1[4], + m1[1] * m2[4] + m1[3] * m2[5] + m1[5] + ]; + }; + Util.applyTransform = function Util_applyTransform(p, m) { + var xt = p[0] * m[0] + p[1] * m[2] + m[4]; + var yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [ + xt, + yt + ]; + }; + Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { + var d = m[0] * m[3] - m[1] * m[2]; + var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [ + xt, + yt + ]; + }; + Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) { + var p1 = Util.applyTransform(r, m); + var p2 = Util.applyTransform(r.slice(2, 4), m); + var p3 = Util.applyTransform([ + r[0], + r[3] + ], m); + var p4 = Util.applyTransform([ + r[2], + r[1] + ], m); + return [ + Math.min(p1[0], p2[0], p3[0], p4[0]), + Math.min(p1[1], p2[1], p3[1], p4[1]), + Math.max(p1[0], p2[0], p3[0], p4[0]), + Math.max(p1[1], p2[1], p3[1], p4[1]) + ]; + }; + Util.inverseTransform = function Util_inverseTransform(m) { + var d = m[0] * m[3] - m[1] * m[2]; + return [ + m[3] / d, + -m[1] / d, + -m[2] / d, + m[0] / d, + (m[2] * m[5] - m[4] * m[3]) / d, + (m[4] * m[1] - m[5] * m[0]) / d + ]; + }; + Util.apply3dTransform = function Util_apply3dTransform(m, v) { + return [ + m[0] * v[0] + m[1] * v[1] + m[2] * v[2], + m[3] * v[0] + m[4] * v[1] + m[5] * v[2], + m[6] * v[0] + m[7] * v[1] + m[8] * v[2] + ]; + }; + Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) { + var transpose = [ + m[0], + m[2], + m[1], + m[3] + ]; + var a = m[0] * transpose[0] + m[1] * transpose[2]; + var b = m[0] * transpose[1] + m[1] * transpose[3]; + var c = m[2] * transpose[0] + m[3] * transpose[2]; + var d = m[2] * transpose[1] + m[3] * transpose[3]; + var first = (a + d) / 2; + var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; + var sx = first + second || 1; + var sy = first - second || 1; + return [ + Math.sqrt(sx), + Math.sqrt(sy) + ]; + }; + Util.normalizeRect = function Util_normalizeRect(rect) { + var r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + }; + Util.intersect = function Util_intersect(rect1, rect2) { + function compare(a, b) { + return a - b; + } + var orderedX = [ + rect1[0], + rect1[2], + rect2[0], + rect2[2] + ].sort(compare), orderedY = [ + rect1[1], + rect1[3], + rect2[1], + rect2[3] + ].sort(compare), result = []; + rect1 = Util.normalizeRect(rect1); + rect2 = Util.normalizeRect(rect2); + if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) { + result[0] = orderedX[1]; + result[2] = orderedX[2]; + } else { + return false; + } + if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) { + result[1] = orderedY[1]; + result[3] = orderedY[2]; + } else { + return false; + } + return result; + }; + Util.sign = function Util_sign(num) { + return num < 0 ? -1 : 1; + }; + var ROMAN_NUMBER_MAP = [ + '', + 'C', + 'CC', + 'CCC', + 'CD', + 'D', + 'DC', + 'DCC', + 'DCCC', + 'CM', + '', + 'X', + 'XX', + 'XXX', + 'XL', + 'L', + 'LX', + 'LXX', + 'LXXX', + 'XC', + '', + 'I', + 'II', + 'III', + 'IV', + 'V', + 'VI', + 'VII', + 'VIII', + 'IX' + ]; + Util.toRoman = function Util_toRoman(number, lowerCase) { + assert(isInt(number) && number > 0, 'The number should be a positive integer.'); + var pos, romanBuf = []; + while (number >= 1000) { + number -= 1000; + romanBuf.push('M'); + } + pos = number / 100 | 0; + number %= 100; + romanBuf.push(ROMAN_NUMBER_MAP[pos]); + pos = number / 10 | 0; + number %= 10; + romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); + romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); + var romanStr = romanBuf.join(''); + return lowerCase ? romanStr.toLowerCase() : romanStr; + }; + Util.appendToArray = function Util_appendToArray(arr1, arr2) { + Array.prototype.push.apply(arr1, arr2); + }; + Util.prependToArray = function Util_prependToArray(arr1, arr2) { + Array.prototype.unshift.apply(arr1, arr2); + }; + Util.extendObj = function extendObj(obj1, obj2) { + for (var key in obj2) { + obj1[key] = obj2[key]; + } + }; + Util.getInheritableProperty = function Util_getInheritableProperty(dict, name, getArray) { + while (dict && !dict.has(name)) { + dict = dict.get('Parent'); + } + if (!dict) { + return null; + } + return getArray ? dict.getArray(name) : dict.get(name); + }; + 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 = function PageViewportClosure() { + function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { + this.viewBox = viewBox; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + var centerX = (viewBox[2] + viewBox[0]) / 2; + var centerY = (viewBox[3] + viewBox[1]) / 2; + var rotateA, rotateB, rotateC, rotateD; + rotation = rotation % 360; + rotation = rotation < 0 ? rotation + 360 : rotation; + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + default: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + var offsetCanvasX, offsetCanvasY; + var width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = Math.abs(viewBox[3] - viewBox[1]) * scale; + height = Math.abs(viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = Math.abs(viewBox[2] - viewBox[0]) * scale; + height = Math.abs(viewBox[3] - viewBox[1]) * scale; + } + this.transform = [ + rotateA * scale, + rotateB * scale, + rotateC * scale, + rotateD * scale, + offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, + offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY + ]; + this.width = width; + this.height = height; + this.fontScale = scale; + } + PageViewport.prototype = { + clone: function PageViewPort_clone(args) { + args = args || {}; + var scale = 'scale' in args ? args.scale : this.scale; + var rotation = 'rotation' in args ? args.rotation : this.rotation; + return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip); + }, + convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { + return Util.applyTransform([ + x, + y + ], this.transform); + }, + convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) { + var tl = Util.applyTransform([ + rect[0], + rect[1] + ], this.transform); + var br = Util.applyTransform([ + rect[2], + rect[3] + ], this.transform); + return [ + tl[0], + tl[1], + br[0], + br[1] + ]; + }, + convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { + return Util.applyInverseTransform([ + x, + y + ], this.transform); + } + }; + return PageViewport; + }(); + var PDFStringTranslateTable = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0x2D8, + 0x2C7, + 0x2C6, + 0x2D9, + 0x2DD, + 0x2DB, + 0x2DA, + 0x2DC, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0x2022, + 0x2020, + 0x2021, + 0x2026, + 0x2014, + 0x2013, + 0x192, + 0x2044, + 0x2039, + 0x203A, + 0x2212, + 0x2030, + 0x201E, + 0x201C, + 0x201D, + 0x2018, + 0x2019, + 0x201A, + 0x2122, + 0xFB01, + 0xFB02, + 0x141, + 0x152, + 0x160, + 0x178, + 0x17D, + 0x131, + 0x142, + 0x153, + 0x161, + 0x17E, + 0, + 0x20AC + ]; + function stringToPDFString(str) { + var i, n = str.length, strBuf = []; + if (str[0] === '\xFE' && str[1] === '\xFF') { + for (i = 2; i < n; i += 2) { + strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1))); + } + } else { + for (i = 0; i < n; ++i) { + var code = PDFStringTranslateTable[str.charCodeAt(i)]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + } + return strBuf.join(''); + } + function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); + } + function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); + } + function isEmptyObj(obj) { + for (var key in obj) { + return false; + } + return true; + } + function isBool(v) { + return typeof v === 'boolean'; + } + function isInt(v) { + return typeof v === 'number' && (v | 0) === v; + } + function isNum(v) { + return typeof v === 'number'; + } + function isString(v) { + return typeof v === 'string'; + } + function isArray(v) { + return v instanceof Array; + } + function isArrayBuffer(v) { + return typeof v === 'object' && v !== null && v.byteLength !== undefined; + } + function isSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A; + } + function createPromiseCapability() { + var capability = {}; + capability.promise = new Promise(function (resolve, reject) { + capability.resolve = resolve; + capability.reject = reject; + }); + return capability; + } + (function PromiseClosure() { + if (globalScope.Promise) { + if (typeof globalScope.Promise.all !== 'function') { + globalScope.Promise.all = function (iterable) { + var count = 0, results = [], resolve, reject; + var promise = new globalScope.Promise(function (resolve_, reject_) { + resolve = resolve_; + reject = reject_; + }); + iterable.forEach(function (p, i) { + count++; + p.then(function (result) { + results[i] = result; + count--; + if (count === 0) { + resolve(results); + } + }, reject); + }); + if (count === 0) { + resolve(results); + } + return promise; + }; + } + if (typeof globalScope.Promise.resolve !== 'function') { + globalScope.Promise.resolve = function (value) { + return new globalScope.Promise(function (resolve) { + resolve(value); + }); + }; + } + if (typeof globalScope.Promise.reject !== 'function') { + globalScope.Promise.reject = function (reason) { + return new globalScope.Promise(function (resolve, reject) { + reject(reason); + }); + }; + } + if (typeof globalScope.Promise.prototype.catch !== 'function') { + globalScope.Promise.prototype.catch = function (onReject) { + return globalScope.Promise.prototype.then(undefined, onReject); + }; + } + return; + } + var STATUS_PENDING = 0; + var STATUS_RESOLVED = 1; + var STATUS_REJECTED = 2; + var REJECTION_TIMEOUT = 500; + var HandlerManager = { + handlers: [], + running: false, + unhandledRejections: [], + pendingRejectionCheck: false, + scheduleHandlers: function scheduleHandlers(promise) { + if (promise._status === STATUS_PENDING) { + return; + } + this.handlers = this.handlers.concat(promise._handlers); + promise._handlers = []; + if (this.running) { + return; + } + this.running = true; + setTimeout(this.runHandlers.bind(this), 0); + }, + runHandlers: function runHandlers() { + var RUN_TIMEOUT = 1; + var timeoutAt = Date.now() + RUN_TIMEOUT; + while (this.handlers.length > 0) { + var handler = this.handlers.shift(); + var nextStatus = handler.thisPromise._status; + var nextValue = handler.thisPromise._value; + try { + if (nextStatus === STATUS_RESOLVED) { + if (typeof handler.onResolve === 'function') { + nextValue = handler.onResolve(nextValue); + } + } else if (typeof handler.onReject === 'function') { + nextValue = handler.onReject(nextValue); + nextStatus = STATUS_RESOLVED; + if (handler.thisPromise._unhandledRejection) { + this.removeUnhandeledRejection(handler.thisPromise); + } + } + } catch (ex) { + nextStatus = STATUS_REJECTED; + nextValue = ex; + } + handler.nextPromise._updateStatus(nextStatus, nextValue); + if (Date.now() >= timeoutAt) { + break; + } + } + if (this.handlers.length > 0) { + setTimeout(this.runHandlers.bind(this), 0); + return; + } + this.running = false; + }, + addUnhandledRejection: function addUnhandledRejection(promise) { + this.unhandledRejections.push({ + promise: promise, + time: Date.now() + }); + this.scheduleRejectionCheck(); + }, + removeUnhandeledRejection: function removeUnhandeledRejection(promise) { + promise._unhandledRejection = false; + for (var i = 0; i < this.unhandledRejections.length; i++) { + if (this.unhandledRejections[i].promise === promise) { + this.unhandledRejections.splice(i); + i--; + } + } + }, + scheduleRejectionCheck: function scheduleRejectionCheck() { + if (this.pendingRejectionCheck) { + return; + } + this.pendingRejectionCheck = true; + setTimeout(function rejectionCheck() { + this.pendingRejectionCheck = false; + var now = Date.now(); + for (var i = 0; i < this.unhandledRejections.length; i++) { + if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { + var unhandled = this.unhandledRejections[i].promise._value; + var msg = 'Unhandled rejection: ' + unhandled; + if (unhandled.stack) { + msg += '\n' + unhandled.stack; + } + warn(msg); + this.unhandledRejections.splice(i); + i--; + } + } + if (this.unhandledRejections.length) { + this.scheduleRejectionCheck(); + } + }.bind(this), REJECTION_TIMEOUT); + } + }; + var Promise = function Promise(resolver) { + this._status = STATUS_PENDING; + this._handlers = []; + try { + resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); + } catch (e) { + this._reject(e); + } + }; + Promise.all = function Promise_all(promises) { + var resolveAll, rejectAll; + var deferred = new Promise(function (resolve, reject) { + resolveAll = resolve; + rejectAll = reject; + }); + var unresolved = promises.length; + var results = []; + if (unresolved === 0) { + resolveAll(results); + return deferred; + } + function reject(reason) { + if (deferred._status === STATUS_REJECTED) { + return; + } + results = []; + rejectAll(reason); + } + for (var i = 0, ii = promises.length; i < ii; ++i) { + var promise = promises[i]; + var resolve = function (i) { + return function (value) { + if (deferred._status === STATUS_REJECTED) { + return; + } + results[i] = value; + unresolved--; + if (unresolved === 0) { + resolveAll(results); + } + }; + }(i); + if (Promise.isPromise(promise)) { + promise.then(resolve, reject); + } else { + resolve(promise); + } + } + return deferred; + }; + Promise.isPromise = function Promise_isPromise(value) { + return value && typeof value.then === 'function'; + }; + Promise.resolve = function Promise_resolve(value) { + return new Promise(function (resolve) { + resolve(value); + }); + }; + Promise.reject = function Promise_reject(reason) { + return new Promise(function (resolve, reject) { + reject(reason); + }); + }; + Promise.prototype = { + _status: null, + _value: null, + _handlers: null, + _unhandledRejection: null, + _updateStatus: function Promise__updateStatus(status, value) { + if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) { + return; + } + if (status === STATUS_RESOLVED && Promise.isPromise(value)) { + value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED)); + return; + } + this._status = status; + this._value = value; + if (status === STATUS_REJECTED && this._handlers.length === 0) { + this._unhandledRejection = true; + HandlerManager.addUnhandledRejection(this); + } + HandlerManager.scheduleHandlers(this); + }, + _resolve: function Promise_resolve(value) { + this._updateStatus(STATUS_RESOLVED, value); + }, + _reject: function Promise_reject(reason) { + this._updateStatus(STATUS_REJECTED, reason); + }, + then: function Promise_then(onResolve, onReject) { + var nextPromise = new Promise(function (resolve, reject) { + this.resolve = resolve; + this.reject = reject; + }); + this._handlers.push({ + thisPromise: this, + onResolve: onResolve, + onReject: onReject, + nextPromise: nextPromise + }); + HandlerManager.scheduleHandlers(this); + return nextPromise; + }, + catch: function Promise_catch(onReject) { + return this.then(undefined, onReject); + } + }; + globalScope.Promise = Promise; + }()); + (function WeakMapClosure() { + if (globalScope.WeakMap) { + return; + } + var id = 0; + function WeakMap() { + this.id = '$weakmap' + id++; + } + WeakMap.prototype = { + has: function (obj) { + return !!Object.getOwnPropertyDescriptor(obj, this.id); + }, + get: function (obj, defaultValue) { + return this.has(obj) ? obj[this.id] : defaultValue; + }, + set: function (obj, value) { + Object.defineProperty(obj, this.id, { + value: value, + enumerable: false, + configurable: true + }); + }, + delete: function (obj) { + delete obj[this.id]; + } + }; + globalScope.WeakMap = WeakMap; + }()); + var StatTimer = function StatTimerClosure() { + function rpad(str, pad, length) { + while (str.length < length) { + str += pad; + } + return str; + } + function StatTimer() { + this.started = Object.create(null); + this.times = []; + this.enabled = true; + } + StatTimer.prototype = { + time: function StatTimer_time(name) { + if (!this.enabled) { + return; + } + if (name in this.started) { + warn('Timer is already running for ' + name); + } + this.started[name] = Date.now(); + }, + timeEnd: function StatTimer_timeEnd(name) { + if (!this.enabled) { + return; + } + if (!(name in this.started)) { + warn('Timer has not been started for ' + name); + } + this.times.push({ + 'name': name, + 'start': this.started[name], + 'end': Date.now() + }); + delete this.started[name]; + }, + toString: function StatTimer_toString() { + var i, ii; + var times = this.times; + var out = ''; + var longest = 0; + for (i = 0, ii = times.length; i < ii; ++i) { + var name = times[i]['name']; + if (name.length > longest) { + longest = name.length; + } + } + for (i = 0, ii = times.length; i < ii; ++i) { + var span = times[i]; + var duration = span.end - span.start; + out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; + } + return out; + } + }; + return StatTimer; + }(); + var createBlob = function createBlob(data, contentType) { + if (typeof Blob !== 'undefined') { + return new Blob([data], { type: contentType }); + } + warn('The "Blob" constructor is not supported.'); + }; + var createObjectURL = function createObjectURLClosure() { + var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + return function createObjectURL(data, contentType, forceDataSchema) { + if (!forceDataSchema && typeof URL !== 'undefined' && URL.createObjectURL) { + var blob = createBlob(data, contentType); + return URL.createObjectURL(blob); + } + var buffer = 'data:' + contentType + ';base64,'; + for (var i = 0, ii = data.length; i < ii; i += 3) { + var b1 = data[i] & 0xFF; + var b2 = data[i + 1] & 0xFF; + var b3 = data[i + 2] & 0xFF; + var d1 = b1 >> 2, d2 = (b1 & 3) << 4 | b2 >> 4; + var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64; + var d4 = i + 2 < ii ? b3 & 0x3F : 64; + buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; + } + return buffer; + }; + }(); + function MessageHandler(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackIndex = 1; + this.postMessageTransfers = true; + var callbacksCapabilities = this.callbacksCapabilities = Object.create(null); + var ah = this.actionHandler = Object.create(null); + this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { + var data = event.data; + if (data.targetName !== this.sourceName) { + return; + } + if (data.isReply) { + var callbackId = data.callbackId; + if (data.callbackId in callbacksCapabilities) { + var callback = callbacksCapabilities[callbackId]; + delete callbacksCapabilities[callbackId]; + if ('error' in data) { + callback.reject(data.error); + } else { + callback.resolve(data.data); + } + } else { + error('Cannot resolve callback ' + callbackId); + } + } else if (data.action in ah) { + var action = ah[data.action]; + if (data.callbackId) { + var sourceName = this.sourceName; + var targetName = data.sourceName; + Promise.resolve().then(function () { + return action[0].call(action[1], data.data); + }).then(function (result) { + comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, + isReply: true, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + if (reason instanceof Error) { + reason = reason + ''; + } + comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, + isReply: true, + callbackId: data.callbackId, + error: reason + }); + }); + } else { + action[0].call(action[1], data.data); + } + } else { + error('Unknown action from worker: ' + data.action); + } + }.bind(this); + comObj.addEventListener('message', this._onComObjOnMessage); + } + MessageHandler.prototype = { + on: function messageHandlerOn(actionName, handler, scope) { + var ah = this.actionHandler; + if (ah[actionName]) { + error('There is already an actionName called "' + actionName + '"'); + } + ah[actionName] = [ + handler, + scope + ]; + }, + send: function messageHandlerSend(actionName, data, transfers) { + var message = { + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data: data + }; + this.postMessage(message, transfers); + }, + sendWithPromise: function messageHandlerSendWithPromise(actionName, data, transfers) { + var callbackId = this.callbackIndex++; + var message = { + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data: data, + callbackId: callbackId + }; + var capability = createPromiseCapability(); + this.callbacksCapabilities[callbackId] = capability; + try { + this.postMessage(message, transfers); + } catch (e) { + capability.reject(e); + } + return capability.promise; + }, + postMessage: function (message, transfers) { + if (transfers && this.postMessageTransfers) { + this.comObj.postMessage(message, transfers); + } else { + this.comObj.postMessage(message); + } + }, + destroy: function () { + this.comObj.removeEventListener('message', this._onComObjOnMessage); + } + }; + function loadJpegStream(id, imageUrl, objs) { + var img = new Image(); + img.onload = function loadJpegStream_onloadClosure() { + objs.resolve(id, img); + }; + img.onerror = function loadJpegStream_onerrorClosure() { + objs.resolve(id, null); + warn('Error during JPEG image loading'); + }; + img.src = imageUrl; + } + /* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + (function checkURLConstructor(scope) { + var hasWorkingUrl = false; + try { + if (typeof URL === 'function' && typeof URL.prototype === 'object' && 'origin' in URL.prototype) { + var u = new URL('b', 'http://a'); + u.pathname = 'c%20d'; + hasWorkingUrl = u.href === 'http://a/c%20d'; + } + } catch (e) { + } + if (hasWorkingUrl) { + return; + } + var relative = Object.create(null); + relative['ftp'] = 21; + relative['file'] = 0; + relative['gopher'] = 70; + relative['http'] = 80; + relative['https'] = 443; + relative['ws'] = 80; + relative['wss'] = 443; + var relativePathDotMapping = Object.create(null); + relativePathDotMapping['%2e'] = '.'; + relativePathDotMapping['.%2e'] = '..'; + relativePathDotMapping['%2e.'] = '..'; + relativePathDotMapping['%2e%2e'] = '..'; + function isRelativeScheme(scheme) { + return relative[scheme] !== undefined; + } + function invalid() { + clear.call(this); + this._isInvalid = true; + } + function IDNAToASCII(h) { + if (h === '') { + invalid.call(this); + } + return h.toLowerCase(); + } + function percentEscape(c) { + var unicode = c.charCodeAt(0); + if (unicode > 0x20 && unicode < 0x7F && [ + 0x22, + 0x23, + 0x3C, + 0x3E, + 0x3F, + 0x60 + ].indexOf(unicode) === -1) { + return c; + } + return encodeURIComponent(c); + } + function percentEscapeQuery(c) { + var unicode = c.charCodeAt(0); + if (unicode > 0x20 && unicode < 0x7F && [ + 0x22, + 0x23, + 0x3C, + 0x3E, + 0x60 + ].indexOf(unicode) === -1) { + return c; + } + return encodeURIComponent(c); + } + var EOF, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; + function parse(input, stateOverride, base) { + function err(message) { + errors.push(message); + } + var state = stateOverride || 'scheme start', cursor = 0, buffer = '', seenAt = false, seenBracket = false, errors = []; + loop: + while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) { + var c = input[cursor]; + switch (state) { + case 'scheme start': + if (c && ALPHA.test(c)) { + buffer += c.toLowerCase(); + state = 'scheme'; + } else if (!stateOverride) { + buffer = ''; + state = 'no scheme'; + continue; + } else { + err('Invalid scheme.'); + break loop; + } + break; + case 'scheme': + if (c && ALPHANUMERIC.test(c)) { + buffer += c.toLowerCase(); + } else if (c === ':') { + this._scheme = buffer; + buffer = ''; + if (stateOverride) { + break loop; + } + if (isRelativeScheme(this._scheme)) { + this._isRelative = true; + } + if (this._scheme === 'file') { + state = 'relative'; + } else if (this._isRelative && base && base._scheme === this._scheme) { + state = 'relative or authority'; + } else if (this._isRelative) { + state = 'authority first slash'; + } else { + state = 'scheme data'; + } + } else if (!stateOverride) { + buffer = ''; + cursor = 0; + state = 'no scheme'; + continue; + } else if (EOF === c) { + break loop; + } else { + err('Code point not allowed in scheme: ' + c); + break loop; + } + break; + case 'scheme data': + if (c === '?') { + this._query = '?'; + state = 'query'; + } else if (c === '#') { + this._fragment = '#'; + state = 'fragment'; + } else { + if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { + this._schemeData += percentEscape(c); + } + } + break; + case 'no scheme': + if (!base || !isRelativeScheme(base._scheme)) { + err('Missing scheme.'); + invalid.call(this); + } else { + state = 'relative'; + continue; + } + break; + case 'relative or authority': + if (c === '/' && input[cursor + 1] === '/') { + state = 'authority ignore slashes'; + } else { + err('Expected /, got: ' + c); + state = 'relative'; + continue; + } + break; + case 'relative': + this._isRelative = true; + if ('file' !== this._scheme) { + this._scheme = base._scheme; + } + if (EOF === c) { + this._host = base._host; + this._port = base._port; + this._path = base._path.slice(); + this._query = base._query; + this._username = base._username; + this._password = base._password; + break loop; + } else if (c === '/' || c === '\\') { + if (c === '\\') { + err('\\ is an invalid code point.'); + } + state = 'relative slash'; + } else if (c === '?') { + this._host = base._host; + this._port = base._port; + this._path = base._path.slice(); + this._query = '?'; + this._username = base._username; + this._password = base._password; + state = 'query'; + } else if (c === '#') { + this._host = base._host; + this._port = base._port; + this._path = base._path.slice(); + this._query = base._query; + this._fragment = '#'; + this._username = base._username; + this._password = base._password; + state = 'fragment'; + } else { + var nextC = input[cursor + 1]; + var nextNextC = input[cursor + 2]; + if ('file' !== this._scheme || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || EOF !== nextNextC && '/' !== nextNextC && '\\' !== nextNextC && '?' !== nextNextC && '#' !== nextNextC) { + this._host = base._host; + this._port = base._port; + this._username = base._username; + this._password = base._password; + this._path = base._path.slice(); + this._path.pop(); + } + state = 'relative path'; + continue; + } + break; + case 'relative slash': + if (c === '/' || c === '\\') { + if (c === '\\') { + err('\\ is an invalid code point.'); + } + if (this._scheme === 'file') { + state = 'file host'; + } else { + state = 'authority ignore slashes'; + } + } else { + if ('file' !== this._scheme) { + this._host = base._host; + this._port = base._port; + this._username = base._username; + this._password = base._password; + } + state = 'relative path'; + continue; + } + break; + case 'authority first slash': + if (c === '/') { + state = 'authority second slash'; + } else { + err('Expected \'/\', got: ' + c); + state = 'authority ignore slashes'; + continue; + } + break; + case 'authority second slash': + state = 'authority ignore slashes'; + if ('/' !== c) { + err('Expected \'/\', got: ' + c); + continue; + } + break; + case 'authority ignore slashes': + if ('/' !== c && '\\' !== c) { + state = 'authority'; + continue; + } else { + err('Expected authority, got: ' + c); + } + break; + case 'authority': + if (c === '@') { + if (seenAt) { + err('@ already seen.'); + buffer += '%40'; + } + seenAt = true; + for (var i = 0; i < buffer.length; i++) { + var cp = buffer[i]; + if (cp === '\t' || cp === '\n' || cp === '\r') { + err('Invalid whitespace in authority.'); + continue; + } + if (cp === ':' && this._password === null) { + this._password = ''; + continue; + } + var tempC = percentEscape(cp); + if (null !== this._password) { + this._password += tempC; + } else { + this._username += tempC; + } + } + buffer = ''; + } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') { + cursor -= buffer.length; + buffer = ''; + state = 'host'; + continue; + } else { + buffer += c; + } + break; + case 'file host': + if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') { + if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) { + state = 'relative path'; + } else if (buffer.length === 0) { + state = 'relative path start'; + } else { + this._host = IDNAToASCII.call(this, buffer); + buffer = ''; + state = 'relative path start'; + } + continue; + } else if (c === '\t' || c === '\n' || c === '\r') { + err('Invalid whitespace in file host.'); + } else { + buffer += c; + } + break; + case 'host': + case 'hostname': + if (c === ':' && !seenBracket) { + this._host = IDNAToASCII.call(this, buffer); + buffer = ''; + state = 'port'; + if (stateOverride === 'hostname') { + break loop; + } + } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') { + this._host = IDNAToASCII.call(this, buffer); + buffer = ''; + state = 'relative path start'; + if (stateOverride) { + break loop; + } + continue; + } else if ('\t' !== c && '\n' !== c && '\r' !== c) { + if (c === '[') { + seenBracket = true; + } else if (c === ']') { + seenBracket = false; + } + buffer += c; + } else { + err('Invalid code point in host/hostname: ' + c); + } + break; + case 'port': + if (/[0-9]/.test(c)) { + buffer += c; + } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#' || stateOverride) { + if ('' !== buffer) { + var temp = parseInt(buffer, 10); + if (temp !== relative[this._scheme]) { + this._port = temp + ''; + } + buffer = ''; + } + if (stateOverride) { + break loop; + } + state = 'relative path start'; + continue; + } else if (c === '\t' || c === '\n' || c === '\r') { + err('Invalid code point in port: ' + c); + } else { + invalid.call(this); + } + break; + case 'relative path start': + if (c === '\\') { + err('\'\\\' not allowed in path.'); + } + state = 'relative path'; + if ('/' !== c && '\\' !== c) { + continue; + } + break; + case 'relative path': + if (c === EOF || c === '/' || c === '\\' || !stateOverride && (c === '?' || c === '#')) { + if (c === '\\') { + err('\\ not allowed in relative path.'); + } + var tmp; + if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { + buffer = tmp; + } + if (buffer === '..') { + this._path.pop(); + if ('/' !== c && '\\' !== c) { + this._path.push(''); + } + } else if (buffer === '.' && '/' !== c && '\\' !== c) { + this._path.push(''); + } else if ('.' !== buffer) { + if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') { + buffer = buffer[0] + ':'; + } + this._path.push(buffer); + } + buffer = ''; + if (c === '?') { + this._query = '?'; + state = 'query'; + } else if (c === '#') { + this._fragment = '#'; + state = 'fragment'; + } + } else if ('\t' !== c && '\n' !== c && '\r' !== c) { + buffer += percentEscape(c); + } + break; + case 'query': + if (!stateOverride && c === '#') { + this._fragment = '#'; + state = 'fragment'; + } else if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { + this._query += percentEscapeQuery(c); + } + break; + case 'fragment': + if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { + this._fragment += c; + } + break; + } + cursor++; + } + } + function clear() { + this._scheme = ''; + this._schemeData = ''; + this._username = ''; + this._password = null; + this._host = ''; + this._port = ''; + this._path = []; + this._query = ''; + this._fragment = ''; + this._isInvalid = false; + this._isRelative = false; + } + function JURL(url, base) + { + if (base !== undefined && !(base instanceof JURL)) { + base = new JURL(String(base)); + } + this._url = url; + clear.call(this); + var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); + parse.call(this, input, null, base); + } + JURL.prototype = { + toString: function () { + return this.href; + }, + get href() { + if (this._isInvalid) { + return this._url; + } + var authority = ''; + if ('' !== this._username || null !== this._password) { + authority = this._username + (null !== this._password ? ':' + this._password : '') + '@'; + } + return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment; + }, + set href(href) { + clear.call(this); + parse.call(this, href); + }, + get protocol() { + return this._scheme + ':'; + }, + set protocol(protocol) { + if (this._isInvalid) { + return; + } + parse.call(this, protocol + ':', 'scheme start'); + }, + get host() { + return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host; + }, + set host(host) { + if (this._isInvalid || !this._isRelative) { + return; + } + parse.call(this, host, 'host'); + }, + get hostname() { + return this._host; + }, + set hostname(hostname) { + if (this._isInvalid || !this._isRelative) { + return; + } + parse.call(this, hostname, 'hostname'); + }, + get port() { + return this._port; + }, + set port(port) { + if (this._isInvalid || !this._isRelative) { + return; + } + parse.call(this, port, 'port'); + }, + get pathname() { + return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData; + }, + set pathname(pathname) { + if (this._isInvalid || !this._isRelative) { + return; + } + this._path = []; + parse.call(this, pathname, 'relative path start'); + }, + get search() { + return this._isInvalid || !this._query || this._query === '?' ? '' : this._query; + }, + set search(search) { + if (this._isInvalid || !this._isRelative) { + return; + } + this._query = '?'; + if (search[0] === '?') { + search = search.slice(1); + } + parse.call(this, search, 'query'); + }, + get hash() { + return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment; + }, + set hash(hash) { + if (this._isInvalid) { + return; + } + this._fragment = '#'; + if (hash[0] === '#') { + hash = hash.slice(1); + } + parse.call(this, hash, 'fragment'); + }, + get origin() { + var host; + if (this._isInvalid || !this._scheme) { + return ''; + } + switch (this._scheme) { + case 'data': + case 'file': + case 'javascript': + case 'mailto': + return 'null'; + } + host = this.host; + if (!host) { + return ''; + } + return this._scheme + '://' + host; + } + }; + var OriginalURL = scope.URL; + if (OriginalURL) { + JURL.createObjectURL = function (blob) { + return OriginalURL.createObjectURL.apply(OriginalURL, arguments); + }; + JURL.revokeObjectURL = function (url) { + OriginalURL.revokeObjectURL(url); + }; + } + scope.URL = JURL; + }(globalScope)); + exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; + exports.IDENTITY_MATRIX = IDENTITY_MATRIX; + exports.OPS = OPS; + exports.VERBOSITY_LEVELS = VERBOSITY_LEVELS; + exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; + exports.AnnotationBorderStyleType = AnnotationBorderStyleType; + exports.AnnotationFieldFlag = AnnotationFieldFlag; + exports.AnnotationFlag = AnnotationFlag; + exports.AnnotationType = AnnotationType; + exports.FontType = FontType; + exports.ImageKind = ImageKind; + exports.InvalidPDFException = InvalidPDFException; + exports.MessageHandler = MessageHandler; + exports.MissingDataException = MissingDataException; + exports.MissingPDFException = MissingPDFException; + exports.NotImplementedException = NotImplementedException; + exports.PageViewport = PageViewport; + exports.PasswordException = PasswordException; + exports.PasswordResponses = PasswordResponses; + exports.StatTimer = StatTimer; + exports.StreamType = StreamType; + exports.TextRenderingMode = TextRenderingMode; + exports.UnexpectedResponseException = UnexpectedResponseException; + exports.UnknownErrorException = UnknownErrorException; + exports.Util = Util; + exports.XRefParseException = XRefParseException; + exports.arrayByteLength = arrayByteLength; + exports.arraysToBytes = arraysToBytes; + exports.assert = assert; + exports.bytesToString = bytesToString; + exports.createBlob = createBlob; + exports.createPromiseCapability = createPromiseCapability; + exports.createObjectURL = createObjectURL; + exports.deprecated = deprecated; + exports.error = error; + exports.getLookupTableFactory = getLookupTableFactory; + exports.getVerbosityLevel = getVerbosityLevel; + exports.globalScope = globalScope; + exports.info = info; + exports.isArray = isArray; + exports.isArrayBuffer = isArrayBuffer; + exports.isBool = isBool; + exports.isEmptyObj = isEmptyObj; + exports.isInt = isInt; + exports.isNum = isNum; + exports.isString = isString; + exports.isSpace = isSpace; + exports.isSameOrigin = isSameOrigin; + exports.createValidAbsoluteUrl = createValidAbsoluteUrl; + exports.isLittleEndian = isLittleEndian; + exports.isEvalSupported = isEvalSupported; + exports.loadJpegStream = loadJpegStream; + exports.log2 = log2; + exports.readInt8 = readInt8; + exports.readUint16 = readUint16; + exports.readUint32 = readUint32; + exports.removeNullCharacters = removeNullCharacters; + exports.setVerbosityLevel = setVerbosityLevel; + exports.shadow = shadow; + exports.string32 = string32; + exports.stringToBytes = stringToBytes; + exports.stringToPDFString = stringToPDFString; + exports.stringToUTF8String = stringToUTF8String; + exports.utf8StringToString = utf8StringToString; + exports.warn = warn; + })); + (function (root, factory) { + factory(root.pdfjsDisplayDOMUtils = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var removeNullCharacters = sharedUtil.removeNullCharacters; + var warn = sharedUtil.warn; + var deprecated = sharedUtil.deprecated; + var createValidAbsoluteUrl = sharedUtil.createValidAbsoluteUrl; + var DEFAULT_LINK_REL = 'noopener noreferrer nofollow'; + var CustomStyle = function CustomStyleClosure() { + var prefixes = [ + 'ms', + 'Moz', + 'Webkit', + 'O' + ]; + var _cache = Object.create(null); + function CustomStyle() { + } + CustomStyle.getProp = function get(propName, element) { + if (arguments.length === 1 && typeof _cache[propName] === 'string') { + return _cache[propName]; + } + element = element || document.documentElement; + var style = element.style, prefixed, uPropName; + if (typeof style[propName] === 'string') { + return _cache[propName] = propName; + } + uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); + for (var i = 0, l = prefixes.length; i < l; i++) { + prefixed = prefixes[i] + uPropName; + if (typeof style[prefixed] === 'string') { + return _cache[propName] = prefixed; + } + } + return _cache[propName] = 'undefined'; + }; + CustomStyle.setProp = function set(propName, element, str) { + var prop = this.getProp(propName); + if (prop !== 'undefined') { + element.style[prop] = str; + } + }; + return CustomStyle; + }(); + var hasCanvasTypedArrays; + hasCanvasTypedArrays = function hasCanvasTypedArrays() { + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + var ctx = canvas.getContext('2d'); + var imageData = ctx.createImageData(1, 1); + return typeof imageData.data.buffer !== 'undefined'; + }; + var LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 + }; + var LinkTargetStringMap = [ + '', + '_self', + '_blank', + '_parent', + '_top' + ]; + function addLinkAttributes(link, params) { + var url = params && params.url; + link.href = link.title = url ? removeNullCharacters(url) : ''; + if (url) { + var target = params.target; + if (typeof target === 'undefined') { + target = getDefaultSetting('externalLinkTarget'); + } + link.target = LinkTargetStringMap[target]; + var rel = params.rel; + if (typeof rel === 'undefined') { + rel = getDefaultSetting('externalLinkRel'); + } + link.rel = rel; + } + } + function getFilenameFromUrl(url) { + var anchor = url.indexOf('#'); + var query = url.indexOf('?'); + var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length); + return url.substring(url.lastIndexOf('/', end) + 1, end); + } + function getDefaultSetting(id) { + var globalSettings = sharedUtil.globalScope.PDFJS; + switch (id) { + case 'pdfBug': + return globalSettings ? globalSettings.pdfBug : false; + case 'disableAutoFetch': + return globalSettings ? globalSettings.disableAutoFetch : false; + case 'disableStream': + return globalSettings ? globalSettings.disableStream : false; + case 'disableRange': + return globalSettings ? globalSettings.disableRange : false; + case 'disableFontFace': + return globalSettings ? globalSettings.disableFontFace : false; + case 'disableCreateObjectURL': + return globalSettings ? globalSettings.disableCreateObjectURL : false; + case 'disableWebGL': + return globalSettings ? globalSettings.disableWebGL : true; + case 'cMapUrl': + return globalSettings ? globalSettings.cMapUrl : null; + case 'cMapPacked': + return globalSettings ? globalSettings.cMapPacked : false; + case 'postMessageTransfers': + return globalSettings ? globalSettings.postMessageTransfers : true; + case 'workerSrc': + return globalSettings ? globalSettings.workerSrc : null; + case 'disableWorker': + return globalSettings ? globalSettings.disableWorker : false; + case 'maxImageSize': + return globalSettings ? globalSettings.maxImageSize : -1; + case 'imageResourcesPath': + return globalSettings ? globalSettings.imageResourcesPath : ''; + case 'isEvalSupported': + return globalSettings ? globalSettings.isEvalSupported : true; + case 'externalLinkTarget': + if (!globalSettings) { + return LinkTarget.NONE; + } + switch (globalSettings.externalLinkTarget) { + case LinkTarget.NONE: + case LinkTarget.SELF: + case LinkTarget.BLANK: + case LinkTarget.PARENT: + case LinkTarget.TOP: + return globalSettings.externalLinkTarget; + } + warn('PDFJS.externalLinkTarget is invalid: ' + globalSettings.externalLinkTarget); + globalSettings.externalLinkTarget = LinkTarget.NONE; + return LinkTarget.NONE; + case 'externalLinkRel': + return globalSettings ? globalSettings.externalLinkRel : DEFAULT_LINK_REL; + case 'enableStats': + return !!(globalSettings && globalSettings.enableStats); + default: + throw new Error('Unknown default setting: ' + id); + } + } + function isExternalLinkTargetSet() { + var externalLinkTarget = getDefaultSetting('externalLinkTarget'); + switch (externalLinkTarget) { + case LinkTarget.NONE: + return false; + case LinkTarget.SELF: + case LinkTarget.BLANK: + case LinkTarget.PARENT: + case LinkTarget.TOP: + return true; + } + } + function isValidUrl(url, allowRelative) { + deprecated('isValidUrl(), please use createValidAbsoluteUrl() instead.'); + var baseUrl = allowRelative ? 'http://example.com' : null; + return createValidAbsoluteUrl(url, baseUrl) !== null; + } + exports.CustomStyle = CustomStyle; + exports.addLinkAttributes = addLinkAttributes; + exports.isExternalLinkTargetSet = isExternalLinkTargetSet; + exports.isValidUrl = isValidUrl; + exports.getFilenameFromUrl = getFilenameFromUrl; + exports.LinkTarget = LinkTarget; + exports.hasCanvasTypedArrays = hasCanvasTypedArrays; + exports.getDefaultSetting = getDefaultSetting; + exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL; + })); + (function (root, factory) { + factory(root.pdfjsDisplayFontLoader = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var assert = sharedUtil.assert; + var bytesToString = sharedUtil.bytesToString; + var string32 = sharedUtil.string32; + var shadow = sharedUtil.shadow; + var warn = sharedUtil.warn; + function FontLoader(docId) { + this.docId = docId; + this.styleElement = null; + this.nativeFontFaces = []; + this.loadTestFontId = 0; + this.loadingContext = { + requests: [], + nextRequestId: 0 + }; + } + FontLoader.prototype = { + insertRule: function fontLoaderInsertRule(rule) { + var styleElement = this.styleElement; + if (!styleElement) { + styleElement = this.styleElement = document.createElement('style'); + styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; + document.documentElement.getElementsByTagName('head')[0].appendChild(styleElement); + } + var styleSheet = styleElement.sheet; + styleSheet.insertRule(rule, styleSheet.cssRules.length); + }, + clear: function fontLoaderClear() { + var styleElement = this.styleElement; + if (styleElement) { + styleElement.parentNode.removeChild(styleElement); + styleElement = this.styleElement = null; + } + this.nativeFontFaces.forEach(function (nativeFontFace) { + document.fonts.delete(nativeFontFace); + }); + this.nativeFontFaces.length = 0; + } + }; + var getLoadTestFont = function () { + return atob('T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + 'ABAAAAAAAAAAAD6AAAAAAAAA=='); + }; + Object.defineProperty(FontLoader.prototype, 'loadTestFont', { + get: function () { + return shadow(this, 'loadTestFont', getLoadTestFont()); + }, + configurable: true + }); + FontLoader.prototype.addNativeFontFace = function fontLoader_addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.push(nativeFontFace); + document.fonts.add(nativeFontFace); + }; + FontLoader.prototype.bind = function fontLoaderBind(fonts, callback) { + var rules = []; + var fontsToLoad = []; + var fontLoadPromises = []; + var getNativeFontPromise = function (nativeFontFace) { + return nativeFontFace.loaded.catch(function (e) { + warn('Failed to load font "' + nativeFontFace.family + '": ' + e); + }); + }; + var isFontLoadingAPISupported = FontLoader.isFontLoadingAPISupported && !FontLoader.isSyncFontLoadingSupported; + for (var i = 0, ii = fonts.length; i < ii; i++) { + var font = fonts[i]; + if (font.attached || font.loading === false) { + continue; + } + font.attached = true; + if (isFontLoadingAPISupported) { + var nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + fontLoadPromises.push(getNativeFontPromise(nativeFontFace)); + } + } else { + var rule = font.createFontFaceRule(); + if (rule) { + this.insertRule(rule); + rules.push(rule); + fontsToLoad.push(font); + } + } + } + var request = this.queueLoadingCallback(callback); + if (isFontLoadingAPISupported) { + Promise.all(fontLoadPromises).then(function () { + request.complete(); + }); + } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) { + this.prepareFontLoadEvent(rules, fontsToLoad, request); + } else { + request.complete(); + } + }; + FontLoader.prototype.queueLoadingCallback = function FontLoader_queueLoadingCallback(callback) { + function LoadLoader_completeRequest() { + assert(!request.end, 'completeRequest() cannot be called twice'); + request.end = Date.now(); + while (context.requests.length > 0 && context.requests[0].end) { + var otherRequest = context.requests.shift(); + setTimeout(otherRequest.callback, 0); + } + } + var context = this.loadingContext; + var requestId = 'pdfjs-font-loading-' + context.nextRequestId++; + var request = { + id: requestId, + complete: LoadLoader_completeRequest, + callback: callback, + started: Date.now() + }; + context.requests.push(request); + return request; + }; + FontLoader.prototype.prepareFontLoadEvent = function fontLoaderPrepareFontLoadEvent(rules, fonts, request) { + function int32(data, offset) { + return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; + } + function spliceString(s, offset, remove, insert) { + var chunk1 = s.substr(0, offset); + var chunk2 = s.substr(offset + remove); + return chunk1 + insert + chunk2; + } + var i, ii; + var canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + var ctx = canvas.getContext('2d'); + var called = 0; + function isFontReady(name, callback) { + called++; + if (called > 30) { + warn('Load test font never loaded.'); + callback(); + return; + } + ctx.font = '30px ' + name; + ctx.fillText('.', 0, 20); + var imageData = ctx.getImageData(0, 0, 1, 1); + if (imageData.data[3] > 0) { + callback(); + return; + } + setTimeout(isFontReady.bind(null, name, callback)); + } + var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++; + var data = this.loadTestFont; + var COMMENT_OFFSET = 976; + data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); + var CFF_CHECKSUM_OFFSET = 16; + var XXXX_VALUE = 0x58585858; + var checksum = int32(data, CFF_CHECKSUM_OFFSET); + for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; + } + if (i < loadTestFontId.length) { + checksum = checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i) | 0; + } + data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); + var url = 'url(data:font/opentype;base64,' + btoa(data) + ');'; + var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' + url + '}'; + this.insertRule(rule); + var names = []; + for (i = 0, ii = fonts.length; i < ii; i++) { + names.push(fonts[i].loadedName); + } + names.push(loadTestFontId); + var div = document.createElement('div'); + div.setAttribute('style', 'visibility: hidden;' + 'width: 10px; height: 10px;' + 'position: absolute; top: 0px; left: 0px;'); + for (i = 0, ii = names.length; i < ii; ++i) { + var span = document.createElement('span'); + span.textContent = 'Hi'; + span.style.fontFamily = names[i]; + div.appendChild(span); + } + document.body.appendChild(div); + isFontReady(loadTestFontId, function () { + document.body.removeChild(div); + request.complete(); + }); + }; + FontLoader.isFontLoadingAPISupported = typeof document !== 'undefined' && !!document.fonts; + var isSyncFontLoadingSupported = function isSyncFontLoadingSupported() { + if (typeof navigator === 'undefined') { + return true; + } + var supported = false; + var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); + if (m && m[1] >= 14) { + supported = true; + } + return supported; + }; + Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { + get: function () { + return shadow(FontLoader, 'isSyncFontLoadingSupported', isSyncFontLoadingSupported()); + }, + enumerable: true, + configurable: true + }); + var IsEvalSupportedCached = { + get value() { + return shadow(this, 'value', sharedUtil.isEvalSupported()); + } + }; + var FontFaceObject = function FontFaceObjectClosure() { + function FontFaceObject(translatedData, options) { + this.compiledGlyphs = Object.create(null); + for (var i in translatedData) { + this[i] = translatedData[i]; + } + this.options = options; + } + FontFaceObject.prototype = { + createNativeFontFace: function FontFaceObject_createNativeFontFace() { + if (!this.data) { + return null; + } + if (this.options.disableFontFace) { + this.disableFontFace = true; + return null; + } + var nativeFontFace = new FontFace(this.loadedName, this.data, {}); + if (this.options.fontRegistry) { + this.options.fontRegistry.registerFont(this); + } + return nativeFontFace; + }, + createFontFaceRule: function FontFaceObject_createFontFaceRule() { + if (!this.data) { + return null; + } + if (this.options.disableFontFace) { + this.disableFontFace = true; + return null; + } + var data = bytesToString(new Uint8Array(this.data)); + var fontName = this.loadedName; + var url = 'url(data:' + this.mimetype + ';base64,' + btoa(data) + ');'; + var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; + if (this.options.fontRegistry) { + this.options.fontRegistry.registerFont(this, url); + } + return rule; + }, + getPathGenerator: function FontFaceObject_getPathGenerator(objs, character) { + if (!(character in this.compiledGlyphs)) { + var cmds = objs.get(this.loadedName + '_path_' + character); + var current, i, len; + if (this.options.isEvalSupported && IsEvalSupportedCached.value) { + var args, js = ''; + for (i = 0, len = cmds.length; i < len; i++) { + current = cmds[i]; + if (current.args !== undefined) { + args = current.args.join(','); + } else { + args = ''; + } + js += 'c.' + current.cmd + '(' + args + ');\n'; + } + this.compiledGlyphs[character] = new Function('c', 'size', js); + } else { + this.compiledGlyphs[character] = function (c, size) { + for (i = 0, len = cmds.length; i < len; i++) { + current = cmds[i]; + if (current.cmd === 'scale') { + current.args = [ + size, + -size + ]; + } + c[current.cmd].apply(c, current.args); + } + }; + } + } + return this.compiledGlyphs[character]; + } + }; + return FontFaceObject; + }(); + exports.FontFaceObject = FontFaceObject; + exports.FontLoader = FontLoader; + })); + (function (root, factory) { + factory(root.pdfjsDisplayMetadata = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var error = sharedUtil.error; + function fixMetadata(meta) { + return meta.replace(/>\\376\\377([^<]+)/g, function (all, codes) { + var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) { + return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); + }); + var chars = ''; + for (var i = 0; i < bytes.length; i += 2) { + var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); + chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38 ? String.fromCharCode(code) : '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; + } + return '>' + chars; + }); + } + function Metadata(meta) { + if (typeof meta === 'string') { + meta = fixMetadata(meta); + var parser = new DOMParser(); + meta = parser.parseFromString(meta, 'application/xml'); + } else if (!(meta instanceof Document)) { + error('Metadata: Invalid metadata object'); + } + this.metaDocument = meta; + this.metadata = Object.create(null); + this.parse(); + } + Metadata.prototype = { + parse: function Metadata_parse() { + var doc = this.metaDocument; + var rdf = doc.documentElement; + if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { + rdf = rdf.firstChild; + while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') { + rdf = rdf.nextSibling; + } + } + var nodeName = rdf ? rdf.nodeName.toLowerCase() : null; + if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) { + return; + } + var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength; + for (i = 0, length = children.length; i < length; i++) { + desc = children[i]; + if (desc.nodeName.toLowerCase() !== 'rdf:description') { + continue; + } + for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { + if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') { + entry = desc.childNodes[ii]; + name = entry.nodeName.toLowerCase(); + this.metadata[name] = entry.textContent.trim(); + } + } + } + }, + get: function Metadata_get(name) { + return this.metadata[name] || null; + }, + has: function Metadata_has(name) { + return typeof this.metadata[name] !== 'undefined'; + } + }; + exports.Metadata = Metadata; + })); + (function (root, factory) { + factory(root.pdfjsDisplaySVG = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; + var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; + var ImageKind = sharedUtil.ImageKind; + var OPS = sharedUtil.OPS; + var Util = sharedUtil.Util; + var isNum = sharedUtil.isNum; + var isArray = sharedUtil.isArray; + var warn = sharedUtil.warn; + var createObjectURL = sharedUtil.createObjectURL; + var SVG_DEFAULTS = { + fontStyle: 'normal', + fontWeight: 'normal', + fillColor: '#000000' + }; + var convertImgDataToPng = function convertImgDataToPngClosure() { + var PNG_HEADER = new Uint8Array([ + 0x89, + 0x50, + 0x4e, + 0x47, + 0x0d, + 0x0a, + 0x1a, + 0x0a + ]); + var CHUNK_WRAPPER_SIZE = 12; + var crcTable = new Int32Array(256); + for (var i = 0; i < 256; i++) { + var c = i; + for (var h = 0; h < 8; h++) { + if (c & 1) { + c = 0xedB88320 ^ c >> 1 & 0x7fffffff; + } else { + c = c >> 1 & 0x7fffffff; + } + } + crcTable[i] = c; + } + function crc32(data, start, end) { + var crc = -1; + for (var i = start; i < end; i++) { + var a = (crc ^ data[i]) & 0xff; + var b = crcTable[a]; + crc = crc >>> 8 ^ b; + } + return crc ^ -1; + } + function writePngChunk(type, body, data, offset) { + var p = offset; + var len = body.length; + data[p] = len >> 24 & 0xff; + data[p + 1] = len >> 16 & 0xff; + data[p + 2] = len >> 8 & 0xff; + data[p + 3] = len & 0xff; + p += 4; + data[p] = type.charCodeAt(0) & 0xff; + data[p + 1] = type.charCodeAt(1) & 0xff; + data[p + 2] = type.charCodeAt(2) & 0xff; + data[p + 3] = type.charCodeAt(3) & 0xff; + p += 4; + data.set(body, p); + p += body.length; + var crc = crc32(data, offset + 4, p); + data[p] = crc >> 24 & 0xff; + data[p + 1] = crc >> 16 & 0xff; + data[p + 2] = crc >> 8 & 0xff; + data[p + 3] = crc & 0xff; + } + function adler32(data, start, end) { + var a = 1; + var b = 0; + for (var i = start; i < end; ++i) { + a = (a + (data[i] & 0xff)) % 65521; + b = (b + a) % 65521; + } + return b << 16 | a; + } + function encode(imgData, kind, forceDataSchema) { + var width = imgData.width; + var height = imgData.height; + var bitDepth, colorType, lineSize; + var bytes = imgData.data; + switch (kind) { + case ImageKind.GRAYSCALE_1BPP: + colorType = 0; + bitDepth = 1; + lineSize = width + 7 >> 3; + break; + case ImageKind.RGB_24BPP: + colorType = 2; + bitDepth = 8; + lineSize = width * 3; + break; + case ImageKind.RGBA_32BPP: + colorType = 6; + bitDepth = 8; + lineSize = width * 4; + break; + default: + throw new Error('invalid format'); + } + var literals = new Uint8Array((1 + lineSize) * height); + var offsetLiterals = 0, offsetBytes = 0; + var y, i; + for (y = 0; y < height; ++y) { + literals[offsetLiterals++] = 0; + literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals); + offsetBytes += lineSize; + offsetLiterals += lineSize; + } + if (kind === ImageKind.GRAYSCALE_1BPP) { + offsetLiterals = 0; + for (y = 0; y < height; y++) { + offsetLiterals++; + for (i = 0; i < lineSize; i++) { + literals[offsetLiterals++] ^= 0xFF; + } + } + } + var ihdr = new Uint8Array([ + width >> 24 & 0xff, + width >> 16 & 0xff, + width >> 8 & 0xff, + width & 0xff, + height >> 24 & 0xff, + height >> 16 & 0xff, + height >> 8 & 0xff, + height & 0xff, + bitDepth, + colorType, + 0x00, + 0x00, + 0x00 + ]); + var len = literals.length; + var maxBlockLength = 0xFFFF; + var deflateBlocks = Math.ceil(len / maxBlockLength); + var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); + var pi = 0; + idat[pi++] = 0x78; + idat[pi++] = 0x9c; + var pos = 0; + while (len > maxBlockLength) { + idat[pi++] = 0x00; + idat[pi++] = 0xff; + idat[pi++] = 0xff; + idat[pi++] = 0x00; + idat[pi++] = 0x00; + idat.set(literals.subarray(pos, pos + maxBlockLength), pi); + pi += maxBlockLength; + pos += maxBlockLength; + len -= maxBlockLength; + } + idat[pi++] = 0x01; + idat[pi++] = len & 0xff; + idat[pi++] = len >> 8 & 0xff; + idat[pi++] = ~len & 0xffff & 0xff; + idat[pi++] = (~len & 0xffff) >> 8 & 0xff; + idat.set(literals.subarray(pos), pi); + pi += literals.length - pos; + var adler = adler32(literals, 0, literals.length); + idat[pi++] = adler >> 24 & 0xff; + idat[pi++] = adler >> 16 & 0xff; + idat[pi++] = adler >> 8 & 0xff; + idat[pi++] = adler & 0xff; + var pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length; + var data = new Uint8Array(pngLength); + var offset = 0; + data.set(PNG_HEADER, offset); + offset += PNG_HEADER.length; + writePngChunk('IHDR', ihdr, data, offset); + offset += CHUNK_WRAPPER_SIZE + ihdr.length; + writePngChunk('IDATA', idat, data, offset); + offset += CHUNK_WRAPPER_SIZE + idat.length; + writePngChunk('IEND', new Uint8Array(0), data, offset); + return createObjectURL(data, 'image/png', forceDataSchema); + } + return function convertImgDataToPng(imgData, forceDataSchema) { + var kind = imgData.kind === undefined ? ImageKind.GRAYSCALE_1BPP : imgData.kind; + return encode(imgData, kind, forceDataSchema); + }; + }(); + var SVGExtraState = function SVGExtraStateClosure() { + function SVGExtraState() { + this.fontSizeScale = 1; + this.fontWeight = SVG_DEFAULTS.fontWeight; + this.fontSize = 0; + this.textMatrix = IDENTITY_MATRIX; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.leading = 0; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRise = 0; + this.fillColor = SVG_DEFAULTS.fillColor; + this.strokeColor = '#000000'; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.lineJoin = ''; + this.lineCap = ''; + this.miterLimit = 0; + this.dashArray = []; + this.dashPhase = 0; + this.dependencies = []; + this.activeClipUrl = null; + this.clipGroup = null; + this.maskId = ''; + } + SVGExtraState.prototype = { + clone: function SVGExtraState_clone() { + return Object.create(this); + }, + setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { + this.x = x; + this.y = y; + } + }; + return SVGExtraState; + }(); + var SVGGraphics = function SVGGraphicsClosure() { + function opListToTree(opList) { + var opTree = []; + var tmp = []; + var opListLen = opList.length; + for (var x = 0; x < opListLen; x++) { + if (opList[x].fn === 'save') { + opTree.push({ + 'fnId': 92, + 'fn': 'group', + 'items': [] + }); + tmp.push(opTree); + opTree = opTree[opTree.length - 1].items; + continue; + } + if (opList[x].fn === 'restore') { + opTree = tmp.pop(); + } else { + opTree.push(opList[x]); + } + } + return opTree; + } + function pf(value) { + if (value === (value | 0)) { + return value.toString(); + } + var s = value.toFixed(10); + var i = s.length - 1; + if (s[i] !== '0') { + return s; + } + do { + i--; + } while (s[i] === '0'); + return s.substr(0, s[i] === '.' ? i : i + 1); + } + function pm(m) { + if (m[4] === 0 && m[5] === 0) { + if (m[1] === 0 && m[2] === 0) { + if (m[0] === 1 && m[3] === 1) { + return ''; + } + return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; + } + if (m[0] === m[3] && m[1] === -m[2]) { + var a = Math.acos(m[0]) * 180 / Math.PI; + return 'rotate(' + pf(a) + ')'; + } + } else { + if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { + return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; + } + } + return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; + } + function SVGGraphics(commonObjs, objs, forceDataSchema) { + this.current = new SVGExtraState(); + this.transformMatrix = IDENTITY_MATRIX; + this.transformStack = []; + this.extraStack = []; + this.commonObjs = commonObjs; + this.objs = objs; + this.pendingEOFill = false; + this.embedFonts = false; + this.embeddedFonts = Object.create(null); + this.cssStyle = null; + this.forceDataSchema = !!forceDataSchema; + } + var NS = 'http://www.w3.org/2000/svg'; + var XML_NS = 'http://www.w3.org/XML/1998/namespace'; + var XLINK_NS = 'http://www.w3.org/1999/xlink'; + var LINE_CAP_STYLES = [ + 'butt', + 'round', + 'square' + ]; + var LINE_JOIN_STYLES = [ + 'miter', + 'round', + 'bevel' + ]; + var clipCount = 0; + var maskCount = 0; + SVGGraphics.prototype = { + save: function SVGGraphics_save() { + this.transformStack.push(this.transformMatrix); + var old = this.current; + this.extraStack.push(old); + this.current = old.clone(); + }, + restore: function SVGGraphics_restore() { + this.transformMatrix = this.transformStack.pop(); + this.current = this.extraStack.pop(); + this.tgrp = null; + }, + group: function SVGGraphics_group(items) { + this.save(); + this.executeOpTree(items); + this.restore(); + }, + loadDependencies: function SVGGraphics_loadDependencies(operatorList) { + var fnArray = operatorList.fnArray; + var fnArrayLen = fnArray.length; + var argsArray = operatorList.argsArray; + var self = this; + for (var i = 0; i < fnArrayLen; i++) { + if (OPS.dependency === fnArray[i]) { + var deps = argsArray[i]; + for (var n = 0, nn = deps.length; n < nn; n++) { + var obj = deps[n]; + var common = obj.substring(0, 2) === 'g_'; + var promise; + if (common) { + promise = new Promise(function (resolve) { + self.commonObjs.get(obj, resolve); + }); + } else { + promise = new Promise(function (resolve) { + self.objs.get(obj, resolve); + }); + } + this.current.dependencies.push(promise); + } + } + } + return Promise.all(this.current.dependencies); + }, + transform: function SVGGraphics_transform(a, b, c, d, e, f) { + var transformMatrix = [ + a, + b, + c, + d, + e, + f + ]; + this.transformMatrix = Util.transform(this.transformMatrix, transformMatrix); + this.tgrp = null; + }, + getSVG: function SVGGraphics_getSVG(operatorList, viewport) { + this.viewport = viewport; + var svgElement = this._initialize(viewport); + return this.loadDependencies(operatorList).then(function () { + this.transformMatrix = IDENTITY_MATRIX; + var opTree = this.convertOpList(operatorList); + this.executeOpTree(opTree); + return svgElement; + }.bind(this)); + }, + convertOpList: function SVGGraphics_convertOpList(operatorList) { + var argsArray = operatorList.argsArray; + var fnArray = operatorList.fnArray; + var fnArrayLen = fnArray.length; + var REVOPS = []; + var opList = []; + for (var op in OPS) { + REVOPS[OPS[op]] = op; + } + for (var x = 0; x < fnArrayLen; x++) { + var fnId = fnArray[x]; + opList.push({ + 'fnId': fnId, + 'fn': REVOPS[fnId], + 'args': argsArray[x] + }); + } + return opListToTree(opList); + }, + executeOpTree: function SVGGraphics_executeOpTree(opTree) { + var opTreeLen = opTree.length; + for (var x = 0; x < opTreeLen; x++) { + var fn = opTree[x].fn; + var fnId = opTree[x].fnId; + var args = opTree[x].args; + switch (fnId | 0) { + case OPS.beginText: + this.beginText(); + break; + case OPS.setLeading: + this.setLeading(args); + break; + case OPS.setLeadingMoveText: + this.setLeadingMoveText(args[0], args[1]); + break; + case OPS.setFont: + this.setFont(args); + break; + case OPS.showText: + this.showText(args[0]); + break; + case OPS.showSpacedText: + this.showText(args[0]); + break; + case OPS.endText: + this.endText(); + break; + case OPS.moveText: + this.moveText(args[0], args[1]); + break; + case OPS.setCharSpacing: + this.setCharSpacing(args[0]); + break; + case OPS.setWordSpacing: + this.setWordSpacing(args[0]); + break; + case OPS.setHScale: + this.setHScale(args[0]); + break; + case OPS.setTextMatrix: + this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + case OPS.setLineWidth: + this.setLineWidth(args[0]); + break; + case OPS.setLineJoin: + this.setLineJoin(args[0]); + break; + case OPS.setLineCap: + this.setLineCap(args[0]); + break; + case OPS.setMiterLimit: + this.setMiterLimit(args[0]); + break; + case OPS.setFillRGBColor: + this.setFillRGBColor(args[0], args[1], args[2]); + break; + case OPS.setStrokeRGBColor: + this.setStrokeRGBColor(args[0], args[1], args[2]); + break; + case OPS.setDash: + this.setDash(args[0], args[1]); + break; + case OPS.setGState: + this.setGState(args[0]); + break; + case OPS.fill: + this.fill(); + break; + case OPS.eoFill: + this.eoFill(); + break; + case OPS.stroke: + this.stroke(); + break; + case OPS.fillStroke: + this.fillStroke(); + break; + case OPS.eoFillStroke: + this.eoFillStroke(); + break; + case OPS.clip: + this.clip('nonzero'); + break; + case OPS.eoClip: + this.clip('evenodd'); + break; + case OPS.paintSolidColorImageMask: + this.paintSolidColorImageMask(); + break; + case OPS.paintJpegXObject: + this.paintJpegXObject(args[0], args[1], args[2]); + break; + case OPS.paintImageXObject: + this.paintImageXObject(args[0]); + break; + case OPS.paintInlineImageXObject: + this.paintInlineImageXObject(args[0]); + break; + case OPS.paintImageMaskXObject: + this.paintImageMaskXObject(args[0]); + break; + case OPS.paintFormXObjectBegin: + this.paintFormXObjectBegin(args[0], args[1]); + break; + case OPS.paintFormXObjectEnd: + this.paintFormXObjectEnd(); + break; + case OPS.closePath: + this.closePath(); + break; + case OPS.closeStroke: + this.closeStroke(); + break; + case OPS.closeFillStroke: + this.closeFillStroke(); + break; + case OPS.nextLine: + this.nextLine(); + break; + case OPS.transform: + this.transform(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + case OPS.constructPath: + this.constructPath(args[0], args[1]); + break; + case OPS.endPath: + this.endPath(); + break; + case 92: + this.group(opTree[x].items); + break; + default: + warn('Unimplemented operator ' + fn); + break; + } + } + }, + setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { + this.current.wordSpacing = wordSpacing; + }, + setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { + this.current.charSpacing = charSpacing; + }, + nextLine: function SVGGraphics_nextLine() { + this.moveText(0, this.current.leading); + }, + setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { + var current = this.current; + this.current.textMatrix = this.current.lineMatrix = [ + a, + b, + c, + d, + e, + f + ]; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + current.xcoords = []; + current.tspan = document.createElementNS(NS, 'svg:tspan'); + current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); + current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); + current.tspan.setAttributeNS(null, 'y', pf(-current.y)); + current.txtElement = document.createElementNS(NS, 'svg:text'); + current.txtElement.appendChild(current.tspan); + }, + beginText: function SVGGraphics_beginText() { + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + this.current.textMatrix = IDENTITY_MATRIX; + this.current.lineMatrix = IDENTITY_MATRIX; + this.current.tspan = document.createElementNS(NS, 'svg:tspan'); + this.current.txtElement = document.createElementNS(NS, 'svg:text'); + this.current.txtgrp = document.createElementNS(NS, 'svg:g'); + this.current.xcoords = []; + }, + moveText: function SVGGraphics_moveText(x, y) { + var current = this.current; + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + current.xcoords = []; + current.tspan = document.createElementNS(NS, 'svg:tspan'); + current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); + current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); + current.tspan.setAttributeNS(null, 'y', pf(-current.y)); + }, + showText: function SVGGraphics_showText(glyphs) { + var current = this.current; + var font = current.font; + var fontSize = current.fontSize; + if (fontSize === 0) { + return; + } + var charSpacing = current.charSpacing; + var wordSpacing = current.wordSpacing; + var fontDirection = current.fontDirection; + var textHScale = current.textHScale * fontDirection; + var glyphsLength = glyphs.length; + var vertical = font.vertical; + var widthAdvanceScale = fontSize * current.fontMatrix[0]; + var x = 0, i; + for (i = 0; i < glyphsLength; ++i) { + var glyph = glyphs[i]; + if (glyph === null) { + x += fontDirection * wordSpacing; + continue; + } else if (isNum(glyph)) { + x += -glyph * fontSize * 0.001; + continue; + } + current.xcoords.push(current.x + x * textHScale); + var width = glyph.width; + var character = glyph.fontChar; + var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; + x += charWidth; + current.tspan.textContent += character; + } + if (vertical) { + current.y -= x * textHScale; + } else { + current.x += x * textHScale; + } + current.tspan.setAttributeNS(null, 'x', current.xcoords.map(pf).join(' ')); + current.tspan.setAttributeNS(null, 'y', pf(-current.y)); + current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); + current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px'); + if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { + current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); + } + if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { + current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight); + } + if (current.fillColor !== SVG_DEFAULTS.fillColor) { + current.tspan.setAttributeNS(null, 'fill', current.fillColor); + } + current.txtElement.setAttributeNS(null, 'transform', pm(current.textMatrix) + ' scale(1, -1)'); + current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); + current.txtElement.appendChild(current.tspan); + current.txtgrp.appendChild(current.txtElement); + this._ensureTransformGroup().appendChild(current.txtElement); + }, + setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { + this.setLeading(-y); + this.moveText(x, y); + }, + addFontStyle: function SVGGraphics_addFontStyle(fontObj) { + if (!this.cssStyle) { + this.cssStyle = document.createElementNS(NS, 'svg:style'); + this.cssStyle.setAttributeNS(null, 'type', 'text/css'); + this.defs.appendChild(this.cssStyle); + } + var url = createObjectURL(fontObj.data, fontObj.mimetype, this.forceDataSchema); + this.cssStyle.textContent += '@font-face { font-family: "' + fontObj.loadedName + '";' + ' src: url(' + url + '); }\n'; + }, + setFont: function SVGGraphics_setFont(details) { + var current = this.current; + var fontObj = this.commonObjs.get(details[0]); + var size = details[1]; + this.current.font = fontObj; + if (this.embedFonts && fontObj.data && !this.embeddedFonts[fontObj.loadedName]) { + this.addFontStyle(fontObj); + this.embeddedFonts[fontObj.loadedName] = fontObj; + } + current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : FONT_IDENTITY_MATRIX; + var bold = fontObj.black ? fontObj.bold ? 'bolder' : 'bold' : fontObj.bold ? 'bold' : 'normal'; + var italic = fontObj.italic ? 'italic' : 'normal'; + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + current.fontSize = size; + current.fontFamily = fontObj.loadedName; + current.fontWeight = bold; + current.fontStyle = italic; + current.tspan = document.createElementNS(NS, 'svg:tspan'); + current.tspan.setAttributeNS(null, 'y', pf(-current.y)); + current.xcoords = []; + }, + endText: function SVGGraphics_endText() { + }, + setLineWidth: function SVGGraphics_setLineWidth(width) { + this.current.lineWidth = width; + }, + setLineCap: function SVGGraphics_setLineCap(style) { + this.current.lineCap = LINE_CAP_STYLES[style]; + }, + setLineJoin: function SVGGraphics_setLineJoin(style) { + this.current.lineJoin = LINE_JOIN_STYLES[style]; + }, + setMiterLimit: function SVGGraphics_setMiterLimit(limit) { + this.current.miterLimit = limit; + }, + setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { + var color = Util.makeCssRgb(r, g, b); + this.current.strokeColor = color; + }, + setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { + var color = Util.makeCssRgb(r, g, b); + this.current.fillColor = color; + this.current.tspan = document.createElementNS(NS, 'svg:tspan'); + this.current.xcoords = []; + }, + setDash: function SVGGraphics_setDash(dashArray, dashPhase) { + this.current.dashArray = dashArray; + this.current.dashPhase = dashPhase; + }, + constructPath: function SVGGraphics_constructPath(ops, args) { + var current = this.current; + var x = current.x, y = current.y; + current.path = document.createElementNS(NS, 'svg:path'); + var d = []; + var opLength = ops.length; + for (var i = 0, j = 0; i < opLength; i++) { + switch (ops[i] | 0) { + case OPS.rectangle: + x = args[j++]; + y = args[j++]; + var width = args[j++]; + var height = args[j++]; + var xw = x + width; + var yh = y + height; + d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z'); + break; + case OPS.moveTo: + x = args[j++]; + y = args[j++]; + d.push('M', pf(x), pf(y)); + break; + case OPS.lineTo: + x = args[j++]; + y = args[j++]; + d.push('L', pf(x), pf(y)); + break; + case OPS.curveTo: + x = args[j + 4]; + y = args[j + 5]; + d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y)); + j += 6; + break; + case OPS.curveTo2: + x = args[j + 2]; + y = args[j + 3]; + d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3])); + j += 4; + break; + case OPS.curveTo3: + x = args[j + 2]; + y = args[j + 3]; + d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y)); + j += 4; + break; + case OPS.closePath: + d.push('Z'); + break; + } + } + current.path.setAttributeNS(null, 'd', d.join(' ')); + current.path.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit)); + current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap); + current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); + current.path.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px'); + current.path.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' ')); + current.path.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px'); + current.path.setAttributeNS(null, 'fill', 'none'); + this._ensureTransformGroup().appendChild(current.path); + current.element = current.path; + current.setCurrentPoint(x, y); + }, + endPath: function SVGGraphics_endPath() { + }, + clip: function SVGGraphics_clip(type) { + var current = this.current; + var clipId = 'clippath' + clipCount; + clipCount++; + var clipPath = document.createElementNS(NS, 'svg:clipPath'); + clipPath.setAttributeNS(null, 'id', clipId); + clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); + var clipElement = current.element.cloneNode(); + if (type === 'evenodd') { + clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); + } else { + clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); + } + clipPath.appendChild(clipElement); + this.defs.appendChild(clipPath); + if (current.activeClipUrl) { + current.clipGroup = null; + this.extraStack.forEach(function (prev) { + prev.clipGroup = null; + }); + } + current.activeClipUrl = 'url(#' + clipId + ')'; + this.tgrp = null; + }, + closePath: function SVGGraphics_closePath() { + var current = this.current; + var d = current.path.getAttributeNS(null, 'd'); + d += 'Z'; + current.path.setAttributeNS(null, 'd', d); + }, + setLeading: function SVGGraphics_setLeading(leading) { + this.current.leading = -leading; + }, + setTextRise: function SVGGraphics_setTextRise(textRise) { + this.current.textRise = textRise; + }, + setHScale: function SVGGraphics_setHScale(scale) { + this.current.textHScale = scale / 100; + }, + setGState: function SVGGraphics_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 'Font': + this.setFont(value); + break; + default: + warn('Unimplemented graphic state ' + key); + break; + } + } + }, + fill: function SVGGraphics_fill() { + var current = this.current; + current.element.setAttributeNS(null, 'fill', current.fillColor); + }, + stroke: function SVGGraphics_stroke() { + var current = this.current; + current.element.setAttributeNS(null, 'stroke', current.strokeColor); + current.element.setAttributeNS(null, 'fill', 'none'); + }, + eoFill: function SVGGraphics_eoFill() { + var current = this.current; + current.element.setAttributeNS(null, 'fill', current.fillColor); + current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); + }, + fillStroke: function SVGGraphics_fillStroke() { + this.stroke(); + this.fill(); + }, + eoFillStroke: function SVGGraphics_eoFillStroke() { + this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); + this.fillStroke(); + }, + closeStroke: function SVGGraphics_closeStroke() { + this.closePath(); + this.stroke(); + }, + closeFillStroke: function SVGGraphics_closeFillStroke() { + this.closePath(); + this.fillStroke(); + }, + paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() { + var current = this.current; + var rect = document.createElementNS(NS, 'svg:rect'); + rect.setAttributeNS(null, 'x', '0'); + rect.setAttributeNS(null, 'y', '0'); + rect.setAttributeNS(null, 'width', '1px'); + rect.setAttributeNS(null, 'height', '1px'); + rect.setAttributeNS(null, 'fill', current.fillColor); + this._ensureTransformGroup().appendChild(rect); + }, + paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { + var imgObj = this.objs.get(objId); + var imgEl = document.createElementNS(NS, 'svg:image'); + imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); + imgEl.setAttributeNS(null, 'width', imgObj.width + 'px'); + imgEl.setAttributeNS(null, 'height', imgObj.height + 'px'); + imgEl.setAttributeNS(null, 'x', '0'); + imgEl.setAttributeNS(null, 'y', pf(-h)); + imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); + this._ensureTransformGroup().appendChild(imgEl); + }, + paintImageXObject: function SVGGraphics_paintImageXObject(objId) { + var imgData = this.objs.get(objId); + if (!imgData) { + warn('Dependent image isn\'t ready yet'); + return; + } + this.paintInlineImageXObject(imgData); + }, + paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) { + var width = imgData.width; + var height = imgData.height; + var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema); + var cliprect = document.createElementNS(NS, 'svg:rect'); + cliprect.setAttributeNS(null, 'x', '0'); + cliprect.setAttributeNS(null, 'y', '0'); + cliprect.setAttributeNS(null, 'width', pf(width)); + cliprect.setAttributeNS(null, 'height', pf(height)); + this.current.element = cliprect; + this.clip('nonzero'); + var imgEl = document.createElementNS(NS, 'svg:image'); + imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc); + imgEl.setAttributeNS(null, 'x', '0'); + imgEl.setAttributeNS(null, 'y', pf(-height)); + imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); + imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); + imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / width) + ' ' + pf(-1 / height) + ')'); + if (mask) { + mask.appendChild(imgEl); + } else { + this._ensureTransformGroup().appendChild(imgEl); + } + }, + paintImageMaskXObject: function SVGGraphics_paintImageMaskXObject(imgData) { + var current = this.current; + var width = imgData.width; + var height = imgData.height; + var fillColor = current.fillColor; + current.maskId = 'mask' + maskCount++; + var mask = document.createElementNS(NS, 'svg:mask'); + mask.setAttributeNS(null, 'id', current.maskId); + var rect = document.createElementNS(NS, 'svg:rect'); + rect.setAttributeNS(null, 'x', '0'); + rect.setAttributeNS(null, 'y', '0'); + rect.setAttributeNS(null, 'width', pf(width)); + rect.setAttributeNS(null, 'height', pf(height)); + rect.setAttributeNS(null, 'fill', fillColor); + rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId + ')'); + this.defs.appendChild(mask); + this._ensureTransformGroup().appendChild(rect); + this.paintInlineImageXObject(imgData, mask); + }, + paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { + if (isArray(matrix) && matrix.length === 6) { + this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); + } + if (isArray(bbox) && bbox.length === 4) { + var width = bbox[2] - bbox[0]; + var height = bbox[3] - bbox[1]; + var cliprect = document.createElementNS(NS, 'svg:rect'); + cliprect.setAttributeNS(null, 'x', bbox[0]); + cliprect.setAttributeNS(null, 'y', bbox[1]); + cliprect.setAttributeNS(null, 'width', pf(width)); + cliprect.setAttributeNS(null, 'height', pf(height)); + this.current.element = cliprect; + this.clip('nonzero'); + this.endPath(); + } + }, + paintFormXObjectEnd: function SVGGraphics_paintFormXObjectEnd() { + }, + _initialize: function SVGGraphics_initialize(viewport) { + var svg = document.createElementNS(NS, 'svg:svg'); + svg.setAttributeNS(null, 'version', '1.1'); + svg.setAttributeNS(null, 'width', viewport.width + 'px'); + svg.setAttributeNS(null, 'height', viewport.height + 'px'); + svg.setAttributeNS(null, 'preserveAspectRatio', 'none'); + svg.setAttributeNS(null, 'viewBox', '0 0 ' + viewport.width + ' ' + viewport.height); + var definitions = document.createElementNS(NS, 'svg:defs'); + svg.appendChild(definitions); + this.defs = definitions; + var rootGroup = document.createElementNS(NS, 'svg:g'); + rootGroup.setAttributeNS(null, 'transform', pm(viewport.transform)); + svg.appendChild(rootGroup); + this.svg = rootGroup; + return svg; + }, + _ensureClipGroup: function SVGGraphics_ensureClipGroup() { + if (!this.current.clipGroup) { + var clipGroup = document.createElementNS(NS, 'svg:g'); + clipGroup.setAttributeNS(null, 'clip-path', this.current.activeClipUrl); + this.svg.appendChild(clipGroup); + this.current.clipGroup = clipGroup; + } + return this.current.clipGroup; + }, + _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() { + if (!this.tgrp) { + this.tgrp = document.createElementNS(NS, 'svg:g'); + this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); + if (this.current.activeClipUrl) { + this._ensureClipGroup().appendChild(this.tgrp); + } else { + this.svg.appendChild(this.tgrp); + } + } + return this.tgrp; + } + }; + return SVGGraphics; + }(); + exports.SVGGraphics = SVGGraphics; + })); + (function (root, factory) { + factory(root.pdfjsDisplayAnnotationLayer = {}, root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils); + }(this, function (exports, sharedUtil, displayDOMUtils) { + var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; + var AnnotationType = sharedUtil.AnnotationType; + var Util = sharedUtil.Util; + var addLinkAttributes = displayDOMUtils.addLinkAttributes; + var LinkTarget = displayDOMUtils.LinkTarget; + var getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; + var warn = sharedUtil.warn; + var CustomStyle = displayDOMUtils.CustomStyle; + var getDefaultSetting = displayDOMUtils.getDefaultSetting; + function AnnotationElementFactory() { + } + AnnotationElementFactory.prototype = { + create: function AnnotationElementFactory_create(parameters) { + var subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case AnnotationType.WIDGET: + var fieldType = parameters.data.fieldType; + switch (fieldType) { + case 'Tx': + return new TextWidgetAnnotationElement(parameters); + case 'Btn': + if (parameters.data.radioButton) { + return new RadioButtonWidgetAnnotationElement(parameters); + } else if (parameters.data.checkBox) { + return new CheckboxWidgetAnnotationElement(parameters); + } + warn('Unimplemented button widget annotation: pushbutton'); + break; + case 'Ch': + return new ChoiceWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } + }; + var AnnotationElement = function AnnotationElementClosure() { + function AnnotationElement(parameters, isRenderable) { + this.isRenderable = isRenderable || false; + this.data = parameters.data; + this.layer = parameters.layer; + this.page = parameters.page; + this.viewport = parameters.viewport; + this.linkService = parameters.linkService; + this.downloadManager = parameters.downloadManager; + this.imageResourcesPath = parameters.imageResourcesPath; + this.renderInteractiveForms = parameters.renderInteractiveForms; + if (isRenderable) { + this.container = this._createContainer(); + } + } + AnnotationElement.prototype = { + _createContainer: function AnnotationElement_createContainer() { + var data = this.data, page = this.page, viewport = this.viewport; + var container = document.createElement('section'); + var width = data.rect[2] - data.rect[0]; + var height = data.rect[3] - data.rect[1]; + container.setAttribute('data-annotation-id', data.id); + var rect = Util.normalizeRect([ + data.rect[0], + page.view[3] - data.rect[1] + page.view[1], + data.rect[2], + page.view[3] - data.rect[3] + page.view[1] + ]); + CustomStyle.setProp('transform', container, 'matrix(' + viewport.transform.join(',') + ')'); + CustomStyle.setProp('transformOrigin', container, -rect[0] + 'px ' + -rect[1] + 'px'); + if (data.borderStyle.width > 0) { + container.style.borderWidth = data.borderStyle.width + 'px'; + if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { + width = width - 2 * data.borderStyle.width; + height = height - 2 * data.borderStyle.width; + } + var horizontalRadius = data.borderStyle.horizontalCornerRadius; + var verticalRadius = data.borderStyle.verticalCornerRadius; + if (horizontalRadius > 0 || verticalRadius > 0) { + var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; + CustomStyle.setProp('borderRadius', container, radius); + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + container.style.borderStyle = 'solid'; + break; + case AnnotationBorderStyleType.DASHED: + container.style.borderStyle = 'dashed'; + break; + case AnnotationBorderStyleType.BEVELED: + warn('Unimplemented border style: beveled'); + break; + case AnnotationBorderStyleType.INSET: + warn('Unimplemented border style: inset'); + break; + case AnnotationBorderStyleType.UNDERLINE: + container.style.borderBottomStyle = 'solid'; + break; + default: + break; + } + if (data.color) { + container.style.borderColor = Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0); + } else { + container.style.borderWidth = 0; + } + } + container.style.left = rect[0] + 'px'; + container.style.top = rect[1] + 'px'; + container.style.width = width + 'px'; + container.style.height = height + 'px'; + return container; + }, + _createPopup: function AnnotationElement_createPopup(container, trigger, data) { + if (!trigger) { + trigger = document.createElement('div'); + trigger.style.height = container.style.height; + trigger.style.width = container.style.width; + container.appendChild(trigger); + } + var popupElement = new PopupElement({ + container: container, + trigger: trigger, + color: data.color, + title: data.title, + contents: data.contents, + hideWrapper: true + }); + var popup = popupElement.render(); + popup.style.left = container.style.width; + container.appendChild(popup); + }, + render: function AnnotationElement_render() { + throw new Error('Abstract method AnnotationElement.render called'); + } + }; + return AnnotationElement; + }(); + var LinkAnnotationElement = function LinkAnnotationElementClosure() { + function LinkAnnotationElement(parameters) { + AnnotationElement.call(this, parameters, true); + } + Util.inherit(LinkAnnotationElement, AnnotationElement, { + render: function LinkAnnotationElement_render() { + this.container.className = 'linkAnnotation'; + var link = document.createElement('a'); + addLinkAttributes(link, { + url: this.data.url, + target: this.data.newWindow ? LinkTarget.BLANK : undefined + }); + if (!this.data.url) { + if (this.data.action) { + this._bindNamedAction(link, this.data.action); + } else { + this._bindLink(link, this.data.dest); + } + } + this.container.appendChild(link); + return this.container; + }, + _bindLink: function LinkAnnotationElement_bindLink(link, destination) { + var self = this; + link.href = this.linkService.getDestinationHash(destination); + link.onclick = function () { + if (destination) { + self.linkService.navigateTo(destination); + } + return false; + }; + if (destination) { + link.className = 'internalLink'; + } + }, + _bindNamedAction: function LinkAnnotationElement_bindNamedAction(link, action) { + var self = this; + link.href = this.linkService.getAnchorUrl(''); + link.onclick = function () { + self.linkService.executeNamedAction(action); + return false; + }; + link.className = 'internalLink'; + } + }); + return LinkAnnotationElement; + }(); + var TextAnnotationElement = function TextAnnotationElementClosure() { + function TextAnnotationElement(parameters) { + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(TextAnnotationElement, AnnotationElement, { + render: function TextAnnotationElement_render() { + this.container.className = 'textAnnotation'; + var image = document.createElement('img'); + image.style.height = this.container.style.height; + image.style.width = this.container.style.width; + image.src = this.imageResourcesPath + 'annotation-' + this.data.name.toLowerCase() + '.svg'; + image.alt = '[{{type}} Annotation]'; + image.dataset.l10nId = 'text_annotation_type'; + image.dataset.l10nArgs = JSON.stringify({ type: this.data.name }); + if (!this.data.hasPopup) { + this._createPopup(this.container, image, this.data); + } + this.container.appendChild(image); + return this.container; + } + }); + return TextAnnotationElement; + }(); + var WidgetAnnotationElement = function WidgetAnnotationElementClosure() { + function WidgetAnnotationElement(parameters, isRenderable) { + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(WidgetAnnotationElement, AnnotationElement, { + render: function WidgetAnnotationElement_render() { + return this.container; + } + }); + return WidgetAnnotationElement; + }(); + var TextWidgetAnnotationElement = function TextWidgetAnnotationElementClosure() { + var TEXT_ALIGNMENT = [ + 'left', + 'center', + 'right' + ]; + function TextWidgetAnnotationElement(parameters) { + var isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue; + WidgetAnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(TextWidgetAnnotationElement, WidgetAnnotationElement, { + render: function TextWidgetAnnotationElement_render() { + this.container.className = 'textWidgetAnnotation'; + var element = null; + if (this.renderInteractiveForms) { + if (this.data.multiLine) { + element = document.createElement('textarea'); + element.textContent = this.data.fieldValue; + } else { + element = document.createElement('input'); + element.type = 'text'; + element.setAttribute('value', this.data.fieldValue); + } + element.disabled = this.data.readOnly; + if (this.data.maxLen !== null) { + element.maxLength = this.data.maxLen; + } + if (this.data.comb) { + var fieldWidth = this.data.rect[2] - this.data.rect[0]; + var combWidth = fieldWidth / this.data.maxLen; + element.classList.add('comb'); + element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)'; + } + } else { + element = document.createElement('div'); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = 'middle'; + element.style.display = 'table-cell'; + var font = null; + if (this.data.fontRefName) { + font = this.page.commonObjs.getData(this.data.fontRefName); + } + this._setTextStyle(element, font); + } + if (this.data.textAlignment !== null) { + element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; + } + this.container.appendChild(element); + return this.container; + }, + _setTextStyle: function TextWidgetAnnotationElement_setTextStyle(element, font) { + var style = element.style; + style.fontSize = this.data.fontSize + 'px'; + style.direction = this.data.fontDirection < 0 ? 'rtl' : 'ltr'; + if (!font) { + return; + } + style.fontWeight = font.black ? font.bold ? '900' : 'bold' : font.bold ? 'bold' : 'normal'; + style.fontStyle = font.italic ? 'italic' : 'normal'; + var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : ''; + var fallbackName = font.fallbackName || 'Helvetica, sans-serif'; + style.fontFamily = fontFamily + fallbackName; + } + }); + return TextWidgetAnnotationElement; + }(); + var CheckboxWidgetAnnotationElement = function CheckboxWidgetAnnotationElementClosure() { + function CheckboxWidgetAnnotationElement(parameters) { + WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms); + } + Util.inherit(CheckboxWidgetAnnotationElement, WidgetAnnotationElement, { + render: function CheckboxWidgetAnnotationElement_render() { + this.container.className = 'buttonWidgetAnnotation checkBox'; + var element = document.createElement('input'); + element.disabled = this.data.readOnly; + element.type = 'checkbox'; + if (this.data.fieldValue && this.data.fieldValue !== 'Off') { + element.setAttribute('checked', true); + } + this.container.appendChild(element); + return this.container; + } + }); + return CheckboxWidgetAnnotationElement; + }(); + var RadioButtonWidgetAnnotationElement = function RadioButtonWidgetAnnotationElementClosure() { + function RadioButtonWidgetAnnotationElement(parameters) { + WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms); + } + Util.inherit(RadioButtonWidgetAnnotationElement, WidgetAnnotationElement, { + render: function RadioButtonWidgetAnnotationElement_render() { + this.container.className = 'buttonWidgetAnnotation radioButton'; + var element = document.createElement('input'); + element.disabled = this.data.readOnly; + element.type = 'radio'; + element.name = this.data.fieldName; + if (this.data.fieldValue === this.data.buttonValue) { + element.setAttribute('checked', true); + } + this.container.appendChild(element); + return this.container; + } + }); + return RadioButtonWidgetAnnotationElement; + }(); + var ChoiceWidgetAnnotationElement = function ChoiceWidgetAnnotationElementClosure() { + function ChoiceWidgetAnnotationElement(parameters) { + WidgetAnnotationElement.call(this, parameters, parameters.renderInteractiveForms); + } + Util.inherit(ChoiceWidgetAnnotationElement, WidgetAnnotationElement, { + render: function ChoiceWidgetAnnotationElement_render() { + this.container.className = 'choiceWidgetAnnotation'; + var selectElement = document.createElement('select'); + selectElement.disabled = this.data.readOnly; + if (!this.data.combo) { + selectElement.size = this.data.options.length; + if (this.data.multiSelect) { + selectElement.multiple = true; + } + } + for (var i = 0, ii = this.data.options.length; i < ii; i++) { + var option = this.data.options[i]; + var optionElement = document.createElement('option'); + optionElement.textContent = option.displayValue; + optionElement.value = option.exportValue; + if (this.data.fieldValue.indexOf(option.displayValue) >= 0) { + optionElement.setAttribute('selected', true); + } + selectElement.appendChild(optionElement); + } + this.container.appendChild(selectElement); + return this.container; + } + }); + return ChoiceWidgetAnnotationElement; + }(); + var PopupAnnotationElement = function PopupAnnotationElementClosure() { + function PopupAnnotationElement(parameters) { + var isRenderable = !!(parameters.data.title || parameters.data.contents); + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(PopupAnnotationElement, AnnotationElement, { + render: function PopupAnnotationElement_render() { + this.container.className = 'popupAnnotation'; + var selector = '[data-annotation-id="' + this.data.parentId + '"]'; + var parentElement = this.layer.querySelector(selector); + if (!parentElement) { + return this.container; + } + var popup = new PopupElement({ + container: this.container, + trigger: parentElement, + color: this.data.color, + title: this.data.title, + contents: this.data.contents + }); + var parentLeft = parseFloat(parentElement.style.left); + var parentWidth = parseFloat(parentElement.style.width); + CustomStyle.setProp('transformOrigin', this.container, -(parentLeft + parentWidth) + 'px -' + parentElement.style.top); + this.container.style.left = parentLeft + parentWidth + 'px'; + this.container.appendChild(popup.render()); + return this.container; + } + }); + return PopupAnnotationElement; + }(); + var PopupElement = function PopupElementClosure() { + var BACKGROUND_ENLIGHT = 0.7; + function PopupElement(parameters) { + this.container = parameters.container; + this.trigger = parameters.trigger; + this.color = parameters.color; + this.title = parameters.title; + this.contents = parameters.contents; + this.hideWrapper = parameters.hideWrapper || false; + this.pinned = false; + } + PopupElement.prototype = { + render: function PopupElement_render() { + var wrapper = document.createElement('div'); + wrapper.className = 'popupWrapper'; + this.hideElement = this.hideWrapper ? wrapper : this.container; + this.hideElement.setAttribute('hidden', true); + var popup = document.createElement('div'); + popup.className = 'popup'; + var color = this.color; + if (color) { + var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; + var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; + var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; + popup.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0); + } + var contents = this._formatContents(this.contents); + var title = document.createElement('h1'); + title.textContent = this.title; + this.trigger.addEventListener('click', this._toggle.bind(this)); + this.trigger.addEventListener('mouseover', this._show.bind(this, false)); + this.trigger.addEventListener('mouseout', this._hide.bind(this, false)); + popup.addEventListener('click', this._hide.bind(this, true)); + popup.appendChild(title); + popup.appendChild(contents); + wrapper.appendChild(popup); + return wrapper; + }, + _formatContents: function PopupElement_formatContents(contents) { + var p = document.createElement('p'); + var lines = contents.split(/(?:\r\n?|\n)/); + for (var i = 0, ii = lines.length; i < ii; ++i) { + var line = lines[i]; + p.appendChild(document.createTextNode(line)); + if (i < ii - 1) { + p.appendChild(document.createElement('br')); + } + } + return p; + }, + _toggle: function PopupElement_toggle() { + if (this.pinned) { + this._hide(true); + } else { + this._show(true); + } + }, + _show: function PopupElement_show(pin) { + if (pin) { + this.pinned = true; + } + if (this.hideElement.hasAttribute('hidden')) { + this.hideElement.removeAttribute('hidden'); + this.container.style.zIndex += 1; + } + }, + _hide: function PopupElement_hide(unpin) { + if (unpin) { + this.pinned = false; + } + if (!this.hideElement.hasAttribute('hidden') && !this.pinned) { + this.hideElement.setAttribute('hidden', true); + this.container.style.zIndex -= 1; + } + } + }; + return PopupElement; + }(); + var HighlightAnnotationElement = function HighlightAnnotationElementClosure() { + function HighlightAnnotationElement(parameters) { + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(HighlightAnnotationElement, AnnotationElement, { + render: function HighlightAnnotationElement_render() { + this.container.className = 'highlightAnnotation'; + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + return this.container; + } + }); + return HighlightAnnotationElement; + }(); + var UnderlineAnnotationElement = function UnderlineAnnotationElementClosure() { + function UnderlineAnnotationElement(parameters) { + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(UnderlineAnnotationElement, AnnotationElement, { + render: function UnderlineAnnotationElement_render() { + this.container.className = 'underlineAnnotation'; + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + return this.container; + } + }); + return UnderlineAnnotationElement; + }(); + var SquigglyAnnotationElement = function SquigglyAnnotationElementClosure() { + function SquigglyAnnotationElement(parameters) { + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(SquigglyAnnotationElement, AnnotationElement, { + render: function SquigglyAnnotationElement_render() { + this.container.className = 'squigglyAnnotation'; + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + return this.container; + } + }); + return SquigglyAnnotationElement; + }(); + var StrikeOutAnnotationElement = function StrikeOutAnnotationElementClosure() { + function StrikeOutAnnotationElement(parameters) { + var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents); + AnnotationElement.call(this, parameters, isRenderable); + } + Util.inherit(StrikeOutAnnotationElement, AnnotationElement, { + render: function StrikeOutAnnotationElement_render() { + this.container.className = 'strikeoutAnnotation'; + if (!this.data.hasPopup) { + this._createPopup(this.container, null, this.data); + } + return this.container; + } + }); + return StrikeOutAnnotationElement; + }(); + var FileAttachmentAnnotationElement = function FileAttachmentAnnotationElementClosure() { + function FileAttachmentAnnotationElement(parameters) { + AnnotationElement.call(this, parameters, true); + this.filename = getFilenameFromUrl(parameters.data.file.filename); + this.content = parameters.data.file.content; + } + Util.inherit(FileAttachmentAnnotationElement, AnnotationElement, { + render: function FileAttachmentAnnotationElement_render() { + this.container.className = 'fileAttachmentAnnotation'; + var trigger = document.createElement('div'); + trigger.style.height = this.container.style.height; + trigger.style.width = this.container.style.width; + trigger.addEventListener('dblclick', this._download.bind(this)); + if (!this.data.hasPopup && (this.data.title || this.data.contents)) { + this._createPopup(this.container, trigger, this.data); + } + this.container.appendChild(trigger); + return this.container; + }, + _download: function FileAttachmentAnnotationElement_download() { + if (!this.downloadManager) { + warn('Download cannot be started due to unavailable download manager'); + return; + } + this.downloadManager.downloadData(this.content, this.filename, ''); + } + }); + return FileAttachmentAnnotationElement; + }(); + var AnnotationLayer = function AnnotationLayerClosure() { + return { + render: function AnnotationLayer_render(parameters) { + var annotationElementFactory = new AnnotationElementFactory(); + for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { + var data = parameters.annotations[i]; + if (!data) { + continue; + } + var properties = { + data: data, + layer: parameters.div, + page: parameters.page, + viewport: parameters.viewport, + linkService: parameters.linkService, + downloadManager: parameters.downloadManager, + imageResourcesPath: parameters.imageResourcesPath || getDefaultSetting('imageResourcesPath'), + renderInteractiveForms: parameters.renderInteractiveForms || false + }; + var element = annotationElementFactory.create(properties); + if (element.isRenderable) { + parameters.div.appendChild(element.render()); + } + } + }, + update: function AnnotationLayer_update(parameters) { + for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { + var data = parameters.annotations[i]; + var element = parameters.div.querySelector('[data-annotation-id="' + data.id + '"]'); + if (element) { + CustomStyle.setProp('transform', element, 'matrix(' + parameters.viewport.transform.join(',') + ')'); + } + } + parameters.div.removeAttribute('hidden'); + } + }; + }(); + exports.AnnotationLayer = AnnotationLayer; + })); + (function (root, factory) { + factory(root.pdfjsDisplayTextLayer = {}, root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils); + }(this, function (exports, sharedUtil, displayDOMUtils) { + var Util = sharedUtil.Util; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var CustomStyle = displayDOMUtils.CustomStyle; + var getDefaultSetting = displayDOMUtils.getDefaultSetting; + var renderTextLayer = function renderTextLayerClosure() { + var MAX_TEXT_DIVS_TO_RENDER = 100000; + var NonWhitespaceRegexp = /\S/; + function isAllWhitespace(str) { + return !NonWhitespaceRegexp.test(str); + } + var styleBuf = [ + 'left: ', + 0, + 'px; top: ', + 0, + 'px; font-size: ', + 0, + 'px; font-family: ', + '', + ';' + ]; + function appendText(task, geom, styles) { + var textDiv = document.createElement('div'); + var textDivProperties = { + style: null, + angle: 0, + canvasWidth: 0, + isWhitespace: false, + originalTransform: null, + paddingBottom: 0, + paddingLeft: 0, + paddingRight: 0, + paddingTop: 0, + scale: 1 + }; + task._textDivs.push(textDiv); + if (isAllWhitespace(geom.str)) { + textDivProperties.isWhitespace = true; + task._textDivProperties.set(textDiv, textDivProperties); + return; + } + var tx = Util.transform(task._viewport.transform, geom.transform); + var angle = Math.atan2(tx[1], tx[0]); + var style = styles[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + var fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]); + var fontAscent = fontHeight; + if (style.ascent) { + fontAscent = style.ascent * fontAscent; + } else if (style.descent) { + fontAscent = (1 + style.descent) * fontAscent; + } + var left; + var top; + if (angle === 0) { + left = tx[4]; + top = tx[5] - fontAscent; + } else { + left = tx[4] + fontAscent * Math.sin(angle); + top = tx[5] - fontAscent * Math.cos(angle); + } + styleBuf[1] = left; + styleBuf[3] = top; + styleBuf[5] = fontHeight; + styleBuf[7] = style.fontFamily; + textDivProperties.style = styleBuf.join(''); + textDiv.setAttribute('style', textDivProperties.style); + textDiv.textContent = geom.str; + if (getDefaultSetting('pdfBug')) { + textDiv.dataset.fontName = geom.fontName; + } + if (angle !== 0) { + textDivProperties.angle = angle * (180 / Math.PI); + } + if (geom.str.length > 1) { + if (style.vertical) { + textDivProperties.canvasWidth = geom.height * task._viewport.scale; + } else { + textDivProperties.canvasWidth = geom.width * task._viewport.scale; + } + } + task._textDivProperties.set(textDiv, textDivProperties); + if (task._enhanceTextSelection) { + var angleCos = 1, angleSin = 0; + if (angle !== 0) { + angleCos = Math.cos(angle); + angleSin = Math.sin(angle); + } + var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale; + var divHeight = fontHeight; + var m, b; + if (angle !== 0) { + m = [ + angleCos, + angleSin, + -angleSin, + angleCos, + left, + top + ]; + b = Util.getAxialAlignedBoundingBox([ + 0, + 0, + divWidth, + divHeight + ], m); + } else { + b = [ + left, + top, + left + divWidth, + top + divHeight + ]; + } + task._bounds.push({ + left: b[0], + top: b[1], + right: b[2], + bottom: b[3], + div: textDiv, + size: [ + divWidth, + divHeight + ], + m: m + }); + } + } + function render(task) { + if (task._canceled) { + return; + } + var textLayerFrag = task._container; + var textDivs = task._textDivs; + var capability = task._capability; + var textDivsLength = textDivs.length; + if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { + task._renderingDone = true; + capability.resolve(); + return; + } + var canvas = document.createElement('canvas'); + canvas.mozOpaque = true; + var ctx = canvas.getContext('2d', { alpha: false }); + var lastFontSize; + var lastFontFamily; + for (var i = 0; i < textDivsLength; i++) { + var textDiv = textDivs[i]; + var textDivProperties = task._textDivProperties.get(textDiv); + if (textDivProperties.isWhitespace) { + continue; + } + var fontSize = textDiv.style.fontSize; + var fontFamily = textDiv.style.fontFamily; + if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { + ctx.font = fontSize + ' ' + fontFamily; + lastFontSize = fontSize; + lastFontFamily = fontFamily; + } + var width = ctx.measureText(textDiv.textContent).width; + textLayerFrag.appendChild(textDiv); + var transform = ''; + if (textDivProperties.canvasWidth !== 0 && width > 0) { + textDivProperties.scale = textDivProperties.canvasWidth / width; + transform = 'scaleX(' + textDivProperties.scale + ')'; + } + if (textDivProperties.angle !== 0) { + transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform; + } + if (transform !== '') { + textDivProperties.originalTransform = transform; + CustomStyle.setProp('transform', textDiv, transform); + } + task._textDivProperties.set(textDiv, textDivProperties); + } + task._renderingDone = true; + capability.resolve(); + } + function expand(task) { + var bounds = task._bounds; + var viewport = task._viewport; + var expanded = expandBounds(viewport.width, viewport.height, bounds); + for (var i = 0; i < expanded.length; i++) { + var div = bounds[i].div; + var divProperties = task._textDivProperties.get(div); + if (divProperties.angle === 0) { + divProperties.paddingLeft = bounds[i].left - expanded[i].left; + divProperties.paddingTop = bounds[i].top - expanded[i].top; + divProperties.paddingRight = expanded[i].right - bounds[i].right; + divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom; + task._textDivProperties.set(div, divProperties); + continue; + } + var e = expanded[i], b = bounds[i]; + var m = b.m, c = m[0], s = m[1]; + var points = [ + [ + 0, + 0 + ], + [ + 0, + b.size[1] + ], + [ + b.size[0], + 0 + ], + b.size + ]; + var ts = new Float64Array(64); + points.forEach(function (p, i) { + var t = Util.applyTransform(p, m); + ts[i + 0] = c && (e.left - t[0]) / c; + ts[i + 4] = s && (e.top - t[1]) / s; + ts[i + 8] = c && (e.right - t[0]) / c; + ts[i + 12] = s && (e.bottom - t[1]) / s; + ts[i + 16] = s && (e.left - t[0]) / -s; + ts[i + 20] = c && (e.top - t[1]) / c; + ts[i + 24] = s && (e.right - t[0]) / -s; + ts[i + 28] = c && (e.bottom - t[1]) / c; + ts[i + 32] = c && (e.left - t[0]) / -c; + ts[i + 36] = s && (e.top - t[1]) / -s; + ts[i + 40] = c && (e.right - t[0]) / -c; + ts[i + 44] = s && (e.bottom - t[1]) / -s; + ts[i + 48] = s && (e.left - t[0]) / s; + ts[i + 52] = c && (e.top - t[1]) / -c; + ts[i + 56] = s && (e.right - t[0]) / s; + ts[i + 60] = c && (e.bottom - t[1]) / -c; + }); + var findPositiveMin = function (ts, offset, count) { + var result = 0; + for (var i = 0; i < count; i++) { + var t = ts[offset++]; + if (t > 0) { + result = result ? Math.min(t, result) : t; + } + } + return result; + }; + var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s)); + divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale; + divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale; + divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale; + divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale; + task._textDivProperties.set(div, divProperties); + } + } + function expandBounds(width, height, boxes) { + var bounds = boxes.map(function (box, i) { + return { + x1: box.left, + y1: box.top, + x2: box.right, + y2: box.bottom, + index: i, + x1New: undefined, + x2New: undefined + }; + }); + expandBoundsLTR(width, bounds); + var expanded = new Array(boxes.length); + bounds.forEach(function (b) { + var i = b.index; + expanded[i] = { + left: b.x1New, + top: 0, + right: b.x2New, + bottom: 0 + }; + }); + boxes.map(function (box, i) { + var e = expanded[i], b = bounds[i]; + b.x1 = box.top; + b.y1 = width - e.right; + b.x2 = box.bottom; + b.y2 = width - e.left; + b.index = i; + b.x1New = undefined; + b.x2New = undefined; + }); + expandBoundsLTR(height, bounds); + bounds.forEach(function (b) { + var i = b.index; + expanded[i].top = b.x1New; + expanded[i].bottom = b.x2New; + }); + return expanded; + } + function expandBoundsLTR(width, bounds) { + bounds.sort(function (a, b) { + return a.x1 - b.x1 || a.index - b.index; + }); + var fakeBoundary = { + x1: -Infinity, + y1: -Infinity, + x2: 0, + y2: Infinity, + index: -1, + x1New: 0, + x2New: 0 + }; + var horizon = [{ + start: -Infinity, + end: Infinity, + boundary: fakeBoundary + }]; + bounds.forEach(function (boundary) { + var i = 0; + while (i < horizon.length && horizon[i].end <= boundary.y1) { + i++; + } + var j = horizon.length - 1; + while (j >= 0 && horizon[j].start >= boundary.y2) { + j--; + } + var horizonPart, affectedBoundary; + var q, k, maxXNew = -Infinity; + for (q = i; q <= j; q++) { + horizonPart = horizon[q]; + affectedBoundary = horizonPart.boundary; + var xNew; + if (affectedBoundary.x2 > boundary.x1) { + xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1; + } else if (affectedBoundary.x2New === undefined) { + xNew = (affectedBoundary.x2 + boundary.x1) / 2; + } else { + xNew = affectedBoundary.x2New; + } + if (xNew > maxXNew) { + maxXNew = xNew; + } + } + boundary.x1New = maxXNew; + for (q = i; q <= j; q++) { + horizonPart = horizon[q]; + affectedBoundary = horizonPart.boundary; + if (affectedBoundary.x2New === undefined) { + if (affectedBoundary.x2 > boundary.x1) { + if (affectedBoundary.index > boundary.index) { + affectedBoundary.x2New = affectedBoundary.x2; + } + } else { + affectedBoundary.x2New = maxXNew; + } + } else if (affectedBoundary.x2New > maxXNew) { + affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2); + } + } + var changedHorizon = [], lastBoundary = null; + for (q = i; q <= j; q++) { + horizonPart = horizon[q]; + affectedBoundary = horizonPart.boundary; + var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary; + if (lastBoundary === useBoundary) { + changedHorizon[changedHorizon.length - 1].end = horizonPart.end; + } else { + changedHorizon.push({ + start: horizonPart.start, + end: horizonPart.end, + boundary: useBoundary + }); + lastBoundary = useBoundary; + } + } + if (horizon[i].start < boundary.y1) { + changedHorizon[0].start = boundary.y1; + changedHorizon.unshift({ + start: horizon[i].start, + end: boundary.y1, + boundary: horizon[i].boundary + }); + } + if (boundary.y2 < horizon[j].end) { + changedHorizon[changedHorizon.length - 1].end = boundary.y2; + changedHorizon.push({ + start: boundary.y2, + end: horizon[j].end, + boundary: horizon[j].boundary + }); + } + for (q = i; q <= j; q++) { + horizonPart = horizon[q]; + affectedBoundary = horizonPart.boundary; + if (affectedBoundary.x2New !== undefined) { + continue; + } + var used = false; + for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) { + used = horizon[k].boundary === affectedBoundary; + } + for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) { + used = horizon[k].boundary === affectedBoundary; + } + for (k = 0; !used && k < changedHorizon.length; k++) { + used = changedHorizon[k].boundary === affectedBoundary; + } + if (!used) { + affectedBoundary.x2New = maxXNew; + } + } + Array.prototype.splice.apply(horizon, [ + i, + j - i + 1 + ].concat(changedHorizon)); + }); + horizon.forEach(function (horizonPart) { + var affectedBoundary = horizonPart.boundary; + if (affectedBoundary.x2New === undefined) { + affectedBoundary.x2New = Math.max(width, affectedBoundary.x2); + } + }); + } + function TextLayerRenderTask(textContent, container, viewport, textDivs, enhanceTextSelection) { + this._textContent = textContent; + this._container = container; + this._viewport = viewport; + this._textDivs = textDivs || []; + this._textDivProperties = new WeakMap(); + this._renderingDone = false; + this._canceled = false; + this._capability = createPromiseCapability(); + this._renderTimer = null; + this._bounds = []; + this._enhanceTextSelection = !!enhanceTextSelection; + } + TextLayerRenderTask.prototype = { + get promise() { + return this._capability.promise; + }, + cancel: function TextLayer_cancel() { + this._canceled = true; + if (this._renderTimer !== null) { + clearTimeout(this._renderTimer); + this._renderTimer = null; + } + this._capability.reject('canceled'); + }, + _render: function TextLayer_render(timeout) { + var textItems = this._textContent.items; + var textStyles = this._textContent.styles; + for (var i = 0, len = textItems.length; i < len; i++) { + appendText(this, textItems[i], textStyles); + } + if (!timeout) { + render(this); + } else { + var self = this; + this._renderTimer = setTimeout(function () { + render(self); + self._renderTimer = null; + }, timeout); + } + }, + expandTextDivs: function TextLayer_expandTextDivs(expandDivs) { + if (!this._enhanceTextSelection || !this._renderingDone) { + return; + } + if (this._bounds !== null) { + expand(this); + this._bounds = null; + } + for (var i = 0, ii = this._textDivs.length; i < ii; i++) { + var div = this._textDivs[i]; + var divProperties = this._textDivProperties.get(div); + if (divProperties.isWhitespace) { + continue; + } + if (expandDivs) { + var transform = '', padding = ''; + if (divProperties.scale !== 1) { + transform = 'scaleX(' + divProperties.scale + ')'; + } + if (divProperties.angle !== 0) { + transform = 'rotate(' + divProperties.angle + 'deg) ' + transform; + } + if (divProperties.paddingLeft !== 0) { + padding += ' padding-left: ' + divProperties.paddingLeft / divProperties.scale + 'px;'; + transform += ' translateX(' + -divProperties.paddingLeft / divProperties.scale + 'px)'; + } + if (divProperties.paddingTop !== 0) { + padding += ' padding-top: ' + divProperties.paddingTop + 'px;'; + transform += ' translateY(' + -divProperties.paddingTop + 'px)'; + } + if (divProperties.paddingRight !== 0) { + padding += ' padding-right: ' + divProperties.paddingRight / divProperties.scale + 'px;'; + } + if (divProperties.paddingBottom !== 0) { + padding += ' padding-bottom: ' + divProperties.paddingBottom + 'px;'; + } + if (padding !== '') { + div.setAttribute('style', divProperties.style + padding); + } + if (transform !== '') { + CustomStyle.setProp('transform', div, transform); + } + } else { + div.style.padding = 0; + CustomStyle.setProp('transform', div, divProperties.originalTransform || ''); + } + } + } + }; + function renderTextLayer(renderParameters) { + var task = new TextLayerRenderTask(renderParameters.textContent, renderParameters.container, renderParameters.viewport, renderParameters.textDivs, renderParameters.enhanceTextSelection); + task._render(renderParameters.timeout); + return task; + } + return renderTextLayer; + }(); + exports.renderTextLayer = renderTextLayer; + })); + (function (root, factory) { + factory(root.pdfjsDisplayWebGL = {}, root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils); + }(this, function (exports, sharedUtil, displayDOMUtils) { + var shadow = sharedUtil.shadow; + var getDefaultSetting = displayDOMUtils.getDefaultSetting; + var WebGLUtils = function WebGLUtilsClosure() { + function loadShader(gl, code, shaderType) { + var shader = gl.createShader(shaderType); + gl.shaderSource(shader, code); + gl.compileShader(shader); + var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); + if (!compiled) { + var errorMsg = gl.getShaderInfoLog(shader); + throw new Error('Error during shader compilation: ' + errorMsg); + } + return shader; + } + function createVertexShader(gl, code) { + return loadShader(gl, code, gl.VERTEX_SHADER); + } + function createFragmentShader(gl, code) { + return loadShader(gl, code, gl.FRAGMENT_SHADER); + } + function createProgram(gl, shaders) { + var program = gl.createProgram(); + for (var i = 0, ii = shaders.length; i < ii; ++i) { + gl.attachShader(program, shaders[i]); + } + gl.linkProgram(program); + var linked = gl.getProgramParameter(program, gl.LINK_STATUS); + if (!linked) { + var errorMsg = gl.getProgramInfoLog(program); + throw new Error('Error during program linking: ' + errorMsg); + } + return program; + } + function createTexture(gl, image, textureId) { + gl.activeTexture(textureId); + var texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); + return texture; + } + var currentGL, currentCanvas; + function generateGL() { + if (currentGL) { + return; + } + currentCanvas = document.createElement('canvas'); + currentGL = currentCanvas.getContext('webgl', { premultipliedalpha: false }); + } + var smaskVertexShaderCode = '\ + attribute vec2 a_position; \ + attribute vec2 a_texCoord; \ + \ + uniform vec2 u_resolution; \ + \ + varying vec2 v_texCoord; \ + \ + void main() { \ + vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \ + gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ + \ + v_texCoord = a_texCoord; \ + } '; + var smaskFragmentShaderCode = '\ + precision mediump float; \ + \ + uniform vec4 u_backdrop; \ + uniform int u_subtype; \ + uniform sampler2D u_image; \ + uniform sampler2D u_mask; \ + \ + varying vec2 v_texCoord; \ + \ + void main() { \ + vec4 imageColor = texture2D(u_image, v_texCoord); \ + vec4 maskColor = texture2D(u_mask, v_texCoord); \ + if (u_backdrop.a > 0.0) { \ + maskColor.rgb = maskColor.rgb * maskColor.a + \ + u_backdrop.rgb * (1.0 - maskColor.a); \ + } \ + float lum; \ + if (u_subtype == 0) { \ + lum = maskColor.a; \ + } else { \ + lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \ + maskColor.b * 0.11; \ + } \ + imageColor.a *= lum; \ + imageColor.rgb *= imageColor.a; \ + gl_FragColor = imageColor; \ + } '; + var smaskCache = null; + function initSmaskGL() { + var canvas, gl; + generateGL(); + canvas = currentCanvas; + currentCanvas = null; + gl = currentGL; + currentGL = null; + var vertexShader = createVertexShader(gl, smaskVertexShaderCode); + var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); + var program = createProgram(gl, [ + vertexShader, + fragmentShader + ]); + gl.useProgram(program); + var cache = {}; + cache.gl = gl; + cache.canvas = canvas; + cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); + cache.positionLocation = gl.getAttribLocation(program, 'a_position'); + cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop'); + cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype'); + var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord'); + var texLayerLocation = gl.getUniformLocation(program, 'u_image'); + var texMaskLocation = gl.getUniformLocation(program, 'u_mask'); + var texCoordBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 1.0, + 1.0, + 0.0, + 1.0, + 1.0 + ]), gl.STATIC_DRAW); + gl.enableVertexAttribArray(texCoordLocation); + gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); + gl.uniform1i(texLayerLocation, 0); + gl.uniform1i(texMaskLocation, 1); + smaskCache = cache; + } + function composeSMask(layer, mask, properties) { + var width = layer.width, height = layer.height; + if (!smaskCache) { + initSmaskGL(); + } + var cache = smaskCache, canvas = cache.canvas, gl = cache.gl; + canvas.width = width; + canvas.height = height; + gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); + gl.uniform2f(cache.resolutionLocation, width, height); + if (properties.backdrop) { + gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], properties.backdrop[2], 1); + } else { + gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0); + } + gl.uniform1i(cache.subtypeLocation, properties.subtype === 'Luminosity' ? 1 : 0); + var texture = createTexture(gl, layer, gl.TEXTURE0); + var maskTexture = createTexture(gl, mask, gl.TEXTURE1); + var buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + 0, + 0, + width, + 0, + 0, + height, + 0, + height, + width, + 0, + width, + height + ]), gl.STATIC_DRAW); + gl.enableVertexAttribArray(cache.positionLocation); + gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); + gl.clearColor(0, 0, 0, 0); + gl.enable(gl.BLEND); + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLES, 0, 6); + gl.flush(); + gl.deleteTexture(texture); + gl.deleteTexture(maskTexture); + gl.deleteBuffer(buffer); + return canvas; + } + var figuresVertexShaderCode = '\ + attribute vec2 a_position; \ + attribute vec3 a_color; \ + \ + uniform vec2 u_resolution; \ + uniform vec2 u_scale; \ + uniform vec2 u_offset; \ + \ + varying vec4 v_color; \ + \ + void main() { \ + vec2 position = (a_position + u_offset) * u_scale; \ + vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \ + gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ + \ + v_color = vec4(a_color / 255.0, 1.0); \ + } '; + var figuresFragmentShaderCode = '\ + precision mediump float; \ + \ + varying vec4 v_color; \ + \ + void main() { \ + gl_FragColor = v_color; \ + } '; + var figuresCache = null; + function initFiguresGL() { + var canvas, gl; + generateGL(); + canvas = currentCanvas; + currentCanvas = null; + gl = currentGL; + currentGL = null; + var vertexShader = createVertexShader(gl, figuresVertexShaderCode); + var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); + var program = createProgram(gl, [ + vertexShader, + fragmentShader + ]); + gl.useProgram(program); + var cache = {}; + cache.gl = gl; + cache.canvas = canvas; + cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); + cache.scaleLocation = gl.getUniformLocation(program, 'u_scale'); + cache.offsetLocation = gl.getUniformLocation(program, 'u_offset'); + cache.positionLocation = gl.getAttribLocation(program, 'a_position'); + cache.colorLocation = gl.getAttribLocation(program, 'a_color'); + figuresCache = cache; + } + function drawFigures(width, height, backgroundColor, figures, context) { + if (!figuresCache) { + initFiguresGL(); + } + var cache = figuresCache, canvas = cache.canvas, gl = cache.gl; + canvas.width = width; + canvas.height = height; + gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); + gl.uniform2f(cache.resolutionLocation, width, height); + var count = 0; + var i, ii, rows; + for (i = 0, ii = figures.length; i < ii; i++) { + switch (figures[i].type) { + case 'lattice': + rows = figures[i].coords.length / figures[i].verticesPerRow | 0; + count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; + break; + case 'triangles': + count += figures[i].coords.length; + break; + } + } + var coords = new Float32Array(count * 2); + var colors = new Uint8Array(count * 3); + var coordsMap = context.coords, colorsMap = context.colors; + var pIndex = 0, cIndex = 0; + for (i = 0, ii = figures.length; i < ii; i++) { + var figure = figures[i], ps = figure.coords, cs = figure.colors; + switch (figure.type) { + case 'lattice': + var cols = figure.verticesPerRow; + rows = ps.length / cols | 0; + for (var row = 1; row < rows; row++) { + var offset = row * cols + 1; + for (var col = 1; col < cols; col++, offset++) { + coords[pIndex] = coordsMap[ps[offset - cols - 1]]; + coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; + coords[pIndex + 2] = coordsMap[ps[offset - cols]]; + coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1]; + coords[pIndex + 4] = coordsMap[ps[offset - 1]]; + coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1]; + colors[cIndex] = colorsMap[cs[offset - cols - 1]]; + colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1]; + colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2]; + colors[cIndex + 3] = colorsMap[cs[offset - cols]]; + colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1]; + colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2]; + colors[cIndex + 6] = colorsMap[cs[offset - 1]]; + colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1]; + colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2]; + coords[pIndex + 6] = coords[pIndex + 2]; + coords[pIndex + 7] = coords[pIndex + 3]; + coords[pIndex + 8] = coords[pIndex + 4]; + coords[pIndex + 9] = coords[pIndex + 5]; + coords[pIndex + 10] = coordsMap[ps[offset]]; + coords[pIndex + 11] = coordsMap[ps[offset] + 1]; + colors[cIndex + 9] = colors[cIndex + 3]; + colors[cIndex + 10] = colors[cIndex + 4]; + colors[cIndex + 11] = colors[cIndex + 5]; + colors[cIndex + 12] = colors[cIndex + 6]; + colors[cIndex + 13] = colors[cIndex + 7]; + colors[cIndex + 14] = colors[cIndex + 8]; + colors[cIndex + 15] = colorsMap[cs[offset]]; + colors[cIndex + 16] = colorsMap[cs[offset] + 1]; + colors[cIndex + 17] = colorsMap[cs[offset] + 2]; + pIndex += 12; + cIndex += 18; + } + } + break; + case 'triangles': + for (var j = 0, jj = ps.length; j < jj; j++) { + coords[pIndex] = coordsMap[ps[j]]; + coords[pIndex + 1] = coordsMap[ps[j] + 1]; + colors[cIndex] = colorsMap[cs[j]]; + colors[cIndex + 1] = colorsMap[cs[j] + 1]; + colors[cIndex + 2] = colorsMap[cs[j] + 2]; + pIndex += 2; + cIndex += 3; + } + break; + } + } + if (backgroundColor) { + gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0); + } else { + gl.clearColor(0, 0, 0, 0); + } + gl.clear(gl.COLOR_BUFFER_BIT); + var coordsBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); + gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); + gl.enableVertexAttribArray(cache.positionLocation); + gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); + var colorsBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); + gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); + gl.enableVertexAttribArray(cache.colorLocation); + gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0); + gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY); + gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY); + gl.drawArrays(gl.TRIANGLES, 0, count); + gl.flush(); + gl.deleteBuffer(coordsBuffer); + gl.deleteBuffer(colorsBuffer); + return canvas; + } + function cleanup() { + if (smaskCache && smaskCache.canvas) { + smaskCache.canvas.width = 0; + smaskCache.canvas.height = 0; + } + if (figuresCache && figuresCache.canvas) { + figuresCache.canvas.width = 0; + figuresCache.canvas.height = 0; + } + smaskCache = null; + figuresCache = null; + } + return { + get isEnabled() { + if (getDefaultSetting('disableWebGL')) { + return false; + } + var enabled = false; + try { + generateGL(); + enabled = !!currentGL; + } catch (e) { + } + return shadow(this, 'isEnabled', enabled); + }, + composeSMask: composeSMask, + drawFigures: drawFigures, + clear: cleanup + }; + }(); + exports.WebGLUtils = WebGLUtils; + })); + (function (root, factory) { + factory(root.pdfjsDisplayPatternHelper = {}, root.pdfjsSharedUtil, root.pdfjsDisplayWebGL); + }(this, function (exports, sharedUtil, displayWebGL) { + var Util = sharedUtil.Util; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var error = sharedUtil.error; + var WebGLUtils = displayWebGL.WebGLUtils; + var ShadingIRs = {}; + ShadingIRs.RadialAxial = { + fromIR: function RadialAxial_fromIR(raw) { + var type = raw[1]; + var colorStops = raw[2]; + var p0 = raw[3]; + var p1 = raw[4]; + var r0 = raw[5]; + var r1 = raw[6]; + return { + type: 'Pattern', + getPattern: function RadialAxial_getPattern(ctx) { + var grad; + if (type === 'axial') { + grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); + } else if (type === 'radial') { + grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); + } + for (var i = 0, ii = colorStops.length; i < ii; ++i) { + var c = colorStops[i]; + grad.addColorStop(c[0], c[1]); + } + return grad; + } + }; + } + }; + var createMeshCanvas = function createMeshCanvasClosure() { + function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { + var coords = context.coords, colors = context.colors; + var bytes = data.data, rowSize = data.width * 4; + var tmp; + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + if (coords[p2 + 1] > coords[p3 + 1]) { + tmp = p2; + p2 = p3; + p3 = tmp; + tmp = c2; + c2 = c3; + c3 = tmp; + } + if (coords[p1 + 1] > coords[p2 + 1]) { + tmp = p1; + p1 = p2; + p2 = tmp; + tmp = c1; + c1 = c2; + c2 = tmp; + } + var x1 = (coords[p1] + context.offsetX) * context.scaleX; + var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; + var x2 = (coords[p2] + context.offsetX) * context.scaleX; + var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; + var x3 = (coords[p3] + context.offsetX) * context.scaleX; + var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; + if (y1 >= y3) { + return; + } + var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2]; + var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2]; + var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2]; + var minY = Math.round(y1), maxY = Math.round(y3); + var xa, car, cag, cab; + var xb, cbr, cbg, cbb; + var k; + for (var y = minY; y <= maxY; y++) { + if (y < y2) { + k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2); + xa = x1 - (x1 - x2) * k; + car = c1r - (c1r - c2r) * k; + cag = c1g - (c1g - c2g) * k; + cab = c1b - (c1b - c2b) * k; + } else { + k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3); + xa = x2 - (x2 - x3) * k; + car = c2r - (c2r - c3r) * k; + cag = c2g - (c2g - c3g) * k; + cab = c2b - (c2b - c3b) * k; + } + k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3); + xb = x1 - (x1 - x3) * k; + cbr = c1r - (c1r - c3r) * k; + cbg = c1g - (c1g - c3g) * k; + cbb = c1b - (c1b - c3b) * k; + var x1_ = Math.round(Math.min(xa, xb)); + var x2_ = Math.round(Math.max(xa, xb)); + var j = rowSize * y + x1_ * 4; + for (var x = x1_; x <= x2_; x++) { + k = (xa - x) / (xa - xb); + k = k < 0 ? 0 : k > 1 ? 1 : k; + bytes[j++] = car - (car - cbr) * k | 0; + bytes[j++] = cag - (cag - cbg) * k | 0; + bytes[j++] = cab - (cab - cbb) * k | 0; + bytes[j++] = 255; + } + } + } + function drawFigure(data, figure, context) { + var ps = figure.coords; + var cs = figure.colors; + var i, ii; + switch (figure.type) { + case 'lattice': + var verticesPerRow = figure.verticesPerRow; + var rows = Math.floor(ps.length / verticesPerRow) - 1; + var cols = verticesPerRow - 1; + for (i = 0; i < rows; i++) { + var q = i * verticesPerRow; + for (var j = 0; j < cols; j++, q++) { + drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); + drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); + } + } + break; + case 'triangles': + for (i = 0, ii = ps.length; i < ii; i += 3) { + drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); + } + break; + default: + error('illigal figure'); + break; + } + } + function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases) { + var EXPECTED_SCALE = 1.1; + var MAX_PATTERN_SIZE = 3000; + var BORDER_SIZE = 2; + var offsetX = Math.floor(bounds[0]); + var offsetY = Math.floor(bounds[1]); + var boundsWidth = Math.ceil(bounds[2]) - offsetX; + var boundsHeight = Math.ceil(bounds[3]) - offsetY; + var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); + var scaleX = boundsWidth / width; + var scaleY = boundsHeight / height; + var context = { + coords: coords, + colors: colors, + offsetX: -offsetX, + offsetY: -offsetY, + scaleX: 1 / scaleX, + scaleY: 1 / scaleY + }; + var paddedWidth = width + BORDER_SIZE * 2; + var paddedHeight = height + BORDER_SIZE * 2; + var canvas, tmpCanvas, i, ii; + if (WebGLUtils.isEnabled) { + canvas = WebGLUtils.drawFigures(width, height, backgroundColor, figures, context); + tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false); + tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE); + canvas = tmpCanvas.canvas; + } else { + tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false); + var tmpCtx = tmpCanvas.context; + var data = tmpCtx.createImageData(width, height); + if (backgroundColor) { + var bytes = data.data; + for (i = 0, ii = bytes.length; i < ii; i += 4) { + bytes[i] = backgroundColor[0]; + bytes[i + 1] = backgroundColor[1]; + bytes[i + 2] = backgroundColor[2]; + bytes[i + 3] = 255; + } + } + for (i = 0; i < figures.length; i++) { + drawFigure(data, figures[i], context); + } + tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); + canvas = tmpCanvas.canvas; + } + return { + canvas: canvas, + offsetX: offsetX - BORDER_SIZE * scaleX, + offsetY: offsetY - BORDER_SIZE * scaleY, + scaleX: scaleX, + scaleY: scaleY + }; + } + return createMeshCanvas; + }(); + ShadingIRs.Mesh = { + fromIR: function Mesh_fromIR(raw) { + var coords = raw[2]; + var colors = raw[3]; + var figures = raw[4]; + var bounds = raw[5]; + var matrix = raw[6]; + var background = raw[8]; + return { + type: 'Pattern', + getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { + var scale; + if (shadingFill) { + scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); + } else { + scale = Util.singularValueDecompose2dScale(owner.baseTransform); + if (matrix) { + var matrixScale = Util.singularValueDecompose2dScale(matrix); + scale = [ + scale[0] * matrixScale[0], + scale[1] * matrixScale[1] + ]; + } + } + var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases); + if (!shadingFill) { + ctx.setTransform.apply(ctx, owner.baseTransform); + if (matrix) { + ctx.transform.apply(ctx, matrix); + } + } + ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); + ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); + return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat'); + } + }; + } + }; + ShadingIRs.Dummy = { + fromIR: function Dummy_fromIR() { + return { + type: 'Pattern', + getPattern: function Dummy_fromIR_getPattern() { + return 'hotpink'; + } + }; + } + }; + function getShadingPatternFromIR(raw) { + var shadingIR = ShadingIRs[raw[0]]; + if (!shadingIR) { + error('Unknown IR type: ' + raw[0]); + } + return shadingIR.fromIR(raw); + } + var TilingPattern = function TilingPatternClosure() { + var PaintType = { + COLORED: 1, + UNCOLORED: 2 + }; + var MAX_PATTERN_SIZE = 3000; + function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) { + this.operatorList = IR[2]; + this.matrix = IR[3] || [ + 1, + 0, + 0, + 1, + 0, + 0 + ]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.color = color; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + this.type = 'Pattern'; + this.ctx = ctx; + } + TilingPattern.prototype = { + createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { + var operatorList = this.operatorList; + var bbox = this.bbox; + var xstep = this.xstep; + var ystep = this.ystep; + var paintType = this.paintType; + var tilingType = this.tilingType; + var color = this.color; + var canvasGraphicsFactory = this.canvasGraphicsFactory; + info('TilingType: ' + tilingType); + var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; + var topLeft = [ + x0, + y0 + ]; + var botRight = [ + x0 + xstep, + y0 + ystep + ]; + var width = botRight[0] - topLeft[0]; + var height = botRight[1] - topLeft[1]; + var matrixScale = Util.singularValueDecompose2dScale(this.matrix); + var curMatrixScale = Util.singularValueDecompose2dScale(this.baseTransform); + var combinedScale = [ + matrixScale[0] * curMatrixScale[0], + matrixScale[1] * curMatrixScale[1] + ]; + width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), MAX_PATTERN_SIZE); + height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), MAX_PATTERN_SIZE); + var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', width, height, true); + var tmpCtx = tmpCanvas.context; + var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color); + this.setScale(width, height, xstep, ystep); + this.transformToScale(graphics); + var tmpTranslate = [ + 1, + 0, + 0, + 1, + -topLeft[0], + -topLeft[1] + ]; + graphics.transform.apply(graphics, tmpTranslate); + this.clipBbox(graphics, bbox, x0, y0, x1, y1); + graphics.executeOperatorList(operatorList); + return tmpCanvas.canvas; + }, + setScale: function TilingPattern_setScale(width, height, xstep, ystep) { + this.scale = [ + width / xstep, + height / ystep + ]; + }, + transformToScale: function TilingPattern_transformToScale(graphics) { + var scale = this.scale; + var tmpScale = [ + scale[0], + 0, + 0, + scale[1], + 0, + 0 + ]; + graphics.transform.apply(graphics, tmpScale); + }, + scaleToContext: function TilingPattern_scaleToContext() { + var scale = this.scale; + this.ctx.scale(1 / scale[0], 1 / scale[1]); + }, + clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { + if (bbox && isArray(bbox) && bbox.length === 4) { + var bboxWidth = x1 - x0; + var bboxHeight = y1 - y0; + graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); + graphics.clip(); + graphics.endPath(); + } + }, + setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(context, paintType, color) { + switch (paintType) { + case PaintType.COLORED: + var ctx = this.ctx; + context.fillStyle = ctx.fillStyle; + context.strokeStyle = ctx.strokeStyle; + break; + case PaintType.UNCOLORED: + var cssColor = Util.makeCssRgb(color[0], color[1], color[2]); + context.fillStyle = cssColor; + context.strokeStyle = cssColor; + break; + default: + error('Unsupported paint type: ' + paintType); + } + }, + getPattern: function TilingPattern_getPattern(ctx, owner) { + var temporaryPatternCanvas = this.createPatternCanvas(owner); + ctx = this.ctx; + ctx.setTransform.apply(ctx, this.baseTransform); + ctx.transform.apply(ctx, this.matrix); + this.scaleToContext(); + return ctx.createPattern(temporaryPatternCanvas, 'repeat'); + } + }; + return TilingPattern; + }(); + exports.getShadingPatternFromIR = getShadingPatternFromIR; + exports.TilingPattern = TilingPattern; + })); + (function (root, factory) { + factory(root.pdfjsDisplayCanvas = {}, root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils, root.pdfjsDisplayPatternHelper, root.pdfjsDisplayWebGL); + }(this, function (exports, sharedUtil, displayDOMUtils, displayPatternHelper, displayWebGL) { + var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; + var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; + var ImageKind = sharedUtil.ImageKind; + var OPS = sharedUtil.OPS; + var TextRenderingMode = sharedUtil.TextRenderingMode; + var Uint32ArrayView = sharedUtil.Uint32ArrayView; + var Util = sharedUtil.Util; + var assert = sharedUtil.assert; + var info = sharedUtil.info; + var isNum = sharedUtil.isNum; + var isArray = sharedUtil.isArray; + var isLittleEndian = sharedUtil.isLittleEndian; + var error = sharedUtil.error; + var shadow = sharedUtil.shadow; + var warn = sharedUtil.warn; + var TilingPattern = displayPatternHelper.TilingPattern; + var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR; + var WebGLUtils = displayWebGL.WebGLUtils; + var hasCanvasTypedArrays = displayDOMUtils.hasCanvasTypedArrays; + var MIN_FONT_SIZE = 16; + var MAX_FONT_SIZE = 100; + var MAX_GROUP_SIZE = 4096; + var MIN_WIDTH_FACTOR = 0.65; + var COMPILE_TYPE3_GLYPHS = true; + var MAX_SIZE_TO_COMPILE = 1000; + var FULL_CHUNK_HEIGHT = 16; + var HasCanvasTypedArraysCached = { + get value() { + return shadow(HasCanvasTypedArraysCached, 'value', hasCanvasTypedArrays()); + } + }; + var IsLittleEndianCached = { + get value() { + return shadow(IsLittleEndianCached, 'value', isLittleEndian()); + } + }; + function createScratchCanvas(width, height) { + var canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + return canvas; + } + function addContextCurrentTransform(ctx) { + if (!ctx.mozCurrentTransform) { + 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._transformMatrix || [ + 1, + 0, + 0, + 1, + 0, + 0 + ]; + ctx._transformStack = []; + Object.defineProperty(ctx, 'mozCurrentTransform', { + get: function getCurrentTransform() { + return this._transformMatrix; + } + }); + Object.defineProperty(ctx, 'mozCurrentTransformInverse', { + get: function getCurrentTransformInverse() { + 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() { + function CachedCanvases() { + this.cache = Object.create(null); + } + CachedCanvases.prototype = { + getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) { + var canvasEntry; + if (this.cache[id] !== undefined) { + canvasEntry = this.cache[id]; + canvasEntry.canvas.width = width; + canvasEntry.canvas.height = height; + canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0); + } else { + var canvas = createScratchCanvas(width, height); + var ctx = canvas.getContext('2d'); + if (trackTransform) { + addContextCurrentTransform(ctx); + } + this.cache[id] = canvasEntry = { + canvas: canvas, + context: ctx + }; + } + return canvasEntry; + }, + clear: function () { + for (var id in this.cache) { + var canvasEntry = this.cache[id]; + canvasEntry.canvas.width = 0; + canvasEntry.canvas.height = 0; + delete this.cache[id]; + } + } + }; + return CachedCanvases; + }(); + 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 + ]); + var lineSize = width + 7 & ~7, data0 = imgData.data; + var data = new Uint8Array(lineSize * height), pos = 0, ii; + for (i = 0, ii = data0.length; i < ii; i++) { + var mask = 128, elem = data0[i]; + while (mask > 0) { + data[pos++] = elem & mask ? 0 : 255; + mask >>= 1; + } + } + var count = 0; + pos = 0; + if (data[pos] !== 0) { + points[0] = 1; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j] = data[pos] ? 2 : 1; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j] = 2; + ++count; + } + for (i = 1; i < height; i++) { + pos = i * lineSize; + j0 = i * width1; + if (data[pos - lineSize] !== data[pos]) { + points[j0] = data[pos] ? 1 : 8; + ++count; + } + var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); + for (j = 1; j < width; j++) { + sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); + if (POINT_TYPES[sum]) { + points[j0 + j] = POINT_TYPES[sum]; + ++count; + } + pos++; + } + if (data[pos - lineSize] !== data[pos]) { + points[j0 + j] = data[pos] ? 2 : 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + } + pos = lineSize * (height - 1); + j0 = i * width1; + if (data[pos] !== 0) { + points[j0] = 8; + ++count; + } + for (j = 1; j < width; j++) { + if (data[pos] !== data[pos + 1]) { + points[j0 + j] = data[pos] ? 4 : 8; + ++count; + } + pos++; + } + if (data[pos] !== 0) { + points[j0 + j] = 4; + ++count; + } + if (count > POINT_TO_PROCESS_LIMIT) { + return null; + } + 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) { + type = pp; + points[p] = 0; + } else { + type = pp & 0x33 * type >> 4; + 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(); + 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) { + this.alphaIsShape = false; + this.fontSize = 0; + this.fontSizeScale = 1; + this.textMatrix = IDENTITY_MATRIX; + this.textMatrixScale = 1; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.leading = 0; + this.x = 0; + this.y = 0; + this.lineX = 0; + this.lineY = 0; + this.charSpacing = 0; + this.wordSpacing = 0; + this.textHScale = 1; + this.textRenderingMode = TextRenderingMode.FILL; + this.textRise = 0; + this.fillColor = '#000000'; + this.strokeColor = '#000000'; + this.patternFill = false; + this.fillAlpha = 1; + this.strokeAlpha = 1; + this.lineWidth = 1; + this.activeSMask = null; + this.resumeSMaskCtx = null; + 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() { + var EXECUTION_TIME = 15; + var EXECUTION_STEPS = 10; + function CanvasGraphics(canvasCtx, commonObjs, objs, 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.imageLayer = imageLayer; + this.groupStack = []; + this.processingType3 = null; + this.baseTransform = null; + this.baseTransformStack = []; + this.groupLevel = 0; + this.smaskStack = []; + this.smaskCounter = 0; + this.tempSMask = null; + this.cachedCanvases = new CachedCanvases(); + if (canvasCtx) { + addContextCurrentTransform(canvasCtx); + } + this.cachedGetSinglePixelWidth = null; + } + function putBinaryImageData(ctx, imgData) { + if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) { + ctx.putImageData(imgData, 0, 0); + return; + } + var height = imgData.height, width = imgData.width; + var partialChunkHeight = height % FULL_CHUNK_HEIGHT; + var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + var srcPos = 0, destPos; + var src = imgData.data; + var dest = chunkImgData.data; + var i, j, thisChunkHeight, elemsInThisChunk; + if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { + var srcLength = src.byteLength; + var dest32 = HasCanvasTypedArraysCached.value ? new Uint32Array(dest.buffer) : new Uint32ArrayView(dest); + var dest32DataLength = dest32.length; + var fullSrcDiff = width + 7 >> 3; + var white = 0xFFFFFFFF; + var black = IsLittleEndianCached.value || !HasCanvasTypedArraysCached.value ? 0xFF000000 : 0x000000FF; + for (i = 0; i < totalChunks; i++) { + thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + destPos = 0; + for (j = 0; j < thisChunkHeight; j++) { + var srcDiff = srcLength - srcPos; + var k = 0; + var kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; + var kEndUnrolled = kEnd & ~7; + var mask = 0; + var srcByte = 0; + for (; k < kEndUnrolled; k += 8) { + srcByte = src[srcPos++]; + dest32[destPos++] = srcByte & 128 ? white : black; + dest32[destPos++] = srcByte & 64 ? white : black; + dest32[destPos++] = srcByte & 32 ? white : black; + dest32[destPos++] = srcByte & 16 ? white : black; + dest32[destPos++] = srcByte & 8 ? white : black; + dest32[destPos++] = srcByte & 4 ? white : black; + dest32[destPos++] = srcByte & 2 ? white : black; + dest32[destPos++] = srcByte & 1 ? white : black; + } + for (; k < kEnd; k++) { + if (mask === 0) { + srcByte = src[srcPos++]; + mask = 128; + } + dest32[destPos++] = srcByte & mask ? white : black; + mask >>= 1; + } + } + while (destPos < dest32DataLength) { + dest32[destPos++] = 0; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else if (imgData.kind === ImageKind.RGBA_32BPP) { + j = 0; + elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + ctx.putImageData(chunkImgData, 0, j); + } + } else if (imgData.kind === ImageKind.RGB_24BPP) { + thisChunkHeight = FULL_CHUNK_HEIGHT; + elemsInThisChunk = width * thisChunkHeight; + for (i = 0; i < totalChunks; i++) { + if (i >= fullChunks) { + thisChunkHeight = partialChunkHeight; + elemsInThisChunk = width * thisChunkHeight; + } + destPos = 0; + for (j = elemsInThisChunk; j--;) { + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = src[srcPos++]; + dest[destPos++] = 255; + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } else { + error('bad image kind: ' + imgData.kind); + } + } + function putBinaryImageMask(ctx, imgData) { + var height = imgData.height, width = imgData.width; + var partialChunkHeight = height % FULL_CHUNK_HEIGHT; + var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; + var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; + var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); + var srcPos = 0; + var src = imgData.data; + var dest = chunkImgData.data; + for (var i = 0; i < totalChunks; i++) { + var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; + var destPos = 3; + for (var j = 0; j < thisChunkHeight; j++) { + var mask = 0; + for (var k = 0; k < width; k++) { + if (!mask) { + var elem = src[srcPos++]; + mask = 128; + } + dest[destPos] = elem & mask ? 0 : 255; + destPos += 4; + mask >>= 1; + } + } + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } + } + 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 (sourceCtx[property] !== undefined) { + destCtx[property] = sourceCtx[property]; + } + } + if (sourceCtx.setLineDash !== undefined) { + destCtx.setLineDash(sourceCtx.getLineDash()); + destCtx.lineDashOffset = sourceCtx.lineDashOffset; + } + } + function composeSMaskBackdrop(bytes, r0, g0, b0) { + var length = bytes.length; + for (var i = 3; i < length; i += 4) { + var alpha = bytes[i]; + if (alpha === 0) { + bytes[i - 3] = r0; + bytes[i - 2] = g0; + bytes[i - 1] = b0; + } else if (alpha < 255) { + var alpha_ = 255 - alpha; + bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8; + bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8; + bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8; + } + } + } + function composeSMaskAlpha(maskData, layerData, transferMap) { + var length = maskData.length; + var scale = 1 / 255; + for (var i = 3; i < length; i += 4) { + var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; + layerData[i] = layerData[i] * alpha * scale | 0; + } + } + function composeSMaskLuminosity(maskData, layerData, transferMap) { + var length = maskData.length; + for (var i = 3; i < length; i += 4) { + var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28; + layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16; + } + } + function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) { + var hasBackdrop = !!backdrop; + var r0 = hasBackdrop ? backdrop[0] : 0; + var g0 = hasBackdrop ? backdrop[1] : 0; + var b0 = hasBackdrop ? backdrop[2] : 0; + var composeFn; + if (subtype === 'Luminosity') { + composeFn = composeSMaskLuminosity; + } else { + composeFn = composeSMaskAlpha; + } + var PIXELS_TO_PROCESS = 1048576; + var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); + for (var row = 0; row < height; row += chunkSize) { + var chunkHeight = Math.min(chunkSize, height - row); + var maskData = maskCtx.getImageData(0, row, width, chunkHeight); + var layerData = layerCtx.getImageData(0, row, width, chunkHeight); + if (hasBackdrop) { + composeSMaskBackdrop(maskData.data, r0, g0, b0); + } + composeFn(maskData.data, layerData.data, transferMap); + maskCtx.putImageData(layerData, 0, row); + } + } + function composeSMask(ctx, smask, layerCtx) { + var mask = smask.canvas; + var maskCtx = smask.context; + ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY); + var backdrop = smask.backdrop || null; + if (!smask.transferMap && WebGLUtils.isEnabled) { + var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask, { + subtype: smask.subtype, + backdrop: backdrop + }); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(composed, smask.offsetX, smask.offsetY); + return; + } + genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, smask.transferMap); + ctx.drawImage(mask, 0, 0); + } + var LINE_CAP_STYLES = [ + 'butt', + 'round', + 'square' + ]; + var LINE_JOIN_STYLES = [ + 'miter', + 'round', + 'bevel' + ]; + var NORMAL_CLIP = {}; + var EO_CLIP = {}; + CanvasGraphics.prototype = { + beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport, transparency) { + var width = this.ctx.canvas.width; + var height = this.ctx.canvas.height; + this.ctx.save(); + this.ctx.fillStyle = 'rgb(255, 255, 255)'; + this.ctx.fillRect(0, 0, width, height); + this.ctx.restore(); + if (transparency) { + var transparentCanvas = this.cachedCanvases.getCanvas('transparent', width, height, true); + this.compositeCtx = this.ctx; + this.transparentCanvas = transparentCanvas.canvas; + this.ctx = transparentCanvas.context; + this.ctx.save(); + this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform); + } + this.ctx.save(); + if (transform) { + this.ctx.transform.apply(this.ctx, transform); + } + this.ctx.transform.apply(this.ctx, viewport.transform); + this.baseTransform = this.ctx.mozCurrentTransform.slice(); + 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; + if (argsArrayLen === i) { + return i; + } + var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === 'function'; + var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; + var steps = 0; + var commonObjs = this.commonObjs; + var objs = this.objs; + var fnId; + while (true) { + if (stepper !== undefined && i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + fnId = fnArray[i]; + if (fnId !== OPS.dependency) { + this[fnId].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[0] === 'g' && depObjId[1] === '_'; + var objsPool = common ? commonObjs : objs; + if (!objsPool.isResolved(depObjId)) { + objsPool.get(depObjId, continueCallback); + return i; + } + } + } + i++; + if (i === argsArrayLen) { + return i; + } + if (chunkOperations && ++steps > EXECUTION_STEPS) { + if (Date.now() > endTime) { + continueCallback(); + return i; + } + steps = 0; + } + } + }, + endDrawing: function CanvasGraphics_endDrawing() { + if (this.current.activeSMask !== null) { + this.endSMaskGroup(); + } + this.ctx.restore(); + if (this.transparentCanvas) { + this.ctx = this.compositeCtx; + this.ctx.save(); + this.ctx.setTransform(1, 0, 0, 1, 0, 0); + this.ctx.drawImage(this.transparentCanvas, 0, 0); + this.ctx.restore(); + this.transparentCanvas = null; + } + this.cachedCanvases.clear(); + WebGLUtils.clear(); + if (this.imageLayer) { + this.imageLayer.endLayout(); + } + }, + 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 (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + }, + setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) { + }, + setFlatness: function CanvasGraphics_setFlatness(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; + case 'SMask': + if (this.current.activeSMask) { + if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) { + this.suspendSMaskGroup(); + } else { + this.endSMaskGroup(); + } + } + this.current.activeSMask = value ? this.tempSMask : null; + if (this.current.activeSMask) { + this.beginSMaskGroup(); + } + this.tempSMask = null; + break; + } + } + }, + beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { + var activeSMask = this.current.activeSMask; + var drawnWidth = activeSMask.canvas.width; + var drawnHeight = activeSMask.canvas.height; + var cacheId = 'smaskGroupAt' + this.groupLevel; + var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true); + var currentCtx = this.ctx; + var currentTransform = currentCtx.mozCurrentTransform; + this.ctx.save(); + var groupCtx = scratchCanvas.context; + groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); + groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); + groupCtx.transform.apply(groupCtx, currentTransform); + activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse; + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([ + [ + 'BM', + 'Normal' + ], + [ + 'ca', + 1 + ], + [ + 'CA', + 1 + ] + ]); + this.groupStack.push(currentCtx); + this.groupLevel++; + }, + suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() { + var groupCtx = this.ctx; + this.groupLevel--; + this.ctx = this.groupStack.pop(); + composeSMask(this.ctx, this.current.activeSMask, groupCtx); + this.ctx.restore(); + this.ctx.save(); + copyCtxState(groupCtx, this.ctx); + this.current.resumeSMaskCtx = groupCtx; + var deltaTransform = Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); + this.ctx.transform.apply(this.ctx, deltaTransform); + groupCtx.save(); + groupCtx.setTransform(1, 0, 0, 1, 0, 0); + groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height); + groupCtx.restore(); + }, + resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() { + var groupCtx = this.current.resumeSMaskCtx; + var currentCtx = this.ctx; + this.ctx = groupCtx; + this.groupStack.push(currentCtx); + this.groupLevel++; + }, + endSMaskGroup: function CanvasGraphics_endSMaskGroup() { + var groupCtx = this.ctx; + this.groupLevel--; + this.ctx = this.groupStack.pop(); + composeSMask(this.ctx, this.current.activeSMask, groupCtx); + this.ctx.restore(); + copyCtxState(groupCtx, this.ctx); + var deltaTransform = Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform); + this.ctx.transform.apply(this.ctx, deltaTransform); + }, + save: function CanvasGraphics_save() { + this.ctx.save(); + var old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + this.current.resumeSMaskCtx = null; + }, + restore: function CanvasGraphics_restore() { + if (this.current.resumeSMaskCtx) { + this.resumeSMaskGroup(); + } + if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) { + this.endSMaskGroup(); + } + if (this.stateStack.length !== 0) { + this.current = this.stateStack.pop(); + this.ctx.restore(); + this.pendingClip = null; + this.cachedGetSinglePixelWidth = null; + } + }, + transform: function CanvasGraphics_transform(a, b, c, d, e, f) { + this.ctx.transform(a, b, c, d, e, f); + this.cachedGetSinglePixelWidth = null; + }, + constructPath: function CanvasGraphics_constructPath(ops, args) { + var ctx = this.ctx; + var current = this.current; + var x = current.x, y = current.y; + for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { + switch (ops[i] | 0) { + case OPS.rectangle: + x = args[j++]; + y = args[j++]; + var width = args[j++]; + var height = args[j++]; + if (width === 0) { + width = this.getSinglePixelWidth(); + } + if (height === 0) { + height = this.getSinglePixelWidth(); + } + var xw = x + width; + var yh = y + height; + this.ctx.moveTo(x, y); + this.ctx.lineTo(xw, y); + this.ctx.lineTo(xw, yh); + this.ctx.lineTo(x, yh); + this.ctx.lineTo(x, y); + this.ctx.closePath(); + break; + case OPS.moveTo: + x = args[j++]; + y = args[j++]; + ctx.moveTo(x, y); + break; + case OPS.lineTo: + x = args[j++]; + y = args[j++]; + ctx.lineTo(x, y); + break; + case OPS.curveTo: + x = args[j + 4]; + y = args[j + 5]; + ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); + j += 6; + break; + case OPS.curveTo2: + ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); + x = args[j + 2]; + y = args[j + 3]; + j += 4; + break; + case OPS.curveTo3: + x = args[j + 2]; + y = args[j + 3]; + ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); + j += 4; + break; + case OPS.closePath: + ctx.closePath(); + break; + } + } + current.setCurrentPoint(x, y); + }, + closePath: function CanvasGraphics_closePath() { + this.ctx.closePath(); + }, + stroke: function CanvasGraphics_stroke(consumePath) { + consumePath = typeof consumePath !== 'undefined' ? consumePath : true; + var ctx = this.ctx; + var strokeColor = this.current.strokeColor; + ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth); + ctx.globalAlpha = this.current.strokeAlpha; + if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') { + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this); + ctx.stroke(); + ctx.restore(); + } else { + ctx.stroke(); + } + if (consumePath) { + this.consumePath(); + } + 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 isPatternFill = this.current.patternFill; + var needRestore = false; + if (isPatternFill) { + ctx.save(); + if (this.baseTransform) { + ctx.setTransform.apply(ctx, this.baseTransform); + } + ctx.fillStyle = fillColor.getPattern(ctx, this); + needRestore = true; + } + if (this.pendingEOFill) { + if (ctx.mozFillRule !== undefined) { + ctx.mozFillRule = 'evenodd'; + ctx.fill(); + ctx.mozFillRule = 'nonzero'; + } else { + ctx.fill('evenodd'); + } + this.pendingEOFill = false; + } else { + 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(); + }, + clip: function CanvasGraphics_clip() { + this.pendingClip = NORMAL_CLIP; + }, + eoClip: function CanvasGraphics_eoClip() { + this.pendingClip = EO_CLIP; + }, + beginText: function CanvasGraphics_beginText() { + this.current.textMatrix = IDENTITY_MATRIX; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + }, + endText: function CanvasGraphics_endText() { + var paths = this.pendingTextPaths; + var ctx = this.ctx; + if (paths === undefined) { + ctx.beginPath(); + return; + } + 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; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + warn('Invalid font matrix for font ' + fontRefName); + } + if (size < 0) { + size = -size; + current.fontDirection = -1; + } else { + current.fontDirection = 1; + } + this.current.font = fontObj; + this.current.fontSize = size; + if (fontObj.isType3Font) { + return; + } + var name = fontObj.loadedName || 'sans-serif'; + var bold = fontObj.black ? '900' : fontObj.bold ? 'bold' : 'normal'; + var italic = fontObj.italic ? 'italic' : 'normal'; + var typeface = '"' + name + '", ' + fontObj.fallbackName; + var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size; + this.current.fontSizeScale = size / browserFontSize; + 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.textMatrixScale = Math.sqrt(a * a + b * b); + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + }, + nextLine: function CanvasGraphics_nextLine() { + this.moveText(0, this.current.leading); + }, + paintChar: function CanvasGraphics_paintChar(character, x, y) { + var ctx = this.ctx; + var current = this.current; + var font = current.font; + var textRenderingMode = current.textRenderingMode; + var fontSize = current.fontSize / current.fontSizeScale; + var fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + var isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + var addToPath; + if (font.disableFontFace || isAddToPathSet) { + addToPath = font.getPathGenerator(this.commonObjs, 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 + }); + } + }, + get isFontSubpixelAAEnabled() { + var ctx = document.createElement('canvas').getContext('2d'); + ctx.scale(1.5, 1); + ctx.fillText('I', 0, 10); + var data = ctx.getImageData(0, 0, 10, 10).data; + var enabled = false; + for (var i = 3; i < data.length; i += 4) { + if (data[i] > 0 && data[i] < 255) { + enabled = true; + break; + } + } + return shadow(this, 'isFontSubpixelAAEnabled', enabled); + }, + showText: function CanvasGraphics_showText(glyphs) { + var current = this.current; + var font = current.font; + if (font.isType3Font) { + return this.showType3Text(glyphs); + } + var fontSize = current.fontSize; + if (fontSize === 0) { + return; + } + var ctx = this.ctx; + var fontSizeScale = current.fontSizeScale; + var charSpacing = current.charSpacing; + var wordSpacing = current.wordSpacing; + var fontDirection = current.fontDirection; + var textHScale = current.textHScale * fontDirection; + var glyphsLength = glyphs.length; + var vertical = font.vertical; + var spacingDir = vertical ? 1 : -1; + var defaultVMetrics = font.defaultVMetrics; + var widthAdvanceScale = fontSize * current.fontMatrix[0]; + var simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace; + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.translate(current.x, current.y + current.textRise); + if (current.patternFill) { + ctx.fillStyle = current.fillColor.getPattern(ctx, this); + } + if (fontDirection > 0) { + ctx.scale(textHScale, -1); + } else { + ctx.scale(textHScale, 1); + } + var lineWidth = current.lineWidth; + var scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + var fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + this.cachedGetSinglePixelWidth = null; + lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; + } + } else { + lineWidth /= scale; + } + if (fontSizeScale !== 1.0) { + ctx.scale(fontSizeScale, fontSizeScale); + lineWidth /= fontSizeScale; + } + ctx.lineWidth = lineWidth; + var x = 0, i; + for (i = 0; i < glyphsLength; ++i) { + var glyph = glyphs[i]; + if (isNum(glyph)) { + x += spacingDir * glyph * fontSize / 1000; + continue; + } + var restoreNeeded = false; + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + var character = glyph.fontChar; + var accent = glyph.accent; + var scaledX, scaledY, scaledAccentX, scaledAccentY; + var width = glyph.width; + if (vertical) { + var vmetric, vx, vy; + vmetric = glyph.vmetric || defaultVMetrics; + vx = glyph.vmetric ? vmetric[1] : width * 0.5; + vx = -vx * widthAdvanceScale; + vy = vmetric[2] * widthAdvanceScale; + width = vmetric ? -vmetric[0] : width; + scaledX = vx / fontSizeScale; + scaledY = (x + vy) / fontSizeScale; + } else { + scaledX = x / fontSizeScale; + scaledY = 0; + } + if (font.remeasure && width > 0) { + var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; + if (width < measuredWidth && this.isFontSubpixelAAEnabled) { + var characterScaleX = width / measuredWidth; + restoreNeeded = true; + ctx.save(); + ctx.scale(characterScaleX, 1); + scaledX /= characterScaleX; + } else if (width !== measuredWidth) { + scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; + } + } + if (glyph.isInFont || font.missingFile) { + if (simpleFillText && !accent) { + ctx.fillText(character, scaledX, scaledY); + } else { + 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); + } + } + } + var charWidth = width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x * textHScale; + } else { + current.x += x * textHScale; + } + ctx.restore(); + }, + showType3Text: function CanvasGraphics_showType3Text(glyphs) { + var ctx = this.ctx; + var current = this.current; + var font = current.font; + var fontSize = current.fontSize; + var fontDirection = current.fontDirection; + var spacingDir = font.vertical ? 1 : -1; + var charSpacing = current.charSpacing; + var wordSpacing = current.wordSpacing; + var textHScale = current.textHScale * fontDirection; + var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; + var glyphsLength = glyphs.length; + var isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + var i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this.cachedGetSinglePixelWidth = null; + ctx.save(); + ctx.transform.apply(ctx, current.textMatrix); + ctx.translate(current.x, current.y); + ctx.scale(textHScale, fontDirection); + for (i = 0; i < glyphsLength; ++i) { + glyph = glyphs[i]; + if (isNum(glyph)) { + spacingLength = spacingDir * glyph * fontSize / 1000; + this.ctx.translate(spacingLength, 0); + current.x += spacingLength * textHScale; + continue; + } + var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; + var operatorList = font.charProcOperatorList[glyph.operatorListId]; + if (!operatorList) { + warn('Type3 character \"' + glyph.operatorListId + '\" is not available'); + continue; + } + this.processingType3 = glyph; + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform.apply(ctx, fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + var transformed = Util.applyTransform([ + glyph.width, + 0 + ], fontMatrix); + width = transformed[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + this.processingType3 = null; + }, + setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) { + }, + setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { + this.ctx.rect(llx, lly, urx - llx, ury - lly); + this.clip(); + this.endPath(); + }, + getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { + var pattern; + if (IR[0] === 'TilingPattern') { + var color = IR[1]; + var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice(); + var self = this; + var canvasGraphicsFactory = { + createCanvasGraphics: function (ctx) { + return new CanvasGraphics(ctx, self.commonObjs, self.objs); + } + }; + pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = getShadingPatternFromIR(IR); + } + return pattern; + }, + setStrokeColorN: function CanvasGraphics_setStrokeColorN() { + this.current.strokeColor = this.getColorN_Pattern(arguments); + }, + setFillColorN: function CanvasGraphics_setFillColorN() { + this.current.fillColor = this.getColorN_Pattern(arguments); + this.current.patternFill = true; + }, + setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { + var color = Util.makeCssRgb(r, g, b); + this.ctx.strokeStyle = color; + this.current.strokeColor = color; + }, + setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { + var color = Util.makeCssRgb(r, g, b); + this.ctx.fillStyle = color; + this.current.fillColor = color; + this.current.patternFill = false; + }, + shadingFill: function CanvasGraphics_shadingFill(patternIR) { + var ctx = this.ctx; + this.save(); + var pattern = getShadingPatternFromIR(patternIR); + ctx.fillStyle = pattern.getPattern(ctx, this, true); + 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); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.restore(); + }, + 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.baseTransformStack.push(this.baseTransform); + if (isArray(matrix) && matrix.length === 6) { + this.transform.apply(this, matrix); + } + this.baseTransform = this.ctx.mozCurrentTransform; + if (isArray(bbox) && bbox.length === 4) { + var width = bbox[2] - bbox[0]; + var height = bbox[3] - bbox[1]; + this.ctx.rect(bbox[0], bbox[1], width, height); + this.clip(); + this.endPath(); + } + }, + paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { + this.restore(); + this.baseTransform = this.baseTransformStack.pop(); + }, + beginGroup: function CanvasGraphics_beginGroup(group) { + this.save(); + var currentCtx = this.ctx; + if (!group.isolated) { + info('TODO: Support non-isolated groups.'); + } + if (group.knockout) { + warn('Knockout groups not supported.'); + } + var currentTransform = currentCtx.mozCurrentTransform; + if (group.matrix) { + currentCtx.transform.apply(currentCtx, group.matrix); + } + assert(group.bbox, 'Bounding box is required.'); + var bounds = Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform); + var canvasBounds = [ + 0, + 0, + currentCtx.canvas.width, + currentCtx.canvas.height + ]; + bounds = Util.intersect(bounds, canvasBounds) || [ + 0, + 0, + 0, + 0 + ]; + var offsetX = Math.floor(bounds[0]); + var offsetY = Math.floor(bounds[1]); + var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + var scaleX = 1, scaleY = 1; + if (drawnWidth > MAX_GROUP_SIZE) { + scaleX = drawnWidth / MAX_GROUP_SIZE; + drawnWidth = MAX_GROUP_SIZE; + } + if (drawnHeight > MAX_GROUP_SIZE) { + scaleY = drawnHeight / MAX_GROUP_SIZE; + drawnHeight = MAX_GROUP_SIZE; + } + var cacheId = 'groupAt' + this.groupLevel; + if (group.smask) { + cacheId += '_smask_' + this.smaskCounter++ % 2; + } + var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true); + var groupCtx = scratchCanvas.context; + groupCtx.scale(1 / scaleX, 1 / scaleY); + groupCtx.translate(-offsetX, -offsetY); + groupCtx.transform.apply(groupCtx, currentTransform); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX: offsetX, + offsetY: offsetY, + scaleX: scaleX, + scaleY: scaleY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } else + { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.scale(scaleX, scaleY); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.setGState([ + [ + 'BM', + 'Normal' + ], + [ + 'ca', + 1 + ], + [ + 'CA', + 1 + ] + ]); + this.groupStack.push(currentCtx); + this.groupLevel++; + this.current.activeSMask = null; + }, + endGroup: function CanvasGraphics_endGroup(group) { + this.groupLevel--; + var groupCtx = this.ctx; + this.ctx = this.groupStack.pop(); + if (this.ctx.imageSmoothingEnabled !== undefined) { + this.ctx.imageSmoothingEnabled = false; + } else { + this.ctx.mozImageSmoothingEnabled = false; + } + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + } else { + this.ctx.drawImage(groupCtx.canvas, 0, 0); + } + this.restore(); + }, + beginAnnotations: function CanvasGraphics_beginAnnotations() { + this.save(); + this.current = new CanvasExtraState(); + if (this.baseTransform) { + this.ctx.setTransform.apply(this.ctx, this.baseTransform); + } + }, + endAnnotations: function CanvasGraphics_endAnnotations() { + this.restore(); + }, + beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) { + this.save(); + if (isArray(rect) && rect.length === 4) { + var width = rect[2] - rect[0]; + var height = rect[3] - rect[1]; + this.ctx.rect(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) { + warn('Dependent image isn\'t ready yet'); + return; + } + this.save(); + var ctx = this.ctx; + 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 fillColor = this.current.fillColor; + var isPatternFill = this.current.patternFill; + var glyph = this.processingType3; + if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { + 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 = this.cachedCanvases.getCanvas('maskCanvas', width, height); + var maskCtx = maskCanvas.context; + maskCtx.save(); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = 'source-in'; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + this.paintInlineImageXObject(maskCanvas.canvas); + }, + paintImageMaskXObjectRepeat: function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, scaleY, positions) { + var width = imgData.width; + var height = imgData.height; + var fillColor = this.current.fillColor; + var isPatternFill = this.current.patternFill; + var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height); + var maskCtx = maskCanvas.context; + maskCtx.save(); + putBinaryImageMask(maskCtx, imgData); + maskCtx.globalCompositeOperation = 'source-in'; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + var ctx = this.ctx; + for (var i = 0, ii = positions.length; i < ii; i += 2) { + ctx.save(); + ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); + ctx.scale(1, -1); + ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + }, + paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) { + var ctx = this.ctx; + var fillColor = this.current.fillColor; + var isPatternFill = this.current.patternFill; + for (var i = 0, ii = images.length; i < ii; i++) { + var image = images[i]; + var width = image.width, height = image.height; + var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height); + var maskCtx = maskCanvas.context; + maskCtx.save(); + putBinaryImageMask(maskCtx, image); + maskCtx.globalCompositeOperation = 'source-in'; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor; + maskCtx.fillRect(0, 0, width, height); + maskCtx.restore(); + ctx.save(); + ctx.transform.apply(ctx, image.transform); + ctx.scale(1, -1); + ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); + ctx.restore(); + } + }, + paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { + var imgData = this.objs.get(objId); + if (!imgData) { + warn('Dependent image isn\'t ready yet'); + return; + } + this.paintInlineImageXObject(imgData); + }, + paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { + var imgData = this.objs.get(objId); + if (!imgData) { + warn('Dependent image isn\'t ready yet'); + return; + } + var width = imgData.width; + var height = imgData.height; + var map = []; + for (var i = 0, ii = positions.length; i < ii; i += 2) { + map.push({ + transform: [ + scaleX, + 0, + 0, + scaleY, + positions[i], + positions[i + 1] + ], + x: 0, + y: 0, + w: width, + h: height + }); + } + this.paintInlineImageXObjectGroup(imgData, map); + }, + paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) { + var width = imgData.width; + var height = imgData.height; + var ctx = this.ctx; + this.save(); + 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, tmpCanvas; + if (imgData instanceof HTMLElement || !imgData.data) { + imgToPaint = imgData; + } else { + tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', width, height); + var tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = tmpCanvas.canvas; + } + var paintWidth = width, paintHeight = height; + var tmpCanvasId = 'prescale1'; + 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; + } + tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); + tmpCtx = tmpCanvas.context; + tmpCtx.clearRect(0, 0, newWidth, newHeight); + tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); + imgToPaint = tmpCanvas.canvas; + 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 = this.cachedCanvases.getCanvas('inlineImage', w, h); + var tmpCtx = tmpCanvas.context; + 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.canvas, 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(); + } + }, + paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() { + this.ctx.fillRect(0, 0, 1, 1); + }, + paintXObject: function CanvasGraphics_paintXObject() { + warn('Unsupported \'paintXObject\' command.'); + }, + markPoint: function CanvasGraphics_markPoint(tag) { + }, + markPointProps: function CanvasGraphics_markPointProps(tag, properties) { + }, + beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) { + }, + beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) { + }, + endMarkedContent: function CanvasGraphics_endMarkedContent() { + }, + beginCompat: function CanvasGraphics_beginCompat() { + }, + endCompat: function CanvasGraphics_endCompat() { + }, + consumePath: function CanvasGraphics_consumePath() { + var ctx = this.ctx; + if (this.pendingClip) { + if (this.pendingClip === EO_CLIP) { + if (ctx.mozFillRule !== undefined) { + ctx.mozFillRule = 'evenodd'; + ctx.clip(); + ctx.mozFillRule = 'nonzero'; + } else { + ctx.clip('evenodd'); + } + } else { + ctx.clip(); + } + this.pendingClip = null; + } + ctx.beginPath(); + }, + getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { + if (this.cachedGetSinglePixelWidth === null) { + this.ctx.save(); + var inverse = this.ctx.mozCurrentTransformInverse; + this.ctx.restore(); + this.cachedGetSinglePixelWidth = Math.sqrt(Math.max(inverse[0] * inverse[0] + inverse[1] * inverse[1], inverse[2] * inverse[2] + inverse[3] * inverse[3])); + } + return this.cachedGetSinglePixelWidth; + }, + 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] + ]; + } + }; + for (var op in OPS) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } + return CanvasGraphics; + }(); + exports.CanvasGraphics = CanvasGraphics; + exports.createScratchCanvas = createScratchCanvas; + })); + (function (root, factory) { + factory(root.pdfjsDisplayAPI = {}, root.pdfjsSharedUtil, root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas, root.pdfjsDisplayMetadata, root.pdfjsDisplayDOMUtils); + }(this, function (exports, sharedUtil, displayFontLoader, displayCanvas, displayMetadata, displayDOMUtils, amdRequire) { + var InvalidPDFException = sharedUtil.InvalidPDFException; + var MessageHandler = sharedUtil.MessageHandler; + var MissingPDFException = sharedUtil.MissingPDFException; + var PageViewport = sharedUtil.PageViewport; + var PasswordResponses = sharedUtil.PasswordResponses; + var PasswordException = sharedUtil.PasswordException; + var StatTimer = sharedUtil.StatTimer; + var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; + var UnknownErrorException = sharedUtil.UnknownErrorException; + var Util = sharedUtil.Util; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var error = sharedUtil.error; + var deprecated = sharedUtil.deprecated; + var getVerbosityLevel = sharedUtil.getVerbosityLevel; + var info = sharedUtil.info; + var isInt = sharedUtil.isInt; + var isArray = sharedUtil.isArray; + var isArrayBuffer = sharedUtil.isArrayBuffer; + var isSameOrigin = sharedUtil.isSameOrigin; + var loadJpegStream = sharedUtil.loadJpegStream; + var stringToBytes = sharedUtil.stringToBytes; + var globalScope = sharedUtil.globalScope; + var warn = sharedUtil.warn; + var FontFaceObject = displayFontLoader.FontFaceObject; + var FontLoader = displayFontLoader.FontLoader; + var CanvasGraphics = displayCanvas.CanvasGraphics; + var createScratchCanvas = displayCanvas.createScratchCanvas; + var Metadata = displayMetadata.Metadata; + var getDefaultSetting = displayDOMUtils.getDefaultSetting; + var DEFAULT_RANGE_CHUNK_SIZE = 65536; + var isWorkerDisabled = false; + var workerSrc; + var isPostMessageTransfersDisabled = false; + var fakeWorkerFilesLoader = null; + var useRequireEnsure = false; + if (typeof window === 'undefined') { + isWorkerDisabled = true; + if (typeof require.ensure === 'undefined') { + require.ensure = require('node-ensure'); + } + useRequireEnsure = true; + } + if (typeof __webpack_require__ !== 'undefined') { + useRequireEnsure = true; + } + if (typeof requirejs !== 'undefined' && requirejs.toUrl) { + workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); + } + var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load; + fakeWorkerFilesLoader = useRequireEnsure ? function (callback) { + require.ensure([], function () { + var worker = require('./pdf.worker.js'); + callback(worker.WorkerMessageHandler); + }); + } : dynamicLoaderSupported ? function (callback) { + requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) { + callback(worker.WorkerMessageHandler); + }); + } : null; + function getDocument(src, pdfDataRangeTransport, passwordCallback, progressCallback) { + var task = new PDFDocumentLoadingTask(); + if (arguments.length > 1) { + deprecated('getDocument is called with pdfDataRangeTransport, ' + 'passwordCallback or progressCallback argument'); + } + if (pdfDataRangeTransport) { + if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) { + pdfDataRangeTransport = Object.create(pdfDataRangeTransport); + pdfDataRangeTransport.length = src.length; + pdfDataRangeTransport.initialData = src.initialData; + if (!pdfDataRangeTransport.abort) { + pdfDataRangeTransport.abort = function () { + }; + } + } + src = Object.create(src); + src.range = pdfDataRangeTransport; + } + task.onPassword = passwordCallback || null; + task.onProgress = progressCallback || null; + var source; + if (typeof src === 'string') { + source = { url: src }; + } else if (isArrayBuffer(src)) { + source = { data: src }; + } else if (src instanceof PDFDataRangeTransport) { + source = { range: src }; + } else { + if (typeof src !== 'object') { + error('Invalid parameter in getDocument, need either Uint8Array, ' + 'string or a parameter object'); + } + if (!src.url && !src.data && !src.range) { + error('Invalid parameter object: need either .data, .range or .url'); + } + source = src; + } + var params = {}; + var rangeTransport = null; + var worker = null; + for (var key in source) { + if (key === 'url' && typeof window !== 'undefined') { + params[key] = new URL(source[key], window.location).href; + continue; + } else if (key === 'range') { + rangeTransport = source[key]; + continue; + } else if (key === 'worker') { + worker = source[key]; + continue; + } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { + var pdfBytes = source[key]; + if (typeof pdfBytes === 'string') { + params[key] = stringToBytes(pdfBytes); + } else if (typeof pdfBytes === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) { + params[key] = new Uint8Array(pdfBytes); + } else if (isArrayBuffer(pdfBytes)) { + params[key] = new Uint8Array(pdfBytes); + } else { + error('Invalid PDF binary data: either typed array, string or ' + 'array-like object is expected in the data property.'); + } + continue; + } + params[key] = source[key]; + } + params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; + if (!worker) { + worker = new PDFWorker(); + task._worker = worker; + } + var docId = task.docId; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error('Loading aborted'); + } + return _fetchDocument(worker, params, rangeTransport, docId).then(function (workerId) { + if (task.destroyed) { + throw new Error('Loading aborted'); + } + var messageHandler = new MessageHandler(docId, workerId, worker.port); + var transport = new WorkerTransport(messageHandler, task, rangeTransport); + task._transport = transport; + messageHandler.send('Ready', null); + }); + }).catch(task._capability.reject); + return task; + } + function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { + if (worker.destroyed) { + return Promise.reject(new Error('Worker was destroyed')); + } + source.disableAutoFetch = getDefaultSetting('disableAutoFetch'); + source.disableStream = getDefaultSetting('disableStream'); + source.chunkedViewerLoading = !!pdfDataRangeTransport; + if (pdfDataRangeTransport) { + source.length = pdfDataRangeTransport.length; + source.initialData = pdfDataRangeTransport.initialData; + } + return worker.messageHandler.sendWithPromise('GetDocRequest', { + docId: docId, + source: source, + disableRange: getDefaultSetting('disableRange'), + maxImageSize: getDefaultSetting('maxImageSize'), + cMapUrl: getDefaultSetting('cMapUrl'), + cMapPacked: getDefaultSetting('cMapPacked'), + disableFontFace: getDefaultSetting('disableFontFace'), + disableCreateObjectURL: getDefaultSetting('disableCreateObjectURL'), + postMessageTransfers: getDefaultSetting('postMessageTransfers') && !isPostMessageTransfersDisabled, + docBaseUrl: source.docBaseUrl + }).then(function (workerId) { + if (worker.destroyed) { + throw new Error('Worker was destroyed'); + } + return workerId; + }); + } + var PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() { + var nextDocumentId = 0; + function PDFDocumentLoadingTask() { + this._capability = createPromiseCapability(); + this._transport = null; + this._worker = null; + this.docId = 'd' + nextDocumentId++; + this.destroyed = false; + this.onPassword = null; + this.onProgress = null; + this.onUnsupportedFeature = null; + } + PDFDocumentLoadingTask.prototype = { + get promise() { + return this._capability.promise; + }, + destroy: function () { + this.destroyed = true; + var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy(); + return transportDestroyed.then(function () { + this._transport = null; + if (this._worker) { + this._worker.destroy(); + this._worker = null; + } + }.bind(this)); + }, + then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) { + return this.promise.then.apply(this.promise, arguments); + } + }; + return PDFDocumentLoadingTask; + }(); + var PDFDataRangeTransport = function pdfDataRangeTransportClosure() { + function PDFDataRangeTransport(length, initialData) { + this.length = length; + this.initialData = initialData; + this._rangeListeners = []; + this._progressListeners = []; + this._progressiveReadListeners = []; + this._readyCapability = createPromiseCapability(); + } + PDFDataRangeTransport.prototype = { + addRangeListener: function PDFDataRangeTransport_addRangeListener(listener) { + this._rangeListeners.push(listener); + }, + addProgressListener: function PDFDataRangeTransport_addProgressListener(listener) { + this._progressListeners.push(listener); + }, + addProgressiveReadListener: function PDFDataRangeTransport_addProgressiveReadListener(listener) { + this._progressiveReadListeners.push(listener); + }, + onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) { + var listeners = this._rangeListeners; + for (var i = 0, n = listeners.length; i < n; ++i) { + listeners[i](begin, chunk); + } + }, + onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) { + this._readyCapability.promise.then(function () { + var listeners = this._progressListeners; + for (var i = 0, n = listeners.length; i < n; ++i) { + listeners[i](loaded); + } + }.bind(this)); + }, + onDataProgressiveRead: function PDFDataRangeTransport_onDataProgress(chunk) { + this._readyCapability.promise.then(function () { + var listeners = this._progressiveReadListeners; + for (var i = 0, n = listeners.length; i < n; ++i) { + listeners[i](chunk); + } + }.bind(this)); + }, + transportReady: function PDFDataRangeTransport_transportReady() { + this._readyCapability.resolve(); + }, + requestDataRange: function PDFDataRangeTransport_requestDataRange(begin, end) { + throw new Error('Abstract method PDFDataRangeTransport.requestDataRange'); + }, + abort: function PDFDataRangeTransport_abort() { + } + }; + return PDFDataRangeTransport; + }(); + var PDFDocumentProxy = function PDFDocumentProxyClosure() { + function PDFDocumentProxy(pdfInfo, transport, loadingTask) { + this.pdfInfo = pdfInfo; + this.transport = transport; + this.loadingTask = loadingTask; + } + PDFDocumentProxy.prototype = { + get numPages() { + return this.pdfInfo.numPages; + }, + get fingerprint() { + return this.pdfInfo.fingerprint; + }, + getPage: function PDFDocumentProxy_getPage(pageNumber) { + return this.transport.getPage(pageNumber); + }, + getPageIndex: function PDFDocumentProxy_getPageIndex(ref) { + return this.transport.getPageIndex(ref); + }, + getDestinations: function PDFDocumentProxy_getDestinations() { + return this.transport.getDestinations(); + }, + getDestination: function PDFDocumentProxy_getDestination(id) { + return this.transport.getDestination(id); + }, + getPageLabels: function PDFDocumentProxy_getPageLabels() { + return this.transport.getPageLabels(); + }, + getAttachments: function PDFDocumentProxy_getAttachments() { + return this.transport.getAttachments(); + }, + getJavaScript: function PDFDocumentProxy_getJavaScript() { + return this.transport.getJavaScript(); + }, + getOutline: function PDFDocumentProxy_getOutline() { + return this.transport.getOutline(); + }, + getMetadata: function PDFDocumentProxy_getMetadata() { + return this.transport.getMetadata(); + }, + getData: function PDFDocumentProxy_getData() { + return this.transport.getData(); + }, + getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() { + return this.transport.downloadInfoCapability.promise; + }, + getStats: function PDFDocumentProxy_getStats() { + return this.transport.getStats(); + }, + cleanup: function PDFDocumentProxy_cleanup() { + this.transport.startCleanup(); + }, + destroy: function PDFDocumentProxy_destroy() { + return this.loadingTask.destroy(); + } + }; + return PDFDocumentProxy; + }(); + var PDFPageProxy = function PDFPageProxyClosure() { + function PDFPageProxy(pageIndex, pageInfo, transport) { + this.pageIndex = pageIndex; + this.pageInfo = pageInfo; + this.transport = transport; + this.stats = new StatTimer(); + this.stats.enabled = getDefaultSetting('enableStats'); + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this.cleanupAfterRender = false; + this.pendingCleanup = false; + this.intentStates = Object.create(null); + this.destroyed = false; + } + PDFPageProxy.prototype = { + get pageNumber() { + return this.pageIndex + 1; + }, + get rotate() { + return this.pageInfo.rotate; + }, + get ref() { + return this.pageInfo.ref; + }, + get userUnit() { + return this.pageInfo.userUnit; + }, + get view() { + return this.pageInfo.view; + }, + getViewport: function PDFPageProxy_getViewport(scale, rotate) { + if (arguments.length < 2) { + rotate = this.rotate; + } + return new PageViewport(this.view, scale, rotate, 0, 0); + }, + getAnnotations: function PDFPageProxy_getAnnotations(params) { + var intent = params && params.intent || null; + if (!this.annotationsPromise || this.annotationsIntent !== intent) { + this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, intent); + this.annotationsIntent = intent; + } + return this.annotationsPromise; + }, + render: function PDFPageProxy_render(params) { + var stats = this.stats; + stats.time('Overall'); + this.pendingCleanup = false; + var renderingIntent = params.intent === 'print' ? 'print' : 'display'; + var renderInteractiveForms = params.renderInteractiveForms === true ? true : false; + if (!this.intentStates[renderingIntent]) { + this.intentStates[renderingIntent] = Object.create(null); + } + var intentState = this.intentStates[renderingIntent]; + if (!intentState.displayReadyCapability) { + intentState.receivingOperatorList = true; + intentState.displayReadyCapability = createPromiseCapability(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false + }; + this.stats.time('Page Request'); + this.transport.messageHandler.send('RenderPageRequest', { + pageIndex: this.pageNumber - 1, + intent: renderingIntent, + renderInteractiveForms: renderInteractiveForms + }); + } + var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber); + internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print'; + if (!intentState.renderTasks) { + intentState.renderTasks = []; + } + intentState.renderTasks.push(internalRenderTask); + var renderTask = internalRenderTask.task; + if (params.continueCallback) { + deprecated('render is used with continueCallback parameter'); + renderTask.onContinue = params.continueCallback; + } + var self = this; + intentState.displayReadyCapability.promise.then(function pageDisplayReadyPromise(transparency) { + if (self.pendingCleanup) { + complete(); + return; + } + stats.time('Rendering'); + internalRenderTask.initializeGraphics(transparency); + internalRenderTask.operatorListChanged(); + }, function pageDisplayReadPromiseError(reason) { + complete(reason); + }); + function complete(error) { + var i = intentState.renderTasks.indexOf(internalRenderTask); + if (i >= 0) { + intentState.renderTasks.splice(i, 1); + } + if (self.cleanupAfterRender) { + self.pendingCleanup = true; + } + self._tryCleanup(); + if (error) { + internalRenderTask.capability.reject(error); + } else { + internalRenderTask.capability.resolve(); + } + stats.timeEnd('Rendering'); + stats.timeEnd('Overall'); + } + return renderTask; + }, + getOperatorList: function PDFPageProxy_getOperatorList() { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + var i = intentState.renderTasks.indexOf(opListTask); + if (i >= 0) { + intentState.renderTasks.splice(i, 1); + } + } + } + var renderingIntent = 'oplist'; + if (!this.intentStates[renderingIntent]) { + this.intentStates[renderingIntent] = Object.create(null); + } + var intentState = this.intentStates[renderingIntent]; + var opListTask; + if (!intentState.opListReadCapability) { + opListTask = {}; + opListTask.operatorListChanged = operatorListChanged; + intentState.receivingOperatorList = true; + intentState.opListReadCapability = createPromiseCapability(); + intentState.renderTasks = []; + intentState.renderTasks.push(opListTask); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false + }; + this.transport.messageHandler.send('RenderPageRequest', { + pageIndex: this.pageIndex, + intent: renderingIntent + }); + } + return intentState.opListReadCapability.promise; + }, + getTextContent: function PDFPageProxy_getTextContent(params) { + return this.transport.messageHandler.sendWithPromise('GetTextContent', { + pageIndex: this.pageNumber - 1, + normalizeWhitespace: params && params.normalizeWhitespace === true ? true : false, + combineTextItems: params && params.disableCombineTextItems === true ? false : true + }); + }, + _destroy: function PDFPageProxy_destroy() { + this.destroyed = true; + this.transport.pageCache[this.pageIndex] = null; + var waitOn = []; + Object.keys(this.intentStates).forEach(function (intent) { + if (intent === 'oplist') { + return; + } + var intentState = this.intentStates[intent]; + intentState.renderTasks.forEach(function (renderTask) { + var renderCompleted = renderTask.capability.promise.catch(function () { + }); + waitOn.push(renderCompleted); + renderTask.cancel(); + }); + }, this); + this.objs.clear(); + this.annotationsPromise = null; + this.pendingCleanup = false; + return Promise.all(waitOn); + }, + destroy: function () { + deprecated('page destroy method, use cleanup() instead'); + this.cleanup(); + }, + cleanup: function PDFPageProxy_cleanup() { + this.pendingCleanup = true; + this._tryCleanup(); + }, + _tryCleanup: function PDFPageProxy_tryCleanup() { + if (!this.pendingCleanup || Object.keys(this.intentStates).some(function (intent) { + var intentState = this.intentStates[intent]; + return intentState.renderTasks.length !== 0 || intentState.receivingOperatorList; + }, this)) { + return; + } + Object.keys(this.intentStates).forEach(function (intent) { + delete this.intentStates[intent]; + }, this); + this.objs.clear(); + this.annotationsPromise = null; + this.pendingCleanup = false; + }, + _startRenderPage: function PDFPageProxy_startRenderPage(transparency, intent) { + var intentState = this.intentStates[intent]; + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.resolve(transparency); + } + }, + _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, intent) { + var intentState = this.intentStates[intent]; + var i, ii; + for (i = 0, ii = operatorListChunk.length; i < ii; i++) { + intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); + intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); + } + intentState.operatorList.lastChunk = operatorListChunk.lastChunk; + for (i = 0; i < intentState.renderTasks.length; i++) { + intentState.renderTasks[i].operatorListChanged(); + } + if (operatorListChunk.lastChunk) { + intentState.receivingOperatorList = false; + this._tryCleanup(); + } + } + }; + return PDFPageProxy; + }(); + var PDFWorker = function PDFWorkerClosure() { + var nextFakeWorkerId = 0; + function getWorkerSrc() { + if (typeof workerSrc !== 'undefined') { + return workerSrc; + } + if (getDefaultSetting('workerSrc')) { + return getDefaultSetting('workerSrc'); + } + if (pdfjsFilePath) { + return pdfjsFilePath.replace(/\.js$/i, '.worker.js'); + } + error('No PDFJS.workerSrc specified'); + } + var fakeWorkerFilesLoadedCapability; + function setupFakeWorkerGlobal() { + var WorkerMessageHandler; + if (fakeWorkerFilesLoadedCapability) { + return fakeWorkerFilesLoadedCapability.promise; + } + fakeWorkerFilesLoadedCapability = createPromiseCapability(); + var loader = fakeWorkerFilesLoader || function (callback) { + Util.loadScript(getWorkerSrc(), function () { + callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler); + }); + }; + loader(fakeWorkerFilesLoadedCapability.resolve); + return fakeWorkerFilesLoadedCapability.promise; + } + function FakeWorkerPort(defer) { + this._listeners = []; + this._defer = defer; + this._deferred = Promise.resolve(undefined); + } + FakeWorkerPort.prototype = { + postMessage: function (obj, transfers) { + function cloneValue(value) { + if (typeof value !== 'object' || value === null) { + return value; + } + if (cloned.has(value)) { + return cloned.get(value); + } + var result; + var buffer; + if ((buffer = value.buffer) && isArrayBuffer(buffer)) { + var transferable = transfers && transfers.indexOf(buffer) >= 0; + if (value === buffer) { + result = value; + } else if (transferable) { + result = new value.constructor(buffer, value.byteOffset, value.byteLength); + } else { + result = new value.constructor(value); + } + cloned.set(value, result); + return result; + } + result = isArray(value) ? [] : {}; + cloned.set(value, result); + for (var i in value) { + var desc, p = value; + while (!(desc = Object.getOwnPropertyDescriptor(p, i))) { + p = Object.getPrototypeOf(p); + } + if (typeof desc.value === 'undefined' || typeof desc.value === 'function') { + continue; + } + result[i] = cloneValue(desc.value); + } + return result; + } + if (!this._defer) { + this._listeners.forEach(function (listener) { + listener.call(this, { data: obj }); + }, this); + return; + } + var cloned = new WeakMap(); + var e = { data: cloneValue(obj) }; + this._deferred.then(function () { + this._listeners.forEach(function (listener) { + listener.call(this, e); + }, this); + }.bind(this)); + }, + addEventListener: function (name, listener) { + this._listeners.push(listener); + }, + removeEventListener: function (name, listener) { + var i = this._listeners.indexOf(listener); + this._listeners.splice(i, 1); + }, + terminate: function () { + this._listeners = []; + } + }; + function createCDNWrapper(url) { + var wrapper = 'importScripts(\'' + url + '\');'; + return URL.createObjectURL(new Blob([wrapper])); + } + function PDFWorker(name) { + this.name = name; + this.destroyed = false; + this._readyCapability = createPromiseCapability(); + this._port = null; + this._webWorker = null; + this._messageHandler = null; + this._initialize(); + } + PDFWorker.prototype = { + get promise() { + return this._readyCapability.promise; + }, + get port() { + return this._port; + }, + get messageHandler() { + return this._messageHandler; + }, + _initialize: function PDFWorker_initialize() { + if (!isWorkerDisabled && !getDefaultSetting('disableWorker') && typeof Worker !== 'undefined') { + var workerSrc = getWorkerSrc(); + try { + if (!isSameOrigin(window.location.href, workerSrc)) { + workerSrc = createCDNWrapper(new URL(workerSrc, window.location).href); + } + var worker = new Worker(workerSrc); + var messageHandler = new MessageHandler('main', 'worker', worker); + var terminateEarly = function () { + worker.removeEventListener('error', onWorkerError); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this._readyCapability.reject(new Error('Worker was destroyed')); + } else { + this._setupFakeWorker(); + } + }.bind(this); + var onWorkerError = function (event) { + if (!this._webWorker) { + terminateEarly(); + } + }.bind(this); + worker.addEventListener('error', onWorkerError); + messageHandler.on('test', function PDFWorker_test(data) { + worker.removeEventListener('error', onWorkerError); + if (this.destroyed) { + terminateEarly(); + return; + } + var supportTypedArray = data && data.supportTypedArray; + if (supportTypedArray) { + this._messageHandler = messageHandler; + this._port = worker; + this._webWorker = worker; + if (!data.supportTransfers) { + isPostMessageTransfersDisabled = true; + } + this._readyCapability.resolve(); + messageHandler.send('configure', { verbosity: getVerbosityLevel() }); + } else { + this._setupFakeWorker(); + messageHandler.destroy(); + worker.terminate(); + } + }.bind(this)); + messageHandler.on('console_log', function (data) { + console.log.apply(console, data); + }); + messageHandler.on('console_error', function (data) { + console.error.apply(console, data); + }); + messageHandler.on('ready', function (data) { + worker.removeEventListener('error', onWorkerError); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch (e) { + this._setupFakeWorker(); + } + }.bind(this)); + var sendTest = function () { + var postMessageTransfers = getDefaultSetting('postMessageTransfers') && !isPostMessageTransfersDisabled; + var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]); + try { + messageHandler.send('test', testObj, [testObj.buffer]); + } catch (ex) { + info('Cannot use postMessage transfers'); + testObj[0] = 0; + messageHandler.send('test', testObj); + } + }; + sendTest(); + return; + } catch (e) { + info('The worker has been disabled.'); + } + } + this._setupFakeWorker(); + }, + _setupFakeWorker: function PDFWorker_setupFakeWorker() { + if (!isWorkerDisabled && !getDefaultSetting('disableWorker')) { + warn('Setting up fake worker.'); + isWorkerDisabled = true; + } + setupFakeWorkerGlobal().then(function (WorkerMessageHandler) { + if (this.destroyed) { + this._readyCapability.reject(new Error('Worker was destroyed')); + return; + } + var isTypedArraysPresent = Uint8Array !== Float32Array; + var port = new FakeWorkerPort(isTypedArraysPresent); + this._port = port; + var id = 'fake' + nextFakeWorkerId++; + var workerHandler = new MessageHandler(id + '_worker', id, port); + WorkerMessageHandler.setup(workerHandler, port); + var messageHandler = new MessageHandler(id, id + '_worker', port); + this._messageHandler = messageHandler; + this._readyCapability.resolve(); + }.bind(this)); + }, + destroy: function PDFWorker_destroy() { + this.destroyed = true; + if (this._webWorker) { + this._webWorker.terminate(); + this._webWorker = null; + } + this._port = null; + if (this._messageHandler) { + this._messageHandler.destroy(); + this._messageHandler = null; + } + } + }; + return PDFWorker; + }(); + var WorkerTransport = function WorkerTransportClosure() { + function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.pdfDataRangeTransport = pdfDataRangeTransport; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader(loadingTask.docId); + this.destroyed = false; + this.destroyCapability = null; + this._passwordCapability = null; + this.pageCache = []; + this.pagePromises = []; + this.downloadInfoCapability = createPromiseCapability(); + this.setupMessageHandler(); + } + WorkerTransport.prototype = { + destroy: function WorkerTransport_destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = createPromiseCapability(); + if (this._passwordCapability) { + this._passwordCapability.reject(new Error('Worker was destroyed during onPassword callback')); + } + var waitOn = []; + this.pageCache.forEach(function (page) { + if (page) { + waitOn.push(page._destroy()); + } + }); + this.pageCache = []; + this.pagePromises = []; + var self = this; + var terminated = this.messageHandler.sendWithPromise('Terminate', null); + waitOn.push(terminated); + Promise.all(waitOn).then(function () { + self.fontLoader.clear(); + if (self.pdfDataRangeTransport) { + self.pdfDataRangeTransport.abort(); + self.pdfDataRangeTransport = null; + } + if (self.messageHandler) { + self.messageHandler.destroy(); + self.messageHandler = null; + } + self.destroyCapability.resolve(); + }, this.destroyCapability.reject); + return this.destroyCapability.promise; + }, + setupMessageHandler: function WorkerTransport_setupMessageHandler() { + var messageHandler = this.messageHandler; + var loadingTask = this.loadingTask; + 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 }); + }); + pdfDataRangeTransport.addProgressiveReadListener(function (chunk) { + messageHandler.send('OnDataRange', { chunk: chunk }); + }); + messageHandler.on('RequestDataRange', function transportDataRange(data) { + pdfDataRangeTransport.requestDataRange(data.begin, data.end); + }, this); + } + messageHandler.on('GetDoc', function transportDoc(data) { + var pdfInfo = data.pdfInfo; + this.numPages = data.pdfInfo.numPages; + var loadingTask = this.loadingTask; + var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); + this.pdfDocument = pdfDocument; + loadingTask._capability.resolve(pdfDocument); + }, this); + messageHandler.on('PasswordRequest', function transportPasswordRequest(exception) { + this._passwordCapability = createPromiseCapability(); + if (loadingTask.onPassword) { + var updatePassword = function (password) { + this._passwordCapability.resolve({ password: password }); + }.bind(this); + loadingTask.onPassword(updatePassword, exception.code); + } else { + this._passwordCapability.reject(new PasswordException(exception.message, exception.code)); + } + return this._passwordCapability.promise; + }, this); + messageHandler.on('PasswordException', function transportPasswordException(exception) { + loadingTask._capability.reject(new PasswordException(exception.message, exception.code)); + }, this); + messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { + this.loadingTask._capability.reject(new InvalidPDFException(exception.message)); + }, this); + messageHandler.on('MissingPDF', function transportMissingPDF(exception) { + this.loadingTask._capability.reject(new MissingPDFException(exception.message)); + }, this); + messageHandler.on('UnexpectedResponse', function transportUnexpectedResponse(exception) { + this.loadingTask._capability.reject(new UnexpectedResponseException(exception.message, exception.status)); + }, this); + messageHandler.on('UnknownError', function transportUnknownError(exception) { + this.loadingTask._capability.reject(new UnknownErrorException(exception.message, exception.details)); + }, this); + messageHandler.on('DataLoaded', function transportPage(data) { + this.downloadInfoCapability.resolve(data); + }, this); + messageHandler.on('PDFManagerReady', function transportPage(data) { + if (this.pdfDataRangeTransport) { + this.pdfDataRangeTransport.transportReady(); + } + }, this); + messageHandler.on('StartRenderPage', function transportRender(data) { + if (this.destroyed) { + return; + } + var page = this.pageCache[data.pageIndex]; + page.stats.timeEnd('Page Request'); + page._startRenderPage(data.transparency, data.intent); + }, this); + messageHandler.on('RenderPageChunk', function transportRender(data) { + if (this.destroyed) { + return; + } + var page = this.pageCache[data.pageIndex]; + page._renderPageChunk(data.operatorList, data.intent); + }, this); + messageHandler.on('commonobj', function transportObj(data) { + if (this.destroyed) { + return; + } + var id = data[0]; + var type = data[1]; + if (this.commonObjs.hasData(id)) { + return; + } + switch (type) { + case 'Font': + var exportedData = data[2]; + if ('error' in exportedData) { + var exportedError = exportedData.error; + warn('Error during font loading: ' + exportedError); + this.commonObjs.resolve(id, exportedError); + break; + } + var fontRegistry = null; + if (getDefaultSetting('pdfBug') && globalScope.FontInspector && globalScope['FontInspector'].enabled) { + fontRegistry = { + registerFont: function (font, url) { + globalScope['FontInspector'].fontAdded(font, url); + } + }; + } + var font = new FontFaceObject(exportedData, { + isEvalSuported: getDefaultSetting('isEvalSupported'), + disableFontFace: getDefaultSetting('disableFontFace'), + fontRegistry: fontRegistry + }); + this.fontLoader.bind([font], function fontReady(fontObjs) { + this.commonObjs.resolve(id, font); + }.bind(this)); + break; + case 'FontPath': + this.commonObjs.resolve(id, data[2]); + break; + default: + error('Got unknown common object type ' + type); + } + }, this); + messageHandler.on('obj', function transportObj(data) { + if (this.destroyed) { + return; + } + var id = data[0]; + var pageIndex = data[1]; + var type = data[2]; + var pageProxy = this.pageCache[pageIndex]; + var imageData; + if (pageProxy.objs.hasData(id)) { + return; + } + switch (type) { + case 'JpegStream': + imageData = data[3]; + loadJpegStream(id, imageData, pageProxy.objs); + break; + case 'Image': + imageData = data[3]; + pageProxy.objs.resolve(id, imageData); + var MAX_IMAGE_SIZE_TO_STORE = 8000000; + if (imageData && '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.destroyed) { + return; + } + var loadingTask = this.loadingTask; + if (loadingTask.onProgress) { + loadingTask.onProgress({ + loaded: data.loaded, + total: data.total + }); + } + }, this); + messageHandler.on('PageError', function transportError(data) { + if (this.destroyed) { + return; + } + var page = this.pageCache[data.pageNum - 1]; + var intentState = page.intentStates[data.intent]; + if (intentState.displayReadyCapability) { + intentState.displayReadyCapability.reject(data.error); + } else { + error(data.error); + } + if (intentState.operatorList) { + intentState.operatorList.lastChunk = true; + for (var i = 0; i < intentState.renderTasks.length; i++) { + intentState.renderTasks[i].operatorListChanged(); + } + } + }, this); + messageHandler.on('UnsupportedFeature', function transportUnsupportedFeature(data) { + if (this.destroyed) { + return; + } + var featureId = data.featureId; + var loadingTask = this.loadingTask; + if (loadingTask.onUnsupportedFeature) { + loadingTask.onUnsupportedFeature(featureId); + } + _UnsupportedManager.notify(featureId); + }, this); + messageHandler.on('JpegDecode', function (data) { + if (this.destroyed) { + return Promise.reject(new Error('Worker was destroyed')); + } + var imageUrl = data[0]; + var components = data[1]; + if (components !== 3 && components !== 1) { + return Promise.reject(new Error('Only 3 components or 1 component can be returned')); + } + return new Promise(function (resolve, reject) { + var img = new Image(); + img.onload = function () { + 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; + var i, j; + if (components === 3) { + for (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 (i = 0, j = 0; i < rgbaLength; i += 4, j++) { + buf[j] = data[i]; + } + } + resolve({ + data: buf, + width: width, + height: height + }); + }; + img.onerror = function () { + reject(new Error('JpegDecode failed to load image')); + }; + img.src = imageUrl; + }); + }, this); + }, + getData: function WorkerTransport_getData() { + return this.messageHandler.sendWithPromise('GetData', null); + }, + getPage: function WorkerTransport_getPage(pageNumber, capability) { + if (!isInt(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) { + return Promise.reject(new Error('Invalid page request')); + } + var pageIndex = pageNumber - 1; + if (pageIndex in this.pagePromises) { + return this.pagePromises[pageIndex]; + } + var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) { + if (this.destroyed) { + throw new Error('Transport destroyed'); + } + var page = new PDFPageProxy(pageIndex, pageInfo, this); + this.pageCache[pageIndex] = page; + return page; + }.bind(this)); + this.pagePromises[pageIndex] = promise; + return promise; + }, + getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { + return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }).catch(function (reason) { + return Promise.reject(new Error(reason)); + }); + }, + getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { + return this.messageHandler.sendWithPromise('GetAnnotations', { + pageIndex: pageIndex, + intent: intent + }); + }, + getDestinations: function WorkerTransport_getDestinations() { + return this.messageHandler.sendWithPromise('GetDestinations', null); + }, + getDestination: function WorkerTransport_getDestination(id) { + return this.messageHandler.sendWithPromise('GetDestination', { id: id }); + }, + getPageLabels: function WorkerTransport_getPageLabels() { + return this.messageHandler.sendWithPromise('GetPageLabels', null); + }, + getAttachments: function WorkerTransport_getAttachments() { + return this.messageHandler.sendWithPromise('GetAttachments', null); + }, + getJavaScript: function WorkerTransport_getJavaScript() { + return this.messageHandler.sendWithPromise('GetJavaScript', null); + }, + getOutline: function WorkerTransport_getOutline() { + return this.messageHandler.sendWithPromise('GetOutline', null); + }, + getMetadata: function WorkerTransport_getMetadata() { + return this.messageHandler.sendWithPromise('GetMetadata', null).then(function transportMetadata(results) { + return { + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null + }; + }); + }, + getStats: function WorkerTransport_getStats() { + return this.messageHandler.sendWithPromise('GetStats', null); + }, + startCleanup: function WorkerTransport_startCleanup() { + this.messageHandler.sendWithPromise('Cleanup', null).then(function endCleanup() { + for (var i = 0, ii = this.pageCache.length; i < ii; i++) { + var page = this.pageCache[i]; + if (page) { + page.cleanup(); + } + } + this.commonObjs.clear(); + this.fontLoader.clear(); + }.bind(this)); + } + }; + return WorkerTransport; + }(); + var PDFObjects = function PDFObjectsClosure() { + function PDFObjects() { + this.objs = Object.create(null); + } + PDFObjects.prototype = { + ensureObj: function PDFObjects_ensureObj(objId) { + if (this.objs[objId]) { + return this.objs[objId]; + } + var obj = { + capability: createPromiseCapability(), + data: null, + resolved: false + }; + this.objs[objId] = obj; + return obj; + }, + get: function PDFObjects_get(objId, callback) { + if (callback) { + this.ensureObj(objId).capability.promise.then(callback); + return null; + } + var obj = this.objs[objId]; + if (!obj || !obj.resolved) { + error('Requesting object that isn\'t resolved yet ' + objId); + } + return obj.data; + }, + resolve: function PDFObjects_resolve(objId, data) { + var obj = this.ensureObj(objId); + obj.resolved = true; + obj.data = data; + obj.capability.resolve(data); + }, + isResolved: function PDFObjects_isResolved(objId) { + var objs = this.objs; + if (!objs[objId]) { + return false; + } + return objs[objId].resolved; + }, + hasData: function PDFObjects_hasData(objId) { + return this.isResolved(objId); + }, + getData: function PDFObjects_getData(objId) { + var objs = this.objs; + if (!objs[objId] || !objs[objId].resolved) { + return null; + } + return objs[objId].data; + }, + clear: function PDFObjects_clear() { + this.objs = Object.create(null); + } + }; + return PDFObjects; + }(); + var RenderTask = function RenderTaskClosure() { + function RenderTask(internalRenderTask) { + this._internalRenderTask = internalRenderTask; + this.onContinue = null; + } + RenderTask.prototype = { + get promise() { + return this._internalRenderTask.capability.promise; + }, + cancel: function RenderTask_cancel() { + this._internalRenderTask.cancel(); + }, + then: function RenderTask_then(onFulfilled, onRejected) { + return this.promise.then.apply(this.promise, arguments); + } + }; + 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.useRequestAnimationFrame = false; + this.cancelled = false; + this.capability = createPromiseCapability(); + this.task = new RenderTask(this); + this._continueBound = this._continue.bind(this); + this._scheduleNextBound = this._scheduleNext.bind(this); + this._nextBound = this._next.bind(this); + } + InternalRenderTask.prototype = { + initializeGraphics: function InternalRenderTask_initializeGraphics(transparency) { + if (this.cancelled) { + return; + } + if (getDefaultSetting('pdfBug') && globalScope.StepperManager && 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.imageLayer); + this.gfx.beginDrawing(params.transform, 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._continueBound; + } + 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.task.onContinue) { + this.task.onContinue(this._scheduleNextBound); + } else { + this._scheduleNext(); + } + }, + _scheduleNext: function InternalRenderTask__scheduleNext() { + if (this.useRequestAnimationFrame && typeof window !== 'undefined') { + window.requestAnimationFrame(this._nextBound); + } else { + Promise.resolve(undefined).then(this._nextBound); + } + }, + _next: function InternalRenderTask__next() { + if (this.cancelled) { + return; + } + this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + this.callback(); + } + } + } + }; + return InternalRenderTask; + }(); + var _UnsupportedManager = function UnsupportedManagerClosure() { + var listeners = []; + return { + listen: function (cb) { + deprecated('Global UnsupportedManager.listen is used: ' + ' use PDFDocumentLoadingTask.onUnsupportedFeature instead'); + listeners.push(cb); + }, + notify: function (featureId) { + for (var i = 0, ii = listeners.length; i < ii; i++) { + listeners[i](featureId); + } + } + }; + }(); + if (typeof pdfjsVersion !== 'undefined') { + exports.version = pdfjsVersion; + } + if (typeof pdfjsBuild !== 'undefined') { + exports.build = pdfjsBuild; + } + exports.getDocument = getDocument; + exports.PDFDataRangeTransport = PDFDataRangeTransport; + exports.PDFWorker = PDFWorker; + exports.PDFDocumentProxy = PDFDocumentProxy; + exports.PDFPageProxy = PDFPageProxy; + exports._UnsupportedManager = _UnsupportedManager; + })); + (function (root, factory) { + factory(root.pdfjsDisplayGlobal = {}, root.pdfjsSharedUtil, root.pdfjsDisplayDOMUtils, root.pdfjsDisplayAPI, root.pdfjsDisplayAnnotationLayer, root.pdfjsDisplayTextLayer, root.pdfjsDisplayMetadata, root.pdfjsDisplaySVG); + }(this, function (exports, sharedUtil, displayDOMUtils, displayAPI, displayAnnotationLayer, displayTextLayer, displayMetadata, displaySVG) { + var globalScope = sharedUtil.globalScope; + var deprecated = sharedUtil.deprecated; + var warn = sharedUtil.warn; + var LinkTarget = displayDOMUtils.LinkTarget; + var DEFAULT_LINK_REL = displayDOMUtils.DEFAULT_LINK_REL; + var isWorker = typeof window === 'undefined'; + if (!globalScope.PDFJS) { + globalScope.PDFJS = {}; + } + var PDFJS = globalScope.PDFJS; + if (typeof pdfjsVersion !== 'undefined') { + PDFJS.version = pdfjsVersion; + } + if (typeof pdfjsBuild !== 'undefined') { + PDFJS.build = pdfjsBuild; + } + PDFJS.pdfBug = false; + if (PDFJS.verbosity !== undefined) { + sharedUtil.setVerbosityLevel(PDFJS.verbosity); + } + delete PDFJS.verbosity; + Object.defineProperty(PDFJS, 'verbosity', { + get: function () { + return sharedUtil.getVerbosityLevel(); + }, + set: function (level) { + sharedUtil.setVerbosityLevel(level); + }, + enumerable: true, + configurable: true + }); + PDFJS.VERBOSITY_LEVELS = sharedUtil.VERBOSITY_LEVELS; + PDFJS.OPS = sharedUtil.OPS; + PDFJS.UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; + PDFJS.isValidUrl = displayDOMUtils.isValidUrl; + PDFJS.shadow = sharedUtil.shadow; + PDFJS.createBlob = sharedUtil.createBlob; + PDFJS.createObjectURL = function PDFJS_createObjectURL(data, contentType) { + return sharedUtil.createObjectURL(data, contentType, PDFJS.disableCreateObjectURL); + }; + Object.defineProperty(PDFJS, 'isLittleEndian', { + configurable: true, + get: function PDFJS_isLittleEndian() { + var value = sharedUtil.isLittleEndian(); + return sharedUtil.shadow(PDFJS, 'isLittleEndian', value); + } + }); + PDFJS.removeNullCharacters = sharedUtil.removeNullCharacters; + PDFJS.PasswordResponses = sharedUtil.PasswordResponses; + PDFJS.PasswordException = sharedUtil.PasswordException; + PDFJS.UnknownErrorException = sharedUtil.UnknownErrorException; + PDFJS.InvalidPDFException = sharedUtil.InvalidPDFException; + PDFJS.MissingPDFException = sharedUtil.MissingPDFException; + PDFJS.UnexpectedResponseException = sharedUtil.UnexpectedResponseException; + PDFJS.Util = sharedUtil.Util; + PDFJS.PageViewport = sharedUtil.PageViewport; + PDFJS.createPromiseCapability = sharedUtil.createPromiseCapability; + PDFJS.maxImageSize = PDFJS.maxImageSize === undefined ? -1 : PDFJS.maxImageSize; + PDFJS.cMapUrl = PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl; + PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; + PDFJS.disableFontFace = PDFJS.disableFontFace === undefined ? false : PDFJS.disableFontFace; + PDFJS.imageResourcesPath = PDFJS.imageResourcesPath === undefined ? '' : PDFJS.imageResourcesPath; + PDFJS.disableWorker = PDFJS.disableWorker === undefined ? false : PDFJS.disableWorker; + PDFJS.workerSrc = PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc; + PDFJS.disableRange = PDFJS.disableRange === undefined ? false : PDFJS.disableRange; + PDFJS.disableStream = PDFJS.disableStream === undefined ? false : PDFJS.disableStream; + PDFJS.disableAutoFetch = PDFJS.disableAutoFetch === undefined ? false : PDFJS.disableAutoFetch; + PDFJS.pdfBug = PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug; + PDFJS.postMessageTransfers = PDFJS.postMessageTransfers === undefined ? true : PDFJS.postMessageTransfers; + PDFJS.disableCreateObjectURL = PDFJS.disableCreateObjectURL === undefined ? false : PDFJS.disableCreateObjectURL; + PDFJS.disableWebGL = PDFJS.disableWebGL === undefined ? true : PDFJS.disableWebGL; + PDFJS.externalLinkTarget = PDFJS.externalLinkTarget === undefined ? LinkTarget.NONE : PDFJS.externalLinkTarget; + PDFJS.externalLinkRel = PDFJS.externalLinkRel === undefined ? DEFAULT_LINK_REL : PDFJS.externalLinkRel; + PDFJS.isEvalSupported = PDFJS.isEvalSupported === undefined ? true : PDFJS.isEvalSupported; + var savedOpenExternalLinksInNewWindow = PDFJS.openExternalLinksInNewWindow; + delete PDFJS.openExternalLinksInNewWindow; + Object.defineProperty(PDFJS, 'openExternalLinksInNewWindow', { + get: function () { + return PDFJS.externalLinkTarget === LinkTarget.BLANK; + }, + set: function (value) { + if (value) { + deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); + } + if (PDFJS.externalLinkTarget !== LinkTarget.NONE) { + warn('PDFJS.externalLinkTarget is already initialized'); + return; + } + PDFJS.externalLinkTarget = value ? LinkTarget.BLANK : LinkTarget.NONE; + }, + enumerable: true, + configurable: true + }); + if (savedOpenExternalLinksInNewWindow) { + PDFJS.openExternalLinksInNewWindow = savedOpenExternalLinksInNewWindow; + } + PDFJS.getDocument = displayAPI.getDocument; + PDFJS.PDFDataRangeTransport = displayAPI.PDFDataRangeTransport; + PDFJS.PDFWorker = displayAPI.PDFWorker; + Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { + configurable: true, + get: function PDFJS_hasCanvasTypedArrays() { + var value = displayDOMUtils.hasCanvasTypedArrays(); + return sharedUtil.shadow(PDFJS, 'hasCanvasTypedArrays', value); + } + }); + PDFJS.CustomStyle = displayDOMUtils.CustomStyle; + PDFJS.LinkTarget = LinkTarget; + PDFJS.addLinkAttributes = displayDOMUtils.addLinkAttributes; + PDFJS.getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; + PDFJS.isExternalLinkTargetSet = displayDOMUtils.isExternalLinkTargetSet; + PDFJS.AnnotationLayer = displayAnnotationLayer.AnnotationLayer; + PDFJS.renderTextLayer = displayTextLayer.renderTextLayer; + PDFJS.Metadata = displayMetadata.Metadata; + PDFJS.SVGGraphics = displaySVG.SVGGraphics; + PDFJS.UnsupportedManager = displayAPI._UnsupportedManager; + exports.globalScope = globalScope; + exports.isWorker = isWorker; + exports.PDFJS = globalScope.PDFJS; + })); + }.call(pdfjsLibs)); + exports.PDFJS = pdfjsLibs.pdfjsDisplayGlobal.PDFJS; + exports.build = pdfjsLibs.pdfjsDisplayAPI.build; + exports.version = pdfjsLibs.pdfjsDisplayAPI.version; + exports.getDocument = pdfjsLibs.pdfjsDisplayAPI.getDocument; + exports.PDFDataRangeTransport = pdfjsLibs.pdfjsDisplayAPI.PDFDataRangeTransport; + exports.PDFWorker = pdfjsLibs.pdfjsDisplayAPI.PDFWorker; + exports.renderTextLayer = pdfjsLibs.pdfjsDisplayTextLayer.renderTextLayer; + exports.AnnotationLayer = pdfjsLibs.pdfjsDisplayAnnotationLayer.AnnotationLayer; + exports.CustomStyle = pdfjsLibs.pdfjsDisplayDOMUtils.CustomStyle; + exports.PasswordResponses = pdfjsLibs.pdfjsSharedUtil.PasswordResponses; + exports.InvalidPDFException = pdfjsLibs.pdfjsSharedUtil.InvalidPDFException; + exports.MissingPDFException = pdfjsLibs.pdfjsSharedUtil.MissingPDFException; + exports.SVGGraphics = pdfjsLibs.pdfjsDisplaySVG.SVGGraphics; + exports.UnexpectedResponseException = pdfjsLibs.pdfjsSharedUtil.UnexpectedResponseException; + exports.OPS = pdfjsLibs.pdfjsSharedUtil.OPS; + exports.UNSUPPORTED_FEATURES = pdfjsLibs.pdfjsSharedUtil.UNSUPPORTED_FEATURES; + exports.isValidUrl = pdfjsLibs.pdfjsDisplayDOMUtils.isValidUrl; + exports.createValidAbsoluteUrl = pdfjsLibs.pdfjsSharedUtil.createValidAbsoluteUrl; + exports.createObjectURL = pdfjsLibs.pdfjsSharedUtil.createObjectURL; + exports.removeNullCharacters = pdfjsLibs.pdfjsSharedUtil.removeNullCharacters; + exports.shadow = pdfjsLibs.pdfjsSharedUtil.shadow; + exports.createBlob = pdfjsLibs.pdfjsSharedUtil.createBlob; + exports.getFilenameFromUrl = pdfjsLibs.pdfjsDisplayDOMUtils.getFilenameFromUrl; + exports.addLinkAttributes = pdfjsLibs.pdfjsDisplayDOMUtils.addLinkAttributes; +})); \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.7.225/pdf.worker.js b/services/web/public/js/libs/pdfjs-1.7.225/pdf.worker.js new file mode 100644 index 0000000000..ddb7618cab --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/pdf.worker.js @@ -0,0 +1,50501 @@ +/* Copyright 2012 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. + */ +(function (root, factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define('pdfjs-dist/build/pdf.worker', ['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory(root['pdfjsDistBuildPdfWorker'] = {}); + } +}(this, function (exports) { + 'use strict'; + var pdfjsVersion = '1.7.225'; + var pdfjsBuild = '17d135f'; + var pdfjsFilePath = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : null; + var pdfjsLibs = {}; + (function pdfjsWrapper() { + (function (root, factory) { + factory(root.pdfjsCoreArithmeticDecoder = {}); + }(this, function (exports) { + var ArithmeticDecoder = function ArithmeticDecoderClosure() { + var QeTable = [ + { + qe: 0x5601, + nmps: 1, + nlps: 1, + switchFlag: 1 + }, + { + qe: 0x3401, + nmps: 2, + nlps: 6, + switchFlag: 0 + }, + { + qe: 0x1801, + nmps: 3, + nlps: 9, + switchFlag: 0 + }, + { + qe: 0x0AC1, + nmps: 4, + nlps: 12, + switchFlag: 0 + }, + { + qe: 0x0521, + nmps: 5, + nlps: 29, + switchFlag: 0 + }, + { + qe: 0x0221, + nmps: 38, + nlps: 33, + switchFlag: 0 + }, + { + qe: 0x5601, + nmps: 7, + nlps: 6, + switchFlag: 1 + }, + { + qe: 0x5401, + nmps: 8, + nlps: 14, + switchFlag: 0 + }, + { + qe: 0x4801, + nmps: 9, + nlps: 14, + switchFlag: 0 + }, + { + qe: 0x3801, + nmps: 10, + nlps: 14, + switchFlag: 0 + }, + { + qe: 0x3001, + nmps: 11, + nlps: 17, + switchFlag: 0 + }, + { + qe: 0x2401, + nmps: 12, + nlps: 18, + switchFlag: 0 + }, + { + qe: 0x1C01, + nmps: 13, + nlps: 20, + switchFlag: 0 + }, + { + qe: 0x1601, + nmps: 29, + nlps: 21, + switchFlag: 0 + }, + { + qe: 0x5601, + nmps: 15, + nlps: 14, + switchFlag: 1 + }, + { + qe: 0x5401, + nmps: 16, + nlps: 14, + switchFlag: 0 + }, + { + qe: 0x5101, + nmps: 17, + nlps: 15, + switchFlag: 0 + }, + { + qe: 0x4801, + nmps: 18, + nlps: 16, + switchFlag: 0 + }, + { + qe: 0x3801, + nmps: 19, + nlps: 17, + switchFlag: 0 + }, + { + qe: 0x3401, + nmps: 20, + nlps: 18, + switchFlag: 0 + }, + { + qe: 0x3001, + nmps: 21, + nlps: 19, + switchFlag: 0 + }, + { + qe: 0x2801, + nmps: 22, + nlps: 19, + switchFlag: 0 + }, + { + qe: 0x2401, + nmps: 23, + nlps: 20, + switchFlag: 0 + }, + { + qe: 0x2201, + nmps: 24, + nlps: 21, + switchFlag: 0 + }, + { + qe: 0x1C01, + nmps: 25, + nlps: 22, + switchFlag: 0 + }, + { + qe: 0x1801, + nmps: 26, + nlps: 23, + switchFlag: 0 + }, + { + qe: 0x1601, + nmps: 27, + nlps: 24, + switchFlag: 0 + }, + { + qe: 0x1401, + nmps: 28, + nlps: 25, + switchFlag: 0 + }, + { + qe: 0x1201, + nmps: 29, + nlps: 26, + switchFlag: 0 + }, + { + qe: 0x1101, + nmps: 30, + nlps: 27, + switchFlag: 0 + }, + { + qe: 0x0AC1, + nmps: 31, + nlps: 28, + switchFlag: 0 + }, + { + qe: 0x09C1, + nmps: 32, + nlps: 29, + switchFlag: 0 + }, + { + qe: 0x08A1, + nmps: 33, + nlps: 30, + switchFlag: 0 + }, + { + qe: 0x0521, + nmps: 34, + nlps: 31, + switchFlag: 0 + }, + { + qe: 0x0441, + nmps: 35, + nlps: 32, + switchFlag: 0 + }, + { + qe: 0x02A1, + nmps: 36, + nlps: 33, + switchFlag: 0 + }, + { + qe: 0x0221, + nmps: 37, + nlps: 34, + switchFlag: 0 + }, + { + qe: 0x0141, + nmps: 38, + nlps: 35, + switchFlag: 0 + }, + { + qe: 0x0111, + nmps: 39, + nlps: 36, + switchFlag: 0 + }, + { + qe: 0x0085, + nmps: 40, + nlps: 37, + switchFlag: 0 + }, + { + qe: 0x0049, + nmps: 41, + nlps: 38, + switchFlag: 0 + }, + { + qe: 0x0025, + nmps: 42, + nlps: 39, + switchFlag: 0 + }, + { + qe: 0x0015, + nmps: 43, + nlps: 40, + switchFlag: 0 + }, + { + qe: 0x0009, + nmps: 44, + nlps: 41, + switchFlag: 0 + }, + { + qe: 0x0005, + nmps: 45, + nlps: 42, + switchFlag: 0 + }, + { + qe: 0x0001, + nmps: 45, + nlps: 43, + switchFlag: 0 + }, + { + qe: 0x5601, + nmps: 46, + nlps: 46, + switchFlag: 0 + } + ]; + function ArithmeticDecoder(data, start, end) { + this.data = data; + this.bp = start; + this.dataEnd = end; + this.chigh = data[start]; + this.clow = 0; + this.byteIn(); + this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F; + this.clow = this.clow << 7 & 0xFFFF; + this.ct -= 7; + this.a = 0x8000; + } + ArithmeticDecoder.prototype = { + byteIn: function ArithmeticDecoder_byteIn() { + var data = this.data; + var bp = this.bp; + if (data[bp] === 0xFF) { + var b1 = data[bp + 1]; + if (b1 > 0x8F) { + this.clow += 0xFF00; + this.ct = 8; + } else { + bp++; + this.clow += data[bp] << 9; + this.ct = 7; + this.bp = bp; + } + } else { + bp++; + this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00; + this.ct = 8; + this.bp = bp; + } + if (this.clow > 0xFFFF) { + this.chigh += this.clow >> 16; + this.clow &= 0xFFFF; + } + }, + readBit: function ArithmeticDecoder_readBit(contexts, pos) { + var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; + var qeTableIcx = QeTable[cx_index]; + var qeIcx = qeTableIcx.qe; + var d; + var a = this.a - qeIcx; + if (this.chigh < qeIcx) { + if (a < qeIcx) { + a = qeIcx; + d = cx_mps; + cx_index = qeTableIcx.nmps; + } else { + a = qeIcx; + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } + } else { + this.chigh -= qeIcx; + if ((a & 0x8000) !== 0) { + this.a = a; + return cx_mps; + } + if (a < qeIcx) { + d = 1 ^ cx_mps; + if (qeTableIcx.switchFlag === 1) { + cx_mps = d; + } + cx_index = qeTableIcx.nlps; + } else { + d = cx_mps; + cx_index = qeTableIcx.nmps; + } + } + do { + if (this.ct === 0) { + this.byteIn(); + } + a <<= 1; + this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1; + this.clow = this.clow << 1 & 0xFFFF; + this.ct--; + } while ((a & 0x8000) === 0); + this.a = a; + contexts[pos] = cx_index << 1 | cx_mps; + return d; + } + }; + return ArithmeticDecoder; + }(); + exports.ArithmeticDecoder = ArithmeticDecoder; + })); + (function (root, factory) { + factory(root.pdfjsCoreCharsets = {}); + }(this, function (exports) { + 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' + ]; + exports.ISOAdobeCharset = ISOAdobeCharset; + exports.ExpertCharset = ExpertCharset; + exports.ExpertSubsetCharset = ExpertSubsetCharset; + })); + (function (root, factory) { + factory(root.pdfjsCoreEncodings = {}); + }(this, function (exports) { + var ExpertEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '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 MacExpertEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'space', + 'exclamsmall', + 'Hungarumlautsmall', + 'centoldstyle', + 'dollaroldstyle', + 'dollarsuperior', + 'ampersandsmall', + 'Acutesmall', + 'parenleftsuperior', + 'parenrightsuperior', + 'twodotenleader', + 'onedotenleader', + 'comma', + 'hyphen', + 'period', + 'fraction', + 'zerooldstyle', + 'oneoldstyle', + 'twooldstyle', + 'threeoldstyle', + 'fouroldstyle', + 'fiveoldstyle', + 'sixoldstyle', + 'sevenoldstyle', + 'eightoldstyle', + 'nineoldstyle', + 'colon', + 'semicolon', + '', + 'threequartersemdash', + '', + 'questionsmall', + '', + '', + '', + '', + 'Ethsmall', + '', + '', + 'onequarter', + 'onehalf', + 'threequarters', + 'oneeighth', + 'threeeighths', + 'fiveeighths', + 'seveneighths', + 'onethird', + 'twothirds', + '', + '', + '', + '', + '', + '', + 'ff', + 'fi', + 'fl', + 'ffi', + 'ffl', + 'parenleftinferior', + '', + 'parenrightinferior', + 'Circumflexsmall', + 'hypheninferior', + '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', + '', + '', + 'asuperior', + 'centsuperior', + '', + '', + '', + '', + 'Aacutesmall', + 'Agravesmall', + 'Acircumflexsmall', + 'Adieresissmall', + 'Atildesmall', + 'Aringsmall', + 'Ccedillasmall', + 'Eacutesmall', + 'Egravesmall', + 'Ecircumflexsmall', + 'Edieresissmall', + 'Iacutesmall', + 'Igravesmall', + 'Icircumflexsmall', + 'Idieresissmall', + 'Ntildesmall', + 'Oacutesmall', + 'Ogravesmall', + 'Ocircumflexsmall', + 'Odieresissmall', + 'Otildesmall', + 'Uacutesmall', + 'Ugravesmall', + 'Ucircumflexsmall', + 'Udieresissmall', + '', + 'eightsuperior', + 'fourinferior', + 'threeinferior', + 'sixinferior', + 'eightinferior', + 'seveninferior', + 'Scaronsmall', + '', + 'centinferior', + 'twoinferior', + '', + 'Dieresissmall', + '', + 'Caronsmall', + 'osuperior', + 'fiveinferior', + '', + 'commainferior', + 'periodinferior', + 'Yacutesmall', + '', + 'dollarinferior', + '', + 'Thornsmall', + '', + 'nineinferior', + 'zeroinferior', + 'Zcaronsmall', + 'AEsmall', + 'Oslashsmall', + 'questiondownsmall', + 'oneinferior', + 'Lslashsmall', + '', + '', + '', + '', + '', + '', + 'Cedillasmall', + '', + '', + '', + '', + '', + 'OEsmall', + 'figuredash', + 'hyphensuperior', + '', + '', + '', + '', + 'exclamdownsmall', + '', + 'Ydieresissmall', + '', + 'onesuperior', + 'twosuperior', + 'threesuperior', + 'foursuperior', + 'fivesuperior', + 'sixsuperior', + 'sevensuperior', + 'ninesuperior', + 'zerosuperior', + '', + 'esuperior', + 'rsuperior', + 'tsuperior', + '', + '', + 'isuperior', + 'ssuperior', + 'dsuperior', + '', + '', + '', + '', + '', + 'lsuperior', + 'Ogoneksmall', + 'Brevesmall', + 'Macronsmall', + 'bsuperior', + 'nsuperior', + 'msuperior', + 'commasuperior', + 'periodsuperior', + 'Dotaccentsmall', + 'Ringsmall' + ]; + var MacRomanEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'space', + 'exclam', + 'quotedbl', + 'numbersign', + 'dollar', + 'percent', + 'ampersand', + 'quotesingle', + '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', + 'grave', + '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', + '', + 'Adieresis', + 'Aring', + 'Ccedilla', + 'Eacute', + 'Ntilde', + 'Odieresis', + 'Udieresis', + 'aacute', + 'agrave', + 'acircumflex', + 'adieresis', + 'atilde', + 'aring', + 'ccedilla', + 'eacute', + 'egrave', + 'ecircumflex', + 'edieresis', + 'iacute', + 'igrave', + 'icircumflex', + 'idieresis', + 'ntilde', + 'oacute', + 'ograve', + 'ocircumflex', + 'odieresis', + 'otilde', + 'uacute', + 'ugrave', + 'ucircumflex', + 'udieresis', + 'dagger', + 'degree', + 'cent', + 'sterling', + 'section', + 'bullet', + 'paragraph', + 'germandbls', + 'registered', + 'copyright', + 'trademark', + 'acute', + 'dieresis', + 'notequal', + 'AE', + 'Oslash', + 'infinity', + 'plusminus', + 'lessequal', + 'greaterequal', + 'yen', + 'mu', + 'partialdiff', + 'summation', + 'product', + 'pi', + 'integral', + 'ordfeminine', + 'ordmasculine', + 'Omega', + 'ae', + 'oslash', + 'questiondown', + 'exclamdown', + 'logicalnot', + 'radical', + 'florin', + 'approxequal', + 'Delta', + 'guillemotleft', + 'guillemotright', + 'ellipsis', + 'space', + 'Agrave', + 'Atilde', + 'Otilde', + 'OE', + 'oe', + 'endash', + 'emdash', + 'quotedblleft', + 'quotedblright', + 'quoteleft', + 'quoteright', + 'divide', + 'lozenge', + 'ydieresis', + 'Ydieresis', + 'fraction', + 'currency', + 'guilsinglleft', + 'guilsinglright', + 'fi', + 'fl', + 'daggerdbl', + 'periodcentered', + 'quotesinglbase', + 'quotedblbase', + 'perthousand', + 'Acircumflex', + 'Ecircumflex', + 'Aacute', + 'Edieresis', + 'Egrave', + 'Iacute', + 'Icircumflex', + 'Idieresis', + 'Igrave', + 'Oacute', + 'Ocircumflex', + 'apple', + 'Ograve', + 'Uacute', + 'Ucircumflex', + 'Ugrave', + 'dotlessi', + 'circumflex', + 'tilde', + 'macron', + 'breve', + 'dotaccent', + 'ring', + 'cedilla', + 'hungarumlaut', + 'ogonek', + 'caron' + ]; + var StandardEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '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' + ]; + var WinAnsiEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'space', + 'exclam', + 'quotedbl', + 'numbersign', + 'dollar', + 'percent', + 'ampersand', + 'quotesingle', + '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', + 'grave', + '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', + 'bullet', + 'Euro', + 'bullet', + 'quotesinglbase', + 'florin', + 'quotedblbase', + 'ellipsis', + 'dagger', + 'daggerdbl', + 'circumflex', + 'perthousand', + 'Scaron', + 'guilsinglleft', + 'OE', + 'bullet', + 'Zcaron', + 'bullet', + 'bullet', + 'quoteleft', + 'quoteright', + 'quotedblleft', + 'quotedblright', + 'bullet', + 'endash', + 'emdash', + 'tilde', + 'trademark', + 'scaron', + 'guilsinglright', + 'oe', + 'bullet', + 'zcaron', + 'Ydieresis', + 'space', + 'exclamdown', + 'cent', + 'sterling', + 'currency', + 'yen', + 'brokenbar', + 'section', + 'dieresis', + 'copyright', + 'ordfeminine', + 'guillemotleft', + 'logicalnot', + 'hyphen', + 'registered', + 'macron', + 'degree', + 'plusminus', + 'twosuperior', + 'threesuperior', + 'acute', + 'mu', + 'paragraph', + 'periodcentered', + 'cedilla', + 'onesuperior', + 'ordmasculine', + 'guillemotright', + 'onequarter', + 'onehalf', + 'threequarters', + 'questiondown', + 'Agrave', + 'Aacute', + 'Acircumflex', + 'Atilde', + 'Adieresis', + 'Aring', + 'AE', + 'Ccedilla', + 'Egrave', + 'Eacute', + 'Ecircumflex', + 'Edieresis', + 'Igrave', + 'Iacute', + 'Icircumflex', + 'Idieresis', + 'Eth', + 'Ntilde', + 'Ograve', + 'Oacute', + 'Ocircumflex', + 'Otilde', + 'Odieresis', + 'multiply', + 'Oslash', + 'Ugrave', + 'Uacute', + 'Ucircumflex', + 'Udieresis', + 'Yacute', + 'Thorn', + 'germandbls', + 'agrave', + 'aacute', + 'acircumflex', + 'atilde', + 'adieresis', + 'aring', + 'ae', + 'ccedilla', + 'egrave', + 'eacute', + 'ecircumflex', + 'edieresis', + 'igrave', + 'iacute', + 'icircumflex', + 'idieresis', + 'eth', + 'ntilde', + 'ograve', + 'oacute', + 'ocircumflex', + 'otilde', + 'odieresis', + 'divide', + 'oslash', + 'ugrave', + 'uacute', + 'ucircumflex', + 'udieresis', + 'yacute', + 'thorn', + 'ydieresis' + ]; + var SymbolSetEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'space', + 'exclam', + 'universal', + 'numbersign', + 'existential', + 'percent', + 'ampersand', + 'suchthat', + 'parenleft', + 'parenright', + 'asteriskmath', + 'plus', + 'comma', + 'minus', + 'period', + 'slash', + 'zero', + 'one', + 'two', + 'three', + 'four', + 'five', + 'six', + 'seven', + 'eight', + 'nine', + 'colon', + 'semicolon', + 'less', + 'equal', + 'greater', + 'question', + 'congruent', + 'Alpha', + 'Beta', + 'Chi', + 'Delta', + 'Epsilon', + 'Phi', + 'Gamma', + 'Eta', + 'Iota', + 'theta1', + 'Kappa', + 'Lambda', + 'Mu', + 'Nu', + 'Omicron', + 'Pi', + 'Theta', + 'Rho', + 'Sigma', + 'Tau', + 'Upsilon', + 'sigma1', + 'Omega', + 'Xi', + 'Psi', + 'Zeta', + 'bracketleft', + 'therefore', + 'bracketright', + 'perpendicular', + 'underscore', + 'radicalex', + 'alpha', + 'beta', + 'chi', + 'delta', + 'epsilon', + 'phi', + 'gamma', + 'eta', + 'iota', + 'phi1', + 'kappa', + 'lambda', + 'mu', + 'nu', + 'omicron', + 'pi', + 'theta', + 'rho', + 'sigma', + 'tau', + 'upsilon', + 'omega1', + 'omega', + 'xi', + 'psi', + 'zeta', + 'braceleft', + 'bar', + 'braceright', + 'similar', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'Euro', + 'Upsilon1', + 'minute', + 'lessequal', + 'fraction', + 'infinity', + 'florin', + 'club', + 'diamond', + 'heart', + 'spade', + 'arrowboth', + 'arrowleft', + 'arrowup', + 'arrowright', + 'arrowdown', + 'degree', + 'plusminus', + 'second', + 'greaterequal', + 'multiply', + 'proportional', + 'partialdiff', + 'bullet', + 'divide', + 'notequal', + 'equivalence', + 'approxequal', + 'ellipsis', + 'arrowvertex', + 'arrowhorizex', + 'carriagereturn', + 'aleph', + 'Ifraktur', + 'Rfraktur', + 'weierstrass', + 'circlemultiply', + 'circleplus', + 'emptyset', + 'intersection', + 'union', + 'propersuperset', + 'reflexsuperset', + 'notsubset', + 'propersubset', + 'reflexsubset', + 'element', + 'notelement', + 'angle', + 'gradient', + 'registerserif', + 'copyrightserif', + 'trademarkserif', + 'product', + 'radical', + 'dotmath', + 'logicalnot', + 'logicaland', + 'logicalor', + 'arrowdblboth', + 'arrowdblleft', + 'arrowdblup', + 'arrowdblright', + 'arrowdbldown', + 'lozenge', + 'angleleft', + 'registersans', + 'copyrightsans', + 'trademarksans', + 'summation', + 'parenlefttp', + 'parenleftex', + 'parenleftbt', + 'bracketlefttp', + 'bracketleftex', + 'bracketleftbt', + 'bracelefttp', + 'braceleftmid', + 'braceleftbt', + 'braceex', + '', + 'angleright', + 'integral', + 'integraltp', + 'integralex', + 'integralbt', + 'parenrighttp', + 'parenrightex', + 'parenrightbt', + 'bracketrighttp', + 'bracketrightex', + 'bracketrightbt', + 'bracerighttp', + 'bracerightmid', + 'bracerightbt' + ]; + var ZapfDingbatsEncoding = [ + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'space', + 'a1', + 'a2', + 'a202', + 'a3', + 'a4', + 'a5', + 'a119', + 'a118', + 'a117', + 'a11', + 'a12', + 'a13', + 'a14', + 'a15', + 'a16', + 'a105', + 'a17', + 'a18', + 'a19', + 'a20', + 'a21', + 'a22', + 'a23', + 'a24', + 'a25', + 'a26', + 'a27', + 'a28', + 'a6', + 'a7', + 'a8', + 'a9', + 'a10', + 'a29', + 'a30', + 'a31', + 'a32', + 'a33', + 'a34', + 'a35', + 'a36', + 'a37', + 'a38', + 'a39', + 'a40', + 'a41', + 'a42', + 'a43', + 'a44', + 'a45', + 'a46', + 'a47', + 'a48', + 'a49', + 'a50', + 'a51', + 'a52', + 'a53', + 'a54', + 'a55', + 'a56', + 'a57', + 'a58', + 'a59', + 'a60', + 'a61', + 'a62', + 'a63', + 'a64', + 'a65', + 'a66', + 'a67', + 'a68', + 'a69', + 'a70', + 'a71', + 'a72', + 'a73', + 'a74', + 'a203', + 'a75', + 'a204', + 'a76', + 'a77', + 'a78', + 'a79', + 'a81', + 'a82', + 'a83', + 'a84', + 'a97', + 'a98', + 'a99', + 'a100', + '', + 'a89', + 'a90', + 'a93', + 'a94', + 'a91', + 'a92', + 'a205', + 'a85', + 'a206', + 'a86', + 'a87', + 'a88', + 'a95', + 'a96', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + 'a101', + 'a102', + 'a103', + 'a104', + 'a106', + 'a107', + 'a108', + 'a112', + 'a111', + 'a110', + 'a109', + 'a120', + 'a121', + 'a122', + 'a123', + 'a124', + 'a125', + 'a126', + 'a127', + 'a128', + 'a129', + 'a130', + 'a131', + 'a132', + 'a133', + 'a134', + 'a135', + 'a136', + 'a137', + 'a138', + 'a139', + 'a140', + 'a141', + 'a142', + 'a143', + 'a144', + 'a145', + 'a146', + 'a147', + 'a148', + 'a149', + 'a150', + 'a151', + 'a152', + 'a153', + 'a154', + 'a155', + 'a156', + 'a157', + 'a158', + 'a159', + 'a160', + 'a161', + 'a163', + 'a164', + 'a196', + 'a165', + 'a192', + 'a166', + 'a167', + 'a168', + 'a169', + 'a170', + 'a171', + 'a172', + 'a173', + 'a162', + 'a174', + 'a175', + 'a176', + 'a177', + 'a178', + 'a179', + 'a193', + 'a180', + 'a199', + 'a181', + 'a200', + 'a182', + '', + 'a201', + 'a183', + 'a184', + 'a197', + 'a185', + 'a194', + 'a198', + 'a186', + 'a195', + 'a187', + 'a188', + 'a189', + 'a190', + 'a191' + ]; + function getEncoding(encodingName) { + switch (encodingName) { + case 'WinAnsiEncoding': + return WinAnsiEncoding; + case 'StandardEncoding': + return StandardEncoding; + case 'MacRomanEncoding': + return MacRomanEncoding; + case 'SymbolSetEncoding': + return SymbolSetEncoding; + case 'ZapfDingbatsEncoding': + return ZapfDingbatsEncoding; + case 'ExpertEncoding': + return ExpertEncoding; + case 'MacExpertEncoding': + return MacExpertEncoding; + default: + return null; + } + } + exports.WinAnsiEncoding = WinAnsiEncoding; + exports.StandardEncoding = StandardEncoding; + exports.MacRomanEncoding = MacRomanEncoding; + exports.SymbolSetEncoding = SymbolSetEncoding; + exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding; + exports.ExpertEncoding = ExpertEncoding; + exports.getEncoding = getEncoding; + })); + (function (root, factory) { + factory(root.pdfjsSharedUtil = {}); + }(this, function (exports) { + var globalScope = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this; + 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 + }; + var ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 + }; + var AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 + }; + var AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 + }; + var AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 + }; + var AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 + }; + var StreamType = { + UNKNOWN: 0, + FLATE: 1, + LZW: 2, + DCT: 3, + JPX: 4, + JBIG: 5, + A85: 6, + AHX: 7, + CCF: 8, + RL: 9 + }; + var FontType = { + UNKNOWN: 0, + TYPE1: 1, + TYPE1C: 2, + CIDFONTTYPE0: 3, + CIDFONTTYPE0C: 4, + TRUETYPE: 5, + CIDFONTTYPE2: 6, + TYPE3: 7, + OPENTYPE: 8, + TYPE0: 9, + MMTYPE1: 10 + }; + var VERBOSITY_LEVELS = { + errors: 0, + warnings: 1, + infos: 5 + }; + var OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotations: 78, + endAnnotations: 79, + beginAnnotation: 80, + endAnnotation: 81, + paintJpegXObject: 82, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91 + }; + var verbosity = VERBOSITY_LEVELS.warnings; + function setVerbosityLevel(level) { + verbosity = level; + } + function getVerbosityLevel() { + return verbosity; + } + function info(msg) { + if (verbosity >= VERBOSITY_LEVELS.infos) { + console.log('Info: ' + msg); + } + } + function warn(msg) { + if (verbosity >= VERBOSITY_LEVELS.warnings) { + console.log('Warning: ' + msg); + } + } + function deprecated(details) { + console.log('Deprecated API usage: ' + details); + } + function error(msg) { + if (verbosity >= VERBOSITY_LEVELS.errors) { + console.log('Error: ' + msg); + console.log(backtrace()); + } + throw new Error(msg); + } + function backtrace() { + try { + throw new Error(); + } catch (e) { + return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; + } + } + function assert(cond, msg) { + if (!cond) { + error(msg); + } + } + var UNSUPPORTED_FEATURES = { + unknown: 'unknown', + forms: 'forms', + javaScript: 'javaScript', + smask: 'smask', + shadingPattern: 'shadingPattern', + font: 'font' + }; + function isSameOrigin(baseUrl, otherUrl) { + try { + var base = new URL(baseUrl); + if (!base.origin || base.origin === 'null') { + return false; + } + } catch (e) { + return false; + } + var other = new URL(otherUrl, base); + return base.origin === other.origin; + } + function isValidProtocol(url) { + if (!url) { + return false; + } + switch (url.protocol) { + case 'http:': + case 'https:': + case 'ftp:': + case 'mailto:': + case 'tel:': + return true; + default: + return false; + } + } + function createValidAbsoluteUrl(url, baseUrl) { + if (!url) { + return null; + } + try { + var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); + if (isValidProtocol(absoluteUrl)) { + return absoluteUrl; + } + } catch (ex) { + } + return null; + } + function shadow(obj, prop, value) { + Object.defineProperty(obj, prop, { + value: value, + enumerable: true, + configurable: true, + writable: false + }); + return value; + } + function getLookupTableFactory(initializer) { + var lookup; + return function () { + if (initializer) { + lookup = Object.create(null); + initializer(lookup); + initializer = null; + } + return lookup; + }; + } + var PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 + }; + var PasswordException = function PasswordExceptionClosure() { + function PasswordException(msg, code) { + this.name = 'PasswordException'; + this.message = msg; + this.code = code; + } + PasswordException.prototype = new Error(); + PasswordException.constructor = PasswordException; + return PasswordException; + }(); + var UnknownErrorException = function UnknownErrorExceptionClosure() { + function UnknownErrorException(msg, details) { + this.name = 'UnknownErrorException'; + this.message = msg; + this.details = details; + } + UnknownErrorException.prototype = new Error(); + UnknownErrorException.constructor = UnknownErrorException; + return UnknownErrorException; + }(); + var InvalidPDFException = function InvalidPDFExceptionClosure() { + function InvalidPDFException(msg) { + this.name = 'InvalidPDFException'; + this.message = msg; + } + InvalidPDFException.prototype = new Error(); + InvalidPDFException.constructor = InvalidPDFException; + return InvalidPDFException; + }(); + var MissingPDFException = function MissingPDFExceptionClosure() { + function MissingPDFException(msg) { + this.name = 'MissingPDFException'; + this.message = msg; + } + MissingPDFException.prototype = new Error(); + MissingPDFException.constructor = MissingPDFException; + return MissingPDFException; + }(); + var UnexpectedResponseException = function UnexpectedResponseExceptionClosure() { + function UnexpectedResponseException(msg, status) { + this.name = 'UnexpectedResponseException'; + this.message = msg; + this.status = status; + } + UnexpectedResponseException.prototype = new Error(); + UnexpectedResponseException.constructor = UnexpectedResponseException; + return UnexpectedResponseException; + }(); + var NotImplementedException = function NotImplementedExceptionClosure() { + function NotImplementedException(msg) { + this.message = msg; + } + NotImplementedException.prototype = new Error(); + NotImplementedException.prototype.name = 'NotImplementedException'; + NotImplementedException.constructor = NotImplementedException; + return NotImplementedException; + }(); + var MissingDataException = function MissingDataExceptionClosure() { + function MissingDataException(begin, end) { + this.begin = begin; + this.end = end; + this.message = 'Missing data [' + begin + ', ' + end + ')'; + } + MissingDataException.prototype = new Error(); + MissingDataException.prototype.name = 'MissingDataException'; + MissingDataException.constructor = MissingDataException; + return MissingDataException; + }(); + var XRefParseException = function XRefParseExceptionClosure() { + function XRefParseException(msg) { + this.message = msg; + } + XRefParseException.prototype = new Error(); + XRefParseException.prototype.name = 'XRefParseException'; + XRefParseException.constructor = XRefParseException; + return XRefParseException; + }(); + var NullCharactersRegExp = /\x00/g; + function removeNullCharacters(str) { + if (typeof str !== 'string') { + warn('The argument for removeNullCharacters must be a string.'); + return str; + } + return str.replace(NullCharactersRegExp, ''); + } + function bytesToString(bytes) { + assert(bytes !== null && typeof bytes === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString'); + var length = bytes.length; + var MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + var strBuf = []; + for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + var chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(''); + } + function stringToBytes(str) { + assert(typeof str === 'string', 'Invalid argument for stringToBytes'); + var length = str.length; + var bytes = new Uint8Array(length); + for (var i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xFF; + } + return bytes; + } + function arrayByteLength(arr) { + if (arr.length !== undefined) { + return arr.length; + } + assert(arr.byteLength !== undefined); + return arr.byteLength; + } + function arraysToBytes(arr) { + if (arr.length === 1 && arr[0] instanceof Uint8Array) { + return arr[0]; + } + var resultLength = 0; + var i, ii = arr.length; + var item, itemLength; + for (i = 0; i < ii; i++) { + item = arr[i]; + itemLength = arrayByteLength(item); + resultLength += itemLength; + } + var pos = 0; + var data = new Uint8Array(resultLength); + for (i = 0; i < ii; i++) { + item = arr[i]; + if (!(item instanceof Uint8Array)) { + if (typeof item === 'string') { + item = stringToBytes(item); + } else { + item = new Uint8Array(item); + } + } + itemLength = item.byteLength; + data.set(item, pos); + pos += itemLength; + } + return data; + } + function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); + } + function log2(x) { + var n = 1, i = 0; + while (x > n) { + n <<= 1; + i++; + } + return i; + } + function readInt8(data, start) { + return data[start] << 24 >> 24; + } + function readUint16(data, offset) { + return data[offset] << 8 | data[offset + 1]; + } + function readUint32(data, offset) { + return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0; + } + function isLittleEndian() { + var buffer8 = new Uint8Array(2); + buffer8[0] = 1; + var buffer16 = new Uint16Array(buffer8.buffer); + return buffer16[0] === 1; + } + function isEvalSupported() { + try { + new Function(''); + return true; + } catch (e) { + return false; + } + } + var Uint32ArrayView = function Uint32ArrayViewClosure() { + function Uint32ArrayView(buffer, length) { + this.buffer = buffer; + this.byteLength = buffer.length; + this.length = length === undefined ? this.byteLength >> 2 : length; + ensureUint32ArrayViewProps(this.length); + } + Uint32ArrayView.prototype = Object.create(null); + var uint32ArrayViewSetters = 0; + function createUint32ArrayProp(index) { + return { + get: function () { + var buffer = this.buffer, offset = index << 2; + return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0; + }, + set: function (value) { + var buffer = this.buffer, offset = index << 2; + buffer[offset] = value & 255; + buffer[offset + 1] = value >> 8 & 255; + buffer[offset + 2] = value >> 16 & 255; + buffer[offset + 3] = value >>> 24 & 255; + } + }; + } + function ensureUint32ArrayViewProps(length) { + while (uint32ArrayViewSetters < length) { + Object.defineProperty(Uint32ArrayView.prototype, uint32ArrayViewSetters, createUint32ArrayProp(uint32ArrayViewSetters)); + uint32ArrayViewSetters++; + } + } + return Uint32ArrayView; + }(); + exports.Uint32ArrayView = Uint32ArrayView; + var IDENTITY_MATRIX = [ + 1, + 0, + 0, + 1, + 0, + 0 + ]; + var Util = function UtilClosure() { + function Util() { + } + var rgbBuf = [ + 'rgb(', + 0, + ',', + 0, + ',', + 0, + ')' + ]; + Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { + rgbBuf[1] = r; + rgbBuf[3] = g; + rgbBuf[5] = b; + return rgbBuf.join(''); + }; + Util.transform = function Util_transform(m1, m2) { + return [ + m1[0] * m2[0] + m1[2] * m2[1], + m1[1] * m2[0] + m1[3] * m2[1], + m1[0] * m2[2] + m1[2] * m2[3], + m1[1] * m2[2] + m1[3] * m2[3], + m1[0] * m2[4] + m1[2] * m2[5] + m1[4], + m1[1] * m2[4] + m1[3] * m2[5] + m1[5] + ]; + }; + Util.applyTransform = function Util_applyTransform(p, m) { + var xt = p[0] * m[0] + p[1] * m[2] + m[4]; + var yt = p[0] * m[1] + p[1] * m[3] + m[5]; + return [ + xt, + yt + ]; + }; + Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { + var d = m[0] * m[3] - m[1] * m[2]; + var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + return [ + xt, + yt + ]; + }; + Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) { + var p1 = Util.applyTransform(r, m); + var p2 = Util.applyTransform(r.slice(2, 4), m); + var p3 = Util.applyTransform([ + r[0], + r[3] + ], m); + var p4 = Util.applyTransform([ + r[2], + r[1] + ], m); + return [ + Math.min(p1[0], p2[0], p3[0], p4[0]), + Math.min(p1[1], p2[1], p3[1], p4[1]), + Math.max(p1[0], p2[0], p3[0], p4[0]), + Math.max(p1[1], p2[1], p3[1], p4[1]) + ]; + }; + Util.inverseTransform = function Util_inverseTransform(m) { + var d = m[0] * m[3] - m[1] * m[2]; + return [ + m[3] / d, + -m[1] / d, + -m[2] / d, + m[0] / d, + (m[2] * m[5] - m[4] * m[3]) / d, + (m[4] * m[1] - m[5] * m[0]) / d + ]; + }; + Util.apply3dTransform = function Util_apply3dTransform(m, v) { + return [ + m[0] * v[0] + m[1] * v[1] + m[2] * v[2], + m[3] * v[0] + m[4] * v[1] + m[5] * v[2], + m[6] * v[0] + m[7] * v[1] + m[8] * v[2] + ]; + }; + Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) { + var transpose = [ + m[0], + m[2], + m[1], + m[3] + ]; + var a = m[0] * transpose[0] + m[1] * transpose[2]; + var b = m[0] * transpose[1] + m[1] * transpose[3]; + var c = m[2] * transpose[0] + m[3] * transpose[2]; + var d = m[2] * transpose[1] + m[3] * transpose[3]; + var first = (a + d) / 2; + var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; + var sx = first + second || 1; + var sy = first - second || 1; + return [ + Math.sqrt(sx), + Math.sqrt(sy) + ]; + }; + Util.normalizeRect = function Util_normalizeRect(rect) { + var r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + }; + Util.intersect = function Util_intersect(rect1, rect2) { + function compare(a, b) { + return a - b; + } + var orderedX = [ + rect1[0], + rect1[2], + rect2[0], + rect2[2] + ].sort(compare), orderedY = [ + rect1[1], + rect1[3], + rect2[1], + rect2[3] + ].sort(compare), result = []; + rect1 = Util.normalizeRect(rect1); + rect2 = Util.normalizeRect(rect2); + if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) { + result[0] = orderedX[1]; + result[2] = orderedX[2]; + } else { + return false; + } + if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) { + result[1] = orderedY[1]; + result[3] = orderedY[2]; + } else { + return false; + } + return result; + }; + Util.sign = function Util_sign(num) { + return num < 0 ? -1 : 1; + }; + var ROMAN_NUMBER_MAP = [ + '', + 'C', + 'CC', + 'CCC', + 'CD', + 'D', + 'DC', + 'DCC', + 'DCCC', + 'CM', + '', + 'X', + 'XX', + 'XXX', + 'XL', + 'L', + 'LX', + 'LXX', + 'LXXX', + 'XC', + '', + 'I', + 'II', + 'III', + 'IV', + 'V', + 'VI', + 'VII', + 'VIII', + 'IX' + ]; + Util.toRoman = function Util_toRoman(number, lowerCase) { + assert(isInt(number) && number > 0, 'The number should be a positive integer.'); + var pos, romanBuf = []; + while (number >= 1000) { + number -= 1000; + romanBuf.push('M'); + } + pos = number / 100 | 0; + number %= 100; + romanBuf.push(ROMAN_NUMBER_MAP[pos]); + pos = number / 10 | 0; + number %= 10; + romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); + romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); + var romanStr = romanBuf.join(''); + return lowerCase ? romanStr.toLowerCase() : romanStr; + }; + Util.appendToArray = function Util_appendToArray(arr1, arr2) { + Array.prototype.push.apply(arr1, arr2); + }; + Util.prependToArray = function Util_prependToArray(arr1, arr2) { + Array.prototype.unshift.apply(arr1, arr2); + }; + Util.extendObj = function extendObj(obj1, obj2) { + for (var key in obj2) { + obj1[key] = obj2[key]; + } + }; + Util.getInheritableProperty = function Util_getInheritableProperty(dict, name, getArray) { + while (dict && !dict.has(name)) { + dict = dict.get('Parent'); + } + if (!dict) { + return null; + } + return getArray ? dict.getArray(name) : dict.get(name); + }; + 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 = function PageViewportClosure() { + function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { + this.viewBox = viewBox; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + var centerX = (viewBox[2] + viewBox[0]) / 2; + var centerY = (viewBox[3] + viewBox[1]) / 2; + var rotateA, rotateB, rotateC, rotateD; + rotation = rotation % 360; + rotation = rotation < 0 ? rotation + 360 : rotation; + switch (rotation) { + case 180: + rotateA = -1; + rotateB = 0; + rotateC = 0; + rotateD = 1; + break; + case 90: + rotateA = 0; + rotateB = 1; + rotateC = 1; + rotateD = 0; + break; + case 270: + rotateA = 0; + rotateB = -1; + rotateC = -1; + rotateD = 0; + break; + default: + rotateA = 1; + rotateB = 0; + rotateC = 0; + rotateD = -1; + break; + } + if (dontFlip) { + rotateC = -rotateC; + rotateD = -rotateD; + } + var offsetCanvasX, offsetCanvasY; + var width, height; + if (rotateA === 0) { + offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; + offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; + width = Math.abs(viewBox[3] - viewBox[1]) * scale; + height = Math.abs(viewBox[2] - viewBox[0]) * scale; + } else { + offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; + offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; + width = Math.abs(viewBox[2] - viewBox[0]) * scale; + height = Math.abs(viewBox[3] - viewBox[1]) * scale; + } + this.transform = [ + rotateA * scale, + rotateB * scale, + rotateC * scale, + rotateD * scale, + offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, + offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY + ]; + this.width = width; + this.height = height; + this.fontScale = scale; + } + PageViewport.prototype = { + clone: function PageViewPort_clone(args) { + args = args || {}; + var scale = 'scale' in args ? args.scale : this.scale; + var rotation = 'rotation' in args ? args.rotation : this.rotation; + return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip); + }, + convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { + return Util.applyTransform([ + x, + y + ], this.transform); + }, + convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) { + var tl = Util.applyTransform([ + rect[0], + rect[1] + ], this.transform); + var br = Util.applyTransform([ + rect[2], + rect[3] + ], this.transform); + return [ + tl[0], + tl[1], + br[0], + br[1] + ]; + }, + convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { + return Util.applyInverseTransform([ + x, + y + ], this.transform); + } + }; + return PageViewport; + }(); + var PDFStringTranslateTable = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0x2D8, + 0x2C7, + 0x2C6, + 0x2D9, + 0x2DD, + 0x2DB, + 0x2DA, + 0x2DC, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0x2022, + 0x2020, + 0x2021, + 0x2026, + 0x2014, + 0x2013, + 0x192, + 0x2044, + 0x2039, + 0x203A, + 0x2212, + 0x2030, + 0x201E, + 0x201C, + 0x201D, + 0x2018, + 0x2019, + 0x201A, + 0x2122, + 0xFB01, + 0xFB02, + 0x141, + 0x152, + 0x160, + 0x178, + 0x17D, + 0x131, + 0x142, + 0x153, + 0x161, + 0x17E, + 0, + 0x20AC + ]; + function stringToPDFString(str) { + var i, n = str.length, strBuf = []; + if (str[0] === '\xFE' && str[1] === '\xFF') { + for (i = 2; i < n; i += 2) { + strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1))); + } + } else { + for (i = 0; i < n; ++i) { + var code = PDFStringTranslateTable[str.charCodeAt(i)]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + } + return strBuf.join(''); + } + function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); + } + function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); + } + function isEmptyObj(obj) { + for (var key in obj) { + return false; + } + return true; + } + function isBool(v) { + return typeof v === 'boolean'; + } + function isInt(v) { + return typeof v === 'number' && (v | 0) === v; + } + function isNum(v) { + return typeof v === 'number'; + } + function isString(v) { + return typeof v === 'string'; + } + function isArray(v) { + return v instanceof Array; + } + function isArrayBuffer(v) { + return typeof v === 'object' && v !== null && v.byteLength !== undefined; + } + function isSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A; + } + function createPromiseCapability() { + var capability = {}; + capability.promise = new Promise(function (resolve, reject) { + capability.resolve = resolve; + capability.reject = reject; + }); + return capability; + } + (function PromiseClosure() { + if (globalScope.Promise) { + if (typeof globalScope.Promise.all !== 'function') { + globalScope.Promise.all = function (iterable) { + var count = 0, results = [], resolve, reject; + var promise = new globalScope.Promise(function (resolve_, reject_) { + resolve = resolve_; + reject = reject_; + }); + iterable.forEach(function (p, i) { + count++; + p.then(function (result) { + results[i] = result; + count--; + if (count === 0) { + resolve(results); + } + }, reject); + }); + if (count === 0) { + resolve(results); + } + return promise; + }; + } + if (typeof globalScope.Promise.resolve !== 'function') { + globalScope.Promise.resolve = function (value) { + return new globalScope.Promise(function (resolve) { + resolve(value); + }); + }; + } + if (typeof globalScope.Promise.reject !== 'function') { + globalScope.Promise.reject = function (reason) { + return new globalScope.Promise(function (resolve, reject) { + reject(reason); + }); + }; + } + if (typeof globalScope.Promise.prototype.catch !== 'function') { + globalScope.Promise.prototype.catch = function (onReject) { + return globalScope.Promise.prototype.then(undefined, onReject); + }; + } + return; + } + var STATUS_PENDING = 0; + var STATUS_RESOLVED = 1; + var STATUS_REJECTED = 2; + var REJECTION_TIMEOUT = 500; + var HandlerManager = { + handlers: [], + running: false, + unhandledRejections: [], + pendingRejectionCheck: false, + scheduleHandlers: function scheduleHandlers(promise) { + if (promise._status === STATUS_PENDING) { + return; + } + this.handlers = this.handlers.concat(promise._handlers); + promise._handlers = []; + if (this.running) { + return; + } + this.running = true; + setTimeout(this.runHandlers.bind(this), 0); + }, + runHandlers: function runHandlers() { + var RUN_TIMEOUT = 1; + var timeoutAt = Date.now() + RUN_TIMEOUT; + while (this.handlers.length > 0) { + var handler = this.handlers.shift(); + var nextStatus = handler.thisPromise._status; + var nextValue = handler.thisPromise._value; + try { + if (nextStatus === STATUS_RESOLVED) { + if (typeof handler.onResolve === 'function') { + nextValue = handler.onResolve(nextValue); + } + } else if (typeof handler.onReject === 'function') { + nextValue = handler.onReject(nextValue); + nextStatus = STATUS_RESOLVED; + if (handler.thisPromise._unhandledRejection) { + this.removeUnhandeledRejection(handler.thisPromise); + } + } + } catch (ex) { + nextStatus = STATUS_REJECTED; + nextValue = ex; + } + handler.nextPromise._updateStatus(nextStatus, nextValue); + if (Date.now() >= timeoutAt) { + break; + } + } + if (this.handlers.length > 0) { + setTimeout(this.runHandlers.bind(this), 0); + return; + } + this.running = false; + }, + addUnhandledRejection: function addUnhandledRejection(promise) { + this.unhandledRejections.push({ + promise: promise, + time: Date.now() + }); + this.scheduleRejectionCheck(); + }, + removeUnhandeledRejection: function removeUnhandeledRejection(promise) { + promise._unhandledRejection = false; + for (var i = 0; i < this.unhandledRejections.length; i++) { + if (this.unhandledRejections[i].promise === promise) { + this.unhandledRejections.splice(i); + i--; + } + } + }, + scheduleRejectionCheck: function scheduleRejectionCheck() { + if (this.pendingRejectionCheck) { + return; + } + this.pendingRejectionCheck = true; + setTimeout(function rejectionCheck() { + this.pendingRejectionCheck = false; + var now = Date.now(); + for (var i = 0; i < this.unhandledRejections.length; i++) { + if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { + var unhandled = this.unhandledRejections[i].promise._value; + var msg = 'Unhandled rejection: ' + unhandled; + if (unhandled.stack) { + msg += '\n' + unhandled.stack; + } + warn(msg); + this.unhandledRejections.splice(i); + i--; + } + } + if (this.unhandledRejections.length) { + this.scheduleRejectionCheck(); + } + }.bind(this), REJECTION_TIMEOUT); + } + }; + var Promise = function Promise(resolver) { + this._status = STATUS_PENDING; + this._handlers = []; + try { + resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); + } catch (e) { + this._reject(e); + } + }; + Promise.all = function Promise_all(promises) { + var resolveAll, rejectAll; + var deferred = new Promise(function (resolve, reject) { + resolveAll = resolve; + rejectAll = reject; + }); + var unresolved = promises.length; + var results = []; + if (unresolved === 0) { + resolveAll(results); + return deferred; + } + function reject(reason) { + if (deferred._status === STATUS_REJECTED) { + return; + } + results = []; + rejectAll(reason); + } + for (var i = 0, ii = promises.length; i < ii; ++i) { + var promise = promises[i]; + var resolve = function (i) { + return function (value) { + if (deferred._status === STATUS_REJECTED) { + return; + } + results[i] = value; + unresolved--; + if (unresolved === 0) { + resolveAll(results); + } + }; + }(i); + if (Promise.isPromise(promise)) { + promise.then(resolve, reject); + } else { + resolve(promise); + } + } + return deferred; + }; + Promise.isPromise = function Promise_isPromise(value) { + return value && typeof value.then === 'function'; + }; + Promise.resolve = function Promise_resolve(value) { + return new Promise(function (resolve) { + resolve(value); + }); + }; + Promise.reject = function Promise_reject(reason) { + return new Promise(function (resolve, reject) { + reject(reason); + }); + }; + Promise.prototype = { + _status: null, + _value: null, + _handlers: null, + _unhandledRejection: null, + _updateStatus: function Promise__updateStatus(status, value) { + if (this._status === STATUS_RESOLVED || this._status === STATUS_REJECTED) { + return; + } + if (status === STATUS_RESOLVED && Promise.isPromise(value)) { + value.then(this._updateStatus.bind(this, STATUS_RESOLVED), this._updateStatus.bind(this, STATUS_REJECTED)); + return; + } + this._status = status; + this._value = value; + if (status === STATUS_REJECTED && this._handlers.length === 0) { + this._unhandledRejection = true; + HandlerManager.addUnhandledRejection(this); + } + HandlerManager.scheduleHandlers(this); + }, + _resolve: function Promise_resolve(value) { + this._updateStatus(STATUS_RESOLVED, value); + }, + _reject: function Promise_reject(reason) { + this._updateStatus(STATUS_REJECTED, reason); + }, + then: function Promise_then(onResolve, onReject) { + var nextPromise = new Promise(function (resolve, reject) { + this.resolve = resolve; + this.reject = reject; + }); + this._handlers.push({ + thisPromise: this, + onResolve: onResolve, + onReject: onReject, + nextPromise: nextPromise + }); + HandlerManager.scheduleHandlers(this); + return nextPromise; + }, + catch: function Promise_catch(onReject) { + return this.then(undefined, onReject); + } + }; + globalScope.Promise = Promise; + }()); + (function WeakMapClosure() { + if (globalScope.WeakMap) { + return; + } + var id = 0; + function WeakMap() { + this.id = '$weakmap' + id++; + } + WeakMap.prototype = { + has: function (obj) { + return !!Object.getOwnPropertyDescriptor(obj, this.id); + }, + get: function (obj, defaultValue) { + return this.has(obj) ? obj[this.id] : defaultValue; + }, + set: function (obj, value) { + Object.defineProperty(obj, this.id, { + value: value, + enumerable: false, + configurable: true + }); + }, + delete: function (obj) { + delete obj[this.id]; + } + }; + globalScope.WeakMap = WeakMap; + }()); + var StatTimer = function StatTimerClosure() { + function rpad(str, pad, length) { + while (str.length < length) { + str += pad; + } + return str; + } + function StatTimer() { + this.started = Object.create(null); + this.times = []; + this.enabled = true; + } + StatTimer.prototype = { + time: function StatTimer_time(name) { + if (!this.enabled) { + return; + } + if (name in this.started) { + warn('Timer is already running for ' + name); + } + this.started[name] = Date.now(); + }, + timeEnd: function StatTimer_timeEnd(name) { + if (!this.enabled) { + return; + } + if (!(name in this.started)) { + warn('Timer has not been started for ' + name); + } + this.times.push({ + 'name': name, + 'start': this.started[name], + 'end': Date.now() + }); + delete this.started[name]; + }, + toString: function StatTimer_toString() { + var i, ii; + var times = this.times; + var out = ''; + var longest = 0; + for (i = 0, ii = times.length; i < ii; ++i) { + var name = times[i]['name']; + if (name.length > longest) { + longest = name.length; + } + } + for (i = 0, ii = times.length; i < ii; ++i) { + var span = times[i]; + var duration = span.end - span.start; + out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; + } + return out; + } + }; + return StatTimer; + }(); + var createBlob = function createBlob(data, contentType) { + if (typeof Blob !== 'undefined') { + return new Blob([data], { type: contentType }); + } + warn('The "Blob" constructor is not supported.'); + }; + var createObjectURL = function createObjectURLClosure() { + var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + return function createObjectURL(data, contentType, forceDataSchema) { + if (!forceDataSchema && typeof URL !== 'undefined' && URL.createObjectURL) { + var blob = createBlob(data, contentType); + return URL.createObjectURL(blob); + } + var buffer = 'data:' + contentType + ';base64,'; + for (var i = 0, ii = data.length; i < ii; i += 3) { + var b1 = data[i] & 0xFF; + var b2 = data[i + 1] & 0xFF; + var b3 = data[i + 2] & 0xFF; + var d1 = b1 >> 2, d2 = (b1 & 3) << 4 | b2 >> 4; + var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64; + var d4 = i + 2 < ii ? b3 & 0x3F : 64; + buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; + } + return buffer; + }; + }(); + function MessageHandler(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackIndex = 1; + this.postMessageTransfers = true; + var callbacksCapabilities = this.callbacksCapabilities = Object.create(null); + var ah = this.actionHandler = Object.create(null); + this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { + var data = event.data; + if (data.targetName !== this.sourceName) { + return; + } + if (data.isReply) { + var callbackId = data.callbackId; + if (data.callbackId in callbacksCapabilities) { + var callback = callbacksCapabilities[callbackId]; + delete callbacksCapabilities[callbackId]; + if ('error' in data) { + callback.reject(data.error); + } else { + callback.resolve(data.data); + } + } else { + error('Cannot resolve callback ' + callbackId); + } + } else if (data.action in ah) { + var action = ah[data.action]; + if (data.callbackId) { + var sourceName = this.sourceName; + var targetName = data.sourceName; + Promise.resolve().then(function () { + return action[0].call(action[1], data.data); + }).then(function (result) { + comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, + isReply: true, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + if (reason instanceof Error) { + reason = reason + ''; + } + comObj.postMessage({ + sourceName: sourceName, + targetName: targetName, + isReply: true, + callbackId: data.callbackId, + error: reason + }); + }); + } else { + action[0].call(action[1], data.data); + } + } else { + error('Unknown action from worker: ' + data.action); + } + }.bind(this); + comObj.addEventListener('message', this._onComObjOnMessage); + } + MessageHandler.prototype = { + on: function messageHandlerOn(actionName, handler, scope) { + var ah = this.actionHandler; + if (ah[actionName]) { + error('There is already an actionName called "' + actionName + '"'); + } + ah[actionName] = [ + handler, + scope + ]; + }, + send: function messageHandlerSend(actionName, data, transfers) { + var message = { + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data: data + }; + this.postMessage(message, transfers); + }, + sendWithPromise: function messageHandlerSendWithPromise(actionName, data, transfers) { + var callbackId = this.callbackIndex++; + var message = { + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data: data, + callbackId: callbackId + }; + var capability = createPromiseCapability(); + this.callbacksCapabilities[callbackId] = capability; + try { + this.postMessage(message, transfers); + } catch (e) { + capability.reject(e); + } + return capability.promise; + }, + postMessage: function (message, transfers) { + if (transfers && this.postMessageTransfers) { + this.comObj.postMessage(message, transfers); + } else { + this.comObj.postMessage(message); + } + }, + destroy: function () { + this.comObj.removeEventListener('message', this._onComObjOnMessage); + } + }; + function loadJpegStream(id, imageUrl, objs) { + var img = new Image(); + img.onload = function loadJpegStream_onloadClosure() { + objs.resolve(id, img); + }; + img.onerror = function loadJpegStream_onerrorClosure() { + objs.resolve(id, null); + warn('Error during JPEG image loading'); + }; + img.src = imageUrl; + } + /* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + (function checkURLConstructor(scope) { + var hasWorkingUrl = false; + try { + if (typeof URL === 'function' && typeof URL.prototype === 'object' && 'origin' in URL.prototype) { + var u = new URL('b', 'http://a'); + u.pathname = 'c%20d'; + hasWorkingUrl = u.href === 'http://a/c%20d'; + } + } catch (e) { + } + if (hasWorkingUrl) { + return; + } + var relative = Object.create(null); + relative['ftp'] = 21; + relative['file'] = 0; + relative['gopher'] = 70; + relative['http'] = 80; + relative['https'] = 443; + relative['ws'] = 80; + relative['wss'] = 443; + var relativePathDotMapping = Object.create(null); + relativePathDotMapping['%2e'] = '.'; + relativePathDotMapping['.%2e'] = '..'; + relativePathDotMapping['%2e.'] = '..'; + relativePathDotMapping['%2e%2e'] = '..'; + function isRelativeScheme(scheme) { + return relative[scheme] !== undefined; + } + function invalid() { + clear.call(this); + this._isInvalid = true; + } + function IDNAToASCII(h) { + if (h === '') { + invalid.call(this); + } + return h.toLowerCase(); + } + function percentEscape(c) { + var unicode = c.charCodeAt(0); + if (unicode > 0x20 && unicode < 0x7F && [ + 0x22, + 0x23, + 0x3C, + 0x3E, + 0x3F, + 0x60 + ].indexOf(unicode) === -1) { + return c; + } + return encodeURIComponent(c); + } + function percentEscapeQuery(c) { + var unicode = c.charCodeAt(0); + if (unicode > 0x20 && unicode < 0x7F && [ + 0x22, + 0x23, + 0x3C, + 0x3E, + 0x60 + ].indexOf(unicode) === -1) { + return c; + } + return encodeURIComponent(c); + } + var EOF, ALPHA = /[a-zA-Z]/, ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; + function parse(input, stateOverride, base) { + function err(message) { + errors.push(message); + } + var state = stateOverride || 'scheme start', cursor = 0, buffer = '', seenAt = false, seenBracket = false, errors = []; + loop: + while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) { + var c = input[cursor]; + switch (state) { + case 'scheme start': + if (c && ALPHA.test(c)) { + buffer += c.toLowerCase(); + state = 'scheme'; + } else if (!stateOverride) { + buffer = ''; + state = 'no scheme'; + continue; + } else { + err('Invalid scheme.'); + break loop; + } + break; + case 'scheme': + if (c && ALPHANUMERIC.test(c)) { + buffer += c.toLowerCase(); + } else if (c === ':') { + this._scheme = buffer; + buffer = ''; + if (stateOverride) { + break loop; + } + if (isRelativeScheme(this._scheme)) { + this._isRelative = true; + } + if (this._scheme === 'file') { + state = 'relative'; + } else if (this._isRelative && base && base._scheme === this._scheme) { + state = 'relative or authority'; + } else if (this._isRelative) { + state = 'authority first slash'; + } else { + state = 'scheme data'; + } + } else if (!stateOverride) { + buffer = ''; + cursor = 0; + state = 'no scheme'; + continue; + } else if (EOF === c) { + break loop; + } else { + err('Code point not allowed in scheme: ' + c); + break loop; + } + break; + case 'scheme data': + if (c === '?') { + this._query = '?'; + state = 'query'; + } else if (c === '#') { + this._fragment = '#'; + state = 'fragment'; + } else { + if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { + this._schemeData += percentEscape(c); + } + } + break; + case 'no scheme': + if (!base || !isRelativeScheme(base._scheme)) { + err('Missing scheme.'); + invalid.call(this); + } else { + state = 'relative'; + continue; + } + break; + case 'relative or authority': + if (c === '/' && input[cursor + 1] === '/') { + state = 'authority ignore slashes'; + } else { + err('Expected /, got: ' + c); + state = 'relative'; + continue; + } + break; + case 'relative': + this._isRelative = true; + if ('file' !== this._scheme) { + this._scheme = base._scheme; + } + if (EOF === c) { + this._host = base._host; + this._port = base._port; + this._path = base._path.slice(); + this._query = base._query; + this._username = base._username; + this._password = base._password; + break loop; + } else if (c === '/' || c === '\\') { + if (c === '\\') { + err('\\ is an invalid code point.'); + } + state = 'relative slash'; + } else if (c === '?') { + this._host = base._host; + this._port = base._port; + this._path = base._path.slice(); + this._query = '?'; + this._username = base._username; + this._password = base._password; + state = 'query'; + } else if (c === '#') { + this._host = base._host; + this._port = base._port; + this._path = base._path.slice(); + this._query = base._query; + this._fragment = '#'; + this._username = base._username; + this._password = base._password; + state = 'fragment'; + } else { + var nextC = input[cursor + 1]; + var nextNextC = input[cursor + 2]; + if ('file' !== this._scheme || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || EOF !== nextNextC && '/' !== nextNextC && '\\' !== nextNextC && '?' !== nextNextC && '#' !== nextNextC) { + this._host = base._host; + this._port = base._port; + this._username = base._username; + this._password = base._password; + this._path = base._path.slice(); + this._path.pop(); + } + state = 'relative path'; + continue; + } + break; + case 'relative slash': + if (c === '/' || c === '\\') { + if (c === '\\') { + err('\\ is an invalid code point.'); + } + if (this._scheme === 'file') { + state = 'file host'; + } else { + state = 'authority ignore slashes'; + } + } else { + if ('file' !== this._scheme) { + this._host = base._host; + this._port = base._port; + this._username = base._username; + this._password = base._password; + } + state = 'relative path'; + continue; + } + break; + case 'authority first slash': + if (c === '/') { + state = 'authority second slash'; + } else { + err('Expected \'/\', got: ' + c); + state = 'authority ignore slashes'; + continue; + } + break; + case 'authority second slash': + state = 'authority ignore slashes'; + if ('/' !== c) { + err('Expected \'/\', got: ' + c); + continue; + } + break; + case 'authority ignore slashes': + if ('/' !== c && '\\' !== c) { + state = 'authority'; + continue; + } else { + err('Expected authority, got: ' + c); + } + break; + case 'authority': + if (c === '@') { + if (seenAt) { + err('@ already seen.'); + buffer += '%40'; + } + seenAt = true; + for (var i = 0; i < buffer.length; i++) { + var cp = buffer[i]; + if (cp === '\t' || cp === '\n' || cp === '\r') { + err('Invalid whitespace in authority.'); + continue; + } + if (cp === ':' && this._password === null) { + this._password = ''; + continue; + } + var tempC = percentEscape(cp); + if (null !== this._password) { + this._password += tempC; + } else { + this._username += tempC; + } + } + buffer = ''; + } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') { + cursor -= buffer.length; + buffer = ''; + state = 'host'; + continue; + } else { + buffer += c; + } + break; + case 'file host': + if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') { + if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) { + state = 'relative path'; + } else if (buffer.length === 0) { + state = 'relative path start'; + } else { + this._host = IDNAToASCII.call(this, buffer); + buffer = ''; + state = 'relative path start'; + } + continue; + } else if (c === '\t' || c === '\n' || c === '\r') { + err('Invalid whitespace in file host.'); + } else { + buffer += c; + } + break; + case 'host': + case 'hostname': + if (c === ':' && !seenBracket) { + this._host = IDNAToASCII.call(this, buffer); + buffer = ''; + state = 'port'; + if (stateOverride === 'hostname') { + break loop; + } + } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') { + this._host = IDNAToASCII.call(this, buffer); + buffer = ''; + state = 'relative path start'; + if (stateOverride) { + break loop; + } + continue; + } else if ('\t' !== c && '\n' !== c && '\r' !== c) { + if (c === '[') { + seenBracket = true; + } else if (c === ']') { + seenBracket = false; + } + buffer += c; + } else { + err('Invalid code point in host/hostname: ' + c); + } + break; + case 'port': + if (/[0-9]/.test(c)) { + buffer += c; + } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#' || stateOverride) { + if ('' !== buffer) { + var temp = parseInt(buffer, 10); + if (temp !== relative[this._scheme]) { + this._port = temp + ''; + } + buffer = ''; + } + if (stateOverride) { + break loop; + } + state = 'relative path start'; + continue; + } else if (c === '\t' || c === '\n' || c === '\r') { + err('Invalid code point in port: ' + c); + } else { + invalid.call(this); + } + break; + case 'relative path start': + if (c === '\\') { + err('\'\\\' not allowed in path.'); + } + state = 'relative path'; + if ('/' !== c && '\\' !== c) { + continue; + } + break; + case 'relative path': + if (c === EOF || c === '/' || c === '\\' || !stateOverride && (c === '?' || c === '#')) { + if (c === '\\') { + err('\\ not allowed in relative path.'); + } + var tmp; + if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { + buffer = tmp; + } + if (buffer === '..') { + this._path.pop(); + if ('/' !== c && '\\' !== c) { + this._path.push(''); + } + } else if (buffer === '.' && '/' !== c && '\\' !== c) { + this._path.push(''); + } else if ('.' !== buffer) { + if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') { + buffer = buffer[0] + ':'; + } + this._path.push(buffer); + } + buffer = ''; + if (c === '?') { + this._query = '?'; + state = 'query'; + } else if (c === '#') { + this._fragment = '#'; + state = 'fragment'; + } + } else if ('\t' !== c && '\n' !== c && '\r' !== c) { + buffer += percentEscape(c); + } + break; + case 'query': + if (!stateOverride && c === '#') { + this._fragment = '#'; + state = 'fragment'; + } else if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { + this._query += percentEscapeQuery(c); + } + break; + case 'fragment': + if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { + this._fragment += c; + } + break; + } + cursor++; + } + } + function clear() { + this._scheme = ''; + this._schemeData = ''; + this._username = ''; + this._password = null; + this._host = ''; + this._port = ''; + this._path = []; + this._query = ''; + this._fragment = ''; + this._isInvalid = false; + this._isRelative = false; + } + function JURL(url, base) + { + if (base !== undefined && !(base instanceof JURL)) { + base = new JURL(String(base)); + } + this._url = url; + clear.call(this); + var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); + parse.call(this, input, null, base); + } + JURL.prototype = { + toString: function () { + return this.href; + }, + get href() { + if (this._isInvalid) { + return this._url; + } + var authority = ''; + if ('' !== this._username || null !== this._password) { + authority = this._username + (null !== this._password ? ':' + this._password : '') + '@'; + } + return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment; + }, + set href(href) { + clear.call(this); + parse.call(this, href); + }, + get protocol() { + return this._scheme + ':'; + }, + set protocol(protocol) { + if (this._isInvalid) { + return; + } + parse.call(this, protocol + ':', 'scheme start'); + }, + get host() { + return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host; + }, + set host(host) { + if (this._isInvalid || !this._isRelative) { + return; + } + parse.call(this, host, 'host'); + }, + get hostname() { + return this._host; + }, + set hostname(hostname) { + if (this._isInvalid || !this._isRelative) { + return; + } + parse.call(this, hostname, 'hostname'); + }, + get port() { + return this._port; + }, + set port(port) { + if (this._isInvalid || !this._isRelative) { + return; + } + parse.call(this, port, 'port'); + }, + get pathname() { + return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData; + }, + set pathname(pathname) { + if (this._isInvalid || !this._isRelative) { + return; + } + this._path = []; + parse.call(this, pathname, 'relative path start'); + }, + get search() { + return this._isInvalid || !this._query || this._query === '?' ? '' : this._query; + }, + set search(search) { + if (this._isInvalid || !this._isRelative) { + return; + } + this._query = '?'; + if (search[0] === '?') { + search = search.slice(1); + } + parse.call(this, search, 'query'); + }, + get hash() { + return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment; + }, + set hash(hash) { + if (this._isInvalid) { + return; + } + this._fragment = '#'; + if (hash[0] === '#') { + hash = hash.slice(1); + } + parse.call(this, hash, 'fragment'); + }, + get origin() { + var host; + if (this._isInvalid || !this._scheme) { + return ''; + } + switch (this._scheme) { + case 'data': + case 'file': + case 'javascript': + case 'mailto': + return 'null'; + } + host = this.host; + if (!host) { + return ''; + } + return this._scheme + '://' + host; + } + }; + var OriginalURL = scope.URL; + if (OriginalURL) { + JURL.createObjectURL = function (blob) { + return OriginalURL.createObjectURL.apply(OriginalURL, arguments); + }; + JURL.revokeObjectURL = function (url) { + OriginalURL.revokeObjectURL(url); + }; + } + scope.URL = JURL; + }(globalScope)); + exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; + exports.IDENTITY_MATRIX = IDENTITY_MATRIX; + exports.OPS = OPS; + exports.VERBOSITY_LEVELS = VERBOSITY_LEVELS; + exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; + exports.AnnotationBorderStyleType = AnnotationBorderStyleType; + exports.AnnotationFieldFlag = AnnotationFieldFlag; + exports.AnnotationFlag = AnnotationFlag; + exports.AnnotationType = AnnotationType; + exports.FontType = FontType; + exports.ImageKind = ImageKind; + exports.InvalidPDFException = InvalidPDFException; + exports.MessageHandler = MessageHandler; + exports.MissingDataException = MissingDataException; + exports.MissingPDFException = MissingPDFException; + exports.NotImplementedException = NotImplementedException; + exports.PageViewport = PageViewport; + exports.PasswordException = PasswordException; + exports.PasswordResponses = PasswordResponses; + exports.StatTimer = StatTimer; + exports.StreamType = StreamType; + exports.TextRenderingMode = TextRenderingMode; + exports.UnexpectedResponseException = UnexpectedResponseException; + exports.UnknownErrorException = UnknownErrorException; + exports.Util = Util; + exports.XRefParseException = XRefParseException; + exports.arrayByteLength = arrayByteLength; + exports.arraysToBytes = arraysToBytes; + exports.assert = assert; + exports.bytesToString = bytesToString; + exports.createBlob = createBlob; + exports.createPromiseCapability = createPromiseCapability; + exports.createObjectURL = createObjectURL; + exports.deprecated = deprecated; + exports.error = error; + exports.getLookupTableFactory = getLookupTableFactory; + exports.getVerbosityLevel = getVerbosityLevel; + exports.globalScope = globalScope; + exports.info = info; + exports.isArray = isArray; + exports.isArrayBuffer = isArrayBuffer; + exports.isBool = isBool; + exports.isEmptyObj = isEmptyObj; + exports.isInt = isInt; + exports.isNum = isNum; + exports.isString = isString; + exports.isSpace = isSpace; + exports.isSameOrigin = isSameOrigin; + exports.createValidAbsoluteUrl = createValidAbsoluteUrl; + exports.isLittleEndian = isLittleEndian; + exports.isEvalSupported = isEvalSupported; + exports.loadJpegStream = loadJpegStream; + exports.log2 = log2; + exports.readInt8 = readInt8; + exports.readUint16 = readUint16; + exports.readUint32 = readUint32; + exports.removeNullCharacters = removeNullCharacters; + exports.setVerbosityLevel = setVerbosityLevel; + exports.shadow = shadow; + exports.string32 = string32; + exports.stringToBytes = stringToBytes; + exports.stringToPDFString = stringToPDFString; + exports.stringToUTF8String = stringToUTF8String; + exports.utf8StringToString = utf8StringToString; + exports.warn = warn; + })); + (function (root, factory) { + factory(root.pdfjsCoreBidi = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var warn = sharedUtil.warn; + var baseTypes = [ + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'S', + 'B', + 'S', + 'WS', + 'B', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'B', + 'B', + 'B', + 'S', + 'WS', + 'ON', + 'ON', + 'ET', + 'ET', + 'ET', + 'ON', + 'ON', + 'ON', + 'ON', + 'ON', + 'ES', + 'CS', + 'ES', + 'CS', + 'CS', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'CS', + 'ON', + 'ON', + 'ON', + 'ON', + 'ON', + 'ON', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'ON', + 'ON', + 'ON', + 'ON', + 'ON', + 'ON', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'ON', + 'ON', + 'ON', + 'ON', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'B', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'BN', + 'CS', + 'ON', + 'ET', + 'ET', + 'ET', + 'ET', + 'ON', + 'ON', + 'ON', + 'ON', + 'L', + 'ON', + 'ON', + 'BN', + 'ON', + 'ON', + 'ET', + 'ET', + 'EN', + 'EN', + 'ON', + 'L', + 'ON', + 'ON', + 'ON', + 'EN', + 'L', + 'ON', + 'ON', + 'ON', + 'ON', + 'ON', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'ON', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'ON', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L', + 'L' + ]; + var arabicTypes = [ + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'ON', + 'ON', + 'AL', + 'ET', + 'ET', + 'AL', + 'CS', + 'AL', + 'ON', + 'ON', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'AL', + 'AL', + '', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'AN', + 'ET', + 'AN', + 'AN', + 'AL', + 'AL', + 'AL', + 'NSM', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'AN', + 'ON', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'AL', + 'AL', + 'NSM', + 'NSM', + 'ON', + 'NSM', + 'NSM', + 'NSM', + 'NSM', + 'AL', + 'AL', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'EN', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL', + 'AL' + ]; + function isOdd(i) { + return (i & 1) !== 0; + } + function isEven(i) { + return (i & 1) === 0; + } + function findUnequal(arr, start, value) { + for (var j = start, jj = arr.length; j < jj; ++j) { + if (arr[j] !== value) { + return j; + } + } + return j; + } + function setValues(arr, start, end, value) { + for (var j = start; j < end; ++j) { + arr[j] = value; + } + } + function reverseValues(arr, start, end) { + for (var i = start, j = end - 1; i < j; ++i, --j) { + var temp = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + } + function createBidiText(str, isLTR, vertical) { + return { + str: str, + dir: vertical ? 'ttb' : isLTR ? 'ltr' : 'rtl' + }; + } + var chars = []; + var types = []; + function bidi(str, startLevel, vertical) { + var isLTR = true; + var strLength = str.length; + if (strLength === 0 || vertical) { + return createBidiText(str, isLTR, vertical); + } + chars.length = strLength; + types.length = strLength; + var numBidi = 0; + var i, ii; + for (i = 0; i < strLength; ++i) { + chars[i] = str.charAt(i); + var charCode = str.charCodeAt(i); + var charType = 'L'; + if (charCode <= 0x00ff) { + charType = baseTypes[charCode]; + } else if (0x0590 <= charCode && charCode <= 0x05f4) { + charType = 'R'; + } else if (0x0600 <= charCode && charCode <= 0x06ff) { + charType = arabicTypes[charCode & 0xff]; + if (!charType) { + warn('Bidi: invalid Unicode character ' + charCode.toString(16)); + } + } else if (0x0700 <= charCode && charCode <= 0x08AC) { + charType = 'AL'; + } + if (charType === 'R' || charType === 'AL' || charType === 'AN') { + numBidi++; + } + types[i] = charType; + } + if (numBidi === 0) { + isLTR = true; + return createBidiText(str, isLTR); + } + if (startLevel === -1) { + if (numBidi / strLength < 0.3) { + isLTR = true; + startLevel = 0; + } else { + isLTR = false; + startLevel = 1; + } + } + var levels = []; + for (i = 0; i < strLength; ++i) { + levels[i] = startLevel; + } + var e = isOdd(startLevel) ? 'R' : 'L'; + var sor = e; + var eor = sor; + var lastType = sor; + for (i = 0; i < strLength; ++i) { + if (types[i] === 'NSM') { + types[i] = lastType; + } else { + lastType = types[i]; + } + } + lastType = sor; + var t; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === 'EN') { + types[i] = lastType === 'AL' ? 'AN' : 'EN'; + } else if (t === 'R' || t === 'L' || t === 'AL') { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === 'AL') { + types[i] = 'R'; + } + } + for (i = 1; i < strLength - 1; ++i) { + if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') { + types[i] = 'EN'; + } + if (types[i] === 'CS' && (types[i - 1] === 'EN' || types[i - 1] === 'AN') && types[i + 1] === types[i - 1]) { + types[i] = types[i - 1]; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === 'EN') { + var j; + for (j = i - 1; j >= 0; --j) { + if (types[j] !== 'ET') { + break; + } + types[j] = 'EN'; + } + for (j = i + 1; j < strLength; ++j) { + if (types[j] !== 'ET') { + break; + } + types[j] = 'EN'; + } + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') { + types[i] = 'ON'; + } + } + lastType = sor; + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (t === 'EN') { + types[i] = lastType === 'L' ? 'L' : 'EN'; + } else if (t === 'R' || t === 'L') { + lastType = t; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === 'ON') { + var end = findUnequal(types, i + 1, 'ON'); + var before = sor; + if (i > 0) { + before = types[i - 1]; + } + var after = eor; + if (end + 1 < strLength) { + after = types[end + 1]; + } + if (before !== 'L') { + before = 'R'; + } + if (after !== 'L') { + after = 'R'; + } + if (before === after) { + setValues(types, i, end, before); + } + i = end - 1; + } + } + for (i = 0; i < strLength; ++i) { + if (types[i] === 'ON') { + types[i] = e; + } + } + for (i = 0; i < strLength; ++i) { + t = types[i]; + if (isEven(levels[i])) { + if (t === 'R') { + levels[i] += 1; + } else if (t === 'AN' || t === 'EN') { + levels[i] += 2; + } + } else { + if (t === 'L' || t === 'AN' || t === 'EN') { + levels[i] += 1; + } + } + } + var highestLevel = -1; + var lowestOddLevel = 99; + var level; + for (i = 0, ii = levels.length; i < ii; ++i) { + level = levels[i]; + if (highestLevel < level) { + highestLevel = level; + } + if (lowestOddLevel > level && isOdd(level)) { + lowestOddLevel = level; + } + } + for (level = highestLevel; level >= lowestOddLevel; --level) { + var start = -1; + for (i = 0, ii = levels.length; i < ii; ++i) { + if (levels[i] < level) { + if (start >= 0) { + reverseValues(chars, start, i); + start = -1; + } + } else if (start < 0) { + start = i; + } + } + if (start >= 0) { + reverseValues(chars, start, levels.length); + } + } + for (i = 0, ii = chars.length; i < ii; ++i) { + var ch = chars[i]; + if (ch === '<' || ch === '>') { + chars[i] = ''; + } + } + return createBidiText(chars.join(''), isLTR); + } + exports.bidi = bidi; + })); + (function (root, factory) { + factory(root.pdfjsCoreCFFParser = {}, root.pdfjsSharedUtil, root.pdfjsCoreCharsets, root.pdfjsCoreEncodings); + }(this, function (exports, sharedUtil, coreCharsets, coreEncodings) { + var error = sharedUtil.error; + var info = sharedUtil.info; + var bytesToString = sharedUtil.bytesToString; + var warn = sharedUtil.warn; + var isArray = sharedUtil.isArray; + var Util = sharedUtil.Util; + var stringToBytes = sharedUtil.stringToBytes; + var assert = sharedUtil.assert; + var ISOAdobeCharset = coreCharsets.ISOAdobeCharset; + var ExpertCharset = coreCharsets.ExpertCharset; + var ExpertSubsetCharset = coreCharsets.ExpertSubsetCharset; + var StandardEncoding = coreEncodings.StandardEncoding; + var ExpertEncoding = coreEncodings.ExpertEncoding; + var MAX_SUBR_NESTING = 10; + var CFFStandardStrings = [ + '.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', + 'exclamsmall', + 'Hungarumlautsmall', + 'dollaroldstyle', + 'dollarsuperior', + 'ampersandsmall', + 'Acutesmall', + 'parenleftsuperior', + 'parenrightsuperior', + 'twodotenleader', + 'onedotenleader', + 'zerooldstyle', + 'oneoldstyle', + 'twooldstyle', + 'threeoldstyle', + 'fouroldstyle', + 'fiveoldstyle', + 'sixoldstyle', + 'sevenoldstyle', + 'eightoldstyle', + 'nineoldstyle', + 'commasuperior', + 'threequartersemdash', + 'periodsuperior', + 'questionsmall', + 'asuperior', + 'bsuperior', + 'centsuperior', + 'dsuperior', + 'esuperior', + 'isuperior', + 'lsuperior', + 'msuperior', + 'nsuperior', + 'osuperior', + 'rsuperior', + 'ssuperior', + 'tsuperior', + 'ff', + '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', + 'questiondownsmall', + 'oneeighth', + 'threeeighths', + 'fiveeighths', + 'seveneighths', + 'onethird', + 'twothirds', + 'zerosuperior', + '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', + '001.000', + '001.001', + '001.002', + '001.003', + 'Black', + 'Bold', + 'Book', + 'Light', + 'Medium', + 'Regular', + 'Roman', + 'Semibold' + ]; + var CFFParser = function CFFParserClosure() { + var CharstringValidationData = [ + null, + { + id: 'hstem', + min: 2, + stackClearing: true, + stem: true + }, + null, + { + id: 'vstem', + min: 2, + stackClearing: true, + stem: true + }, + { + id: 'vmoveto', + min: 1, + stackClearing: true + }, + { + id: 'rlineto', + min: 2, + resetStack: true + }, + { + id: 'hlineto', + min: 1, + resetStack: true + }, + { + id: 'vlineto', + min: 1, + resetStack: true + }, + { + id: 'rrcurveto', + min: 6, + resetStack: true + }, + null, + { + id: 'callsubr', + min: 1, + undefStack: true + }, + { + id: 'return', + min: 0, + undefStack: true + }, + null, + null, + { + id: 'endchar', + min: 0, + stackClearing: true + }, + null, + null, + null, + { + id: 'hstemhm', + min: 2, + stackClearing: true, + stem: true + }, + { + id: 'hintmask', + min: 0, + stackClearing: true + }, + { + id: 'cntrmask', + min: 0, + stackClearing: true + }, + { + id: 'rmoveto', + min: 2, + stackClearing: true + }, + { + id: 'hmoveto', + min: 1, + stackClearing: true + }, + { + id: 'vstemhm', + min: 2, + stackClearing: true, + stem: true + }, + { + id: 'rcurveline', + min: 8, + resetStack: true + }, + { + id: 'rlinecurve', + min: 8, + resetStack: true + }, + { + id: 'vvcurveto', + min: 4, + resetStack: true + }, + { + id: 'hhcurveto', + min: 4, + resetStack: true + }, + null, + { + id: 'callgsubr', + min: 1, + undefStack: true + }, + { + id: 'vhcurveto', + min: 4, + resetStack: true + }, + { + id: 'hvcurveto', + min: 4, + resetStack: true + } + ]; + var CharstringValidationData12 = [ + null, + null, + null, + { + id: 'and', + min: 2, + stackDelta: -1 + }, + { + id: 'or', + min: 2, + stackDelta: -1 + }, + { + id: 'not', + min: 1, + stackDelta: 0 + }, + null, + null, + null, + { + id: 'abs', + min: 1, + stackDelta: 0 + }, + { + id: 'add', + min: 2, + stackDelta: -1, + stackFn: function stack_div(stack, index) { + stack[index - 2] = stack[index - 2] + stack[index - 1]; + } + }, + { + id: 'sub', + min: 2, + stackDelta: -1, + stackFn: function stack_div(stack, index) { + stack[index - 2] = stack[index - 2] - stack[index - 1]; + } + }, + { + id: 'div', + min: 2, + stackDelta: -1, + stackFn: function stack_div(stack, index) { + stack[index - 2] = stack[index - 2] / stack[index - 1]; + } + }, + null, + { + id: 'neg', + min: 1, + stackDelta: 0, + stackFn: function stack_div(stack, index) { + stack[index - 1] = -stack[index - 1]; + } + }, + { + id: 'eq', + min: 2, + stackDelta: -1 + }, + null, + null, + { + id: 'drop', + min: 1, + stackDelta: -1 + }, + null, + { + id: 'put', + min: 2, + stackDelta: -2 + }, + { + id: 'get', + min: 1, + stackDelta: 0 + }, + { + id: 'ifelse', + min: 4, + stackDelta: -3 + }, + { + id: 'random', + min: 0, + stackDelta: 1 + }, + { + id: 'mul', + min: 2, + stackDelta: -1, + stackFn: function stack_div(stack, index) { + stack[index - 2] = stack[index - 2] * stack[index - 1]; + } + }, + null, + { + id: 'sqrt', + min: 1, + stackDelta: 0 + }, + { + id: 'dup', + min: 1, + stackDelta: 1 + }, + { + id: 'exch', + min: 2, + stackDelta: 0 + }, + { + id: 'index', + min: 2, + stackDelta: 0 + }, + { + id: 'roll', + min: 3, + stackDelta: -2 + }, + null, + null, + null, + { + id: 'hflex', + min: 7, + resetStack: true + }, + { + id: 'flex', + min: 13, + resetStack: true + }, + { + id: 'hflex1', + min: 9, + resetStack: true + }, + { + id: 'flex1', + min: 11, + resetStack: true + } + ]; + function CFFParser(file, properties, seacAnalysisEnabled) { + this.bytes = file.getBytes(); + this.properties = properties; + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + } + CFFParser.prototype = { + parse: function CFFParser_parse() { + var properties = this.properties; + var cff = new CFF(); + this.cff = cff; + var header = this.parseHeader(); + var nameIndex = this.parseIndex(header.endPos); + var topDictIndex = this.parseIndex(nameIndex.endPos); + var stringIndex = this.parseIndex(topDictIndex.endPos); + var globalSubrIndex = this.parseIndex(stringIndex.endPos); + var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); + var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); + cff.header = header.obj; + cff.names = this.parseNameIndex(nameIndex.obj); + cff.strings = this.parseStringIndex(stringIndex.obj); + cff.topDict = topDict; + cff.globalSubrIndex = globalSubrIndex.obj; + this.parsePrivateDict(cff.topDict); + cff.isCIDFont = topDict.hasName('ROS'); + var charStringOffset = topDict.getByName('CharStrings'); + var charStringIndex = this.parseIndex(charStringOffset).obj; + var fontMatrix = topDict.getByName('FontMatrix'); + if (fontMatrix) { + properties.fontMatrix = fontMatrix; + } + var fontBBox = topDict.getByName('FontBBox'); + if (fontBBox) { + properties.ascent = fontBBox[3]; + properties.descent = fontBBox[1]; + properties.ascentScaled = true; + } + var charset, encoding; + if (cff.isCIDFont) { + var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; + for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { + var dictRaw = fdArrayIndex.get(i); + var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings); + this.parsePrivateDict(fontDict); + cff.fdArray.push(fontDict); + } + encoding = null; + charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true); + cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count); + } else { + charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false); + encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset); + } + cff.charset = charset; + cff.encoding = encoding; + var charStringsAndSeacs = this.parseCharStrings(charStringIndex, topDict.privateDict.subrsIndex, globalSubrIndex.obj, cff.fdSelect, cff.fdArray); + cff.charStrings = charStringsAndSeacs.charStrings; + cff.seacs = charStringsAndSeacs.seacs; + cff.widths = charStringsAndSeacs.widths; + return cff; + }, + parseHeader: function CFFParser_parseHeader() { + var bytes = this.bytes; + var bytesLength = bytes.length; + var offset = 0; + while (offset < bytesLength && bytes[offset] !== 1) { + ++offset; + } + if (offset >= bytesLength) { + error('Invalid CFF header'); + } else if (offset !== 0) { + info('cff data is shifted'); + bytes = bytes.subarray(offset); + this.bytes = bytes; + } + var major = bytes[0]; + var minor = bytes[1]; + var hdrSize = bytes[2]; + var offSize = bytes[3]; + var header = new CFFHeader(major, minor, hdrSize, offSize); + return { + obj: header, + endPos: hdrSize + }; + }, + parseDict: function CFFParser_parseDict(dict) { + var pos = 0; + function parseOperand() { + var value = dict[pos++]; + if (value === 30) { + return parseFloatOperand(); + } else if (value === 28) { + value = dict[pos++]; + value = (value << 24 | dict[pos++] << 16) >> 16; + return value; + } else if (value === 29) { + value = dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + value = value << 8 | dict[pos++]; + return value; + } else if (value >= 32 && value <= 246) { + return value - 139; + } else if (value >= 247 && value <= 250) { + return (value - 247) * 256 + dict[pos++] + 108; + } else if (value >= 251 && value <= 254) { + return -((value - 251) * 256) - dict[pos++] - 108; + } + warn('CFFParser_parseDict: "' + value + '" is a reserved command.'); + return NaN; + } + function parseFloatOperand() { + var str = ''; + var eof = 15; + var lookup = [ + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '.', + 'E', + 'E-', + null, + '-' + ]; + var length = dict.length; + while (pos < length) { + var b = dict[pos++]; + var b1 = b >> 4; + var b2 = b & 15; + if (b1 === eof) { + break; + } + str += lookup[b1]; + if (b2 === eof) { + break; + } + str += lookup[b2]; + } + return parseFloat(str); + } + var operands = []; + var entries = []; + pos = 0; + var end = dict.length; + while (pos < end) { + var b = dict[pos]; + if (b <= 21) { + if (b === 12) { + b = b << 8 | dict[++pos]; + } + entries.push([ + b, + operands + ]); + operands = []; + ++pos; + } else { + operands.push(parseOperand()); + } + } + return entries; + }, + parseIndex: function CFFParser_parseIndex(pos) { + var cffIndex = new CFFIndex(); + var bytes = this.bytes; + var count = bytes[pos++] << 8 | bytes[pos++]; + var offsets = []; + var end = pos; + var i, ii; + if (count !== 0) { + var offsetSize = bytes[pos++]; + var startPos = pos + (count + 1) * offsetSize - 1; + for (i = 0, ii = count + 1; i < ii; ++i) { + var offset = 0; + for (var j = 0; j < offsetSize; ++j) { + offset <<= 8; + offset += bytes[pos++]; + } + offsets.push(startPos + offset); + } + end = offsets[count]; + } + for (i = 0, ii = offsets.length - 1; i < ii; ++i) { + var offsetStart = offsets[i]; + var offsetEnd = offsets[i + 1]; + cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); + } + return { + obj: cffIndex, + endPos: end + }; + }, + parseNameIndex: function CFFParser_parseNameIndex(index) { + var names = []; + for (var i = 0, ii = index.count; i < ii; ++i) { + var name = index.get(i); + var length = Math.min(name.length, 127); + var data = []; + for (var j = 0; j < length; ++j) { + var c = name[j]; + if (j === 0 && c === 0) { + data[j] = c; + continue; + } + if (c < 33 || c > 126 || c === 91 || c === 93 || c === 40 || c === 41 || c === 123 || c === 125 || c === 60 || c === 62 || c === 47 || c === 37 || c === 35) + { + data[j] = 95; + continue; + } + data[j] = c; + } + names.push(bytesToString(data)); + } + return names; + }, + parseStringIndex: function CFFParser_parseStringIndex(index) { + var strings = new CFFStrings(); + for (var i = 0, ii = index.count; i < ii; ++i) { + var data = index.get(i); + strings.add(bytesToString(data)); + } + return strings; + }, + createDict: function CFFParser_createDict(Type, dict, strings) { + var cffDict = new Type(strings); + for (var i = 0, ii = dict.length; i < ii; ++i) { + var pair = dict[i]; + var key = pair[0]; + var value = pair[1]; + cffDict.setByKey(key, value); + } + return cffDict; + }, + parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) { + if (state.callDepth > MAX_SUBR_NESTING) { + return false; + } + var stackSize = state.stackSize; + var stack = state.stack; + var length = data.length; + for (var j = 0; j < length;) { + var value = data[j++]; + var validationCommand = null; + if (value === 12) { + var q = data[j++]; + if (q === 0) { + data[j - 2] = 139; + data[j - 1] = 22; + stackSize = 0; + } else { + validationCommand = CharstringValidationData12[q]; + } + } else if (value === 28) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16; + j += 2; + stackSize++; + } else if (value === 14) { + if (stackSize >= 4) { + stackSize -= 4; + if (this.seacAnalysisEnabled) { + state.seac = stack.slice(stackSize, stackSize + 4); + return false; + } + } + validationCommand = CharstringValidationData[value]; + } else if (value >= 32 && value <= 246) { + stack[stackSize] = value - 139; + stackSize++; + } else if (value >= 247 && value <= 254) { + stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108; + j++; + stackSize++; + } else if (value === 255) { + stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536; + j += 4; + stackSize++; + } else if (value === 19 || value === 20) { + state.hints += stackSize >> 1; + j += state.hints + 7 >> 3; + stackSize %= 2; + validationCommand = CharstringValidationData[value]; + } else if (value === 10 || value === 29) { + var subrsIndex; + if (value === 10) { + subrsIndex = localSubrIndex; + } else { + subrsIndex = globalSubrIndex; + } + if (!subrsIndex) { + validationCommand = CharstringValidationData[value]; + warn('Missing subrsIndex for ' + validationCommand.id); + return false; + } + var bias = 32768; + if (subrsIndex.count < 1240) { + bias = 107; + } else if (subrsIndex.count < 33900) { + bias = 1131; + } + var subrNumber = stack[--stackSize] + bias; + if (subrNumber < 0 || subrNumber >= subrsIndex.count) { + validationCommand = CharstringValidationData[value]; + warn('Out of bounds subrIndex for ' + validationCommand.id); + return false; + } + state.stackSize = stackSize; + state.callDepth++; + var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex); + if (!valid) { + return false; + } + state.callDepth--; + stackSize = state.stackSize; + continue; + } else if (value === 11) { + state.stackSize = stackSize; + return true; + } else { + validationCommand = CharstringValidationData[value]; + } + if (validationCommand) { + if (validationCommand.stem) { + state.hints += stackSize >> 1; + } + if ('min' in validationCommand) { + if (!state.undefStack && stackSize < validationCommand.min) { + warn('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min); + return false; + } + } + if (state.firstStackClearing && validationCommand.stackClearing) { + state.firstStackClearing = false; + stackSize -= validationCommand.min; + if (stackSize >= 2 && validationCommand.stem) { + stackSize %= 2; + } else if (stackSize > 1) { + warn('Found too many parameters for stack-clearing command'); + } + if (stackSize > 0 && stack[stackSize - 1] >= 0) { + state.width = stack[stackSize - 1]; + } + } + if ('stackDelta' in validationCommand) { + if ('stackFn' in validationCommand) { + validationCommand.stackFn(stack, stackSize); + } + stackSize += validationCommand.stackDelta; + } else if (validationCommand.stackClearing) { + stackSize = 0; + } else if (validationCommand.resetStack) { + stackSize = 0; + state.undefStack = false; + } else if (validationCommand.undefStack) { + stackSize = 0; + state.undefStack = true; + state.firstStackClearing = false; + } + } + } + state.stackSize = stackSize; + return true; + }, + parseCharStrings: function CFFParser_parseCharStrings(charStrings, localSubrIndex, globalSubrIndex, fdSelect, fdArray) { + var seacs = []; + var widths = []; + var count = charStrings.count; + for (var i = 0; i < count; i++) { + var charstring = charStrings.get(i); + var state = { + callDepth: 0, + stackSize: 0, + stack: [], + undefStack: true, + hints: 0, + firstStackClearing: true, + seac: null, + width: null + }; + var valid = true; + var localSubrToUse = null; + if (fdSelect && fdArray.length) { + var fdIndex = fdSelect.getFDIndex(i); + if (fdIndex === -1) { + warn('Glyph index is not in fd select.'); + valid = false; + } + if (fdIndex >= fdArray.length) { + warn('Invalid fd index for glyph index.'); + valid = false; + } + if (valid) { + localSubrToUse = fdArray[fdIndex].privateDict.subrsIndex; + } + } else if (localSubrIndex) { + localSubrToUse = localSubrIndex; + } + if (valid) { + valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex); + } + if (state.width !== null) { + widths[i] = state.width; + } + if (state.seac !== null) { + seacs[i] = state.seac; + } + if (!valid) { + charStrings.set(i, new Uint8Array([14])); + } + } + return { + charStrings: charStrings, + seacs: seacs, + widths: widths + }; + }, + emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) { + var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings); + parentDict.setByKey(18, [ + 0, + 0 + ]); + parentDict.privateDict = privateDict; + }, + parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { + if (!parentDict.hasName('Private')) { + this.emptyPrivateDictionary(parentDict); + return; + } + var privateOffset = parentDict.getByName('Private'); + if (!isArray(privateOffset) || privateOffset.length !== 2) { + parentDict.removeByName('Private'); + return; + } + var size = privateOffset[0]; + var offset = privateOffset[1]; + if (size === 0 || offset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + var privateDictEnd = offset + size; + var dictData = this.bytes.subarray(offset, privateDictEnd); + var dict = this.parseDict(dictData); + var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings); + parentDict.privateDict = privateDict; + if (!privateDict.getByName('Subrs')) { + return; + } + var subrsOffset = privateDict.getByName('Subrs'); + var relativeOffset = offset + subrsOffset; + if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { + this.emptyPrivateDictionary(parentDict); + return; + } + var subrsIndex = this.parseIndex(relativeOffset); + privateDict.subrsIndex = subrsIndex.obj; + }, + parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { + if (pos === 0) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, ISOAdobeCharset); + } else if (pos === 1) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, ExpertCharset); + } else if (pos === 2) { + return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, ExpertSubsetCharset); + } + var bytes = this.bytes; + var start = pos; + var format = bytes[pos++]; + var charset = ['.notdef']; + var id, count, i; + length -= 1; + switch (format) { + case 0: + for (i = 0; i < length; i++) { + id = bytes[pos++] << 8 | bytes[pos++]; + charset.push(cid ? id : strings.get(id)); + } + break; + case 1: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + case 2: + while (charset.length <= length) { + id = bytes[pos++] << 8 | bytes[pos++]; + count = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i <= count; i++) { + charset.push(cid ? id++ : strings.get(id++)); + } + } + break; + default: + error('Unknown charset format'); + } + var end = pos; + var raw = bytes.subarray(start, end); + return new CFFCharset(false, format, charset, raw); + }, + parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) { + var encoding = Object.create(null); + var bytes = this.bytes; + var predefined = false; + var hasSupplement = false; + var format, i, ii; + var raw = null; + function readSupplement() { + var supplementsCount = bytes[pos++]; + for (i = 0; i < supplementsCount; i++) { + var code = bytes[pos++]; + var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); + encoding[code] = charset.indexOf(strings.get(sid)); + } + } + if (pos === 0 || pos === 1) { + predefined = true; + format = pos; + var baseEncoding = pos ? ExpertEncoding : StandardEncoding; + for (i = 0, ii = charset.length; i < ii; i++) { + var index = baseEncoding.indexOf(charset[i]); + if (index !== -1) { + encoding[index] = i; + } + } + } else { + var dataStart = pos; + format = bytes[pos++]; + switch (format & 0x7f) { + case 0: + var glyphsCount = bytes[pos++]; + for (i = 1; i <= glyphsCount; i++) { + encoding[bytes[pos++]] = i; + } + break; + case 1: + var rangesCount = bytes[pos++]; + var gid = 1; + for (i = 0; i < rangesCount; i++) { + var start = bytes[pos++]; + var left = bytes[pos++]; + for (var j = start; j <= start + left; j++) { + encoding[j] = gid++; + } + } + break; + default: + error('Unknown encoding format: ' + format + ' in CFF'); + break; + } + var dataEnd = pos; + if (format & 0x80) { + bytes[dataStart] &= 0x7f; + readSupplement(); + hasSupplement = true; + } + raw = bytes.subarray(dataStart, dataEnd); + } + format = format & 0x7f; + return new CFFEncoding(predefined, format, encoding, raw); + }, + parseFDSelect: function CFFParser_parseFDSelect(pos, length) { + var start = pos; + var bytes = this.bytes; + var format = bytes[pos++]; + var fdSelect = [], rawBytes; + var i, invalidFirstGID = false; + switch (format) { + case 0: + for (i = 0; i < length; ++i) { + var id = bytes[pos++]; + fdSelect.push(id); + } + rawBytes = bytes.subarray(start, pos); + break; + case 3: + var rangesCount = bytes[pos++] << 8 | bytes[pos++]; + for (i = 0; i < rangesCount; ++i) { + var first = bytes[pos++] << 8 | bytes[pos++]; + if (i === 0 && first !== 0) { + warn('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.'); + invalidFirstGID = true; + first = 0; + } + var fdIndex = bytes[pos++]; + var next = bytes[pos] << 8 | bytes[pos + 1]; + for (var j = first; j < next; ++j) { + fdSelect.push(fdIndex); + } + } + pos += 2; + rawBytes = bytes.subarray(start, pos); + if (invalidFirstGID) { + rawBytes[3] = rawBytes[4] = 0; + } + break; + default: + error('parseFDSelect: Unknown format "' + format + '".'); + break; + } + assert(fdSelect.length === length, 'parseFDSelect: Invalid font data.'); + return new CFFFDSelect(fdSelect, rawBytes); + } + }; + return CFFParser; + }(); + var CFF = function CFFClosure() { + function CFF() { + this.header = null; + this.names = []; + this.topDict = null; + this.strings = new CFFStrings(); + this.globalSubrIndex = null; + this.encoding = null; + this.charset = null; + this.charStrings = null; + this.fdArray = []; + this.fdSelect = null; + this.isCIDFont = false; + } + return CFF; + }(); + var CFFHeader = function CFFHeaderClosure() { + function CFFHeader(major, minor, hdrSize, offSize) { + this.major = major; + this.minor = minor; + this.hdrSize = hdrSize; + this.offSize = offSize; + } + return CFFHeader; + }(); + var CFFStrings = function CFFStringsClosure() { + function CFFStrings() { + this.strings = []; + } + CFFStrings.prototype = { + get: function CFFStrings_get(index) { + if (index >= 0 && index <= 390) { + return CFFStandardStrings[index]; + } + if (index - 391 <= this.strings.length) { + return this.strings[index - 391]; + } + return CFFStandardStrings[0]; + }, + add: function CFFStrings_add(value) { + this.strings.push(value); + }, + get count() { + return this.strings.length; + } + }; + return CFFStrings; + }(); + var CFFIndex = function CFFIndexClosure() { + function CFFIndex() { + this.objects = []; + this.length = 0; + } + CFFIndex.prototype = { + add: function CFFIndex_add(data) { + this.length += data.length; + this.objects.push(data); + }, + set: function CFFIndex_set(index, data) { + this.length += data.length - this.objects[index].length; + this.objects[index] = data; + }, + get: function CFFIndex_get(index) { + return this.objects[index]; + }, + get count() { + return this.objects.length; + } + }; + return CFFIndex; + }(); + var CFFDict = function CFFDictClosure() { + function CFFDict(tables, strings) { + this.keyToNameMap = tables.keyToNameMap; + this.nameToKeyMap = tables.nameToKeyMap; + this.defaults = tables.defaults; + this.types = tables.types; + this.opcodes = tables.opcodes; + this.order = tables.order; + this.strings = strings; + this.values = Object.create(null); + } + CFFDict.prototype = { + setByKey: function CFFDict_setByKey(key, value) { + if (!(key in this.keyToNameMap)) { + return false; + } + var valueLength = value.length; + if (valueLength === 0) { + return true; + } + for (var i = 0; i < valueLength; i++) { + if (isNaN(value[i])) { + warn('Invalid CFFDict value: "' + value + '" for key "' + key + '".'); + return true; + } + } + var type = this.types[key]; + if (type === 'num' || type === 'sid' || type === 'offset') { + value = value[0]; + } + this.values[key] = value; + return true; + }, + setByName: function CFFDict_setByName(name, value) { + if (!(name in this.nameToKeyMap)) { + error('Invalid dictionary name "' + name + '"'); + } + this.values[this.nameToKeyMap[name]] = value; + }, + hasName: function CFFDict_hasName(name) { + return this.nameToKeyMap[name] in this.values; + }, + getByName: function CFFDict_getByName(name) { + if (!(name in this.nameToKeyMap)) { + error('Invalid dictionary name "' + name + '"'); + } + var key = this.nameToKeyMap[name]; + if (!(key in this.values)) { + return this.defaults[key]; + } + return this.values[key]; + }, + removeByName: function CFFDict_removeByName(name) { + delete this.values[this.nameToKeyMap[name]]; + } + }; + CFFDict.createTables = function CFFDict_createTables(layout) { + var tables = { + keyToNameMap: {}, + nameToKeyMap: {}, + defaults: {}, + types: {}, + opcodes: {}, + order: [] + }; + for (var i = 0, ii = layout.length; i < ii; ++i) { + var entry = layout[i]; + var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; + tables.keyToNameMap[key] = entry[1]; + tables.nameToKeyMap[entry[1]] = key; + tables.types[key] = entry[2]; + tables.defaults[key] = entry[3]; + tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; + tables.order.push(key); + } + return tables; + }; + return CFFDict; + }(); + var CFFTopDict = function CFFTopDictClosure() { + var layout = [ + [ + [ + 12, + 30 + ], + 'ROS', + [ + 'sid', + 'sid', + 'num' + ], + null + ], + [ + [ + 12, + 20 + ], + 'SyntheticBase', + 'num', + null + ], + [ + 0, + 'version', + 'sid', + null + ], + [ + 1, + 'Notice', + 'sid', + null + ], + [ + [ + 12, + 0 + ], + 'Copyright', + 'sid', + null + ], + [ + 2, + 'FullName', + 'sid', + null + ], + [ + 3, + 'FamilyName', + 'sid', + null + ], + [ + 4, + 'Weight', + 'sid', + null + ], + [ + [ + 12, + 1 + ], + 'isFixedPitch', + 'num', + 0 + ], + [ + [ + 12, + 2 + ], + 'ItalicAngle', + 'num', + 0 + ], + [ + [ + 12, + 3 + ], + 'UnderlinePosition', + 'num', + -100 + ], + [ + [ + 12, + 4 + ], + 'UnderlineThickness', + 'num', + 50 + ], + [ + [ + 12, + 5 + ], + 'PaintType', + 'num', + 0 + ], + [ + [ + 12, + 6 + ], + 'CharstringType', + 'num', + 2 + ], + [ + [ + 12, + 7 + ], + 'FontMatrix', + [ + 'num', + 'num', + 'num', + 'num', + 'num', + 'num' + ], + [ + 0.001, + 0, + 0, + 0.001, + 0, + 0 + ] + ], + [ + 13, + 'UniqueID', + 'num', + null + ], + [ + 5, + 'FontBBox', + [ + 'num', + 'num', + 'num', + 'num' + ], + [ + 0, + 0, + 0, + 0 + ] + ], + [ + [ + 12, + 8 + ], + 'StrokeWidth', + 'num', + 0 + ], + [ + 14, + 'XUID', + 'array', + null + ], + [ + 15, + 'charset', + 'offset', + 0 + ], + [ + 16, + 'Encoding', + 'offset', + 0 + ], + [ + 17, + 'CharStrings', + 'offset', + 0 + ], + [ + 18, + 'Private', + [ + 'offset', + 'offset' + ], + null + ], + [ + [ + 12, + 21 + ], + 'PostScript', + 'sid', + null + ], + [ + [ + 12, + 22 + ], + 'BaseFontName', + 'sid', + null + ], + [ + [ + 12, + 23 + ], + 'BaseFontBlend', + 'delta', + null + ], + [ + [ + 12, + 31 + ], + 'CIDFontVersion', + 'num', + 0 + ], + [ + [ + 12, + 32 + ], + 'CIDFontRevision', + 'num', + 0 + ], + [ + [ + 12, + 33 + ], + 'CIDFontType', + 'num', + 0 + ], + [ + [ + 12, + 34 + ], + 'CIDCount', + 'num', + 8720 + ], + [ + [ + 12, + 35 + ], + 'UIDBase', + 'num', + null + ], + [ + [ + 12, + 37 + ], + 'FDSelect', + 'offset', + null + ], + [ + [ + 12, + 36 + ], + 'FDArray', + 'offset', + null + ], + [ + [ + 12, + 38 + ], + 'FontName', + 'sid', + null + ] + ]; + var tables = null; + function CFFTopDict(strings) { + if (tables === null) { + tables = CFFDict.createTables(layout); + } + CFFDict.call(this, tables, strings); + this.privateDict = null; + } + CFFTopDict.prototype = Object.create(CFFDict.prototype); + return CFFTopDict; + }(); + var CFFPrivateDict = function CFFPrivateDictClosure() { + var layout = [ + [ + 6, + 'BlueValues', + 'delta', + null + ], + [ + 7, + 'OtherBlues', + 'delta', + null + ], + [ + 8, + 'FamilyBlues', + 'delta', + null + ], + [ + 9, + 'FamilyOtherBlues', + 'delta', + null + ], + [ + [ + 12, + 9 + ], + 'BlueScale', + 'num', + 0.039625 + ], + [ + [ + 12, + 10 + ], + 'BlueShift', + 'num', + 7 + ], + [ + [ + 12, + 11 + ], + 'BlueFuzz', + 'num', + 1 + ], + [ + 10, + 'StdHW', + 'num', + null + ], + [ + 11, + 'StdVW', + 'num', + null + ], + [ + [ + 12, + 12 + ], + 'StemSnapH', + 'delta', + null + ], + [ + [ + 12, + 13 + ], + 'StemSnapV', + 'delta', + null + ], + [ + [ + 12, + 14 + ], + 'ForceBold', + 'num', + 0 + ], + [ + [ + 12, + 17 + ], + 'LanguageGroup', + 'num', + 0 + ], + [ + [ + 12, + 18 + ], + 'ExpansionFactor', + 'num', + 0.06 + ], + [ + [ + 12, + 19 + ], + 'initialRandomSeed', + 'num', + 0 + ], + [ + 20, + 'defaultWidthX', + 'num', + 0 + ], + [ + 21, + 'nominalWidthX', + 'num', + 0 + ], + [ + 19, + 'Subrs', + 'offset', + null + ] + ]; + var tables = null; + function CFFPrivateDict(strings) { + if (tables === null) { + tables = CFFDict.createTables(layout); + } + CFFDict.call(this, tables, strings); + this.subrsIndex = null; + } + CFFPrivateDict.prototype = Object.create(CFFDict.prototype); + return CFFPrivateDict; + }(); + var CFFCharsetPredefinedTypes = { + ISO_ADOBE: 0, + EXPERT: 1, + EXPERT_SUBSET: 2 + }; + var CFFCharset = function CFFCharsetClosure() { + function CFFCharset(predefined, format, charset, raw) { + this.predefined = predefined; + this.format = format; + this.charset = charset; + this.raw = raw; + } + return CFFCharset; + }(); + var CFFEncoding = function CFFEncodingClosure() { + function CFFEncoding(predefined, format, encoding, raw) { + this.predefined = predefined; + this.format = format; + this.encoding = encoding; + this.raw = raw; + } + return CFFEncoding; + }(); + var CFFFDSelect = function CFFFDSelectClosure() { + function CFFFDSelect(fdSelect, raw) { + this.fdSelect = fdSelect; + this.raw = raw; + } + CFFFDSelect.prototype = { + getFDIndex: function CFFFDSelect_get(glyphIndex) { + if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { + return -1; + } + return this.fdSelect[glyphIndex]; + } + }; + return CFFFDSelect; + }(); + var CFFOffsetTracker = function CFFOffsetTrackerClosure() { + function CFFOffsetTracker() { + this.offsets = Object.create(null); + } + CFFOffsetTracker.prototype = { + isTracking: function CFFOffsetTracker_isTracking(key) { + return key in this.offsets; + }, + track: function CFFOffsetTracker_track(key, location) { + if (key in this.offsets) { + error('Already tracking location of ' + key); + } + this.offsets[key] = location; + }, + offset: function CFFOffsetTracker_offset(value) { + for (var key in this.offsets) { + this.offsets[key] += value; + } + }, + setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) { + if (!(key in this.offsets)) { + error('Not tracking location of ' + key); + } + var data = output.data; + var dataOffset = this.offsets[key]; + var size = 5; + for (var i = 0, ii = values.length; i < ii; ++i) { + var offset0 = i * size + dataOffset; + var offset1 = offset0 + 1; + var offset2 = offset0 + 2; + var offset3 = offset0 + 3; + var offset4 = offset0 + 4; + if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { + error('writing to an offset that is not empty'); + } + var value = values[i]; + data[offset0] = 0x1d; + data[offset1] = value >> 24 & 0xFF; + data[offset2] = value >> 16 & 0xFF; + data[offset3] = value >> 8 & 0xFF; + data[offset4] = value & 0xFF; + } + } + }; + return CFFOffsetTracker; + }(); + var CFFCompiler = function CFFCompilerClosure() { + function CFFCompiler(cff) { + this.cff = cff; + } + CFFCompiler.prototype = { + compile: function CFFCompiler_compile() { + var cff = this.cff; + var output = { + data: [], + length: 0, + add: function CFFCompiler_add(data) { + this.data = this.data.concat(data); + this.length = this.data.length; + } + }; + var header = this.compileHeader(cff.header); + output.add(header); + var nameIndex = this.compileNameIndex(cff.names); + output.add(nameIndex); + if (cff.isCIDFont) { + if (cff.topDict.hasName('FontMatrix')) { + var base = cff.topDict.getByName('FontMatrix'); + cff.topDict.removeByName('FontMatrix'); + for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { + var subDict = cff.fdArray[i]; + var matrix = base.slice(0); + if (subDict.hasName('FontMatrix')) { + matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); + } + subDict.setByName('FontMatrix', matrix); + } + } + } + var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont); + output.add(compiled.output); + var topDictTracker = compiled.trackers[0]; + var stringIndex = this.compileStringIndex(cff.strings.strings); + output.add(stringIndex); + var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); + output.add(globalSubrIndex); + if (cff.encoding && cff.topDict.hasName('Encoding')) { + if (cff.encoding.predefined) { + topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output); + } else { + var encoding = this.compileEncoding(cff.encoding); + topDictTracker.setEntryLocation('Encoding', [output.length], output); + output.add(encoding); + } + } + if (cff.charset && cff.topDict.hasName('charset')) { + if (cff.charset.predefined) { + topDictTracker.setEntryLocation('charset', [cff.charset.format], output); + } else { + var charset = this.compileCharset(cff.charset); + topDictTracker.setEntryLocation('charset', [output.length], output); + output.add(charset); + } + } + var charStrings = this.compileCharStrings(cff.charStrings); + topDictTracker.setEntryLocation('CharStrings', [output.length], output); + output.add(charStrings); + if (cff.isCIDFont) { + topDictTracker.setEntryLocation('FDSelect', [output.length], output); + var fdSelect = this.compileFDSelect(cff.fdSelect.raw); + output.add(fdSelect); + compiled = this.compileTopDicts(cff.fdArray, output.length, true); + topDictTracker.setEntryLocation('FDArray', [output.length], output); + output.add(compiled.output); + var fontDictTrackers = compiled.trackers; + this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); + } + this.compilePrivateDicts([cff.topDict], [topDictTracker], output); + output.add([0]); + return output.data; + }, + encodeNumber: function CFFCompiler_encodeNumber(value) { + if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { + return this.encodeInteger(value); + } + return this.encodeFloat(value); + }, + encodeFloat: function CFFCompiler_encodeFloat(num) { + var value = num.toString(); + var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value); + if (m) { + var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length)); + value = (Math.round(num * epsilon) / epsilon).toString(); + } + var nibbles = ''; + var i, ii; + for (i = 0, ii = value.length; i < ii; ++i) { + var a = value[i]; + if (a === 'e') { + nibbles += value[++i] === '-' ? 'c' : 'b'; + } else if (a === '.') { + nibbles += 'a'; + } else if (a === '-') { + nibbles += 'e'; + } else { + nibbles += a; + } + } + nibbles += nibbles.length & 1 ? 'f' : 'ff'; + var out = [30]; + for (i = 0, ii = nibbles.length; i < ii; i += 2) { + out.push(parseInt(nibbles.substr(i, 2), 16)); + } + return out; + }, + encodeInteger: function CFFCompiler_encodeInteger(value) { + var code; + if (value >= -107 && value <= 107) { + code = [value + 139]; + } else if (value >= 108 && value <= 1131) { + value = value - 108; + code = [ + (value >> 8) + 247, + value & 0xFF + ]; + } else if (value >= -1131 && value <= -108) { + value = -value - 108; + code = [ + (value >> 8) + 251, + value & 0xFF + ]; + } else if (value >= -32768 && value <= 32767) { + code = [ + 0x1c, + value >> 8 & 0xFF, + value & 0xFF + ]; + } else { + code = [ + 0x1d, + value >> 24 & 0xFF, + value >> 16 & 0xFF, + value >> 8 & 0xFF, + value & 0xFF + ]; + } + return code; + }, + compileHeader: function CFFCompiler_compileHeader(header) { + return [ + header.major, + header.minor, + header.hdrSize, + header.offSize + ]; + }, + compileNameIndex: function CFFCompiler_compileNameIndex(names) { + var nameIndex = new CFFIndex(); + for (var i = 0, ii = names.length; i < ii; ++i) { + nameIndex.add(stringToBytes(names[i])); + } + return this.compileIndex(nameIndex); + }, + compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) { + var fontDictTrackers = []; + var fdArrayIndex = new CFFIndex(); + for (var i = 0, ii = dicts.length; i < ii; ++i) { + var fontDict = dicts[i]; + if (removeCidKeys) { + fontDict.removeByName('CIDFontVersion'); + fontDict.removeByName('CIDFontRevision'); + fontDict.removeByName('CIDFontType'); + fontDict.removeByName('CIDCount'); + fontDict.removeByName('UIDBase'); + } + var fontDictTracker = new CFFOffsetTracker(); + var fontDictData = this.compileDict(fontDict, fontDictTracker); + fontDictTrackers.push(fontDictTracker); + fdArrayIndex.add(fontDictData); + fontDictTracker.offset(length); + } + fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); + return { + trackers: fontDictTrackers, + output: fdArrayIndex + }; + }, + compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) { + for (var i = 0, ii = dicts.length; i < ii; ++i) { + var fontDict = dicts[i]; + assert(fontDict.privateDict && fontDict.hasName('Private'), 'There must be an private dictionary.'); + var privateDict = fontDict.privateDict; + var privateDictTracker = new CFFOffsetTracker(); + var privateDictData = this.compileDict(privateDict, privateDictTracker); + var outputLength = output.length; + privateDictTracker.offset(outputLength); + if (!privateDictData.length) { + outputLength = 0; + } + trackers[i].setEntryLocation('Private', [ + privateDictData.length, + outputLength + ], output); + output.add(privateDictData); + if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { + var subrs = this.compileIndex(privateDict.subrsIndex); + privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output); + output.add(subrs); + } + } + }, + compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { + var out = []; + var order = dict.order; + for (var i = 0; i < order.length; ++i) { + var key = order[i]; + if (!(key in dict.values)) { + continue; + } + var values = dict.values[key]; + var types = dict.types[key]; + if (!isArray(types)) { + types = [types]; + } + if (!isArray(values)) { + values = [values]; + } + if (values.length === 0) { + continue; + } + for (var j = 0, jj = types.length; j < jj; ++j) { + var type = types[j]; + var value = values[j]; + switch (type) { + case 'num': + case 'sid': + out = out.concat(this.encodeNumber(value)); + break; + case 'offset': + var name = dict.keyToNameMap[key]; + if (!offsetTracker.isTracking(name)) { + offsetTracker.track(name, out.length); + } + out = out.concat([ + 0x1d, + 0, + 0, + 0, + 0 + ]); + break; + case 'array': + case 'delta': + out = out.concat(this.encodeNumber(value)); + for (var k = 1, kk = values.length; k < kk; ++k) { + out = out.concat(this.encodeNumber(values[k])); + } + break; + default: + error('Unknown data type of ' + type); + break; + } + } + out = out.concat(dict.opcodes[key]); + } + return out; + }, + compileStringIndex: function CFFCompiler_compileStringIndex(strings) { + var stringIndex = new CFFIndex(); + for (var i = 0, ii = strings.length; i < ii; ++i) { + stringIndex.add(stringToBytes(strings[i])); + } + return this.compileIndex(stringIndex); + }, + compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { + var globalSubrIndex = this.cff.globalSubrIndex; + this.out.writeByteArray(this.compileIndex(globalSubrIndex)); + }, + compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { + return this.compileIndex(charStrings); + }, + compileCharset: function CFFCompiler_compileCharset(charset) { + return this.compileTypedArray(charset.raw); + }, + compileEncoding: function CFFCompiler_compileEncoding(encoding) { + return this.compileTypedArray(encoding.raw); + }, + compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { + return this.compileTypedArray(fdSelect); + }, + compileTypedArray: function CFFCompiler_compileTypedArray(data) { + var out = []; + for (var i = 0, ii = data.length; i < ii; ++i) { + out[i] = data[i]; + } + return out; + }, + compileIndex: function CFFCompiler_compileIndex(index, trackers) { + trackers = trackers || []; + var objects = index.objects; + var count = objects.length; + if (count === 0) { + return [ + 0, + 0, + 0 + ]; + } + var data = [ + count >> 8 & 0xFF, + count & 0xff + ]; + var lastOffset = 1, i; + for (i = 0; i < count; ++i) { + lastOffset += objects[i].length; + } + var offsetSize; + if (lastOffset < 0x100) { + offsetSize = 1; + } else if (lastOffset < 0x10000) { + offsetSize = 2; + } else if (lastOffset < 0x1000000) { + offsetSize = 3; + } else { + offsetSize = 4; + } + data.push(offsetSize); + var relativeOffset = 1; + for (i = 0; i < count + 1; i++) { + if (offsetSize === 1) { + data.push(relativeOffset & 0xFF); + } else if (offsetSize === 2) { + data.push(relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF); + } else if (offsetSize === 3) { + data.push(relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF); + } else { + data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF); + } + if (objects[i]) { + relativeOffset += objects[i].length; + } + } + for (i = 0; i < count; i++) { + if (trackers[i]) { + trackers[i].offset(data.length); + } + for (var j = 0, jj = objects[i].length; j < jj; j++) { + data.push(objects[i][j]); + } + } + return data; + } + }; + return CFFCompiler; + }(); + exports.CFFStandardStrings = CFFStandardStrings; + exports.CFFParser = CFFParser; + exports.CFF = CFF; + exports.CFFHeader = CFFHeader; + exports.CFFStrings = CFFStrings; + exports.CFFIndex = CFFIndex; + exports.CFFCharset = CFFCharset; + exports.CFFTopDict = CFFTopDict; + exports.CFFPrivateDict = CFFPrivateDict; + exports.CFFCompiler = CFFCompiler; + })); + (function (root, factory) { + factory(root.pdfjsCoreChunkedStream = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var MissingDataException = sharedUtil.MissingDataException; + var arrayByteLength = sharedUtil.arrayByteLength; + var arraysToBytes = sharedUtil.arraysToBytes; + var assert = sharedUtil.assert; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var isInt = sharedUtil.isInt; + var isEmptyObj = sharedUtil.isEmptyObj; + 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; + this.progressiveDataLength = 0; + this.lastSuccessfulEnsureByteChunk = -1; + } + ChunkedStream.prototype = { + getMissingChunks: function ChunkedStream_getMissingChunks() { + var chunks = []; + for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) { + if (!this.loadedChunks[chunk]) { + chunks.push(chunk); + } + } + return chunks; + }, + getBaseStreams: function ChunkedStream_getBaseStreams() { + return [this]; + }, + allChunksLoaded: function ChunkedStream_allChunksLoaded() { + return this.numChunksLoaded === this.numChunks; + }, + onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) { + var end = begin + chunk.byteLength; + assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin); + 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; + var curChunk; + for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + if (!this.loadedChunks[curChunk]) { + this.loadedChunks[curChunk] = true; + ++this.numChunksLoaded; + } + } + }, + onReceiveProgressiveData: function ChunkedStream_onReceiveProgressiveData(data) { + var position = this.progressiveDataLength; + var beginChunk = Math.floor(position / this.chunkSize); + this.bytes.set(new Uint8Array(data), position); + position += data.byteLength; + this.progressiveDataLength = position; + var endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize); + var curChunk; + for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { + if (!this.loadedChunks[curChunk]) { + this.loadedChunks[curChunk] = true; + ++this.numChunksLoaded; + } + } + }, + ensureByte: function ChunkedStream_ensureByte(pos) { + var chunk = Math.floor(pos / this.chunkSize); + if (chunk === this.lastSuccessfulEnsureByteChunk) { + return; + } + if (!this.loadedChunks[chunk]) { + throw new MissingDataException(pos, pos + 1); + } + this.lastSuccessfulEnsureByteChunk = chunk; + }, + ensureRange: function ChunkedStream_ensureRange(begin, end) { + if (begin >= end) { + return; + } + if (end <= this.progressiveDataLength) { + 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 (!this.loadedChunks[chunk]) { + throw new MissingDataException(begin, end); + } + } + }, + nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) { + var chunk, numChunks = this.numChunks; + for (var i = 0; i < numChunks; ++i) { + chunk = (beginChunk + i) % numChunks; + if (!this.loadedChunks[chunk]) { + return chunk; + } + } + return null; + }, + hasChunk: function ChunkedStream_hasChunk(chunk) { + return !!this.loadedChunks[chunk]; + }, + get length() { + return this.end - this.start; + }, + get isEmpty() { + return this.length === 0; + }, + getByte: function ChunkedStream_getByte() { + var pos = this.pos; + if (pos >= this.end) { + return -1; + } + this.ensureByte(pos); + return this.bytes[this.pos++]; + }, + getUint16: function ChunkedStream_getUint16() { + var b0 = this.getByte(); + var b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + }, + getInt32: function ChunkedStream_getInt32() { + var b0 = this.getByte(); + var b1 = this.getByte(); + var b2 = this.getByte(); + var b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + }, + 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); + }, + peekByte: function ChunkedStream_peekByte() { + var peekedByte = this.getByte(); + this.pos--; + return peekedByte; + }, + 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) { + this.ensureRange(start, start + length); + 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 (!this.loadedChunks[chunk]) { + 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(pdfNetworkStream, args) { + var chunkSize = args.rangeChunkSize; + var length = args.length; + this.stream = new ChunkedStream(length, chunkSize, this); + this.length = length; + this.chunkSize = chunkSize; + this.pdfNetworkStream = pdfNetworkStream; + this.url = args.url; + this.disableAutoFetch = args.disableAutoFetch; + this.msgHandler = args.msgHandler; + this.currRequestId = 0; + this.chunksNeededByRequest = Object.create(null); + this.requestsByChunk = Object.create(null); + this.promisesByRequest = Object.create(null); + this.progressiveDataLength = 0; + this.aborted = false; + this._loadedStreamCapability = createPromiseCapability(); + } + ChunkedStreamManager.prototype = { + onLoadedStream: function ChunkedStreamManager_getLoadedStream() { + return this._loadedStreamCapability.promise; + }, + sendRequest: function ChunkedStreamManager_sendRequest(begin, end) { + var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); + if (!rangeReader.isStreamingSupported) { + rangeReader.onProgress = this.onProgress.bind(this); + } + var chunks = [], loaded = 0; + var manager = this; + var promise = new Promise(function (resolve, reject) { + var readChunk = function (chunk) { + try { + if (!chunk.done) { + var data = chunk.value; + chunks.push(data); + loaded += arrayByteLength(data); + if (rangeReader.isStreamingSupported) { + manager.onProgress({ loaded: loaded }); + } + rangeReader.read().then(readChunk, reject); + return; + } + var chunkData = arraysToBytes(chunks); + chunks = null; + resolve(chunkData); + } catch (e) { + reject(e); + } + }; + rangeReader.read().then(readChunk, reject); + }); + promise.then(function (data) { + if (this.aborted) { + return; + } + this.onReceiveData({ + chunk: data, + begin: begin + }); + }.bind(this)); + }, + requestAllChunks: function ChunkedStreamManager_requestAllChunks() { + var missingChunks = this.stream.getMissingChunks(); + this._requestChunks(missingChunks); + return this._loadedStreamCapability.promise; + }, + _requestChunks: function ChunkedStreamManager_requestChunks(chunks) { + var requestId = this.currRequestId++; + var i, ii; + var chunksNeeded = Object.create(null); + this.chunksNeededByRequest[requestId] = chunksNeeded; + for (i = 0, ii = chunks.length; i < ii; i++) { + if (!this.stream.hasChunk(chunks[i])) { + chunksNeeded[chunks[i]] = true; + } + } + if (isEmptyObj(chunksNeeded)) { + return Promise.resolve(); + } + var capability = createPromiseCapability(); + this.promisesByRequest[requestId] = capability; + 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 capability.promise; + } + var groupedChunksToRequest = this.groupChunks(chunksToRequest); + for (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); + } + return capability.promise; + }, + getStream: function ChunkedStreamManager_getStream() { + return this.stream; + }, + requestRange: function ChunkedStreamManager_requestRange(begin, end) { + 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); + } + return this._requestChunks(chunks); + }, + requestRanges: function ChunkedStreamManager_requestRanges(ranges) { + 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; + }); + return this._requestChunks(chunksToRequest); + }, + groupChunks: function ChunkedStreamManager_groupChunks(chunks) { + var groupedChunks = []; + var beginChunk = -1; + var prevChunk = -1; + for (var i = 0; i < chunks.length; ++i) { + var chunk = chunks[i]; + if (beginChunk < 0) { + beginChunk = chunk; + } + if (prevChunk >= 0 && 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 isProgressive = args.begin === undefined; + var begin = isProgressive ? this.progressiveDataLength : args.begin; + var end = begin + chunk.byteLength; + var beginChunk = Math.floor(begin / this.chunkSize); + var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize); + if (isProgressive) { + this.stream.onReceiveProgressiveData(chunk); + this.progressiveDataLength = end; + } else { + this.stream.onReceiveData(begin, chunk); + } + if (this.stream.allChunksLoaded()) { + this._loadedStreamCapability.resolve(this.stream); + } + var loadedRequests = []; + var i, requestId; + for (chunk = beginChunk; chunk < endChunk; ++chunk) { + var requestIds = this.requestsByChunk[chunk] || []; + delete this.requestsByChunk[chunk]; + for (i = 0; i < requestIds.length; ++i) { + requestId = requestIds[i]; + var chunksNeeded = this.chunksNeededByRequest[requestId]; + if (chunk in chunksNeeded) { + delete chunksNeeded[chunk]; + } + if (!isEmptyObj(chunksNeeded)) { + continue; + } + loadedRequests.push(requestId); + } + } + if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) { + var nextEmptyChunk; + if (this.stream.numChunksLoaded === 1) { + 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 (i = 0; i < loadedRequests.length; ++i) { + requestId = loadedRequests[i]; + var capability = this.promisesByRequest[requestId]; + delete this.promisesByRequest[requestId]; + capability.resolve(); + } + this.msgHandler.send('DocProgress', { + loaded: this.stream.numChunksLoaded * this.chunkSize, + total: this.length + }); + }, + onError: function ChunkedStreamManager_onError(err) { + this._loadedStreamCapability.reject(err); + }, + getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) { + var chunk = Math.floor(begin / this.chunkSize); + return chunk; + }, + getEndChunk: function ChunkedStreamManager_getEndChunk(end) { + var chunk = Math.floor((end - 1) / this.chunkSize) + 1; + return chunk; + }, + abort: function ChunkedStreamManager_abort() { + this.aborted = true; + if (this.pdfNetworkStream) { + this.pdfNetworkStream.cancelAllRequests('abort'); + } + for (var requestId in this.promisesByRequest) { + var capability = this.promisesByRequest[requestId]; + capability.reject(new Error('Request was aborted')); + } + } + }; + return ChunkedStreamManager; + }(); + exports.ChunkedStream = ChunkedStream; + exports.ChunkedStreamManager = ChunkedStreamManager; + })); + (function (root, factory) { + factory(root.pdfjsCoreGlyphList = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var getLookupTableFactory = sharedUtil.getLookupTableFactory; + var getGlyphsUnicode = getLookupTableFactory(function (t) { + t['A'] = 0x0041; + t['AE'] = 0x00C6; + t['AEacute'] = 0x01FC; + t['AEmacron'] = 0x01E2; + t['AEsmall'] = 0xF7E6; + t['Aacute'] = 0x00C1; + t['Aacutesmall'] = 0xF7E1; + t['Abreve'] = 0x0102; + t['Abreveacute'] = 0x1EAE; + t['Abrevecyrillic'] = 0x04D0; + t['Abrevedotbelow'] = 0x1EB6; + t['Abrevegrave'] = 0x1EB0; + t['Abrevehookabove'] = 0x1EB2; + t['Abrevetilde'] = 0x1EB4; + t['Acaron'] = 0x01CD; + t['Acircle'] = 0x24B6; + t['Acircumflex'] = 0x00C2; + t['Acircumflexacute'] = 0x1EA4; + t['Acircumflexdotbelow'] = 0x1EAC; + t['Acircumflexgrave'] = 0x1EA6; + t['Acircumflexhookabove'] = 0x1EA8; + t['Acircumflexsmall'] = 0xF7E2; + t['Acircumflextilde'] = 0x1EAA; + t['Acute'] = 0xF6C9; + t['Acutesmall'] = 0xF7B4; + t['Acyrillic'] = 0x0410; + t['Adblgrave'] = 0x0200; + t['Adieresis'] = 0x00C4; + t['Adieresiscyrillic'] = 0x04D2; + t['Adieresismacron'] = 0x01DE; + t['Adieresissmall'] = 0xF7E4; + t['Adotbelow'] = 0x1EA0; + t['Adotmacron'] = 0x01E0; + t['Agrave'] = 0x00C0; + t['Agravesmall'] = 0xF7E0; + t['Ahookabove'] = 0x1EA2; + t['Aiecyrillic'] = 0x04D4; + t['Ainvertedbreve'] = 0x0202; + t['Alpha'] = 0x0391; + t['Alphatonos'] = 0x0386; + t['Amacron'] = 0x0100; + t['Amonospace'] = 0xFF21; + t['Aogonek'] = 0x0104; + t['Aring'] = 0x00C5; + t['Aringacute'] = 0x01FA; + t['Aringbelow'] = 0x1E00; + t['Aringsmall'] = 0xF7E5; + t['Asmall'] = 0xF761; + t['Atilde'] = 0x00C3; + t['Atildesmall'] = 0xF7E3; + t['Aybarmenian'] = 0x0531; + t['B'] = 0x0042; + t['Bcircle'] = 0x24B7; + t['Bdotaccent'] = 0x1E02; + t['Bdotbelow'] = 0x1E04; + t['Becyrillic'] = 0x0411; + t['Benarmenian'] = 0x0532; + t['Beta'] = 0x0392; + t['Bhook'] = 0x0181; + t['Blinebelow'] = 0x1E06; + t['Bmonospace'] = 0xFF22; + t['Brevesmall'] = 0xF6F4; + t['Bsmall'] = 0xF762; + t['Btopbar'] = 0x0182; + t['C'] = 0x0043; + t['Caarmenian'] = 0x053E; + t['Cacute'] = 0x0106; + t['Caron'] = 0xF6CA; + t['Caronsmall'] = 0xF6F5; + t['Ccaron'] = 0x010C; + t['Ccedilla'] = 0x00C7; + t['Ccedillaacute'] = 0x1E08; + t['Ccedillasmall'] = 0xF7E7; + t['Ccircle'] = 0x24B8; + t['Ccircumflex'] = 0x0108; + t['Cdot'] = 0x010A; + t['Cdotaccent'] = 0x010A; + t['Cedillasmall'] = 0xF7B8; + t['Chaarmenian'] = 0x0549; + t['Cheabkhasiancyrillic'] = 0x04BC; + t['Checyrillic'] = 0x0427; + t['Chedescenderabkhasiancyrillic'] = 0x04BE; + t['Chedescendercyrillic'] = 0x04B6; + t['Chedieresiscyrillic'] = 0x04F4; + t['Cheharmenian'] = 0x0543; + t['Chekhakassiancyrillic'] = 0x04CB; + t['Cheverticalstrokecyrillic'] = 0x04B8; + t['Chi'] = 0x03A7; + t['Chook'] = 0x0187; + t['Circumflexsmall'] = 0xF6F6; + t['Cmonospace'] = 0xFF23; + t['Coarmenian'] = 0x0551; + t['Csmall'] = 0xF763; + t['D'] = 0x0044; + t['DZ'] = 0x01F1; + t['DZcaron'] = 0x01C4; + t['Daarmenian'] = 0x0534; + t['Dafrican'] = 0x0189; + t['Dcaron'] = 0x010E; + t['Dcedilla'] = 0x1E10; + t['Dcircle'] = 0x24B9; + t['Dcircumflexbelow'] = 0x1E12; + t['Dcroat'] = 0x0110; + t['Ddotaccent'] = 0x1E0A; + t['Ddotbelow'] = 0x1E0C; + t['Decyrillic'] = 0x0414; + t['Deicoptic'] = 0x03EE; + t['Delta'] = 0x2206; + t['Deltagreek'] = 0x0394; + t['Dhook'] = 0x018A; + t['Dieresis'] = 0xF6CB; + t['DieresisAcute'] = 0xF6CC; + t['DieresisGrave'] = 0xF6CD; + t['Dieresissmall'] = 0xF7A8; + t['Digammagreek'] = 0x03DC; + t['Djecyrillic'] = 0x0402; + t['Dlinebelow'] = 0x1E0E; + t['Dmonospace'] = 0xFF24; + t['Dotaccentsmall'] = 0xF6F7; + t['Dslash'] = 0x0110; + t['Dsmall'] = 0xF764; + t['Dtopbar'] = 0x018B; + t['Dz'] = 0x01F2; + t['Dzcaron'] = 0x01C5; + t['Dzeabkhasiancyrillic'] = 0x04E0; + t['Dzecyrillic'] = 0x0405; + t['Dzhecyrillic'] = 0x040F; + t['E'] = 0x0045; + t['Eacute'] = 0x00C9; + t['Eacutesmall'] = 0xF7E9; + t['Ebreve'] = 0x0114; + t['Ecaron'] = 0x011A; + t['Ecedillabreve'] = 0x1E1C; + t['Echarmenian'] = 0x0535; + t['Ecircle'] = 0x24BA; + t['Ecircumflex'] = 0x00CA; + t['Ecircumflexacute'] = 0x1EBE; + t['Ecircumflexbelow'] = 0x1E18; + t['Ecircumflexdotbelow'] = 0x1EC6; + t['Ecircumflexgrave'] = 0x1EC0; + t['Ecircumflexhookabove'] = 0x1EC2; + t['Ecircumflexsmall'] = 0xF7EA; + t['Ecircumflextilde'] = 0x1EC4; + t['Ecyrillic'] = 0x0404; + t['Edblgrave'] = 0x0204; + t['Edieresis'] = 0x00CB; + t['Edieresissmall'] = 0xF7EB; + t['Edot'] = 0x0116; + t['Edotaccent'] = 0x0116; + t['Edotbelow'] = 0x1EB8; + t['Efcyrillic'] = 0x0424; + t['Egrave'] = 0x00C8; + t['Egravesmall'] = 0xF7E8; + t['Eharmenian'] = 0x0537; + t['Ehookabove'] = 0x1EBA; + t['Eightroman'] = 0x2167; + t['Einvertedbreve'] = 0x0206; + t['Eiotifiedcyrillic'] = 0x0464; + t['Elcyrillic'] = 0x041B; + t['Elevenroman'] = 0x216A; + t['Emacron'] = 0x0112; + t['Emacronacute'] = 0x1E16; + t['Emacrongrave'] = 0x1E14; + t['Emcyrillic'] = 0x041C; + t['Emonospace'] = 0xFF25; + t['Encyrillic'] = 0x041D; + t['Endescendercyrillic'] = 0x04A2; + t['Eng'] = 0x014A; + t['Enghecyrillic'] = 0x04A4; + t['Enhookcyrillic'] = 0x04C7; + t['Eogonek'] = 0x0118; + t['Eopen'] = 0x0190; + t['Epsilon'] = 0x0395; + t['Epsilontonos'] = 0x0388; + t['Ercyrillic'] = 0x0420; + t['Ereversed'] = 0x018E; + t['Ereversedcyrillic'] = 0x042D; + t['Escyrillic'] = 0x0421; + t['Esdescendercyrillic'] = 0x04AA; + t['Esh'] = 0x01A9; + t['Esmall'] = 0xF765; + t['Eta'] = 0x0397; + t['Etarmenian'] = 0x0538; + t['Etatonos'] = 0x0389; + t['Eth'] = 0x00D0; + t['Ethsmall'] = 0xF7F0; + t['Etilde'] = 0x1EBC; + t['Etildebelow'] = 0x1E1A; + t['Euro'] = 0x20AC; + t['Ezh'] = 0x01B7; + t['Ezhcaron'] = 0x01EE; + t['Ezhreversed'] = 0x01B8; + t['F'] = 0x0046; + t['Fcircle'] = 0x24BB; + t['Fdotaccent'] = 0x1E1E; + t['Feharmenian'] = 0x0556; + t['Feicoptic'] = 0x03E4; + t['Fhook'] = 0x0191; + t['Fitacyrillic'] = 0x0472; + t['Fiveroman'] = 0x2164; + t['Fmonospace'] = 0xFF26; + t['Fourroman'] = 0x2163; + t['Fsmall'] = 0xF766; + t['G'] = 0x0047; + t['GBsquare'] = 0x3387; + t['Gacute'] = 0x01F4; + t['Gamma'] = 0x0393; + t['Gammaafrican'] = 0x0194; + t['Gangiacoptic'] = 0x03EA; + t['Gbreve'] = 0x011E; + t['Gcaron'] = 0x01E6; + t['Gcedilla'] = 0x0122; + t['Gcircle'] = 0x24BC; + t['Gcircumflex'] = 0x011C; + t['Gcommaaccent'] = 0x0122; + t['Gdot'] = 0x0120; + t['Gdotaccent'] = 0x0120; + t['Gecyrillic'] = 0x0413; + t['Ghadarmenian'] = 0x0542; + t['Ghemiddlehookcyrillic'] = 0x0494; + t['Ghestrokecyrillic'] = 0x0492; + t['Gheupturncyrillic'] = 0x0490; + t['Ghook'] = 0x0193; + t['Gimarmenian'] = 0x0533; + t['Gjecyrillic'] = 0x0403; + t['Gmacron'] = 0x1E20; + t['Gmonospace'] = 0xFF27; + t['Grave'] = 0xF6CE; + t['Gravesmall'] = 0xF760; + t['Gsmall'] = 0xF767; + t['Gsmallhook'] = 0x029B; + t['Gstroke'] = 0x01E4; + t['H'] = 0x0048; + t['H18533'] = 0x25CF; + t['H18543'] = 0x25AA; + t['H18551'] = 0x25AB; + t['H22073'] = 0x25A1; + t['HPsquare'] = 0x33CB; + t['Haabkhasiancyrillic'] = 0x04A8; + t['Hadescendercyrillic'] = 0x04B2; + t['Hardsigncyrillic'] = 0x042A; + t['Hbar'] = 0x0126; + t['Hbrevebelow'] = 0x1E2A; + t['Hcedilla'] = 0x1E28; + t['Hcircle'] = 0x24BD; + t['Hcircumflex'] = 0x0124; + t['Hdieresis'] = 0x1E26; + t['Hdotaccent'] = 0x1E22; + t['Hdotbelow'] = 0x1E24; + t['Hmonospace'] = 0xFF28; + t['Hoarmenian'] = 0x0540; + t['Horicoptic'] = 0x03E8; + t['Hsmall'] = 0xF768; + t['Hungarumlaut'] = 0xF6CF; + t['Hungarumlautsmall'] = 0xF6F8; + t['Hzsquare'] = 0x3390; + t['I'] = 0x0049; + t['IAcyrillic'] = 0x042F; + t['IJ'] = 0x0132; + t['IUcyrillic'] = 0x042E; + t['Iacute'] = 0x00CD; + t['Iacutesmall'] = 0xF7ED; + t['Ibreve'] = 0x012C; + t['Icaron'] = 0x01CF; + t['Icircle'] = 0x24BE; + t['Icircumflex'] = 0x00CE; + t['Icircumflexsmall'] = 0xF7EE; + t['Icyrillic'] = 0x0406; + t['Idblgrave'] = 0x0208; + t['Idieresis'] = 0x00CF; + t['Idieresisacute'] = 0x1E2E; + t['Idieresiscyrillic'] = 0x04E4; + t['Idieresissmall'] = 0xF7EF; + t['Idot'] = 0x0130; + t['Idotaccent'] = 0x0130; + t['Idotbelow'] = 0x1ECA; + t['Iebrevecyrillic'] = 0x04D6; + t['Iecyrillic'] = 0x0415; + t['Ifraktur'] = 0x2111; + t['Igrave'] = 0x00CC; + t['Igravesmall'] = 0xF7EC; + t['Ihookabove'] = 0x1EC8; + t['Iicyrillic'] = 0x0418; + t['Iinvertedbreve'] = 0x020A; + t['Iishortcyrillic'] = 0x0419; + t['Imacron'] = 0x012A; + t['Imacroncyrillic'] = 0x04E2; + t['Imonospace'] = 0xFF29; + t['Iniarmenian'] = 0x053B; + t['Iocyrillic'] = 0x0401; + t['Iogonek'] = 0x012E; + t['Iota'] = 0x0399; + t['Iotaafrican'] = 0x0196; + t['Iotadieresis'] = 0x03AA; + t['Iotatonos'] = 0x038A; + t['Ismall'] = 0xF769; + t['Istroke'] = 0x0197; + t['Itilde'] = 0x0128; + t['Itildebelow'] = 0x1E2C; + t['Izhitsacyrillic'] = 0x0474; + t['Izhitsadblgravecyrillic'] = 0x0476; + t['J'] = 0x004A; + t['Jaarmenian'] = 0x0541; + t['Jcircle'] = 0x24BF; + t['Jcircumflex'] = 0x0134; + t['Jecyrillic'] = 0x0408; + t['Jheharmenian'] = 0x054B; + t['Jmonospace'] = 0xFF2A; + t['Jsmall'] = 0xF76A; + t['K'] = 0x004B; + t['KBsquare'] = 0x3385; + t['KKsquare'] = 0x33CD; + t['Kabashkircyrillic'] = 0x04A0; + t['Kacute'] = 0x1E30; + t['Kacyrillic'] = 0x041A; + t['Kadescendercyrillic'] = 0x049A; + t['Kahookcyrillic'] = 0x04C3; + t['Kappa'] = 0x039A; + t['Kastrokecyrillic'] = 0x049E; + t['Kaverticalstrokecyrillic'] = 0x049C; + t['Kcaron'] = 0x01E8; + t['Kcedilla'] = 0x0136; + t['Kcircle'] = 0x24C0; + t['Kcommaaccent'] = 0x0136; + t['Kdotbelow'] = 0x1E32; + t['Keharmenian'] = 0x0554; + t['Kenarmenian'] = 0x053F; + t['Khacyrillic'] = 0x0425; + t['Kheicoptic'] = 0x03E6; + t['Khook'] = 0x0198; + t['Kjecyrillic'] = 0x040C; + t['Klinebelow'] = 0x1E34; + t['Kmonospace'] = 0xFF2B; + t['Koppacyrillic'] = 0x0480; + t['Koppagreek'] = 0x03DE; + t['Ksicyrillic'] = 0x046E; + t['Ksmall'] = 0xF76B; + t['L'] = 0x004C; + t['LJ'] = 0x01C7; + t['LL'] = 0xF6BF; + t['Lacute'] = 0x0139; + t['Lambda'] = 0x039B; + t['Lcaron'] = 0x013D; + t['Lcedilla'] = 0x013B; + t['Lcircle'] = 0x24C1; + t['Lcircumflexbelow'] = 0x1E3C; + t['Lcommaaccent'] = 0x013B; + t['Ldot'] = 0x013F; + t['Ldotaccent'] = 0x013F; + t['Ldotbelow'] = 0x1E36; + t['Ldotbelowmacron'] = 0x1E38; + t['Liwnarmenian'] = 0x053C; + t['Lj'] = 0x01C8; + t['Ljecyrillic'] = 0x0409; + t['Llinebelow'] = 0x1E3A; + t['Lmonospace'] = 0xFF2C; + t['Lslash'] = 0x0141; + t['Lslashsmall'] = 0xF6F9; + t['Lsmall'] = 0xF76C; + t['M'] = 0x004D; + t['MBsquare'] = 0x3386; + t['Macron'] = 0xF6D0; + t['Macronsmall'] = 0xF7AF; + t['Macute'] = 0x1E3E; + t['Mcircle'] = 0x24C2; + t['Mdotaccent'] = 0x1E40; + t['Mdotbelow'] = 0x1E42; + t['Menarmenian'] = 0x0544; + t['Mmonospace'] = 0xFF2D; + t['Msmall'] = 0xF76D; + t['Mturned'] = 0x019C; + t['Mu'] = 0x039C; + t['N'] = 0x004E; + t['NJ'] = 0x01CA; + t['Nacute'] = 0x0143; + t['Ncaron'] = 0x0147; + t['Ncedilla'] = 0x0145; + t['Ncircle'] = 0x24C3; + t['Ncircumflexbelow'] = 0x1E4A; + t['Ncommaaccent'] = 0x0145; + t['Ndotaccent'] = 0x1E44; + t['Ndotbelow'] = 0x1E46; + t['Nhookleft'] = 0x019D; + t['Nineroman'] = 0x2168; + t['Nj'] = 0x01CB; + t['Njecyrillic'] = 0x040A; + t['Nlinebelow'] = 0x1E48; + t['Nmonospace'] = 0xFF2E; + t['Nowarmenian'] = 0x0546; + t['Nsmall'] = 0xF76E; + t['Ntilde'] = 0x00D1; + t['Ntildesmall'] = 0xF7F1; + t['Nu'] = 0x039D; + t['O'] = 0x004F; + t['OE'] = 0x0152; + t['OEsmall'] = 0xF6FA; + t['Oacute'] = 0x00D3; + t['Oacutesmall'] = 0xF7F3; + t['Obarredcyrillic'] = 0x04E8; + t['Obarreddieresiscyrillic'] = 0x04EA; + t['Obreve'] = 0x014E; + t['Ocaron'] = 0x01D1; + t['Ocenteredtilde'] = 0x019F; + t['Ocircle'] = 0x24C4; + t['Ocircumflex'] = 0x00D4; + t['Ocircumflexacute'] = 0x1ED0; + t['Ocircumflexdotbelow'] = 0x1ED8; + t['Ocircumflexgrave'] = 0x1ED2; + t['Ocircumflexhookabove'] = 0x1ED4; + t['Ocircumflexsmall'] = 0xF7F4; + t['Ocircumflextilde'] = 0x1ED6; + t['Ocyrillic'] = 0x041E; + t['Odblacute'] = 0x0150; + t['Odblgrave'] = 0x020C; + t['Odieresis'] = 0x00D6; + t['Odieresiscyrillic'] = 0x04E6; + t['Odieresissmall'] = 0xF7F6; + t['Odotbelow'] = 0x1ECC; + t['Ogoneksmall'] = 0xF6FB; + t['Ograve'] = 0x00D2; + t['Ogravesmall'] = 0xF7F2; + t['Oharmenian'] = 0x0555; + t['Ohm'] = 0x2126; + t['Ohookabove'] = 0x1ECE; + t['Ohorn'] = 0x01A0; + t['Ohornacute'] = 0x1EDA; + t['Ohorndotbelow'] = 0x1EE2; + t['Ohorngrave'] = 0x1EDC; + t['Ohornhookabove'] = 0x1EDE; + t['Ohorntilde'] = 0x1EE0; + t['Ohungarumlaut'] = 0x0150; + t['Oi'] = 0x01A2; + t['Oinvertedbreve'] = 0x020E; + t['Omacron'] = 0x014C; + t['Omacronacute'] = 0x1E52; + t['Omacrongrave'] = 0x1E50; + t['Omega'] = 0x2126; + t['Omegacyrillic'] = 0x0460; + t['Omegagreek'] = 0x03A9; + t['Omegaroundcyrillic'] = 0x047A; + t['Omegatitlocyrillic'] = 0x047C; + t['Omegatonos'] = 0x038F; + t['Omicron'] = 0x039F; + t['Omicrontonos'] = 0x038C; + t['Omonospace'] = 0xFF2F; + t['Oneroman'] = 0x2160; + t['Oogonek'] = 0x01EA; + t['Oogonekmacron'] = 0x01EC; + t['Oopen'] = 0x0186; + t['Oslash'] = 0x00D8; + t['Oslashacute'] = 0x01FE; + t['Oslashsmall'] = 0xF7F8; + t['Osmall'] = 0xF76F; + t['Ostrokeacute'] = 0x01FE; + t['Otcyrillic'] = 0x047E; + t['Otilde'] = 0x00D5; + t['Otildeacute'] = 0x1E4C; + t['Otildedieresis'] = 0x1E4E; + t['Otildesmall'] = 0xF7F5; + t['P'] = 0x0050; + t['Pacute'] = 0x1E54; + t['Pcircle'] = 0x24C5; + t['Pdotaccent'] = 0x1E56; + t['Pecyrillic'] = 0x041F; + t['Peharmenian'] = 0x054A; + t['Pemiddlehookcyrillic'] = 0x04A6; + t['Phi'] = 0x03A6; + t['Phook'] = 0x01A4; + t['Pi'] = 0x03A0; + t['Piwrarmenian'] = 0x0553; + t['Pmonospace'] = 0xFF30; + t['Psi'] = 0x03A8; + t['Psicyrillic'] = 0x0470; + t['Psmall'] = 0xF770; + t['Q'] = 0x0051; + t['Qcircle'] = 0x24C6; + t['Qmonospace'] = 0xFF31; + t['Qsmall'] = 0xF771; + t['R'] = 0x0052; + t['Raarmenian'] = 0x054C; + t['Racute'] = 0x0154; + t['Rcaron'] = 0x0158; + t['Rcedilla'] = 0x0156; + t['Rcircle'] = 0x24C7; + t['Rcommaaccent'] = 0x0156; + t['Rdblgrave'] = 0x0210; + t['Rdotaccent'] = 0x1E58; + t['Rdotbelow'] = 0x1E5A; + t['Rdotbelowmacron'] = 0x1E5C; + t['Reharmenian'] = 0x0550; + t['Rfraktur'] = 0x211C; + t['Rho'] = 0x03A1; + t['Ringsmall'] = 0xF6FC; + t['Rinvertedbreve'] = 0x0212; + t['Rlinebelow'] = 0x1E5E; + t['Rmonospace'] = 0xFF32; + t['Rsmall'] = 0xF772; + t['Rsmallinverted'] = 0x0281; + t['Rsmallinvertedsuperior'] = 0x02B6; + t['S'] = 0x0053; + t['SF010000'] = 0x250C; + t['SF020000'] = 0x2514; + t['SF030000'] = 0x2510; + t['SF040000'] = 0x2518; + t['SF050000'] = 0x253C; + t['SF060000'] = 0x252C; + t['SF070000'] = 0x2534; + t['SF080000'] = 0x251C; + t['SF090000'] = 0x2524; + t['SF100000'] = 0x2500; + t['SF110000'] = 0x2502; + t['SF190000'] = 0x2561; + t['SF200000'] = 0x2562; + t['SF210000'] = 0x2556; + t['SF220000'] = 0x2555; + t['SF230000'] = 0x2563; + t['SF240000'] = 0x2551; + t['SF250000'] = 0x2557; + t['SF260000'] = 0x255D; + t['SF270000'] = 0x255C; + t['SF280000'] = 0x255B; + t['SF360000'] = 0x255E; + t['SF370000'] = 0x255F; + t['SF380000'] = 0x255A; + t['SF390000'] = 0x2554; + t['SF400000'] = 0x2569; + t['SF410000'] = 0x2566; + t['SF420000'] = 0x2560; + t['SF430000'] = 0x2550; + t['SF440000'] = 0x256C; + t['SF450000'] = 0x2567; + t['SF460000'] = 0x2568; + t['SF470000'] = 0x2564; + t['SF480000'] = 0x2565; + t['SF490000'] = 0x2559; + t['SF500000'] = 0x2558; + t['SF510000'] = 0x2552; + t['SF520000'] = 0x2553; + t['SF530000'] = 0x256B; + t['SF540000'] = 0x256A; + t['Sacute'] = 0x015A; + t['Sacutedotaccent'] = 0x1E64; + t['Sampigreek'] = 0x03E0; + t['Scaron'] = 0x0160; + t['Scarondotaccent'] = 0x1E66; + t['Scaronsmall'] = 0xF6FD; + t['Scedilla'] = 0x015E; + t['Schwa'] = 0x018F; + t['Schwacyrillic'] = 0x04D8; + t['Schwadieresiscyrillic'] = 0x04DA; + t['Scircle'] = 0x24C8; + t['Scircumflex'] = 0x015C; + t['Scommaaccent'] = 0x0218; + t['Sdotaccent'] = 0x1E60; + t['Sdotbelow'] = 0x1E62; + t['Sdotbelowdotaccent'] = 0x1E68; + t['Seharmenian'] = 0x054D; + t['Sevenroman'] = 0x2166; + t['Shaarmenian'] = 0x0547; + t['Shacyrillic'] = 0x0428; + t['Shchacyrillic'] = 0x0429; + t['Sheicoptic'] = 0x03E2; + t['Shhacyrillic'] = 0x04BA; + t['Shimacoptic'] = 0x03EC; + t['Sigma'] = 0x03A3; + t['Sixroman'] = 0x2165; + t['Smonospace'] = 0xFF33; + t['Softsigncyrillic'] = 0x042C; + t['Ssmall'] = 0xF773; + t['Stigmagreek'] = 0x03DA; + t['T'] = 0x0054; + t['Tau'] = 0x03A4; + t['Tbar'] = 0x0166; + t['Tcaron'] = 0x0164; + t['Tcedilla'] = 0x0162; + t['Tcircle'] = 0x24C9; + t['Tcircumflexbelow'] = 0x1E70; + t['Tcommaaccent'] = 0x0162; + t['Tdotaccent'] = 0x1E6A; + t['Tdotbelow'] = 0x1E6C; + t['Tecyrillic'] = 0x0422; + t['Tedescendercyrillic'] = 0x04AC; + t['Tenroman'] = 0x2169; + t['Tetsecyrillic'] = 0x04B4; + t['Theta'] = 0x0398; + t['Thook'] = 0x01AC; + t['Thorn'] = 0x00DE; + t['Thornsmall'] = 0xF7FE; + t['Threeroman'] = 0x2162; + t['Tildesmall'] = 0xF6FE; + t['Tiwnarmenian'] = 0x054F; + t['Tlinebelow'] = 0x1E6E; + t['Tmonospace'] = 0xFF34; + t['Toarmenian'] = 0x0539; + t['Tonefive'] = 0x01BC; + t['Tonesix'] = 0x0184; + t['Tonetwo'] = 0x01A7; + t['Tretroflexhook'] = 0x01AE; + t['Tsecyrillic'] = 0x0426; + t['Tshecyrillic'] = 0x040B; + t['Tsmall'] = 0xF774; + t['Twelveroman'] = 0x216B; + t['Tworoman'] = 0x2161; + t['U'] = 0x0055; + t['Uacute'] = 0x00DA; + t['Uacutesmall'] = 0xF7FA; + t['Ubreve'] = 0x016C; + t['Ucaron'] = 0x01D3; + t['Ucircle'] = 0x24CA; + t['Ucircumflex'] = 0x00DB; + t['Ucircumflexbelow'] = 0x1E76; + t['Ucircumflexsmall'] = 0xF7FB; + t['Ucyrillic'] = 0x0423; + t['Udblacute'] = 0x0170; + t['Udblgrave'] = 0x0214; + t['Udieresis'] = 0x00DC; + t['Udieresisacute'] = 0x01D7; + t['Udieresisbelow'] = 0x1E72; + t['Udieresiscaron'] = 0x01D9; + t['Udieresiscyrillic'] = 0x04F0; + t['Udieresisgrave'] = 0x01DB; + t['Udieresismacron'] = 0x01D5; + t['Udieresissmall'] = 0xF7FC; + t['Udotbelow'] = 0x1EE4; + t['Ugrave'] = 0x00D9; + t['Ugravesmall'] = 0xF7F9; + t['Uhookabove'] = 0x1EE6; + t['Uhorn'] = 0x01AF; + t['Uhornacute'] = 0x1EE8; + t['Uhorndotbelow'] = 0x1EF0; + t['Uhorngrave'] = 0x1EEA; + t['Uhornhookabove'] = 0x1EEC; + t['Uhorntilde'] = 0x1EEE; + t['Uhungarumlaut'] = 0x0170; + t['Uhungarumlautcyrillic'] = 0x04F2; + t['Uinvertedbreve'] = 0x0216; + t['Ukcyrillic'] = 0x0478; + t['Umacron'] = 0x016A; + t['Umacroncyrillic'] = 0x04EE; + t['Umacrondieresis'] = 0x1E7A; + t['Umonospace'] = 0xFF35; + t['Uogonek'] = 0x0172; + t['Upsilon'] = 0x03A5; + t['Upsilon1'] = 0x03D2; + t['Upsilonacutehooksymbolgreek'] = 0x03D3; + t['Upsilonafrican'] = 0x01B1; + t['Upsilondieresis'] = 0x03AB; + t['Upsilondieresishooksymbolgreek'] = 0x03D4; + t['Upsilonhooksymbol'] = 0x03D2; + t['Upsilontonos'] = 0x038E; + t['Uring'] = 0x016E; + t['Ushortcyrillic'] = 0x040E; + t['Usmall'] = 0xF775; + t['Ustraightcyrillic'] = 0x04AE; + t['Ustraightstrokecyrillic'] = 0x04B0; + t['Utilde'] = 0x0168; + t['Utildeacute'] = 0x1E78; + t['Utildebelow'] = 0x1E74; + t['V'] = 0x0056; + t['Vcircle'] = 0x24CB; + t['Vdotbelow'] = 0x1E7E; + t['Vecyrillic'] = 0x0412; + t['Vewarmenian'] = 0x054E; + t['Vhook'] = 0x01B2; + t['Vmonospace'] = 0xFF36; + t['Voarmenian'] = 0x0548; + t['Vsmall'] = 0xF776; + t['Vtilde'] = 0x1E7C; + t['W'] = 0x0057; + t['Wacute'] = 0x1E82; + t['Wcircle'] = 0x24CC; + t['Wcircumflex'] = 0x0174; + t['Wdieresis'] = 0x1E84; + t['Wdotaccent'] = 0x1E86; + t['Wdotbelow'] = 0x1E88; + t['Wgrave'] = 0x1E80; + t['Wmonospace'] = 0xFF37; + t['Wsmall'] = 0xF777; + t['X'] = 0x0058; + t['Xcircle'] = 0x24CD; + t['Xdieresis'] = 0x1E8C; + t['Xdotaccent'] = 0x1E8A; + t['Xeharmenian'] = 0x053D; + t['Xi'] = 0x039E; + t['Xmonospace'] = 0xFF38; + t['Xsmall'] = 0xF778; + t['Y'] = 0x0059; + t['Yacute'] = 0x00DD; + t['Yacutesmall'] = 0xF7FD; + t['Yatcyrillic'] = 0x0462; + t['Ycircle'] = 0x24CE; + t['Ycircumflex'] = 0x0176; + t['Ydieresis'] = 0x0178; + t['Ydieresissmall'] = 0xF7FF; + t['Ydotaccent'] = 0x1E8E; + t['Ydotbelow'] = 0x1EF4; + t['Yericyrillic'] = 0x042B; + t['Yerudieresiscyrillic'] = 0x04F8; + t['Ygrave'] = 0x1EF2; + t['Yhook'] = 0x01B3; + t['Yhookabove'] = 0x1EF6; + t['Yiarmenian'] = 0x0545; + t['Yicyrillic'] = 0x0407; + t['Yiwnarmenian'] = 0x0552; + t['Ymonospace'] = 0xFF39; + t['Ysmall'] = 0xF779; + t['Ytilde'] = 0x1EF8; + t['Yusbigcyrillic'] = 0x046A; + t['Yusbigiotifiedcyrillic'] = 0x046C; + t['Yuslittlecyrillic'] = 0x0466; + t['Yuslittleiotifiedcyrillic'] = 0x0468; + t['Z'] = 0x005A; + t['Zaarmenian'] = 0x0536; + t['Zacute'] = 0x0179; + t['Zcaron'] = 0x017D; + t['Zcaronsmall'] = 0xF6FF; + t['Zcircle'] = 0x24CF; + t['Zcircumflex'] = 0x1E90; + t['Zdot'] = 0x017B; + t['Zdotaccent'] = 0x017B; + t['Zdotbelow'] = 0x1E92; + t['Zecyrillic'] = 0x0417; + t['Zedescendercyrillic'] = 0x0498; + t['Zedieresiscyrillic'] = 0x04DE; + t['Zeta'] = 0x0396; + t['Zhearmenian'] = 0x053A; + t['Zhebrevecyrillic'] = 0x04C1; + t['Zhecyrillic'] = 0x0416; + t['Zhedescendercyrillic'] = 0x0496; + t['Zhedieresiscyrillic'] = 0x04DC; + t['Zlinebelow'] = 0x1E94; + t['Zmonospace'] = 0xFF3A; + t['Zsmall'] = 0xF77A; + t['Zstroke'] = 0x01B5; + t['a'] = 0x0061; + t['aabengali'] = 0x0986; + t['aacute'] = 0x00E1; + t['aadeva'] = 0x0906; + t['aagujarati'] = 0x0A86; + t['aagurmukhi'] = 0x0A06; + t['aamatragurmukhi'] = 0x0A3E; + t['aarusquare'] = 0x3303; + t['aavowelsignbengali'] = 0x09BE; + t['aavowelsigndeva'] = 0x093E; + t['aavowelsigngujarati'] = 0x0ABE; + t['abbreviationmarkarmenian'] = 0x055F; + t['abbreviationsigndeva'] = 0x0970; + t['abengali'] = 0x0985; + t['abopomofo'] = 0x311A; + t['abreve'] = 0x0103; + t['abreveacute'] = 0x1EAF; + t['abrevecyrillic'] = 0x04D1; + t['abrevedotbelow'] = 0x1EB7; + t['abrevegrave'] = 0x1EB1; + t['abrevehookabove'] = 0x1EB3; + t['abrevetilde'] = 0x1EB5; + t['acaron'] = 0x01CE; + t['acircle'] = 0x24D0; + t['acircumflex'] = 0x00E2; + t['acircumflexacute'] = 0x1EA5; + t['acircumflexdotbelow'] = 0x1EAD; + t['acircumflexgrave'] = 0x1EA7; + t['acircumflexhookabove'] = 0x1EA9; + t['acircumflextilde'] = 0x1EAB; + t['acute'] = 0x00B4; + t['acutebelowcmb'] = 0x0317; + t['acutecmb'] = 0x0301; + t['acutecomb'] = 0x0301; + t['acutedeva'] = 0x0954; + t['acutelowmod'] = 0x02CF; + t['acutetonecmb'] = 0x0341; + t['acyrillic'] = 0x0430; + t['adblgrave'] = 0x0201; + t['addakgurmukhi'] = 0x0A71; + t['adeva'] = 0x0905; + t['adieresis'] = 0x00E4; + t['adieresiscyrillic'] = 0x04D3; + t['adieresismacron'] = 0x01DF; + t['adotbelow'] = 0x1EA1; + t['adotmacron'] = 0x01E1; + t['ae'] = 0x00E6; + t['aeacute'] = 0x01FD; + t['aekorean'] = 0x3150; + t['aemacron'] = 0x01E3; + t['afii00208'] = 0x2015; + t['afii08941'] = 0x20A4; + t['afii10017'] = 0x0410; + t['afii10018'] = 0x0411; + t['afii10019'] = 0x0412; + t['afii10020'] = 0x0413; + t['afii10021'] = 0x0414; + t['afii10022'] = 0x0415; + t['afii10023'] = 0x0401; + t['afii10024'] = 0x0416; + t['afii10025'] = 0x0417; + t['afii10026'] = 0x0418; + t['afii10027'] = 0x0419; + t['afii10028'] = 0x041A; + t['afii10029'] = 0x041B; + t['afii10030'] = 0x041C; + t['afii10031'] = 0x041D; + t['afii10032'] = 0x041E; + t['afii10033'] = 0x041F; + t['afii10034'] = 0x0420; + t['afii10035'] = 0x0421; + t['afii10036'] = 0x0422; + t['afii10037'] = 0x0423; + t['afii10038'] = 0x0424; + t['afii10039'] = 0x0425; + t['afii10040'] = 0x0426; + t['afii10041'] = 0x0427; + t['afii10042'] = 0x0428; + t['afii10043'] = 0x0429; + t['afii10044'] = 0x042A; + t['afii10045'] = 0x042B; + t['afii10046'] = 0x042C; + t['afii10047'] = 0x042D; + t['afii10048'] = 0x042E; + t['afii10049'] = 0x042F; + t['afii10050'] = 0x0490; + t['afii10051'] = 0x0402; + t['afii10052'] = 0x0403; + t['afii10053'] = 0x0404; + t['afii10054'] = 0x0405; + t['afii10055'] = 0x0406; + t['afii10056'] = 0x0407; + t['afii10057'] = 0x0408; + t['afii10058'] = 0x0409; + t['afii10059'] = 0x040A; + t['afii10060'] = 0x040B; + t['afii10061'] = 0x040C; + t['afii10062'] = 0x040E; + t['afii10063'] = 0xF6C4; + t['afii10064'] = 0xF6C5; + t['afii10065'] = 0x0430; + t['afii10066'] = 0x0431; + t['afii10067'] = 0x0432; + t['afii10068'] = 0x0433; + t['afii10069'] = 0x0434; + t['afii10070'] = 0x0435; + t['afii10071'] = 0x0451; + t['afii10072'] = 0x0436; + t['afii10073'] = 0x0437; + t['afii10074'] = 0x0438; + t['afii10075'] = 0x0439; + t['afii10076'] = 0x043A; + t['afii10077'] = 0x043B; + t['afii10078'] = 0x043C; + t['afii10079'] = 0x043D; + t['afii10080'] = 0x043E; + t['afii10081'] = 0x043F; + t['afii10082'] = 0x0440; + t['afii10083'] = 0x0441; + t['afii10084'] = 0x0442; + t['afii10085'] = 0x0443; + t['afii10086'] = 0x0444; + t['afii10087'] = 0x0445; + t['afii10088'] = 0x0446; + t['afii10089'] = 0x0447; + t['afii10090'] = 0x0448; + t['afii10091'] = 0x0449; + t['afii10092'] = 0x044A; + t['afii10093'] = 0x044B; + t['afii10094'] = 0x044C; + t['afii10095'] = 0x044D; + t['afii10096'] = 0x044E; + t['afii10097'] = 0x044F; + t['afii10098'] = 0x0491; + t['afii10099'] = 0x0452; + t['afii10100'] = 0x0453; + t['afii10101'] = 0x0454; + t['afii10102'] = 0x0455; + t['afii10103'] = 0x0456; + t['afii10104'] = 0x0457; + t['afii10105'] = 0x0458; + t['afii10106'] = 0x0459; + t['afii10107'] = 0x045A; + t['afii10108'] = 0x045B; + t['afii10109'] = 0x045C; + t['afii10110'] = 0x045E; + t['afii10145'] = 0x040F; + t['afii10146'] = 0x0462; + t['afii10147'] = 0x0472; + t['afii10148'] = 0x0474; + t['afii10192'] = 0xF6C6; + t['afii10193'] = 0x045F; + t['afii10194'] = 0x0463; + t['afii10195'] = 0x0473; + t['afii10196'] = 0x0475; + t['afii10831'] = 0xF6C7; + t['afii10832'] = 0xF6C8; + t['afii10846'] = 0x04D9; + t['afii299'] = 0x200E; + t['afii300'] = 0x200F; + t['afii301'] = 0x200D; + t['afii57381'] = 0x066A; + t['afii57388'] = 0x060C; + t['afii57392'] = 0x0660; + t['afii57393'] = 0x0661; + t['afii57394'] = 0x0662; + t['afii57395'] = 0x0663; + t['afii57396'] = 0x0664; + t['afii57397'] = 0x0665; + t['afii57398'] = 0x0666; + t['afii57399'] = 0x0667; + t['afii57400'] = 0x0668; + t['afii57401'] = 0x0669; + t['afii57403'] = 0x061B; + t['afii57407'] = 0x061F; + t['afii57409'] = 0x0621; + t['afii57410'] = 0x0622; + t['afii57411'] = 0x0623; + t['afii57412'] = 0x0624; + t['afii57413'] = 0x0625; + t['afii57414'] = 0x0626; + t['afii57415'] = 0x0627; + t['afii57416'] = 0x0628; + t['afii57417'] = 0x0629; + t['afii57418'] = 0x062A; + t['afii57419'] = 0x062B; + t['afii57420'] = 0x062C; + t['afii57421'] = 0x062D; + t['afii57422'] = 0x062E; + t['afii57423'] = 0x062F; + t['afii57424'] = 0x0630; + t['afii57425'] = 0x0631; + t['afii57426'] = 0x0632; + t['afii57427'] = 0x0633; + t['afii57428'] = 0x0634; + t['afii57429'] = 0x0635; + t['afii57430'] = 0x0636; + t['afii57431'] = 0x0637; + t['afii57432'] = 0x0638; + t['afii57433'] = 0x0639; + t['afii57434'] = 0x063A; + t['afii57440'] = 0x0640; + t['afii57441'] = 0x0641; + t['afii57442'] = 0x0642; + t['afii57443'] = 0x0643; + t['afii57444'] = 0x0644; + t['afii57445'] = 0x0645; + t['afii57446'] = 0x0646; + t['afii57448'] = 0x0648; + t['afii57449'] = 0x0649; + t['afii57450'] = 0x064A; + t['afii57451'] = 0x064B; + t['afii57452'] = 0x064C; + t['afii57453'] = 0x064D; + t['afii57454'] = 0x064E; + t['afii57455'] = 0x064F; + t['afii57456'] = 0x0650; + t['afii57457'] = 0x0651; + t['afii57458'] = 0x0652; + t['afii57470'] = 0x0647; + t['afii57505'] = 0x06A4; + t['afii57506'] = 0x067E; + t['afii57507'] = 0x0686; + t['afii57508'] = 0x0698; + t['afii57509'] = 0x06AF; + t['afii57511'] = 0x0679; + t['afii57512'] = 0x0688; + t['afii57513'] = 0x0691; + t['afii57514'] = 0x06BA; + t['afii57519'] = 0x06D2; + t['afii57534'] = 0x06D5; + t['afii57636'] = 0x20AA; + t['afii57645'] = 0x05BE; + t['afii57658'] = 0x05C3; + t['afii57664'] = 0x05D0; + t['afii57665'] = 0x05D1; + t['afii57666'] = 0x05D2; + t['afii57667'] = 0x05D3; + t['afii57668'] = 0x05D4; + t['afii57669'] = 0x05D5; + t['afii57670'] = 0x05D6; + t['afii57671'] = 0x05D7; + t['afii57672'] = 0x05D8; + t['afii57673'] = 0x05D9; + t['afii57674'] = 0x05DA; + t['afii57675'] = 0x05DB; + t['afii57676'] = 0x05DC; + t['afii57677'] = 0x05DD; + t['afii57678'] = 0x05DE; + t['afii57679'] = 0x05DF; + t['afii57680'] = 0x05E0; + t['afii57681'] = 0x05E1; + t['afii57682'] = 0x05E2; + t['afii57683'] = 0x05E3; + t['afii57684'] = 0x05E4; + t['afii57685'] = 0x05E5; + t['afii57686'] = 0x05E6; + t['afii57687'] = 0x05E7; + t['afii57688'] = 0x05E8; + t['afii57689'] = 0x05E9; + t['afii57690'] = 0x05EA; + t['afii57694'] = 0xFB2A; + t['afii57695'] = 0xFB2B; + t['afii57700'] = 0xFB4B; + t['afii57705'] = 0xFB1F; + t['afii57716'] = 0x05F0; + t['afii57717'] = 0x05F1; + t['afii57718'] = 0x05F2; + t['afii57723'] = 0xFB35; + t['afii57793'] = 0x05B4; + t['afii57794'] = 0x05B5; + t['afii57795'] = 0x05B6; + t['afii57796'] = 0x05BB; + t['afii57797'] = 0x05B8; + t['afii57798'] = 0x05B7; + t['afii57799'] = 0x05B0; + t['afii57800'] = 0x05B2; + t['afii57801'] = 0x05B1; + t['afii57802'] = 0x05B3; + t['afii57803'] = 0x05C2; + t['afii57804'] = 0x05C1; + t['afii57806'] = 0x05B9; + t['afii57807'] = 0x05BC; + t['afii57839'] = 0x05BD; + t['afii57841'] = 0x05BF; + t['afii57842'] = 0x05C0; + t['afii57929'] = 0x02BC; + t['afii61248'] = 0x2105; + t['afii61289'] = 0x2113; + t['afii61352'] = 0x2116; + t['afii61573'] = 0x202C; + t['afii61574'] = 0x202D; + t['afii61575'] = 0x202E; + t['afii61664'] = 0x200C; + t['afii63167'] = 0x066D; + t['afii64937'] = 0x02BD; + t['agrave'] = 0x00E0; + t['agujarati'] = 0x0A85; + t['agurmukhi'] = 0x0A05; + t['ahiragana'] = 0x3042; + t['ahookabove'] = 0x1EA3; + t['aibengali'] = 0x0990; + t['aibopomofo'] = 0x311E; + t['aideva'] = 0x0910; + t['aiecyrillic'] = 0x04D5; + t['aigujarati'] = 0x0A90; + t['aigurmukhi'] = 0x0A10; + t['aimatragurmukhi'] = 0x0A48; + t['ainarabic'] = 0x0639; + t['ainfinalarabic'] = 0xFECA; + t['aininitialarabic'] = 0xFECB; + t['ainmedialarabic'] = 0xFECC; + t['ainvertedbreve'] = 0x0203; + t['aivowelsignbengali'] = 0x09C8; + t['aivowelsigndeva'] = 0x0948; + t['aivowelsigngujarati'] = 0x0AC8; + t['akatakana'] = 0x30A2; + t['akatakanahalfwidth'] = 0xFF71; + t['akorean'] = 0x314F; + t['alef'] = 0x05D0; + t['alefarabic'] = 0x0627; + t['alefdageshhebrew'] = 0xFB30; + t['aleffinalarabic'] = 0xFE8E; + t['alefhamzaabovearabic'] = 0x0623; + t['alefhamzaabovefinalarabic'] = 0xFE84; + t['alefhamzabelowarabic'] = 0x0625; + t['alefhamzabelowfinalarabic'] = 0xFE88; + t['alefhebrew'] = 0x05D0; + t['aleflamedhebrew'] = 0xFB4F; + t['alefmaddaabovearabic'] = 0x0622; + t['alefmaddaabovefinalarabic'] = 0xFE82; + t['alefmaksuraarabic'] = 0x0649; + t['alefmaksurafinalarabic'] = 0xFEF0; + t['alefmaksurainitialarabic'] = 0xFEF3; + t['alefmaksuramedialarabic'] = 0xFEF4; + t['alefpatahhebrew'] = 0xFB2E; + t['alefqamatshebrew'] = 0xFB2F; + t['aleph'] = 0x2135; + t['allequal'] = 0x224C; + t['alpha'] = 0x03B1; + t['alphatonos'] = 0x03AC; + t['amacron'] = 0x0101; + t['amonospace'] = 0xFF41; + t['ampersand'] = 0x0026; + t['ampersandmonospace'] = 0xFF06; + t['ampersandsmall'] = 0xF726; + t['amsquare'] = 0x33C2; + t['anbopomofo'] = 0x3122; + t['angbopomofo'] = 0x3124; + t['angbracketleft'] = 0x3008; + t['angbracketright'] = 0x3009; + t['angkhankhuthai'] = 0x0E5A; + t['angle'] = 0x2220; + t['anglebracketleft'] = 0x3008; + t['anglebracketleftvertical'] = 0xFE3F; + t['anglebracketright'] = 0x3009; + t['anglebracketrightvertical'] = 0xFE40; + t['angleleft'] = 0x2329; + t['angleright'] = 0x232A; + t['angstrom'] = 0x212B; + t['anoteleia'] = 0x0387; + t['anudattadeva'] = 0x0952; + t['anusvarabengali'] = 0x0982; + t['anusvaradeva'] = 0x0902; + t['anusvaragujarati'] = 0x0A82; + t['aogonek'] = 0x0105; + t['apaatosquare'] = 0x3300; + t['aparen'] = 0x249C; + t['apostrophearmenian'] = 0x055A; + t['apostrophemod'] = 0x02BC; + t['apple'] = 0xF8FF; + t['approaches'] = 0x2250; + t['approxequal'] = 0x2248; + t['approxequalorimage'] = 0x2252; + t['approximatelyequal'] = 0x2245; + t['araeaekorean'] = 0x318E; + t['araeakorean'] = 0x318D; + t['arc'] = 0x2312; + t['arighthalfring'] = 0x1E9A; + t['aring'] = 0x00E5; + t['aringacute'] = 0x01FB; + t['aringbelow'] = 0x1E01; + t['arrowboth'] = 0x2194; + t['arrowdashdown'] = 0x21E3; + t['arrowdashleft'] = 0x21E0; + t['arrowdashright'] = 0x21E2; + t['arrowdashup'] = 0x21E1; + t['arrowdblboth'] = 0x21D4; + t['arrowdbldown'] = 0x21D3; + t['arrowdblleft'] = 0x21D0; + t['arrowdblright'] = 0x21D2; + t['arrowdblup'] = 0x21D1; + t['arrowdown'] = 0x2193; + t['arrowdownleft'] = 0x2199; + t['arrowdownright'] = 0x2198; + t['arrowdownwhite'] = 0x21E9; + t['arrowheaddownmod'] = 0x02C5; + t['arrowheadleftmod'] = 0x02C2; + t['arrowheadrightmod'] = 0x02C3; + t['arrowheadupmod'] = 0x02C4; + t['arrowhorizex'] = 0xF8E7; + t['arrowleft'] = 0x2190; + t['arrowleftdbl'] = 0x21D0; + t['arrowleftdblstroke'] = 0x21CD; + t['arrowleftoverright'] = 0x21C6; + t['arrowleftwhite'] = 0x21E6; + t['arrowright'] = 0x2192; + t['arrowrightdblstroke'] = 0x21CF; + t['arrowrightheavy'] = 0x279E; + t['arrowrightoverleft'] = 0x21C4; + t['arrowrightwhite'] = 0x21E8; + t['arrowtableft'] = 0x21E4; + t['arrowtabright'] = 0x21E5; + t['arrowup'] = 0x2191; + t['arrowupdn'] = 0x2195; + t['arrowupdnbse'] = 0x21A8; + t['arrowupdownbase'] = 0x21A8; + t['arrowupleft'] = 0x2196; + t['arrowupleftofdown'] = 0x21C5; + t['arrowupright'] = 0x2197; + t['arrowupwhite'] = 0x21E7; + t['arrowvertex'] = 0xF8E6; + t['asciicircum'] = 0x005E; + t['asciicircummonospace'] = 0xFF3E; + t['asciitilde'] = 0x007E; + t['asciitildemonospace'] = 0xFF5E; + t['ascript'] = 0x0251; + t['ascriptturned'] = 0x0252; + t['asmallhiragana'] = 0x3041; + t['asmallkatakana'] = 0x30A1; + t['asmallkatakanahalfwidth'] = 0xFF67; + t['asterisk'] = 0x002A; + t['asteriskaltonearabic'] = 0x066D; + t['asteriskarabic'] = 0x066D; + t['asteriskmath'] = 0x2217; + t['asteriskmonospace'] = 0xFF0A; + t['asterisksmall'] = 0xFE61; + t['asterism'] = 0x2042; + t['asuperior'] = 0xF6E9; + t['asymptoticallyequal'] = 0x2243; + t['at'] = 0x0040; + t['atilde'] = 0x00E3; + t['atmonospace'] = 0xFF20; + t['atsmall'] = 0xFE6B; + t['aturned'] = 0x0250; + t['aubengali'] = 0x0994; + t['aubopomofo'] = 0x3120; + t['audeva'] = 0x0914; + t['augujarati'] = 0x0A94; + t['augurmukhi'] = 0x0A14; + t['aulengthmarkbengali'] = 0x09D7; + t['aumatragurmukhi'] = 0x0A4C; + t['auvowelsignbengali'] = 0x09CC; + t['auvowelsigndeva'] = 0x094C; + t['auvowelsigngujarati'] = 0x0ACC; + t['avagrahadeva'] = 0x093D; + t['aybarmenian'] = 0x0561; + t['ayin'] = 0x05E2; + t['ayinaltonehebrew'] = 0xFB20; + t['ayinhebrew'] = 0x05E2; + t['b'] = 0x0062; + t['babengali'] = 0x09AC; + t['backslash'] = 0x005C; + t['backslashmonospace'] = 0xFF3C; + t['badeva'] = 0x092C; + t['bagujarati'] = 0x0AAC; + t['bagurmukhi'] = 0x0A2C; + t['bahiragana'] = 0x3070; + t['bahtthai'] = 0x0E3F; + t['bakatakana'] = 0x30D0; + t['bar'] = 0x007C; + t['barmonospace'] = 0xFF5C; + t['bbopomofo'] = 0x3105; + t['bcircle'] = 0x24D1; + t['bdotaccent'] = 0x1E03; + t['bdotbelow'] = 0x1E05; + t['beamedsixteenthnotes'] = 0x266C; + t['because'] = 0x2235; + t['becyrillic'] = 0x0431; + t['beharabic'] = 0x0628; + t['behfinalarabic'] = 0xFE90; + t['behinitialarabic'] = 0xFE91; + t['behiragana'] = 0x3079; + t['behmedialarabic'] = 0xFE92; + t['behmeeminitialarabic'] = 0xFC9F; + t['behmeemisolatedarabic'] = 0xFC08; + t['behnoonfinalarabic'] = 0xFC6D; + t['bekatakana'] = 0x30D9; + t['benarmenian'] = 0x0562; + t['bet'] = 0x05D1; + t['beta'] = 0x03B2; + t['betasymbolgreek'] = 0x03D0; + t['betdagesh'] = 0xFB31; + t['betdageshhebrew'] = 0xFB31; + t['bethebrew'] = 0x05D1; + t['betrafehebrew'] = 0xFB4C; + t['bhabengali'] = 0x09AD; + t['bhadeva'] = 0x092D; + t['bhagujarati'] = 0x0AAD; + t['bhagurmukhi'] = 0x0A2D; + t['bhook'] = 0x0253; + t['bihiragana'] = 0x3073; + t['bikatakana'] = 0x30D3; + t['bilabialclick'] = 0x0298; + t['bindigurmukhi'] = 0x0A02; + t['birusquare'] = 0x3331; + t['blackcircle'] = 0x25CF; + t['blackdiamond'] = 0x25C6; + t['blackdownpointingtriangle'] = 0x25BC; + t['blackleftpointingpointer'] = 0x25C4; + t['blackleftpointingtriangle'] = 0x25C0; + t['blacklenticularbracketleft'] = 0x3010; + t['blacklenticularbracketleftvertical'] = 0xFE3B; + t['blacklenticularbracketright'] = 0x3011; + t['blacklenticularbracketrightvertical'] = 0xFE3C; + t['blacklowerlefttriangle'] = 0x25E3; + t['blacklowerrighttriangle'] = 0x25E2; + t['blackrectangle'] = 0x25AC; + t['blackrightpointingpointer'] = 0x25BA; + t['blackrightpointingtriangle'] = 0x25B6; + t['blacksmallsquare'] = 0x25AA; + t['blacksmilingface'] = 0x263B; + t['blacksquare'] = 0x25A0; + t['blackstar'] = 0x2605; + t['blackupperlefttriangle'] = 0x25E4; + t['blackupperrighttriangle'] = 0x25E5; + t['blackuppointingsmalltriangle'] = 0x25B4; + t['blackuppointingtriangle'] = 0x25B2; + t['blank'] = 0x2423; + t['blinebelow'] = 0x1E07; + t['block'] = 0x2588; + t['bmonospace'] = 0xFF42; + t['bobaimaithai'] = 0x0E1A; + t['bohiragana'] = 0x307C; + t['bokatakana'] = 0x30DC; + t['bparen'] = 0x249D; + t['bqsquare'] = 0x33C3; + t['braceex'] = 0xF8F4; + t['braceleft'] = 0x007B; + t['braceleftbt'] = 0xF8F3; + t['braceleftmid'] = 0xF8F2; + t['braceleftmonospace'] = 0xFF5B; + t['braceleftsmall'] = 0xFE5B; + t['bracelefttp'] = 0xF8F1; + t['braceleftvertical'] = 0xFE37; + t['braceright'] = 0x007D; + t['bracerightbt'] = 0xF8FE; + t['bracerightmid'] = 0xF8FD; + t['bracerightmonospace'] = 0xFF5D; + t['bracerightsmall'] = 0xFE5C; + t['bracerighttp'] = 0xF8FC; + t['bracerightvertical'] = 0xFE38; + t['bracketleft'] = 0x005B; + t['bracketleftbt'] = 0xF8F0; + t['bracketleftex'] = 0xF8EF; + t['bracketleftmonospace'] = 0xFF3B; + t['bracketlefttp'] = 0xF8EE; + t['bracketright'] = 0x005D; + t['bracketrightbt'] = 0xF8FB; + t['bracketrightex'] = 0xF8FA; + t['bracketrightmonospace'] = 0xFF3D; + t['bracketrighttp'] = 0xF8F9; + t['breve'] = 0x02D8; + t['brevebelowcmb'] = 0x032E; + t['brevecmb'] = 0x0306; + t['breveinvertedbelowcmb'] = 0x032F; + t['breveinvertedcmb'] = 0x0311; + t['breveinverteddoublecmb'] = 0x0361; + t['bridgebelowcmb'] = 0x032A; + t['bridgeinvertedbelowcmb'] = 0x033A; + t['brokenbar'] = 0x00A6; + t['bstroke'] = 0x0180; + t['bsuperior'] = 0xF6EA; + t['btopbar'] = 0x0183; + t['buhiragana'] = 0x3076; + t['bukatakana'] = 0x30D6; + t['bullet'] = 0x2022; + t['bulletinverse'] = 0x25D8; + t['bulletoperator'] = 0x2219; + t['bullseye'] = 0x25CE; + t['c'] = 0x0063; + t['caarmenian'] = 0x056E; + t['cabengali'] = 0x099A; + t['cacute'] = 0x0107; + t['cadeva'] = 0x091A; + t['cagujarati'] = 0x0A9A; + t['cagurmukhi'] = 0x0A1A; + t['calsquare'] = 0x3388; + t['candrabindubengali'] = 0x0981; + t['candrabinducmb'] = 0x0310; + t['candrabindudeva'] = 0x0901; + t['candrabindugujarati'] = 0x0A81; + t['capslock'] = 0x21EA; + t['careof'] = 0x2105; + t['caron'] = 0x02C7; + t['caronbelowcmb'] = 0x032C; + t['caroncmb'] = 0x030C; + t['carriagereturn'] = 0x21B5; + t['cbopomofo'] = 0x3118; + t['ccaron'] = 0x010D; + t['ccedilla'] = 0x00E7; + t['ccedillaacute'] = 0x1E09; + t['ccircle'] = 0x24D2; + t['ccircumflex'] = 0x0109; + t['ccurl'] = 0x0255; + t['cdot'] = 0x010B; + t['cdotaccent'] = 0x010B; + t['cdsquare'] = 0x33C5; + t['cedilla'] = 0x00B8; + t['cedillacmb'] = 0x0327; + t['cent'] = 0x00A2; + t['centigrade'] = 0x2103; + t['centinferior'] = 0xF6DF; + t['centmonospace'] = 0xFFE0; + t['centoldstyle'] = 0xF7A2; + t['centsuperior'] = 0xF6E0; + t['chaarmenian'] = 0x0579; + t['chabengali'] = 0x099B; + t['chadeva'] = 0x091B; + t['chagujarati'] = 0x0A9B; + t['chagurmukhi'] = 0x0A1B; + t['chbopomofo'] = 0x3114; + t['cheabkhasiancyrillic'] = 0x04BD; + t['checkmark'] = 0x2713; + t['checyrillic'] = 0x0447; + t['chedescenderabkhasiancyrillic'] = 0x04BF; + t['chedescendercyrillic'] = 0x04B7; + t['chedieresiscyrillic'] = 0x04F5; + t['cheharmenian'] = 0x0573; + t['chekhakassiancyrillic'] = 0x04CC; + t['cheverticalstrokecyrillic'] = 0x04B9; + t['chi'] = 0x03C7; + t['chieuchacirclekorean'] = 0x3277; + t['chieuchaparenkorean'] = 0x3217; + t['chieuchcirclekorean'] = 0x3269; + t['chieuchkorean'] = 0x314A; + t['chieuchparenkorean'] = 0x3209; + t['chochangthai'] = 0x0E0A; + t['chochanthai'] = 0x0E08; + t['chochingthai'] = 0x0E09; + t['chochoethai'] = 0x0E0C; + t['chook'] = 0x0188; + t['cieucacirclekorean'] = 0x3276; + t['cieucaparenkorean'] = 0x3216; + t['cieuccirclekorean'] = 0x3268; + t['cieuckorean'] = 0x3148; + t['cieucparenkorean'] = 0x3208; + t['cieucuparenkorean'] = 0x321C; + t['circle'] = 0x25CB; + t['circlecopyrt'] = 0x00A9; + t['circlemultiply'] = 0x2297; + t['circleot'] = 0x2299; + t['circleplus'] = 0x2295; + t['circlepostalmark'] = 0x3036; + t['circlewithlefthalfblack'] = 0x25D0; + t['circlewithrighthalfblack'] = 0x25D1; + t['circumflex'] = 0x02C6; + t['circumflexbelowcmb'] = 0x032D; + t['circumflexcmb'] = 0x0302; + t['clear'] = 0x2327; + t['clickalveolar'] = 0x01C2; + t['clickdental'] = 0x01C0; + t['clicklateral'] = 0x01C1; + t['clickretroflex'] = 0x01C3; + t['club'] = 0x2663; + t['clubsuitblack'] = 0x2663; + t['clubsuitwhite'] = 0x2667; + t['cmcubedsquare'] = 0x33A4; + t['cmonospace'] = 0xFF43; + t['cmsquaredsquare'] = 0x33A0; + t['coarmenian'] = 0x0581; + t['colon'] = 0x003A; + t['colonmonetary'] = 0x20A1; + t['colonmonospace'] = 0xFF1A; + t['colonsign'] = 0x20A1; + t['colonsmall'] = 0xFE55; + t['colontriangularhalfmod'] = 0x02D1; + t['colontriangularmod'] = 0x02D0; + t['comma'] = 0x002C; + t['commaabovecmb'] = 0x0313; + t['commaaboverightcmb'] = 0x0315; + t['commaaccent'] = 0xF6C3; + t['commaarabic'] = 0x060C; + t['commaarmenian'] = 0x055D; + t['commainferior'] = 0xF6E1; + t['commamonospace'] = 0xFF0C; + t['commareversedabovecmb'] = 0x0314; + t['commareversedmod'] = 0x02BD; + t['commasmall'] = 0xFE50; + t['commasuperior'] = 0xF6E2; + t['commaturnedabovecmb'] = 0x0312; + t['commaturnedmod'] = 0x02BB; + t['compass'] = 0x263C; + t['congruent'] = 0x2245; + t['contourintegral'] = 0x222E; + t['control'] = 0x2303; + t['controlACK'] = 0x0006; + t['controlBEL'] = 0x0007; + t['controlBS'] = 0x0008; + t['controlCAN'] = 0x0018; + t['controlCR'] = 0x000D; + t['controlDC1'] = 0x0011; + t['controlDC2'] = 0x0012; + t['controlDC3'] = 0x0013; + t['controlDC4'] = 0x0014; + t['controlDEL'] = 0x007F; + t['controlDLE'] = 0x0010; + t['controlEM'] = 0x0019; + t['controlENQ'] = 0x0005; + t['controlEOT'] = 0x0004; + t['controlESC'] = 0x001B; + t['controlETB'] = 0x0017; + t['controlETX'] = 0x0003; + t['controlFF'] = 0x000C; + t['controlFS'] = 0x001C; + t['controlGS'] = 0x001D; + t['controlHT'] = 0x0009; + t['controlLF'] = 0x000A; + t['controlNAK'] = 0x0015; + t['controlNULL'] = 0x0000; + t['controlRS'] = 0x001E; + t['controlSI'] = 0x000F; + t['controlSO'] = 0x000E; + t['controlSOT'] = 0x0002; + t['controlSTX'] = 0x0001; + t['controlSUB'] = 0x001A; + t['controlSYN'] = 0x0016; + t['controlUS'] = 0x001F; + t['controlVT'] = 0x000B; + t['copyright'] = 0x00A9; + t['copyrightsans'] = 0xF8E9; + t['copyrightserif'] = 0xF6D9; + t['cornerbracketleft'] = 0x300C; + t['cornerbracketlefthalfwidth'] = 0xFF62; + t['cornerbracketleftvertical'] = 0xFE41; + t['cornerbracketright'] = 0x300D; + t['cornerbracketrighthalfwidth'] = 0xFF63; + t['cornerbracketrightvertical'] = 0xFE42; + t['corporationsquare'] = 0x337F; + t['cosquare'] = 0x33C7; + t['coverkgsquare'] = 0x33C6; + t['cparen'] = 0x249E; + t['cruzeiro'] = 0x20A2; + t['cstretched'] = 0x0297; + t['curlyand'] = 0x22CF; + t['curlyor'] = 0x22CE; + t['currency'] = 0x00A4; + t['cyrBreve'] = 0xF6D1; + t['cyrFlex'] = 0xF6D2; + t['cyrbreve'] = 0xF6D4; + t['cyrflex'] = 0xF6D5; + t['d'] = 0x0064; + t['daarmenian'] = 0x0564; + t['dabengali'] = 0x09A6; + t['dadarabic'] = 0x0636; + t['dadeva'] = 0x0926; + t['dadfinalarabic'] = 0xFEBE; + t['dadinitialarabic'] = 0xFEBF; + t['dadmedialarabic'] = 0xFEC0; + t['dagesh'] = 0x05BC; + t['dageshhebrew'] = 0x05BC; + t['dagger'] = 0x2020; + t['daggerdbl'] = 0x2021; + t['dagujarati'] = 0x0AA6; + t['dagurmukhi'] = 0x0A26; + t['dahiragana'] = 0x3060; + t['dakatakana'] = 0x30C0; + t['dalarabic'] = 0x062F; + t['dalet'] = 0x05D3; + t['daletdagesh'] = 0xFB33; + t['daletdageshhebrew'] = 0xFB33; + t['dalethebrew'] = 0x05D3; + t['dalfinalarabic'] = 0xFEAA; + t['dammaarabic'] = 0x064F; + t['dammalowarabic'] = 0x064F; + t['dammatanaltonearabic'] = 0x064C; + t['dammatanarabic'] = 0x064C; + t['danda'] = 0x0964; + t['dargahebrew'] = 0x05A7; + t['dargalefthebrew'] = 0x05A7; + t['dasiapneumatacyrilliccmb'] = 0x0485; + t['dblGrave'] = 0xF6D3; + t['dblanglebracketleft'] = 0x300A; + t['dblanglebracketleftvertical'] = 0xFE3D; + t['dblanglebracketright'] = 0x300B; + t['dblanglebracketrightvertical'] = 0xFE3E; + t['dblarchinvertedbelowcmb'] = 0x032B; + t['dblarrowleft'] = 0x21D4; + t['dblarrowright'] = 0x21D2; + t['dbldanda'] = 0x0965; + t['dblgrave'] = 0xF6D6; + t['dblgravecmb'] = 0x030F; + t['dblintegral'] = 0x222C; + t['dbllowline'] = 0x2017; + t['dbllowlinecmb'] = 0x0333; + t['dbloverlinecmb'] = 0x033F; + t['dblprimemod'] = 0x02BA; + t['dblverticalbar'] = 0x2016; + t['dblverticallineabovecmb'] = 0x030E; + t['dbopomofo'] = 0x3109; + t['dbsquare'] = 0x33C8; + t['dcaron'] = 0x010F; + t['dcedilla'] = 0x1E11; + t['dcircle'] = 0x24D3; + t['dcircumflexbelow'] = 0x1E13; + t['dcroat'] = 0x0111; + t['ddabengali'] = 0x09A1; + t['ddadeva'] = 0x0921; + t['ddagujarati'] = 0x0AA1; + t['ddagurmukhi'] = 0x0A21; + t['ddalarabic'] = 0x0688; + t['ddalfinalarabic'] = 0xFB89; + t['dddhadeva'] = 0x095C; + t['ddhabengali'] = 0x09A2; + t['ddhadeva'] = 0x0922; + t['ddhagujarati'] = 0x0AA2; + t['ddhagurmukhi'] = 0x0A22; + t['ddotaccent'] = 0x1E0B; + t['ddotbelow'] = 0x1E0D; + t['decimalseparatorarabic'] = 0x066B; + t['decimalseparatorpersian'] = 0x066B; + t['decyrillic'] = 0x0434; + t['degree'] = 0x00B0; + t['dehihebrew'] = 0x05AD; + t['dehiragana'] = 0x3067; + t['deicoptic'] = 0x03EF; + t['dekatakana'] = 0x30C7; + t['deleteleft'] = 0x232B; + t['deleteright'] = 0x2326; + t['delta'] = 0x03B4; + t['deltaturned'] = 0x018D; + t['denominatorminusonenumeratorbengali'] = 0x09F8; + t['dezh'] = 0x02A4; + t['dhabengali'] = 0x09A7; + t['dhadeva'] = 0x0927; + t['dhagujarati'] = 0x0AA7; + t['dhagurmukhi'] = 0x0A27; + t['dhook'] = 0x0257; + t['dialytikatonos'] = 0x0385; + t['dialytikatonoscmb'] = 0x0344; + t['diamond'] = 0x2666; + t['diamondsuitwhite'] = 0x2662; + t['dieresis'] = 0x00A8; + t['dieresisacute'] = 0xF6D7; + t['dieresisbelowcmb'] = 0x0324; + t['dieresiscmb'] = 0x0308; + t['dieresisgrave'] = 0xF6D8; + t['dieresistonos'] = 0x0385; + t['dihiragana'] = 0x3062; + t['dikatakana'] = 0x30C2; + t['dittomark'] = 0x3003; + t['divide'] = 0x00F7; + t['divides'] = 0x2223; + t['divisionslash'] = 0x2215; + t['djecyrillic'] = 0x0452; + t['dkshade'] = 0x2593; + t['dlinebelow'] = 0x1E0F; + t['dlsquare'] = 0x3397; + t['dmacron'] = 0x0111; + t['dmonospace'] = 0xFF44; + t['dnblock'] = 0x2584; + t['dochadathai'] = 0x0E0E; + t['dodekthai'] = 0x0E14; + t['dohiragana'] = 0x3069; + t['dokatakana'] = 0x30C9; + t['dollar'] = 0x0024; + t['dollarinferior'] = 0xF6E3; + t['dollarmonospace'] = 0xFF04; + t['dollaroldstyle'] = 0xF724; + t['dollarsmall'] = 0xFE69; + t['dollarsuperior'] = 0xF6E4; + t['dong'] = 0x20AB; + t['dorusquare'] = 0x3326; + t['dotaccent'] = 0x02D9; + t['dotaccentcmb'] = 0x0307; + t['dotbelowcmb'] = 0x0323; + t['dotbelowcomb'] = 0x0323; + t['dotkatakana'] = 0x30FB; + t['dotlessi'] = 0x0131; + t['dotlessj'] = 0xF6BE; + t['dotlessjstrokehook'] = 0x0284; + t['dotmath'] = 0x22C5; + t['dottedcircle'] = 0x25CC; + t['doubleyodpatah'] = 0xFB1F; + t['doubleyodpatahhebrew'] = 0xFB1F; + t['downtackbelowcmb'] = 0x031E; + t['downtackmod'] = 0x02D5; + t['dparen'] = 0x249F; + t['dsuperior'] = 0xF6EB; + t['dtail'] = 0x0256; + t['dtopbar'] = 0x018C; + t['duhiragana'] = 0x3065; + t['dukatakana'] = 0x30C5; + t['dz'] = 0x01F3; + t['dzaltone'] = 0x02A3; + t['dzcaron'] = 0x01C6; + t['dzcurl'] = 0x02A5; + t['dzeabkhasiancyrillic'] = 0x04E1; + t['dzecyrillic'] = 0x0455; + t['dzhecyrillic'] = 0x045F; + t['e'] = 0x0065; + t['eacute'] = 0x00E9; + t['earth'] = 0x2641; + t['ebengali'] = 0x098F; + t['ebopomofo'] = 0x311C; + t['ebreve'] = 0x0115; + t['ecandradeva'] = 0x090D; + t['ecandragujarati'] = 0x0A8D; + t['ecandravowelsigndeva'] = 0x0945; + t['ecandravowelsigngujarati'] = 0x0AC5; + t['ecaron'] = 0x011B; + t['ecedillabreve'] = 0x1E1D; + t['echarmenian'] = 0x0565; + t['echyiwnarmenian'] = 0x0587; + t['ecircle'] = 0x24D4; + t['ecircumflex'] = 0x00EA; + t['ecircumflexacute'] = 0x1EBF; + t['ecircumflexbelow'] = 0x1E19; + t['ecircumflexdotbelow'] = 0x1EC7; + t['ecircumflexgrave'] = 0x1EC1; + t['ecircumflexhookabove'] = 0x1EC3; + t['ecircumflextilde'] = 0x1EC5; + t['ecyrillic'] = 0x0454; + t['edblgrave'] = 0x0205; + t['edeva'] = 0x090F; + t['edieresis'] = 0x00EB; + t['edot'] = 0x0117; + t['edotaccent'] = 0x0117; + t['edotbelow'] = 0x1EB9; + t['eegurmukhi'] = 0x0A0F; + t['eematragurmukhi'] = 0x0A47; + t['efcyrillic'] = 0x0444; + t['egrave'] = 0x00E8; + t['egujarati'] = 0x0A8F; + t['eharmenian'] = 0x0567; + t['ehbopomofo'] = 0x311D; + t['ehiragana'] = 0x3048; + t['ehookabove'] = 0x1EBB; + t['eibopomofo'] = 0x311F; + t['eight'] = 0x0038; + t['eightarabic'] = 0x0668; + t['eightbengali'] = 0x09EE; + t['eightcircle'] = 0x2467; + t['eightcircleinversesansserif'] = 0x2791; + t['eightdeva'] = 0x096E; + t['eighteencircle'] = 0x2471; + t['eighteenparen'] = 0x2485; + t['eighteenperiod'] = 0x2499; + t['eightgujarati'] = 0x0AEE; + t['eightgurmukhi'] = 0x0A6E; + t['eighthackarabic'] = 0x0668; + t['eighthangzhou'] = 0x3028; + t['eighthnotebeamed'] = 0x266B; + t['eightideographicparen'] = 0x3227; + t['eightinferior'] = 0x2088; + t['eightmonospace'] = 0xFF18; + t['eightoldstyle'] = 0xF738; + t['eightparen'] = 0x247B; + t['eightperiod'] = 0x248F; + t['eightpersian'] = 0x06F8; + t['eightroman'] = 0x2177; + t['eightsuperior'] = 0x2078; + t['eightthai'] = 0x0E58; + t['einvertedbreve'] = 0x0207; + t['eiotifiedcyrillic'] = 0x0465; + t['ekatakana'] = 0x30A8; + t['ekatakanahalfwidth'] = 0xFF74; + t['ekonkargurmukhi'] = 0x0A74; + t['ekorean'] = 0x3154; + t['elcyrillic'] = 0x043B; + t['element'] = 0x2208; + t['elevencircle'] = 0x246A; + t['elevenparen'] = 0x247E; + t['elevenperiod'] = 0x2492; + t['elevenroman'] = 0x217A; + t['ellipsis'] = 0x2026; + t['ellipsisvertical'] = 0x22EE; + t['emacron'] = 0x0113; + t['emacronacute'] = 0x1E17; + t['emacrongrave'] = 0x1E15; + t['emcyrillic'] = 0x043C; + t['emdash'] = 0x2014; + t['emdashvertical'] = 0xFE31; + t['emonospace'] = 0xFF45; + t['emphasismarkarmenian'] = 0x055B; + t['emptyset'] = 0x2205; + t['enbopomofo'] = 0x3123; + t['encyrillic'] = 0x043D; + t['endash'] = 0x2013; + t['endashvertical'] = 0xFE32; + t['endescendercyrillic'] = 0x04A3; + t['eng'] = 0x014B; + t['engbopomofo'] = 0x3125; + t['enghecyrillic'] = 0x04A5; + t['enhookcyrillic'] = 0x04C8; + t['enspace'] = 0x2002; + t['eogonek'] = 0x0119; + t['eokorean'] = 0x3153; + t['eopen'] = 0x025B; + t['eopenclosed'] = 0x029A; + t['eopenreversed'] = 0x025C; + t['eopenreversedclosed'] = 0x025E; + t['eopenreversedhook'] = 0x025D; + t['eparen'] = 0x24A0; + t['epsilon'] = 0x03B5; + t['epsilontonos'] = 0x03AD; + t['equal'] = 0x003D; + t['equalmonospace'] = 0xFF1D; + t['equalsmall'] = 0xFE66; + t['equalsuperior'] = 0x207C; + t['equivalence'] = 0x2261; + t['erbopomofo'] = 0x3126; + t['ercyrillic'] = 0x0440; + t['ereversed'] = 0x0258; + t['ereversedcyrillic'] = 0x044D; + t['escyrillic'] = 0x0441; + t['esdescendercyrillic'] = 0x04AB; + t['esh'] = 0x0283; + t['eshcurl'] = 0x0286; + t['eshortdeva'] = 0x090E; + t['eshortvowelsigndeva'] = 0x0946; + t['eshreversedloop'] = 0x01AA; + t['eshsquatreversed'] = 0x0285; + t['esmallhiragana'] = 0x3047; + t['esmallkatakana'] = 0x30A7; + t['esmallkatakanahalfwidth'] = 0xFF6A; + t['estimated'] = 0x212E; + t['esuperior'] = 0xF6EC; + t['eta'] = 0x03B7; + t['etarmenian'] = 0x0568; + t['etatonos'] = 0x03AE; + t['eth'] = 0x00F0; + t['etilde'] = 0x1EBD; + t['etildebelow'] = 0x1E1B; + t['etnahtafoukhhebrew'] = 0x0591; + t['etnahtafoukhlefthebrew'] = 0x0591; + t['etnahtahebrew'] = 0x0591; + t['etnahtalefthebrew'] = 0x0591; + t['eturned'] = 0x01DD; + t['eukorean'] = 0x3161; + t['euro'] = 0x20AC; + t['evowelsignbengali'] = 0x09C7; + t['evowelsigndeva'] = 0x0947; + t['evowelsigngujarati'] = 0x0AC7; + t['exclam'] = 0x0021; + t['exclamarmenian'] = 0x055C; + t['exclamdbl'] = 0x203C; + t['exclamdown'] = 0x00A1; + t['exclamdownsmall'] = 0xF7A1; + t['exclammonospace'] = 0xFF01; + t['exclamsmall'] = 0xF721; + t['existential'] = 0x2203; + t['ezh'] = 0x0292; + t['ezhcaron'] = 0x01EF; + t['ezhcurl'] = 0x0293; + t['ezhreversed'] = 0x01B9; + t['ezhtail'] = 0x01BA; + t['f'] = 0x0066; + t['fadeva'] = 0x095E; + t['fagurmukhi'] = 0x0A5E; + t['fahrenheit'] = 0x2109; + t['fathaarabic'] = 0x064E; + t['fathalowarabic'] = 0x064E; + t['fathatanarabic'] = 0x064B; + t['fbopomofo'] = 0x3108; + t['fcircle'] = 0x24D5; + t['fdotaccent'] = 0x1E1F; + t['feharabic'] = 0x0641; + t['feharmenian'] = 0x0586; + t['fehfinalarabic'] = 0xFED2; + t['fehinitialarabic'] = 0xFED3; + t['fehmedialarabic'] = 0xFED4; + t['feicoptic'] = 0x03E5; + t['female'] = 0x2640; + t['ff'] = 0xFB00; + t['ffi'] = 0xFB03; + t['ffl'] = 0xFB04; + t['fi'] = 0xFB01; + t['fifteencircle'] = 0x246E; + t['fifteenparen'] = 0x2482; + t['fifteenperiod'] = 0x2496; + t['figuredash'] = 0x2012; + t['filledbox'] = 0x25A0; + t['filledrect'] = 0x25AC; + t['finalkaf'] = 0x05DA; + t['finalkafdagesh'] = 0xFB3A; + t['finalkafdageshhebrew'] = 0xFB3A; + t['finalkafhebrew'] = 0x05DA; + t['finalmem'] = 0x05DD; + t['finalmemhebrew'] = 0x05DD; + t['finalnun'] = 0x05DF; + t['finalnunhebrew'] = 0x05DF; + t['finalpe'] = 0x05E3; + t['finalpehebrew'] = 0x05E3; + t['finaltsadi'] = 0x05E5; + t['finaltsadihebrew'] = 0x05E5; + t['firsttonechinese'] = 0x02C9; + t['fisheye'] = 0x25C9; + t['fitacyrillic'] = 0x0473; + t['five'] = 0x0035; + t['fivearabic'] = 0x0665; + t['fivebengali'] = 0x09EB; + t['fivecircle'] = 0x2464; + t['fivecircleinversesansserif'] = 0x278E; + t['fivedeva'] = 0x096B; + t['fiveeighths'] = 0x215D; + t['fivegujarati'] = 0x0AEB; + t['fivegurmukhi'] = 0x0A6B; + t['fivehackarabic'] = 0x0665; + t['fivehangzhou'] = 0x3025; + t['fiveideographicparen'] = 0x3224; + t['fiveinferior'] = 0x2085; + t['fivemonospace'] = 0xFF15; + t['fiveoldstyle'] = 0xF735; + t['fiveparen'] = 0x2478; + t['fiveperiod'] = 0x248C; + t['fivepersian'] = 0x06F5; + t['fiveroman'] = 0x2174; + t['fivesuperior'] = 0x2075; + t['fivethai'] = 0x0E55; + t['fl'] = 0xFB02; + t['florin'] = 0x0192; + t['fmonospace'] = 0xFF46; + t['fmsquare'] = 0x3399; + t['fofanthai'] = 0x0E1F; + t['fofathai'] = 0x0E1D; + t['fongmanthai'] = 0x0E4F; + t['forall'] = 0x2200; + t['four'] = 0x0034; + t['fourarabic'] = 0x0664; + t['fourbengali'] = 0x09EA; + t['fourcircle'] = 0x2463; + t['fourcircleinversesansserif'] = 0x278D; + t['fourdeva'] = 0x096A; + t['fourgujarati'] = 0x0AEA; + t['fourgurmukhi'] = 0x0A6A; + t['fourhackarabic'] = 0x0664; + t['fourhangzhou'] = 0x3024; + t['fourideographicparen'] = 0x3223; + t['fourinferior'] = 0x2084; + t['fourmonospace'] = 0xFF14; + t['fournumeratorbengali'] = 0x09F7; + t['fouroldstyle'] = 0xF734; + t['fourparen'] = 0x2477; + t['fourperiod'] = 0x248B; + t['fourpersian'] = 0x06F4; + t['fourroman'] = 0x2173; + t['foursuperior'] = 0x2074; + t['fourteencircle'] = 0x246D; + t['fourteenparen'] = 0x2481; + t['fourteenperiod'] = 0x2495; + t['fourthai'] = 0x0E54; + t['fourthtonechinese'] = 0x02CB; + t['fparen'] = 0x24A1; + t['fraction'] = 0x2044; + t['franc'] = 0x20A3; + t['g'] = 0x0067; + t['gabengali'] = 0x0997; + t['gacute'] = 0x01F5; + t['gadeva'] = 0x0917; + t['gafarabic'] = 0x06AF; + t['gaffinalarabic'] = 0xFB93; + t['gafinitialarabic'] = 0xFB94; + t['gafmedialarabic'] = 0xFB95; + t['gagujarati'] = 0x0A97; + t['gagurmukhi'] = 0x0A17; + t['gahiragana'] = 0x304C; + t['gakatakana'] = 0x30AC; + t['gamma'] = 0x03B3; + t['gammalatinsmall'] = 0x0263; + t['gammasuperior'] = 0x02E0; + t['gangiacoptic'] = 0x03EB; + t['gbopomofo'] = 0x310D; + t['gbreve'] = 0x011F; + t['gcaron'] = 0x01E7; + t['gcedilla'] = 0x0123; + t['gcircle'] = 0x24D6; + t['gcircumflex'] = 0x011D; + t['gcommaaccent'] = 0x0123; + t['gdot'] = 0x0121; + t['gdotaccent'] = 0x0121; + t['gecyrillic'] = 0x0433; + t['gehiragana'] = 0x3052; + t['gekatakana'] = 0x30B2; + t['geometricallyequal'] = 0x2251; + t['gereshaccenthebrew'] = 0x059C; + t['gereshhebrew'] = 0x05F3; + t['gereshmuqdamhebrew'] = 0x059D; + t['germandbls'] = 0x00DF; + t['gershayimaccenthebrew'] = 0x059E; + t['gershayimhebrew'] = 0x05F4; + t['getamark'] = 0x3013; + t['ghabengali'] = 0x0998; + t['ghadarmenian'] = 0x0572; + t['ghadeva'] = 0x0918; + t['ghagujarati'] = 0x0A98; + t['ghagurmukhi'] = 0x0A18; + t['ghainarabic'] = 0x063A; + t['ghainfinalarabic'] = 0xFECE; + t['ghaininitialarabic'] = 0xFECF; + t['ghainmedialarabic'] = 0xFED0; + t['ghemiddlehookcyrillic'] = 0x0495; + t['ghestrokecyrillic'] = 0x0493; + t['gheupturncyrillic'] = 0x0491; + t['ghhadeva'] = 0x095A; + t['ghhagurmukhi'] = 0x0A5A; + t['ghook'] = 0x0260; + t['ghzsquare'] = 0x3393; + t['gihiragana'] = 0x304E; + t['gikatakana'] = 0x30AE; + t['gimarmenian'] = 0x0563; + t['gimel'] = 0x05D2; + t['gimeldagesh'] = 0xFB32; + t['gimeldageshhebrew'] = 0xFB32; + t['gimelhebrew'] = 0x05D2; + t['gjecyrillic'] = 0x0453; + t['glottalinvertedstroke'] = 0x01BE; + t['glottalstop'] = 0x0294; + t['glottalstopinverted'] = 0x0296; + t['glottalstopmod'] = 0x02C0; + t['glottalstopreversed'] = 0x0295; + t['glottalstopreversedmod'] = 0x02C1; + t['glottalstopreversedsuperior'] = 0x02E4; + t['glottalstopstroke'] = 0x02A1; + t['glottalstopstrokereversed'] = 0x02A2; + t['gmacron'] = 0x1E21; + t['gmonospace'] = 0xFF47; + t['gohiragana'] = 0x3054; + t['gokatakana'] = 0x30B4; + t['gparen'] = 0x24A2; + t['gpasquare'] = 0x33AC; + t['gradient'] = 0x2207; + t['grave'] = 0x0060; + t['gravebelowcmb'] = 0x0316; + t['gravecmb'] = 0x0300; + t['gravecomb'] = 0x0300; + t['gravedeva'] = 0x0953; + t['gravelowmod'] = 0x02CE; + t['gravemonospace'] = 0xFF40; + t['gravetonecmb'] = 0x0340; + t['greater'] = 0x003E; + t['greaterequal'] = 0x2265; + t['greaterequalorless'] = 0x22DB; + t['greatermonospace'] = 0xFF1E; + t['greaterorequivalent'] = 0x2273; + t['greaterorless'] = 0x2277; + t['greateroverequal'] = 0x2267; + t['greatersmall'] = 0xFE65; + t['gscript'] = 0x0261; + t['gstroke'] = 0x01E5; + t['guhiragana'] = 0x3050; + t['guillemotleft'] = 0x00AB; + t['guillemotright'] = 0x00BB; + t['guilsinglleft'] = 0x2039; + t['guilsinglright'] = 0x203A; + t['gukatakana'] = 0x30B0; + t['guramusquare'] = 0x3318; + t['gysquare'] = 0x33C9; + t['h'] = 0x0068; + t['haabkhasiancyrillic'] = 0x04A9; + t['haaltonearabic'] = 0x06C1; + t['habengali'] = 0x09B9; + t['hadescendercyrillic'] = 0x04B3; + t['hadeva'] = 0x0939; + t['hagujarati'] = 0x0AB9; + t['hagurmukhi'] = 0x0A39; + t['haharabic'] = 0x062D; + t['hahfinalarabic'] = 0xFEA2; + t['hahinitialarabic'] = 0xFEA3; + t['hahiragana'] = 0x306F; + t['hahmedialarabic'] = 0xFEA4; + t['haitusquare'] = 0x332A; + t['hakatakana'] = 0x30CF; + t['hakatakanahalfwidth'] = 0xFF8A; + t['halantgurmukhi'] = 0x0A4D; + t['hamzaarabic'] = 0x0621; + t['hamzalowarabic'] = 0x0621; + t['hangulfiller'] = 0x3164; + t['hardsigncyrillic'] = 0x044A; + t['harpoonleftbarbup'] = 0x21BC; + t['harpoonrightbarbup'] = 0x21C0; + t['hasquare'] = 0x33CA; + t['hatafpatah'] = 0x05B2; + t['hatafpatah16'] = 0x05B2; + t['hatafpatah23'] = 0x05B2; + t['hatafpatah2f'] = 0x05B2; + t['hatafpatahhebrew'] = 0x05B2; + t['hatafpatahnarrowhebrew'] = 0x05B2; + t['hatafpatahquarterhebrew'] = 0x05B2; + t['hatafpatahwidehebrew'] = 0x05B2; + t['hatafqamats'] = 0x05B3; + t['hatafqamats1b'] = 0x05B3; + t['hatafqamats28'] = 0x05B3; + t['hatafqamats34'] = 0x05B3; + t['hatafqamatshebrew'] = 0x05B3; + t['hatafqamatsnarrowhebrew'] = 0x05B3; + t['hatafqamatsquarterhebrew'] = 0x05B3; + t['hatafqamatswidehebrew'] = 0x05B3; + t['hatafsegol'] = 0x05B1; + t['hatafsegol17'] = 0x05B1; + t['hatafsegol24'] = 0x05B1; + t['hatafsegol30'] = 0x05B1; + t['hatafsegolhebrew'] = 0x05B1; + t['hatafsegolnarrowhebrew'] = 0x05B1; + t['hatafsegolquarterhebrew'] = 0x05B1; + t['hatafsegolwidehebrew'] = 0x05B1; + t['hbar'] = 0x0127; + t['hbopomofo'] = 0x310F; + t['hbrevebelow'] = 0x1E2B; + t['hcedilla'] = 0x1E29; + t['hcircle'] = 0x24D7; + t['hcircumflex'] = 0x0125; + t['hdieresis'] = 0x1E27; + t['hdotaccent'] = 0x1E23; + t['hdotbelow'] = 0x1E25; + t['he'] = 0x05D4; + t['heart'] = 0x2665; + t['heartsuitblack'] = 0x2665; + t['heartsuitwhite'] = 0x2661; + t['hedagesh'] = 0xFB34; + t['hedageshhebrew'] = 0xFB34; + t['hehaltonearabic'] = 0x06C1; + t['heharabic'] = 0x0647; + t['hehebrew'] = 0x05D4; + t['hehfinalaltonearabic'] = 0xFBA7; + t['hehfinalalttwoarabic'] = 0xFEEA; + t['hehfinalarabic'] = 0xFEEA; + t['hehhamzaabovefinalarabic'] = 0xFBA5; + t['hehhamzaaboveisolatedarabic'] = 0xFBA4; + t['hehinitialaltonearabic'] = 0xFBA8; + t['hehinitialarabic'] = 0xFEEB; + t['hehiragana'] = 0x3078; + t['hehmedialaltonearabic'] = 0xFBA9; + t['hehmedialarabic'] = 0xFEEC; + t['heiseierasquare'] = 0x337B; + t['hekatakana'] = 0x30D8; + t['hekatakanahalfwidth'] = 0xFF8D; + t['hekutaarusquare'] = 0x3336; + t['henghook'] = 0x0267; + t['herutusquare'] = 0x3339; + t['het'] = 0x05D7; + t['hethebrew'] = 0x05D7; + t['hhook'] = 0x0266; + t['hhooksuperior'] = 0x02B1; + t['hieuhacirclekorean'] = 0x327B; + t['hieuhaparenkorean'] = 0x321B; + t['hieuhcirclekorean'] = 0x326D; + t['hieuhkorean'] = 0x314E; + t['hieuhparenkorean'] = 0x320D; + t['hihiragana'] = 0x3072; + t['hikatakana'] = 0x30D2; + t['hikatakanahalfwidth'] = 0xFF8B; + t['hiriq'] = 0x05B4; + t['hiriq14'] = 0x05B4; + t['hiriq21'] = 0x05B4; + t['hiriq2d'] = 0x05B4; + t['hiriqhebrew'] = 0x05B4; + t['hiriqnarrowhebrew'] = 0x05B4; + t['hiriqquarterhebrew'] = 0x05B4; + t['hiriqwidehebrew'] = 0x05B4; + t['hlinebelow'] = 0x1E96; + t['hmonospace'] = 0xFF48; + t['hoarmenian'] = 0x0570; + t['hohipthai'] = 0x0E2B; + t['hohiragana'] = 0x307B; + t['hokatakana'] = 0x30DB; + t['hokatakanahalfwidth'] = 0xFF8E; + t['holam'] = 0x05B9; + t['holam19'] = 0x05B9; + t['holam26'] = 0x05B9; + t['holam32'] = 0x05B9; + t['holamhebrew'] = 0x05B9; + t['holamnarrowhebrew'] = 0x05B9; + t['holamquarterhebrew'] = 0x05B9; + t['holamwidehebrew'] = 0x05B9; + t['honokhukthai'] = 0x0E2E; + t['hookabovecomb'] = 0x0309; + t['hookcmb'] = 0x0309; + t['hookpalatalizedbelowcmb'] = 0x0321; + t['hookretroflexbelowcmb'] = 0x0322; + t['hoonsquare'] = 0x3342; + t['horicoptic'] = 0x03E9; + t['horizontalbar'] = 0x2015; + t['horncmb'] = 0x031B; + t['hotsprings'] = 0x2668; + t['house'] = 0x2302; + t['hparen'] = 0x24A3; + t['hsuperior'] = 0x02B0; + t['hturned'] = 0x0265; + t['huhiragana'] = 0x3075; + t['huiitosquare'] = 0x3333; + t['hukatakana'] = 0x30D5; + t['hukatakanahalfwidth'] = 0xFF8C; + t['hungarumlaut'] = 0x02DD; + t['hungarumlautcmb'] = 0x030B; + t['hv'] = 0x0195; + t['hyphen'] = 0x002D; + t['hypheninferior'] = 0xF6E5; + t['hyphenmonospace'] = 0xFF0D; + t['hyphensmall'] = 0xFE63; + t['hyphensuperior'] = 0xF6E6; + t['hyphentwo'] = 0x2010; + t['i'] = 0x0069; + t['iacute'] = 0x00ED; + t['iacyrillic'] = 0x044F; + t['ibengali'] = 0x0987; + t['ibopomofo'] = 0x3127; + t['ibreve'] = 0x012D; + t['icaron'] = 0x01D0; + t['icircle'] = 0x24D8; + t['icircumflex'] = 0x00EE; + t['icyrillic'] = 0x0456; + t['idblgrave'] = 0x0209; + t['ideographearthcircle'] = 0x328F; + t['ideographfirecircle'] = 0x328B; + t['ideographicallianceparen'] = 0x323F; + t['ideographiccallparen'] = 0x323A; + t['ideographiccentrecircle'] = 0x32A5; + t['ideographicclose'] = 0x3006; + t['ideographiccomma'] = 0x3001; + t['ideographiccommaleft'] = 0xFF64; + t['ideographiccongratulationparen'] = 0x3237; + t['ideographiccorrectcircle'] = 0x32A3; + t['ideographicearthparen'] = 0x322F; + t['ideographicenterpriseparen'] = 0x323D; + t['ideographicexcellentcircle'] = 0x329D; + t['ideographicfestivalparen'] = 0x3240; + t['ideographicfinancialcircle'] = 0x3296; + t['ideographicfinancialparen'] = 0x3236; + t['ideographicfireparen'] = 0x322B; + t['ideographichaveparen'] = 0x3232; + t['ideographichighcircle'] = 0x32A4; + t['ideographiciterationmark'] = 0x3005; + t['ideographiclaborcircle'] = 0x3298; + t['ideographiclaborparen'] = 0x3238; + t['ideographicleftcircle'] = 0x32A7; + t['ideographiclowcircle'] = 0x32A6; + t['ideographicmedicinecircle'] = 0x32A9; + t['ideographicmetalparen'] = 0x322E; + t['ideographicmoonparen'] = 0x322A; + t['ideographicnameparen'] = 0x3234; + t['ideographicperiod'] = 0x3002; + t['ideographicprintcircle'] = 0x329E; + t['ideographicreachparen'] = 0x3243; + t['ideographicrepresentparen'] = 0x3239; + t['ideographicresourceparen'] = 0x323E; + t['ideographicrightcircle'] = 0x32A8; + t['ideographicsecretcircle'] = 0x3299; + t['ideographicselfparen'] = 0x3242; + t['ideographicsocietyparen'] = 0x3233; + t['ideographicspace'] = 0x3000; + t['ideographicspecialparen'] = 0x3235; + t['ideographicstockparen'] = 0x3231; + t['ideographicstudyparen'] = 0x323B; + t['ideographicsunparen'] = 0x3230; + t['ideographicsuperviseparen'] = 0x323C; + t['ideographicwaterparen'] = 0x322C; + t['ideographicwoodparen'] = 0x322D; + t['ideographiczero'] = 0x3007; + t['ideographmetalcircle'] = 0x328E; + t['ideographmooncircle'] = 0x328A; + t['ideographnamecircle'] = 0x3294; + t['ideographsuncircle'] = 0x3290; + t['ideographwatercircle'] = 0x328C; + t['ideographwoodcircle'] = 0x328D; + t['ideva'] = 0x0907; + t['idieresis'] = 0x00EF; + t['idieresisacute'] = 0x1E2F; + t['idieresiscyrillic'] = 0x04E5; + t['idotbelow'] = 0x1ECB; + t['iebrevecyrillic'] = 0x04D7; + t['iecyrillic'] = 0x0435; + t['ieungacirclekorean'] = 0x3275; + t['ieungaparenkorean'] = 0x3215; + t['ieungcirclekorean'] = 0x3267; + t['ieungkorean'] = 0x3147; + t['ieungparenkorean'] = 0x3207; + t['igrave'] = 0x00EC; + t['igujarati'] = 0x0A87; + t['igurmukhi'] = 0x0A07; + t['ihiragana'] = 0x3044; + t['ihookabove'] = 0x1EC9; + t['iibengali'] = 0x0988; + t['iicyrillic'] = 0x0438; + t['iideva'] = 0x0908; + t['iigujarati'] = 0x0A88; + t['iigurmukhi'] = 0x0A08; + t['iimatragurmukhi'] = 0x0A40; + t['iinvertedbreve'] = 0x020B; + t['iishortcyrillic'] = 0x0439; + t['iivowelsignbengali'] = 0x09C0; + t['iivowelsigndeva'] = 0x0940; + t['iivowelsigngujarati'] = 0x0AC0; + t['ij'] = 0x0133; + t['ikatakana'] = 0x30A4; + t['ikatakanahalfwidth'] = 0xFF72; + t['ikorean'] = 0x3163; + t['ilde'] = 0x02DC; + t['iluyhebrew'] = 0x05AC; + t['imacron'] = 0x012B; + t['imacroncyrillic'] = 0x04E3; + t['imageorapproximatelyequal'] = 0x2253; + t['imatragurmukhi'] = 0x0A3F; + t['imonospace'] = 0xFF49; + t['increment'] = 0x2206; + t['infinity'] = 0x221E; + t['iniarmenian'] = 0x056B; + t['integral'] = 0x222B; + t['integralbottom'] = 0x2321; + t['integralbt'] = 0x2321; + t['integralex'] = 0xF8F5; + t['integraltop'] = 0x2320; + t['integraltp'] = 0x2320; + t['intersection'] = 0x2229; + t['intisquare'] = 0x3305; + t['invbullet'] = 0x25D8; + t['invcircle'] = 0x25D9; + t['invsmileface'] = 0x263B; + t['iocyrillic'] = 0x0451; + t['iogonek'] = 0x012F; + t['iota'] = 0x03B9; + t['iotadieresis'] = 0x03CA; + t['iotadieresistonos'] = 0x0390; + t['iotalatin'] = 0x0269; + t['iotatonos'] = 0x03AF; + t['iparen'] = 0x24A4; + t['irigurmukhi'] = 0x0A72; + t['ismallhiragana'] = 0x3043; + t['ismallkatakana'] = 0x30A3; + t['ismallkatakanahalfwidth'] = 0xFF68; + t['issharbengali'] = 0x09FA; + t['istroke'] = 0x0268; + t['isuperior'] = 0xF6ED; + t['iterationhiragana'] = 0x309D; + t['iterationkatakana'] = 0x30FD; + t['itilde'] = 0x0129; + t['itildebelow'] = 0x1E2D; + t['iubopomofo'] = 0x3129; + t['iucyrillic'] = 0x044E; + t['ivowelsignbengali'] = 0x09BF; + t['ivowelsigndeva'] = 0x093F; + t['ivowelsigngujarati'] = 0x0ABF; + t['izhitsacyrillic'] = 0x0475; + t['izhitsadblgravecyrillic'] = 0x0477; + t['j'] = 0x006A; + t['jaarmenian'] = 0x0571; + t['jabengali'] = 0x099C; + t['jadeva'] = 0x091C; + t['jagujarati'] = 0x0A9C; + t['jagurmukhi'] = 0x0A1C; + t['jbopomofo'] = 0x3110; + t['jcaron'] = 0x01F0; + t['jcircle'] = 0x24D9; + t['jcircumflex'] = 0x0135; + t['jcrossedtail'] = 0x029D; + t['jdotlessstroke'] = 0x025F; + t['jecyrillic'] = 0x0458; + t['jeemarabic'] = 0x062C; + t['jeemfinalarabic'] = 0xFE9E; + t['jeeminitialarabic'] = 0xFE9F; + t['jeemmedialarabic'] = 0xFEA0; + t['jeharabic'] = 0x0698; + t['jehfinalarabic'] = 0xFB8B; + t['jhabengali'] = 0x099D; + t['jhadeva'] = 0x091D; + t['jhagujarati'] = 0x0A9D; + t['jhagurmukhi'] = 0x0A1D; + t['jheharmenian'] = 0x057B; + t['jis'] = 0x3004; + t['jmonospace'] = 0xFF4A; + t['jparen'] = 0x24A5; + t['jsuperior'] = 0x02B2; + t['k'] = 0x006B; + t['kabashkircyrillic'] = 0x04A1; + t['kabengali'] = 0x0995; + t['kacute'] = 0x1E31; + t['kacyrillic'] = 0x043A; + t['kadescendercyrillic'] = 0x049B; + t['kadeva'] = 0x0915; + t['kaf'] = 0x05DB; + t['kafarabic'] = 0x0643; + t['kafdagesh'] = 0xFB3B; + t['kafdageshhebrew'] = 0xFB3B; + t['kaffinalarabic'] = 0xFEDA; + t['kafhebrew'] = 0x05DB; + t['kafinitialarabic'] = 0xFEDB; + t['kafmedialarabic'] = 0xFEDC; + t['kafrafehebrew'] = 0xFB4D; + t['kagujarati'] = 0x0A95; + t['kagurmukhi'] = 0x0A15; + t['kahiragana'] = 0x304B; + t['kahookcyrillic'] = 0x04C4; + t['kakatakana'] = 0x30AB; + t['kakatakanahalfwidth'] = 0xFF76; + t['kappa'] = 0x03BA; + t['kappasymbolgreek'] = 0x03F0; + t['kapyeounmieumkorean'] = 0x3171; + t['kapyeounphieuphkorean'] = 0x3184; + t['kapyeounpieupkorean'] = 0x3178; + t['kapyeounssangpieupkorean'] = 0x3179; + t['karoriisquare'] = 0x330D; + t['kashidaautoarabic'] = 0x0640; + t['kashidaautonosidebearingarabic'] = 0x0640; + t['kasmallkatakana'] = 0x30F5; + t['kasquare'] = 0x3384; + t['kasraarabic'] = 0x0650; + t['kasratanarabic'] = 0x064D; + t['kastrokecyrillic'] = 0x049F; + t['katahiraprolongmarkhalfwidth'] = 0xFF70; + t['kaverticalstrokecyrillic'] = 0x049D; + t['kbopomofo'] = 0x310E; + t['kcalsquare'] = 0x3389; + t['kcaron'] = 0x01E9; + t['kcedilla'] = 0x0137; + t['kcircle'] = 0x24DA; + t['kcommaaccent'] = 0x0137; + t['kdotbelow'] = 0x1E33; + t['keharmenian'] = 0x0584; + t['kehiragana'] = 0x3051; + t['kekatakana'] = 0x30B1; + t['kekatakanahalfwidth'] = 0xFF79; + t['kenarmenian'] = 0x056F; + t['kesmallkatakana'] = 0x30F6; + t['kgreenlandic'] = 0x0138; + t['khabengali'] = 0x0996; + t['khacyrillic'] = 0x0445; + t['khadeva'] = 0x0916; + t['khagujarati'] = 0x0A96; + t['khagurmukhi'] = 0x0A16; + t['khaharabic'] = 0x062E; + t['khahfinalarabic'] = 0xFEA6; + t['khahinitialarabic'] = 0xFEA7; + t['khahmedialarabic'] = 0xFEA8; + t['kheicoptic'] = 0x03E7; + t['khhadeva'] = 0x0959; + t['khhagurmukhi'] = 0x0A59; + t['khieukhacirclekorean'] = 0x3278; + t['khieukhaparenkorean'] = 0x3218; + t['khieukhcirclekorean'] = 0x326A; + t['khieukhkorean'] = 0x314B; + t['khieukhparenkorean'] = 0x320A; + t['khokhaithai'] = 0x0E02; + t['khokhonthai'] = 0x0E05; + t['khokhuatthai'] = 0x0E03; + t['khokhwaithai'] = 0x0E04; + t['khomutthai'] = 0x0E5B; + t['khook'] = 0x0199; + t['khorakhangthai'] = 0x0E06; + t['khzsquare'] = 0x3391; + t['kihiragana'] = 0x304D; + t['kikatakana'] = 0x30AD; + t['kikatakanahalfwidth'] = 0xFF77; + t['kiroguramusquare'] = 0x3315; + t['kiromeetorusquare'] = 0x3316; + t['kirosquare'] = 0x3314; + t['kiyeokacirclekorean'] = 0x326E; + t['kiyeokaparenkorean'] = 0x320E; + t['kiyeokcirclekorean'] = 0x3260; + t['kiyeokkorean'] = 0x3131; + t['kiyeokparenkorean'] = 0x3200; + t['kiyeoksioskorean'] = 0x3133; + t['kjecyrillic'] = 0x045C; + t['klinebelow'] = 0x1E35; + t['klsquare'] = 0x3398; + t['kmcubedsquare'] = 0x33A6; + t['kmonospace'] = 0xFF4B; + t['kmsquaredsquare'] = 0x33A2; + t['kohiragana'] = 0x3053; + t['kohmsquare'] = 0x33C0; + t['kokaithai'] = 0x0E01; + t['kokatakana'] = 0x30B3; + t['kokatakanahalfwidth'] = 0xFF7A; + t['kooposquare'] = 0x331E; + t['koppacyrillic'] = 0x0481; + t['koreanstandardsymbol'] = 0x327F; + t['koroniscmb'] = 0x0343; + t['kparen'] = 0x24A6; + t['kpasquare'] = 0x33AA; + t['ksicyrillic'] = 0x046F; + t['ktsquare'] = 0x33CF; + t['kturned'] = 0x029E; + t['kuhiragana'] = 0x304F; + t['kukatakana'] = 0x30AF; + t['kukatakanahalfwidth'] = 0xFF78; + t['kvsquare'] = 0x33B8; + t['kwsquare'] = 0x33BE; + t['l'] = 0x006C; + t['labengali'] = 0x09B2; + t['lacute'] = 0x013A; + t['ladeva'] = 0x0932; + t['lagujarati'] = 0x0AB2; + t['lagurmukhi'] = 0x0A32; + t['lakkhangyaothai'] = 0x0E45; + t['lamaleffinalarabic'] = 0xFEFC; + t['lamalefhamzaabovefinalarabic'] = 0xFEF8; + t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7; + t['lamalefhamzabelowfinalarabic'] = 0xFEFA; + t['lamalefhamzabelowisolatedarabic'] = 0xFEF9; + t['lamalefisolatedarabic'] = 0xFEFB; + t['lamalefmaddaabovefinalarabic'] = 0xFEF6; + t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5; + t['lamarabic'] = 0x0644; + t['lambda'] = 0x03BB; + t['lambdastroke'] = 0x019B; + t['lamed'] = 0x05DC; + t['lameddagesh'] = 0xFB3C; + t['lameddageshhebrew'] = 0xFB3C; + t['lamedhebrew'] = 0x05DC; + t['lamfinalarabic'] = 0xFEDE; + t['lamhahinitialarabic'] = 0xFCCA; + t['laminitialarabic'] = 0xFEDF; + t['lamjeeminitialarabic'] = 0xFCC9; + t['lamkhahinitialarabic'] = 0xFCCB; + t['lamlamhehisolatedarabic'] = 0xFDF2; + t['lammedialarabic'] = 0xFEE0; + t['lammeemhahinitialarabic'] = 0xFD88; + t['lammeeminitialarabic'] = 0xFCCC; + t['largecircle'] = 0x25EF; + t['lbar'] = 0x019A; + t['lbelt'] = 0x026C; + t['lbopomofo'] = 0x310C; + t['lcaron'] = 0x013E; + t['lcedilla'] = 0x013C; + t['lcircle'] = 0x24DB; + t['lcircumflexbelow'] = 0x1E3D; + t['lcommaaccent'] = 0x013C; + t['ldot'] = 0x0140; + t['ldotaccent'] = 0x0140; + t['ldotbelow'] = 0x1E37; + t['ldotbelowmacron'] = 0x1E39; + t['leftangleabovecmb'] = 0x031A; + t['lefttackbelowcmb'] = 0x0318; + t['less'] = 0x003C; + t['lessequal'] = 0x2264; + t['lessequalorgreater'] = 0x22DA; + t['lessmonospace'] = 0xFF1C; + t['lessorequivalent'] = 0x2272; + t['lessorgreater'] = 0x2276; + t['lessoverequal'] = 0x2266; + t['lesssmall'] = 0xFE64; + t['lezh'] = 0x026E; + t['lfblock'] = 0x258C; + t['lhookretroflex'] = 0x026D; + t['lira'] = 0x20A4; + t['liwnarmenian'] = 0x056C; + t['lj'] = 0x01C9; + t['ljecyrillic'] = 0x0459; + t['ll'] = 0xF6C0; + t['lladeva'] = 0x0933; + t['llagujarati'] = 0x0AB3; + t['llinebelow'] = 0x1E3B; + t['llladeva'] = 0x0934; + t['llvocalicbengali'] = 0x09E1; + t['llvocalicdeva'] = 0x0961; + t['llvocalicvowelsignbengali'] = 0x09E3; + t['llvocalicvowelsigndeva'] = 0x0963; + t['lmiddletilde'] = 0x026B; + t['lmonospace'] = 0xFF4C; + t['lmsquare'] = 0x33D0; + t['lochulathai'] = 0x0E2C; + t['logicaland'] = 0x2227; + t['logicalnot'] = 0x00AC; + t['logicalnotreversed'] = 0x2310; + t['logicalor'] = 0x2228; + t['lolingthai'] = 0x0E25; + t['longs'] = 0x017F; + t['lowlinecenterline'] = 0xFE4E; + t['lowlinecmb'] = 0x0332; + t['lowlinedashed'] = 0xFE4D; + t['lozenge'] = 0x25CA; + t['lparen'] = 0x24A7; + t['lslash'] = 0x0142; + t['lsquare'] = 0x2113; + t['lsuperior'] = 0xF6EE; + t['ltshade'] = 0x2591; + t['luthai'] = 0x0E26; + t['lvocalicbengali'] = 0x098C; + t['lvocalicdeva'] = 0x090C; + t['lvocalicvowelsignbengali'] = 0x09E2; + t['lvocalicvowelsigndeva'] = 0x0962; + t['lxsquare'] = 0x33D3; + t['m'] = 0x006D; + t['mabengali'] = 0x09AE; + t['macron'] = 0x00AF; + t['macronbelowcmb'] = 0x0331; + t['macroncmb'] = 0x0304; + t['macronlowmod'] = 0x02CD; + t['macronmonospace'] = 0xFFE3; + t['macute'] = 0x1E3F; + t['madeva'] = 0x092E; + t['magujarati'] = 0x0AAE; + t['magurmukhi'] = 0x0A2E; + t['mahapakhhebrew'] = 0x05A4; + t['mahapakhlefthebrew'] = 0x05A4; + t['mahiragana'] = 0x307E; + t['maichattawalowleftthai'] = 0xF895; + t['maichattawalowrightthai'] = 0xF894; + t['maichattawathai'] = 0x0E4B; + t['maichattawaupperleftthai'] = 0xF893; + t['maieklowleftthai'] = 0xF88C; + t['maieklowrightthai'] = 0xF88B; + t['maiekthai'] = 0x0E48; + t['maiekupperleftthai'] = 0xF88A; + t['maihanakatleftthai'] = 0xF884; + t['maihanakatthai'] = 0x0E31; + t['maitaikhuleftthai'] = 0xF889; + t['maitaikhuthai'] = 0x0E47; + t['maitholowleftthai'] = 0xF88F; + t['maitholowrightthai'] = 0xF88E; + t['maithothai'] = 0x0E49; + t['maithoupperleftthai'] = 0xF88D; + t['maitrilowleftthai'] = 0xF892; + t['maitrilowrightthai'] = 0xF891; + t['maitrithai'] = 0x0E4A; + t['maitriupperleftthai'] = 0xF890; + t['maiyamokthai'] = 0x0E46; + t['makatakana'] = 0x30DE; + t['makatakanahalfwidth'] = 0xFF8F; + t['male'] = 0x2642; + t['mansyonsquare'] = 0x3347; + t['maqafhebrew'] = 0x05BE; + t['mars'] = 0x2642; + t['masoracirclehebrew'] = 0x05AF; + t['masquare'] = 0x3383; + t['mbopomofo'] = 0x3107; + t['mbsquare'] = 0x33D4; + t['mcircle'] = 0x24DC; + t['mcubedsquare'] = 0x33A5; + t['mdotaccent'] = 0x1E41; + t['mdotbelow'] = 0x1E43; + t['meemarabic'] = 0x0645; + t['meemfinalarabic'] = 0xFEE2; + t['meeminitialarabic'] = 0xFEE3; + t['meemmedialarabic'] = 0xFEE4; + t['meemmeeminitialarabic'] = 0xFCD1; + t['meemmeemisolatedarabic'] = 0xFC48; + t['meetorusquare'] = 0x334D; + t['mehiragana'] = 0x3081; + t['meizierasquare'] = 0x337E; + t['mekatakana'] = 0x30E1; + t['mekatakanahalfwidth'] = 0xFF92; + t['mem'] = 0x05DE; + t['memdagesh'] = 0xFB3E; + t['memdageshhebrew'] = 0xFB3E; + t['memhebrew'] = 0x05DE; + t['menarmenian'] = 0x0574; + t['merkhahebrew'] = 0x05A5; + t['merkhakefulahebrew'] = 0x05A6; + t['merkhakefulalefthebrew'] = 0x05A6; + t['merkhalefthebrew'] = 0x05A5; + t['mhook'] = 0x0271; + t['mhzsquare'] = 0x3392; + t['middledotkatakanahalfwidth'] = 0xFF65; + t['middot'] = 0x00B7; + t['mieumacirclekorean'] = 0x3272; + t['mieumaparenkorean'] = 0x3212; + t['mieumcirclekorean'] = 0x3264; + t['mieumkorean'] = 0x3141; + t['mieumpansioskorean'] = 0x3170; + t['mieumparenkorean'] = 0x3204; + t['mieumpieupkorean'] = 0x316E; + t['mieumsioskorean'] = 0x316F; + t['mihiragana'] = 0x307F; + t['mikatakana'] = 0x30DF; + t['mikatakanahalfwidth'] = 0xFF90; + t['minus'] = 0x2212; + t['minusbelowcmb'] = 0x0320; + t['minuscircle'] = 0x2296; + t['minusmod'] = 0x02D7; + t['minusplus'] = 0x2213; + t['minute'] = 0x2032; + t['miribaarusquare'] = 0x334A; + t['mirisquare'] = 0x3349; + t['mlonglegturned'] = 0x0270; + t['mlsquare'] = 0x3396; + t['mmcubedsquare'] = 0x33A3; + t['mmonospace'] = 0xFF4D; + t['mmsquaredsquare'] = 0x339F; + t['mohiragana'] = 0x3082; + t['mohmsquare'] = 0x33C1; + t['mokatakana'] = 0x30E2; + t['mokatakanahalfwidth'] = 0xFF93; + t['molsquare'] = 0x33D6; + t['momathai'] = 0x0E21; + t['moverssquare'] = 0x33A7; + t['moverssquaredsquare'] = 0x33A8; + t['mparen'] = 0x24A8; + t['mpasquare'] = 0x33AB; + t['mssquare'] = 0x33B3; + t['msuperior'] = 0xF6EF; + t['mturned'] = 0x026F; + t['mu'] = 0x00B5; + t['mu1'] = 0x00B5; + t['muasquare'] = 0x3382; + t['muchgreater'] = 0x226B; + t['muchless'] = 0x226A; + t['mufsquare'] = 0x338C; + t['mugreek'] = 0x03BC; + t['mugsquare'] = 0x338D; + t['muhiragana'] = 0x3080; + t['mukatakana'] = 0x30E0; + t['mukatakanahalfwidth'] = 0xFF91; + t['mulsquare'] = 0x3395; + t['multiply'] = 0x00D7; + t['mumsquare'] = 0x339B; + t['munahhebrew'] = 0x05A3; + t['munahlefthebrew'] = 0x05A3; + t['musicalnote'] = 0x266A; + t['musicalnotedbl'] = 0x266B; + t['musicflatsign'] = 0x266D; + t['musicsharpsign'] = 0x266F; + t['mussquare'] = 0x33B2; + t['muvsquare'] = 0x33B6; + t['muwsquare'] = 0x33BC; + t['mvmegasquare'] = 0x33B9; + t['mvsquare'] = 0x33B7; + t['mwmegasquare'] = 0x33BF; + t['mwsquare'] = 0x33BD; + t['n'] = 0x006E; + t['nabengali'] = 0x09A8; + t['nabla'] = 0x2207; + t['nacute'] = 0x0144; + t['nadeva'] = 0x0928; + t['nagujarati'] = 0x0AA8; + t['nagurmukhi'] = 0x0A28; + t['nahiragana'] = 0x306A; + t['nakatakana'] = 0x30CA; + t['nakatakanahalfwidth'] = 0xFF85; + t['napostrophe'] = 0x0149; + t['nasquare'] = 0x3381; + t['nbopomofo'] = 0x310B; + t['nbspace'] = 0x00A0; + t['ncaron'] = 0x0148; + t['ncedilla'] = 0x0146; + t['ncircle'] = 0x24DD; + t['ncircumflexbelow'] = 0x1E4B; + t['ncommaaccent'] = 0x0146; + t['ndotaccent'] = 0x1E45; + t['ndotbelow'] = 0x1E47; + t['nehiragana'] = 0x306D; + t['nekatakana'] = 0x30CD; + t['nekatakanahalfwidth'] = 0xFF88; + t['newsheqelsign'] = 0x20AA; + t['nfsquare'] = 0x338B; + t['ngabengali'] = 0x0999; + t['ngadeva'] = 0x0919; + t['ngagujarati'] = 0x0A99; + t['ngagurmukhi'] = 0x0A19; + t['ngonguthai'] = 0x0E07; + t['nhiragana'] = 0x3093; + t['nhookleft'] = 0x0272; + t['nhookretroflex'] = 0x0273; + t['nieunacirclekorean'] = 0x326F; + t['nieunaparenkorean'] = 0x320F; + t['nieuncieuckorean'] = 0x3135; + t['nieuncirclekorean'] = 0x3261; + t['nieunhieuhkorean'] = 0x3136; + t['nieunkorean'] = 0x3134; + t['nieunpansioskorean'] = 0x3168; + t['nieunparenkorean'] = 0x3201; + t['nieunsioskorean'] = 0x3167; + t['nieuntikeutkorean'] = 0x3166; + t['nihiragana'] = 0x306B; + t['nikatakana'] = 0x30CB; + t['nikatakanahalfwidth'] = 0xFF86; + t['nikhahitleftthai'] = 0xF899; + t['nikhahitthai'] = 0x0E4D; + t['nine'] = 0x0039; + t['ninearabic'] = 0x0669; + t['ninebengali'] = 0x09EF; + t['ninecircle'] = 0x2468; + t['ninecircleinversesansserif'] = 0x2792; + t['ninedeva'] = 0x096F; + t['ninegujarati'] = 0x0AEF; + t['ninegurmukhi'] = 0x0A6F; + t['ninehackarabic'] = 0x0669; + t['ninehangzhou'] = 0x3029; + t['nineideographicparen'] = 0x3228; + t['nineinferior'] = 0x2089; + t['ninemonospace'] = 0xFF19; + t['nineoldstyle'] = 0xF739; + t['nineparen'] = 0x247C; + t['nineperiod'] = 0x2490; + t['ninepersian'] = 0x06F9; + t['nineroman'] = 0x2178; + t['ninesuperior'] = 0x2079; + t['nineteencircle'] = 0x2472; + t['nineteenparen'] = 0x2486; + t['nineteenperiod'] = 0x249A; + t['ninethai'] = 0x0E59; + t['nj'] = 0x01CC; + t['njecyrillic'] = 0x045A; + t['nkatakana'] = 0x30F3; + t['nkatakanahalfwidth'] = 0xFF9D; + t['nlegrightlong'] = 0x019E; + t['nlinebelow'] = 0x1E49; + t['nmonospace'] = 0xFF4E; + t['nmsquare'] = 0x339A; + t['nnabengali'] = 0x09A3; + t['nnadeva'] = 0x0923; + t['nnagujarati'] = 0x0AA3; + t['nnagurmukhi'] = 0x0A23; + t['nnnadeva'] = 0x0929; + t['nohiragana'] = 0x306E; + t['nokatakana'] = 0x30CE; + t['nokatakanahalfwidth'] = 0xFF89; + t['nonbreakingspace'] = 0x00A0; + t['nonenthai'] = 0x0E13; + t['nonuthai'] = 0x0E19; + t['noonarabic'] = 0x0646; + t['noonfinalarabic'] = 0xFEE6; + t['noonghunnaarabic'] = 0x06BA; + t['noonghunnafinalarabic'] = 0xFB9F; + t['nooninitialarabic'] = 0xFEE7; + t['noonjeeminitialarabic'] = 0xFCD2; + t['noonjeemisolatedarabic'] = 0xFC4B; + t['noonmedialarabic'] = 0xFEE8; + t['noonmeeminitialarabic'] = 0xFCD5; + t['noonmeemisolatedarabic'] = 0xFC4E; + t['noonnoonfinalarabic'] = 0xFC8D; + t['notcontains'] = 0x220C; + t['notelement'] = 0x2209; + t['notelementof'] = 0x2209; + t['notequal'] = 0x2260; + t['notgreater'] = 0x226F; + t['notgreaternorequal'] = 0x2271; + t['notgreaternorless'] = 0x2279; + t['notidentical'] = 0x2262; + t['notless'] = 0x226E; + t['notlessnorequal'] = 0x2270; + t['notparallel'] = 0x2226; + t['notprecedes'] = 0x2280; + t['notsubset'] = 0x2284; + t['notsucceeds'] = 0x2281; + t['notsuperset'] = 0x2285; + t['nowarmenian'] = 0x0576; + t['nparen'] = 0x24A9; + t['nssquare'] = 0x33B1; + t['nsuperior'] = 0x207F; + t['ntilde'] = 0x00F1; + t['nu'] = 0x03BD; + t['nuhiragana'] = 0x306C; + t['nukatakana'] = 0x30CC; + t['nukatakanahalfwidth'] = 0xFF87; + t['nuktabengali'] = 0x09BC; + t['nuktadeva'] = 0x093C; + t['nuktagujarati'] = 0x0ABC; + t['nuktagurmukhi'] = 0x0A3C; + t['numbersign'] = 0x0023; + t['numbersignmonospace'] = 0xFF03; + t['numbersignsmall'] = 0xFE5F; + t['numeralsigngreek'] = 0x0374; + t['numeralsignlowergreek'] = 0x0375; + t['numero'] = 0x2116; + t['nun'] = 0x05E0; + t['nundagesh'] = 0xFB40; + t['nundageshhebrew'] = 0xFB40; + t['nunhebrew'] = 0x05E0; + t['nvsquare'] = 0x33B5; + t['nwsquare'] = 0x33BB; + t['nyabengali'] = 0x099E; + t['nyadeva'] = 0x091E; + t['nyagujarati'] = 0x0A9E; + t['nyagurmukhi'] = 0x0A1E; + t['o'] = 0x006F; + t['oacute'] = 0x00F3; + t['oangthai'] = 0x0E2D; + t['obarred'] = 0x0275; + t['obarredcyrillic'] = 0x04E9; + t['obarreddieresiscyrillic'] = 0x04EB; + t['obengali'] = 0x0993; + t['obopomofo'] = 0x311B; + t['obreve'] = 0x014F; + t['ocandradeva'] = 0x0911; + t['ocandragujarati'] = 0x0A91; + t['ocandravowelsigndeva'] = 0x0949; + t['ocandravowelsigngujarati'] = 0x0AC9; + t['ocaron'] = 0x01D2; + t['ocircle'] = 0x24DE; + t['ocircumflex'] = 0x00F4; + t['ocircumflexacute'] = 0x1ED1; + t['ocircumflexdotbelow'] = 0x1ED9; + t['ocircumflexgrave'] = 0x1ED3; + t['ocircumflexhookabove'] = 0x1ED5; + t['ocircumflextilde'] = 0x1ED7; + t['ocyrillic'] = 0x043E; + t['odblacute'] = 0x0151; + t['odblgrave'] = 0x020D; + t['odeva'] = 0x0913; + t['odieresis'] = 0x00F6; + t['odieresiscyrillic'] = 0x04E7; + t['odotbelow'] = 0x1ECD; + t['oe'] = 0x0153; + t['oekorean'] = 0x315A; + t['ogonek'] = 0x02DB; + t['ogonekcmb'] = 0x0328; + t['ograve'] = 0x00F2; + t['ogujarati'] = 0x0A93; + t['oharmenian'] = 0x0585; + t['ohiragana'] = 0x304A; + t['ohookabove'] = 0x1ECF; + t['ohorn'] = 0x01A1; + t['ohornacute'] = 0x1EDB; + t['ohorndotbelow'] = 0x1EE3; + t['ohorngrave'] = 0x1EDD; + t['ohornhookabove'] = 0x1EDF; + t['ohorntilde'] = 0x1EE1; + t['ohungarumlaut'] = 0x0151; + t['oi'] = 0x01A3; + t['oinvertedbreve'] = 0x020F; + t['okatakana'] = 0x30AA; + t['okatakanahalfwidth'] = 0xFF75; + t['okorean'] = 0x3157; + t['olehebrew'] = 0x05AB; + t['omacron'] = 0x014D; + t['omacronacute'] = 0x1E53; + t['omacrongrave'] = 0x1E51; + t['omdeva'] = 0x0950; + t['omega'] = 0x03C9; + t['omega1'] = 0x03D6; + t['omegacyrillic'] = 0x0461; + t['omegalatinclosed'] = 0x0277; + t['omegaroundcyrillic'] = 0x047B; + t['omegatitlocyrillic'] = 0x047D; + t['omegatonos'] = 0x03CE; + t['omgujarati'] = 0x0AD0; + t['omicron'] = 0x03BF; + t['omicrontonos'] = 0x03CC; + t['omonospace'] = 0xFF4F; + t['one'] = 0x0031; + t['onearabic'] = 0x0661; + t['onebengali'] = 0x09E7; + t['onecircle'] = 0x2460; + t['onecircleinversesansserif'] = 0x278A; + t['onedeva'] = 0x0967; + t['onedotenleader'] = 0x2024; + t['oneeighth'] = 0x215B; + t['onefitted'] = 0xF6DC; + t['onegujarati'] = 0x0AE7; + t['onegurmukhi'] = 0x0A67; + t['onehackarabic'] = 0x0661; + t['onehalf'] = 0x00BD; + t['onehangzhou'] = 0x3021; + t['oneideographicparen'] = 0x3220; + t['oneinferior'] = 0x2081; + t['onemonospace'] = 0xFF11; + t['onenumeratorbengali'] = 0x09F4; + t['oneoldstyle'] = 0xF731; + t['oneparen'] = 0x2474; + t['oneperiod'] = 0x2488; + t['onepersian'] = 0x06F1; + t['onequarter'] = 0x00BC; + t['oneroman'] = 0x2170; + t['onesuperior'] = 0x00B9; + t['onethai'] = 0x0E51; + t['onethird'] = 0x2153; + t['oogonek'] = 0x01EB; + t['oogonekmacron'] = 0x01ED; + t['oogurmukhi'] = 0x0A13; + t['oomatragurmukhi'] = 0x0A4B; + t['oopen'] = 0x0254; + t['oparen'] = 0x24AA; + t['openbullet'] = 0x25E6; + t['option'] = 0x2325; + t['ordfeminine'] = 0x00AA; + t['ordmasculine'] = 0x00BA; + t['orthogonal'] = 0x221F; + t['oshortdeva'] = 0x0912; + t['oshortvowelsigndeva'] = 0x094A; + t['oslash'] = 0x00F8; + t['oslashacute'] = 0x01FF; + t['osmallhiragana'] = 0x3049; + t['osmallkatakana'] = 0x30A9; + t['osmallkatakanahalfwidth'] = 0xFF6B; + t['ostrokeacute'] = 0x01FF; + t['osuperior'] = 0xF6F0; + t['otcyrillic'] = 0x047F; + t['otilde'] = 0x00F5; + t['otildeacute'] = 0x1E4D; + t['otildedieresis'] = 0x1E4F; + t['oubopomofo'] = 0x3121; + t['overline'] = 0x203E; + t['overlinecenterline'] = 0xFE4A; + t['overlinecmb'] = 0x0305; + t['overlinedashed'] = 0xFE49; + t['overlinedblwavy'] = 0xFE4C; + t['overlinewavy'] = 0xFE4B; + t['overscore'] = 0x00AF; + t['ovowelsignbengali'] = 0x09CB; + t['ovowelsigndeva'] = 0x094B; + t['ovowelsigngujarati'] = 0x0ACB; + t['p'] = 0x0070; + t['paampssquare'] = 0x3380; + t['paasentosquare'] = 0x332B; + t['pabengali'] = 0x09AA; + t['pacute'] = 0x1E55; + t['padeva'] = 0x092A; + t['pagedown'] = 0x21DF; + t['pageup'] = 0x21DE; + t['pagujarati'] = 0x0AAA; + t['pagurmukhi'] = 0x0A2A; + t['pahiragana'] = 0x3071; + t['paiyannoithai'] = 0x0E2F; + t['pakatakana'] = 0x30D1; + t['palatalizationcyrilliccmb'] = 0x0484; + t['palochkacyrillic'] = 0x04C0; + t['pansioskorean'] = 0x317F; + t['paragraph'] = 0x00B6; + t['parallel'] = 0x2225; + t['parenleft'] = 0x0028; + t['parenleftaltonearabic'] = 0xFD3E; + t['parenleftbt'] = 0xF8ED; + t['parenleftex'] = 0xF8EC; + t['parenleftinferior'] = 0x208D; + t['parenleftmonospace'] = 0xFF08; + t['parenleftsmall'] = 0xFE59; + t['parenleftsuperior'] = 0x207D; + t['parenlefttp'] = 0xF8EB; + t['parenleftvertical'] = 0xFE35; + t['parenright'] = 0x0029; + t['parenrightaltonearabic'] = 0xFD3F; + t['parenrightbt'] = 0xF8F8; + t['parenrightex'] = 0xF8F7; + t['parenrightinferior'] = 0x208E; + t['parenrightmonospace'] = 0xFF09; + t['parenrightsmall'] = 0xFE5A; + t['parenrightsuperior'] = 0x207E; + t['parenrighttp'] = 0xF8F6; + t['parenrightvertical'] = 0xFE36; + t['partialdiff'] = 0x2202; + t['paseqhebrew'] = 0x05C0; + t['pashtahebrew'] = 0x0599; + t['pasquare'] = 0x33A9; + t['patah'] = 0x05B7; + t['patah11'] = 0x05B7; + t['patah1d'] = 0x05B7; + t['patah2a'] = 0x05B7; + t['patahhebrew'] = 0x05B7; + t['patahnarrowhebrew'] = 0x05B7; + t['patahquarterhebrew'] = 0x05B7; + t['patahwidehebrew'] = 0x05B7; + t['pazerhebrew'] = 0x05A1; + t['pbopomofo'] = 0x3106; + t['pcircle'] = 0x24DF; + t['pdotaccent'] = 0x1E57; + t['pe'] = 0x05E4; + t['pecyrillic'] = 0x043F; + t['pedagesh'] = 0xFB44; + t['pedageshhebrew'] = 0xFB44; + t['peezisquare'] = 0x333B; + t['pefinaldageshhebrew'] = 0xFB43; + t['peharabic'] = 0x067E; + t['peharmenian'] = 0x057A; + t['pehebrew'] = 0x05E4; + t['pehfinalarabic'] = 0xFB57; + t['pehinitialarabic'] = 0xFB58; + t['pehiragana'] = 0x307A; + t['pehmedialarabic'] = 0xFB59; + t['pekatakana'] = 0x30DA; + t['pemiddlehookcyrillic'] = 0x04A7; + t['perafehebrew'] = 0xFB4E; + t['percent'] = 0x0025; + t['percentarabic'] = 0x066A; + t['percentmonospace'] = 0xFF05; + t['percentsmall'] = 0xFE6A; + t['period'] = 0x002E; + t['periodarmenian'] = 0x0589; + t['periodcentered'] = 0x00B7; + t['periodhalfwidth'] = 0xFF61; + t['periodinferior'] = 0xF6E7; + t['periodmonospace'] = 0xFF0E; + t['periodsmall'] = 0xFE52; + t['periodsuperior'] = 0xF6E8; + t['perispomenigreekcmb'] = 0x0342; + t['perpendicular'] = 0x22A5; + t['perthousand'] = 0x2030; + t['peseta'] = 0x20A7; + t['pfsquare'] = 0x338A; + t['phabengali'] = 0x09AB; + t['phadeva'] = 0x092B; + t['phagujarati'] = 0x0AAB; + t['phagurmukhi'] = 0x0A2B; + t['phi'] = 0x03C6; + t['phi1'] = 0x03D5; + t['phieuphacirclekorean'] = 0x327A; + t['phieuphaparenkorean'] = 0x321A; + t['phieuphcirclekorean'] = 0x326C; + t['phieuphkorean'] = 0x314D; + t['phieuphparenkorean'] = 0x320C; + t['philatin'] = 0x0278; + t['phinthuthai'] = 0x0E3A; + t['phisymbolgreek'] = 0x03D5; + t['phook'] = 0x01A5; + t['phophanthai'] = 0x0E1E; + t['phophungthai'] = 0x0E1C; + t['phosamphaothai'] = 0x0E20; + t['pi'] = 0x03C0; + t['pieupacirclekorean'] = 0x3273; + t['pieupaparenkorean'] = 0x3213; + t['pieupcieuckorean'] = 0x3176; + t['pieupcirclekorean'] = 0x3265; + t['pieupkiyeokkorean'] = 0x3172; + t['pieupkorean'] = 0x3142; + t['pieupparenkorean'] = 0x3205; + t['pieupsioskiyeokkorean'] = 0x3174; + t['pieupsioskorean'] = 0x3144; + t['pieupsiostikeutkorean'] = 0x3175; + t['pieupthieuthkorean'] = 0x3177; + t['pieuptikeutkorean'] = 0x3173; + t['pihiragana'] = 0x3074; + t['pikatakana'] = 0x30D4; + t['pisymbolgreek'] = 0x03D6; + t['piwrarmenian'] = 0x0583; + t['plus'] = 0x002B; + t['plusbelowcmb'] = 0x031F; + t['pluscircle'] = 0x2295; + t['plusminus'] = 0x00B1; + t['plusmod'] = 0x02D6; + t['plusmonospace'] = 0xFF0B; + t['plussmall'] = 0xFE62; + t['plussuperior'] = 0x207A; + t['pmonospace'] = 0xFF50; + t['pmsquare'] = 0x33D8; + t['pohiragana'] = 0x307D; + t['pointingindexdownwhite'] = 0x261F; + t['pointingindexleftwhite'] = 0x261C; + t['pointingindexrightwhite'] = 0x261E; + t['pointingindexupwhite'] = 0x261D; + t['pokatakana'] = 0x30DD; + t['poplathai'] = 0x0E1B; + t['postalmark'] = 0x3012; + t['postalmarkface'] = 0x3020; + t['pparen'] = 0x24AB; + t['precedes'] = 0x227A; + t['prescription'] = 0x211E; + t['primemod'] = 0x02B9; + t['primereversed'] = 0x2035; + t['product'] = 0x220F; + t['projective'] = 0x2305; + t['prolongedkana'] = 0x30FC; + t['propellor'] = 0x2318; + t['propersubset'] = 0x2282; + t['propersuperset'] = 0x2283; + t['proportion'] = 0x2237; + t['proportional'] = 0x221D; + t['psi'] = 0x03C8; + t['psicyrillic'] = 0x0471; + t['psilipneumatacyrilliccmb'] = 0x0486; + t['pssquare'] = 0x33B0; + t['puhiragana'] = 0x3077; + t['pukatakana'] = 0x30D7; + t['pvsquare'] = 0x33B4; + t['pwsquare'] = 0x33BA; + t['q'] = 0x0071; + t['qadeva'] = 0x0958; + t['qadmahebrew'] = 0x05A8; + t['qafarabic'] = 0x0642; + t['qaffinalarabic'] = 0xFED6; + t['qafinitialarabic'] = 0xFED7; + t['qafmedialarabic'] = 0xFED8; + t['qamats'] = 0x05B8; + t['qamats10'] = 0x05B8; + t['qamats1a'] = 0x05B8; + t['qamats1c'] = 0x05B8; + t['qamats27'] = 0x05B8; + t['qamats29'] = 0x05B8; + t['qamats33'] = 0x05B8; + t['qamatsde'] = 0x05B8; + t['qamatshebrew'] = 0x05B8; + t['qamatsnarrowhebrew'] = 0x05B8; + t['qamatsqatanhebrew'] = 0x05B8; + t['qamatsqatannarrowhebrew'] = 0x05B8; + t['qamatsqatanquarterhebrew'] = 0x05B8; + t['qamatsqatanwidehebrew'] = 0x05B8; + t['qamatsquarterhebrew'] = 0x05B8; + t['qamatswidehebrew'] = 0x05B8; + t['qarneyparahebrew'] = 0x059F; + t['qbopomofo'] = 0x3111; + t['qcircle'] = 0x24E0; + t['qhook'] = 0x02A0; + t['qmonospace'] = 0xFF51; + t['qof'] = 0x05E7; + t['qofdagesh'] = 0xFB47; + t['qofdageshhebrew'] = 0xFB47; + t['qofhebrew'] = 0x05E7; + t['qparen'] = 0x24AC; + t['quarternote'] = 0x2669; + t['qubuts'] = 0x05BB; + t['qubuts18'] = 0x05BB; + t['qubuts25'] = 0x05BB; + t['qubuts31'] = 0x05BB; + t['qubutshebrew'] = 0x05BB; + t['qubutsnarrowhebrew'] = 0x05BB; + t['qubutsquarterhebrew'] = 0x05BB; + t['qubutswidehebrew'] = 0x05BB; + t['question'] = 0x003F; + t['questionarabic'] = 0x061F; + t['questionarmenian'] = 0x055E; + t['questiondown'] = 0x00BF; + t['questiondownsmall'] = 0xF7BF; + t['questiongreek'] = 0x037E; + t['questionmonospace'] = 0xFF1F; + t['questionsmall'] = 0xF73F; + t['quotedbl'] = 0x0022; + t['quotedblbase'] = 0x201E; + t['quotedblleft'] = 0x201C; + t['quotedblmonospace'] = 0xFF02; + t['quotedblprime'] = 0x301E; + t['quotedblprimereversed'] = 0x301D; + t['quotedblright'] = 0x201D; + t['quoteleft'] = 0x2018; + t['quoteleftreversed'] = 0x201B; + t['quotereversed'] = 0x201B; + t['quoteright'] = 0x2019; + t['quoterightn'] = 0x0149; + t['quotesinglbase'] = 0x201A; + t['quotesingle'] = 0x0027; + t['quotesinglemonospace'] = 0xFF07; + t['r'] = 0x0072; + t['raarmenian'] = 0x057C; + t['rabengali'] = 0x09B0; + t['racute'] = 0x0155; + t['radeva'] = 0x0930; + t['radical'] = 0x221A; + t['radicalex'] = 0xF8E5; + t['radoverssquare'] = 0x33AE; + t['radoverssquaredsquare'] = 0x33AF; + t['radsquare'] = 0x33AD; + t['rafe'] = 0x05BF; + t['rafehebrew'] = 0x05BF; + t['ragujarati'] = 0x0AB0; + t['ragurmukhi'] = 0x0A30; + t['rahiragana'] = 0x3089; + t['rakatakana'] = 0x30E9; + t['rakatakanahalfwidth'] = 0xFF97; + t['ralowerdiagonalbengali'] = 0x09F1; + t['ramiddlediagonalbengali'] = 0x09F0; + t['ramshorn'] = 0x0264; + t['ratio'] = 0x2236; + t['rbopomofo'] = 0x3116; + t['rcaron'] = 0x0159; + t['rcedilla'] = 0x0157; + t['rcircle'] = 0x24E1; + t['rcommaaccent'] = 0x0157; + t['rdblgrave'] = 0x0211; + t['rdotaccent'] = 0x1E59; + t['rdotbelow'] = 0x1E5B; + t['rdotbelowmacron'] = 0x1E5D; + t['referencemark'] = 0x203B; + t['reflexsubset'] = 0x2286; + t['reflexsuperset'] = 0x2287; + t['registered'] = 0x00AE; + t['registersans'] = 0xF8E8; + t['registerserif'] = 0xF6DA; + t['reharabic'] = 0x0631; + t['reharmenian'] = 0x0580; + t['rehfinalarabic'] = 0xFEAE; + t['rehiragana'] = 0x308C; + t['rekatakana'] = 0x30EC; + t['rekatakanahalfwidth'] = 0xFF9A; + t['resh'] = 0x05E8; + t['reshdageshhebrew'] = 0xFB48; + t['reshhebrew'] = 0x05E8; + t['reversedtilde'] = 0x223D; + t['reviahebrew'] = 0x0597; + t['reviamugrashhebrew'] = 0x0597; + t['revlogicalnot'] = 0x2310; + t['rfishhook'] = 0x027E; + t['rfishhookreversed'] = 0x027F; + t['rhabengali'] = 0x09DD; + t['rhadeva'] = 0x095D; + t['rho'] = 0x03C1; + t['rhook'] = 0x027D; + t['rhookturned'] = 0x027B; + t['rhookturnedsuperior'] = 0x02B5; + t['rhosymbolgreek'] = 0x03F1; + t['rhotichookmod'] = 0x02DE; + t['rieulacirclekorean'] = 0x3271; + t['rieulaparenkorean'] = 0x3211; + t['rieulcirclekorean'] = 0x3263; + t['rieulhieuhkorean'] = 0x3140; + t['rieulkiyeokkorean'] = 0x313A; + t['rieulkiyeoksioskorean'] = 0x3169; + t['rieulkorean'] = 0x3139; + t['rieulmieumkorean'] = 0x313B; + t['rieulpansioskorean'] = 0x316C; + t['rieulparenkorean'] = 0x3203; + t['rieulphieuphkorean'] = 0x313F; + t['rieulpieupkorean'] = 0x313C; + t['rieulpieupsioskorean'] = 0x316B; + t['rieulsioskorean'] = 0x313D; + t['rieulthieuthkorean'] = 0x313E; + t['rieultikeutkorean'] = 0x316A; + t['rieulyeorinhieuhkorean'] = 0x316D; + t['rightangle'] = 0x221F; + t['righttackbelowcmb'] = 0x0319; + t['righttriangle'] = 0x22BF; + t['rihiragana'] = 0x308A; + t['rikatakana'] = 0x30EA; + t['rikatakanahalfwidth'] = 0xFF98; + t['ring'] = 0x02DA; + t['ringbelowcmb'] = 0x0325; + t['ringcmb'] = 0x030A; + t['ringhalfleft'] = 0x02BF; + t['ringhalfleftarmenian'] = 0x0559; + t['ringhalfleftbelowcmb'] = 0x031C; + t['ringhalfleftcentered'] = 0x02D3; + t['ringhalfright'] = 0x02BE; + t['ringhalfrightbelowcmb'] = 0x0339; + t['ringhalfrightcentered'] = 0x02D2; + t['rinvertedbreve'] = 0x0213; + t['rittorusquare'] = 0x3351; + t['rlinebelow'] = 0x1E5F; + t['rlongleg'] = 0x027C; + t['rlonglegturned'] = 0x027A; + t['rmonospace'] = 0xFF52; + t['rohiragana'] = 0x308D; + t['rokatakana'] = 0x30ED; + t['rokatakanahalfwidth'] = 0xFF9B; + t['roruathai'] = 0x0E23; + t['rparen'] = 0x24AD; + t['rrabengali'] = 0x09DC; + t['rradeva'] = 0x0931; + t['rragurmukhi'] = 0x0A5C; + t['rreharabic'] = 0x0691; + t['rrehfinalarabic'] = 0xFB8D; + t['rrvocalicbengali'] = 0x09E0; + t['rrvocalicdeva'] = 0x0960; + t['rrvocalicgujarati'] = 0x0AE0; + t['rrvocalicvowelsignbengali'] = 0x09C4; + t['rrvocalicvowelsigndeva'] = 0x0944; + t['rrvocalicvowelsigngujarati'] = 0x0AC4; + t['rsuperior'] = 0xF6F1; + t['rtblock'] = 0x2590; + t['rturned'] = 0x0279; + t['rturnedsuperior'] = 0x02B4; + t['ruhiragana'] = 0x308B; + t['rukatakana'] = 0x30EB; + t['rukatakanahalfwidth'] = 0xFF99; + t['rupeemarkbengali'] = 0x09F2; + t['rupeesignbengali'] = 0x09F3; + t['rupiah'] = 0xF6DD; + t['ruthai'] = 0x0E24; + t['rvocalicbengali'] = 0x098B; + t['rvocalicdeva'] = 0x090B; + t['rvocalicgujarati'] = 0x0A8B; + t['rvocalicvowelsignbengali'] = 0x09C3; + t['rvocalicvowelsigndeva'] = 0x0943; + t['rvocalicvowelsigngujarati'] = 0x0AC3; + t['s'] = 0x0073; + t['sabengali'] = 0x09B8; + t['sacute'] = 0x015B; + t['sacutedotaccent'] = 0x1E65; + t['sadarabic'] = 0x0635; + t['sadeva'] = 0x0938; + t['sadfinalarabic'] = 0xFEBA; + t['sadinitialarabic'] = 0xFEBB; + t['sadmedialarabic'] = 0xFEBC; + t['sagujarati'] = 0x0AB8; + t['sagurmukhi'] = 0x0A38; + t['sahiragana'] = 0x3055; + t['sakatakana'] = 0x30B5; + t['sakatakanahalfwidth'] = 0xFF7B; + t['sallallahoualayhewasallamarabic'] = 0xFDFA; + t['samekh'] = 0x05E1; + t['samekhdagesh'] = 0xFB41; + t['samekhdageshhebrew'] = 0xFB41; + t['samekhhebrew'] = 0x05E1; + t['saraaathai'] = 0x0E32; + t['saraaethai'] = 0x0E41; + t['saraaimaimalaithai'] = 0x0E44; + t['saraaimaimuanthai'] = 0x0E43; + t['saraamthai'] = 0x0E33; + t['saraathai'] = 0x0E30; + t['saraethai'] = 0x0E40; + t['saraiileftthai'] = 0xF886; + t['saraiithai'] = 0x0E35; + t['saraileftthai'] = 0xF885; + t['saraithai'] = 0x0E34; + t['saraothai'] = 0x0E42; + t['saraueeleftthai'] = 0xF888; + t['saraueethai'] = 0x0E37; + t['saraueleftthai'] = 0xF887; + t['sarauethai'] = 0x0E36; + t['sarauthai'] = 0x0E38; + t['sarauuthai'] = 0x0E39; + t['sbopomofo'] = 0x3119; + t['scaron'] = 0x0161; + t['scarondotaccent'] = 0x1E67; + t['scedilla'] = 0x015F; + t['schwa'] = 0x0259; + t['schwacyrillic'] = 0x04D9; + t['schwadieresiscyrillic'] = 0x04DB; + t['schwahook'] = 0x025A; + t['scircle'] = 0x24E2; + t['scircumflex'] = 0x015D; + t['scommaaccent'] = 0x0219; + t['sdotaccent'] = 0x1E61; + t['sdotbelow'] = 0x1E63; + t['sdotbelowdotaccent'] = 0x1E69; + t['seagullbelowcmb'] = 0x033C; + t['second'] = 0x2033; + t['secondtonechinese'] = 0x02CA; + t['section'] = 0x00A7; + t['seenarabic'] = 0x0633; + t['seenfinalarabic'] = 0xFEB2; + t['seeninitialarabic'] = 0xFEB3; + t['seenmedialarabic'] = 0xFEB4; + t['segol'] = 0x05B6; + t['segol13'] = 0x05B6; + t['segol1f'] = 0x05B6; + t['segol2c'] = 0x05B6; + t['segolhebrew'] = 0x05B6; + t['segolnarrowhebrew'] = 0x05B6; + t['segolquarterhebrew'] = 0x05B6; + t['segoltahebrew'] = 0x0592; + t['segolwidehebrew'] = 0x05B6; + t['seharmenian'] = 0x057D; + t['sehiragana'] = 0x305B; + t['sekatakana'] = 0x30BB; + t['sekatakanahalfwidth'] = 0xFF7E; + t['semicolon'] = 0x003B; + t['semicolonarabic'] = 0x061B; + t['semicolonmonospace'] = 0xFF1B; + t['semicolonsmall'] = 0xFE54; + t['semivoicedmarkkana'] = 0x309C; + t['semivoicedmarkkanahalfwidth'] = 0xFF9F; + t['sentisquare'] = 0x3322; + t['sentosquare'] = 0x3323; + t['seven'] = 0x0037; + t['sevenarabic'] = 0x0667; + t['sevenbengali'] = 0x09ED; + t['sevencircle'] = 0x2466; + t['sevencircleinversesansserif'] = 0x2790; + t['sevendeva'] = 0x096D; + t['seveneighths'] = 0x215E; + t['sevengujarati'] = 0x0AED; + t['sevengurmukhi'] = 0x0A6D; + t['sevenhackarabic'] = 0x0667; + t['sevenhangzhou'] = 0x3027; + t['sevenideographicparen'] = 0x3226; + t['seveninferior'] = 0x2087; + t['sevenmonospace'] = 0xFF17; + t['sevenoldstyle'] = 0xF737; + t['sevenparen'] = 0x247A; + t['sevenperiod'] = 0x248E; + t['sevenpersian'] = 0x06F7; + t['sevenroman'] = 0x2176; + t['sevensuperior'] = 0x2077; + t['seventeencircle'] = 0x2470; + t['seventeenparen'] = 0x2484; + t['seventeenperiod'] = 0x2498; + t['seventhai'] = 0x0E57; + t['sfthyphen'] = 0x00AD; + t['shaarmenian'] = 0x0577; + t['shabengali'] = 0x09B6; + t['shacyrillic'] = 0x0448; + t['shaddaarabic'] = 0x0651; + t['shaddadammaarabic'] = 0xFC61; + t['shaddadammatanarabic'] = 0xFC5E; + t['shaddafathaarabic'] = 0xFC60; + t['shaddakasraarabic'] = 0xFC62; + t['shaddakasratanarabic'] = 0xFC5F; + t['shade'] = 0x2592; + t['shadedark'] = 0x2593; + t['shadelight'] = 0x2591; + t['shademedium'] = 0x2592; + t['shadeva'] = 0x0936; + t['shagujarati'] = 0x0AB6; + t['shagurmukhi'] = 0x0A36; + t['shalshelethebrew'] = 0x0593; + t['shbopomofo'] = 0x3115; + t['shchacyrillic'] = 0x0449; + t['sheenarabic'] = 0x0634; + t['sheenfinalarabic'] = 0xFEB6; + t['sheeninitialarabic'] = 0xFEB7; + t['sheenmedialarabic'] = 0xFEB8; + t['sheicoptic'] = 0x03E3; + t['sheqel'] = 0x20AA; + t['sheqelhebrew'] = 0x20AA; + t['sheva'] = 0x05B0; + t['sheva115'] = 0x05B0; + t['sheva15'] = 0x05B0; + t['sheva22'] = 0x05B0; + t['sheva2e'] = 0x05B0; + t['shevahebrew'] = 0x05B0; + t['shevanarrowhebrew'] = 0x05B0; + t['shevaquarterhebrew'] = 0x05B0; + t['shevawidehebrew'] = 0x05B0; + t['shhacyrillic'] = 0x04BB; + t['shimacoptic'] = 0x03ED; + t['shin'] = 0x05E9; + t['shindagesh'] = 0xFB49; + t['shindageshhebrew'] = 0xFB49; + t['shindageshshindot'] = 0xFB2C; + t['shindageshshindothebrew'] = 0xFB2C; + t['shindageshsindot'] = 0xFB2D; + t['shindageshsindothebrew'] = 0xFB2D; + t['shindothebrew'] = 0x05C1; + t['shinhebrew'] = 0x05E9; + t['shinshindot'] = 0xFB2A; + t['shinshindothebrew'] = 0xFB2A; + t['shinsindot'] = 0xFB2B; + t['shinsindothebrew'] = 0xFB2B; + t['shook'] = 0x0282; + t['sigma'] = 0x03C3; + t['sigma1'] = 0x03C2; + t['sigmafinal'] = 0x03C2; + t['sigmalunatesymbolgreek'] = 0x03F2; + t['sihiragana'] = 0x3057; + t['sikatakana'] = 0x30B7; + t['sikatakanahalfwidth'] = 0xFF7C; + t['siluqhebrew'] = 0x05BD; + t['siluqlefthebrew'] = 0x05BD; + t['similar'] = 0x223C; + t['sindothebrew'] = 0x05C2; + t['siosacirclekorean'] = 0x3274; + t['siosaparenkorean'] = 0x3214; + t['sioscieuckorean'] = 0x317E; + t['sioscirclekorean'] = 0x3266; + t['sioskiyeokkorean'] = 0x317A; + t['sioskorean'] = 0x3145; + t['siosnieunkorean'] = 0x317B; + t['siosparenkorean'] = 0x3206; + t['siospieupkorean'] = 0x317D; + t['siostikeutkorean'] = 0x317C; + t['six'] = 0x0036; + t['sixarabic'] = 0x0666; + t['sixbengali'] = 0x09EC; + t['sixcircle'] = 0x2465; + t['sixcircleinversesansserif'] = 0x278F; + t['sixdeva'] = 0x096C; + t['sixgujarati'] = 0x0AEC; + t['sixgurmukhi'] = 0x0A6C; + t['sixhackarabic'] = 0x0666; + t['sixhangzhou'] = 0x3026; + t['sixideographicparen'] = 0x3225; + t['sixinferior'] = 0x2086; + t['sixmonospace'] = 0xFF16; + t['sixoldstyle'] = 0xF736; + t['sixparen'] = 0x2479; + t['sixperiod'] = 0x248D; + t['sixpersian'] = 0x06F6; + t['sixroman'] = 0x2175; + t['sixsuperior'] = 0x2076; + t['sixteencircle'] = 0x246F; + t['sixteencurrencydenominatorbengali'] = 0x09F9; + t['sixteenparen'] = 0x2483; + t['sixteenperiod'] = 0x2497; + t['sixthai'] = 0x0E56; + t['slash'] = 0x002F; + t['slashmonospace'] = 0xFF0F; + t['slong'] = 0x017F; + t['slongdotaccent'] = 0x1E9B; + t['smileface'] = 0x263A; + t['smonospace'] = 0xFF53; + t['sofpasuqhebrew'] = 0x05C3; + t['softhyphen'] = 0x00AD; + t['softsigncyrillic'] = 0x044C; + t['sohiragana'] = 0x305D; + t['sokatakana'] = 0x30BD; + t['sokatakanahalfwidth'] = 0xFF7F; + t['soliduslongoverlaycmb'] = 0x0338; + t['solidusshortoverlaycmb'] = 0x0337; + t['sorusithai'] = 0x0E29; + t['sosalathai'] = 0x0E28; + t['sosothai'] = 0x0E0B; + t['sosuathai'] = 0x0E2A; + t['space'] = 0x0020; + t['spacehackarabic'] = 0x0020; + t['spade'] = 0x2660; + t['spadesuitblack'] = 0x2660; + t['spadesuitwhite'] = 0x2664; + t['sparen'] = 0x24AE; + t['squarebelowcmb'] = 0x033B; + t['squarecc'] = 0x33C4; + t['squarecm'] = 0x339D; + t['squarediagonalcrosshatchfill'] = 0x25A9; + t['squarehorizontalfill'] = 0x25A4; + t['squarekg'] = 0x338F; + t['squarekm'] = 0x339E; + t['squarekmcapital'] = 0x33CE; + t['squareln'] = 0x33D1; + t['squarelog'] = 0x33D2; + t['squaremg'] = 0x338E; + t['squaremil'] = 0x33D5; + t['squaremm'] = 0x339C; + t['squaremsquared'] = 0x33A1; + t['squareorthogonalcrosshatchfill'] = 0x25A6; + t['squareupperlefttolowerrightfill'] = 0x25A7; + t['squareupperrighttolowerleftfill'] = 0x25A8; + t['squareverticalfill'] = 0x25A5; + t['squarewhitewithsmallblack'] = 0x25A3; + t['srsquare'] = 0x33DB; + t['ssabengali'] = 0x09B7; + t['ssadeva'] = 0x0937; + t['ssagujarati'] = 0x0AB7; + t['ssangcieuckorean'] = 0x3149; + t['ssanghieuhkorean'] = 0x3185; + t['ssangieungkorean'] = 0x3180; + t['ssangkiyeokkorean'] = 0x3132; + t['ssangnieunkorean'] = 0x3165; + t['ssangpieupkorean'] = 0x3143; + t['ssangsioskorean'] = 0x3146; + t['ssangtikeutkorean'] = 0x3138; + t['ssuperior'] = 0xF6F2; + t['sterling'] = 0x00A3; + t['sterlingmonospace'] = 0xFFE1; + t['strokelongoverlaycmb'] = 0x0336; + t['strokeshortoverlaycmb'] = 0x0335; + t['subset'] = 0x2282; + t['subsetnotequal'] = 0x228A; + t['subsetorequal'] = 0x2286; + t['succeeds'] = 0x227B; + t['suchthat'] = 0x220B; + t['suhiragana'] = 0x3059; + t['sukatakana'] = 0x30B9; + t['sukatakanahalfwidth'] = 0xFF7D; + t['sukunarabic'] = 0x0652; + t['summation'] = 0x2211; + t['sun'] = 0x263C; + t['superset'] = 0x2283; + t['supersetnotequal'] = 0x228B; + t['supersetorequal'] = 0x2287; + t['svsquare'] = 0x33DC; + t['syouwaerasquare'] = 0x337C; + t['t'] = 0x0074; + t['tabengali'] = 0x09A4; + t['tackdown'] = 0x22A4; + t['tackleft'] = 0x22A3; + t['tadeva'] = 0x0924; + t['tagujarati'] = 0x0AA4; + t['tagurmukhi'] = 0x0A24; + t['taharabic'] = 0x0637; + t['tahfinalarabic'] = 0xFEC2; + t['tahinitialarabic'] = 0xFEC3; + t['tahiragana'] = 0x305F; + t['tahmedialarabic'] = 0xFEC4; + t['taisyouerasquare'] = 0x337D; + t['takatakana'] = 0x30BF; + t['takatakanahalfwidth'] = 0xFF80; + t['tatweelarabic'] = 0x0640; + t['tau'] = 0x03C4; + t['tav'] = 0x05EA; + t['tavdages'] = 0xFB4A; + t['tavdagesh'] = 0xFB4A; + t['tavdageshhebrew'] = 0xFB4A; + t['tavhebrew'] = 0x05EA; + t['tbar'] = 0x0167; + t['tbopomofo'] = 0x310A; + t['tcaron'] = 0x0165; + t['tccurl'] = 0x02A8; + t['tcedilla'] = 0x0163; + t['tcheharabic'] = 0x0686; + t['tchehfinalarabic'] = 0xFB7B; + t['tchehinitialarabic'] = 0xFB7C; + t['tchehmedialarabic'] = 0xFB7D; + t['tcircle'] = 0x24E3; + t['tcircumflexbelow'] = 0x1E71; + t['tcommaaccent'] = 0x0163; + t['tdieresis'] = 0x1E97; + t['tdotaccent'] = 0x1E6B; + t['tdotbelow'] = 0x1E6D; + t['tecyrillic'] = 0x0442; + t['tedescendercyrillic'] = 0x04AD; + t['teharabic'] = 0x062A; + t['tehfinalarabic'] = 0xFE96; + t['tehhahinitialarabic'] = 0xFCA2; + t['tehhahisolatedarabic'] = 0xFC0C; + t['tehinitialarabic'] = 0xFE97; + t['tehiragana'] = 0x3066; + t['tehjeeminitialarabic'] = 0xFCA1; + t['tehjeemisolatedarabic'] = 0xFC0B; + t['tehmarbutaarabic'] = 0x0629; + t['tehmarbutafinalarabic'] = 0xFE94; + t['tehmedialarabic'] = 0xFE98; + t['tehmeeminitialarabic'] = 0xFCA4; + t['tehmeemisolatedarabic'] = 0xFC0E; + t['tehnoonfinalarabic'] = 0xFC73; + t['tekatakana'] = 0x30C6; + t['tekatakanahalfwidth'] = 0xFF83; + t['telephone'] = 0x2121; + t['telephoneblack'] = 0x260E; + t['telishagedolahebrew'] = 0x05A0; + t['telishaqetanahebrew'] = 0x05A9; + t['tencircle'] = 0x2469; + t['tenideographicparen'] = 0x3229; + t['tenparen'] = 0x247D; + t['tenperiod'] = 0x2491; + t['tenroman'] = 0x2179; + t['tesh'] = 0x02A7; + t['tet'] = 0x05D8; + t['tetdagesh'] = 0xFB38; + t['tetdageshhebrew'] = 0xFB38; + t['tethebrew'] = 0x05D8; + t['tetsecyrillic'] = 0x04B5; + t['tevirhebrew'] = 0x059B; + t['tevirlefthebrew'] = 0x059B; + t['thabengali'] = 0x09A5; + t['thadeva'] = 0x0925; + t['thagujarati'] = 0x0AA5; + t['thagurmukhi'] = 0x0A25; + t['thalarabic'] = 0x0630; + t['thalfinalarabic'] = 0xFEAC; + t['thanthakhatlowleftthai'] = 0xF898; + t['thanthakhatlowrightthai'] = 0xF897; + t['thanthakhatthai'] = 0x0E4C; + t['thanthakhatupperleftthai'] = 0xF896; + t['theharabic'] = 0x062B; + t['thehfinalarabic'] = 0xFE9A; + t['thehinitialarabic'] = 0xFE9B; + t['thehmedialarabic'] = 0xFE9C; + t['thereexists'] = 0x2203; + t['therefore'] = 0x2234; + t['theta'] = 0x03B8; + t['theta1'] = 0x03D1; + t['thetasymbolgreek'] = 0x03D1; + t['thieuthacirclekorean'] = 0x3279; + t['thieuthaparenkorean'] = 0x3219; + t['thieuthcirclekorean'] = 0x326B; + t['thieuthkorean'] = 0x314C; + t['thieuthparenkorean'] = 0x320B; + t['thirteencircle'] = 0x246C; + t['thirteenparen'] = 0x2480; + t['thirteenperiod'] = 0x2494; + t['thonangmonthothai'] = 0x0E11; + t['thook'] = 0x01AD; + t['thophuthaothai'] = 0x0E12; + t['thorn'] = 0x00FE; + t['thothahanthai'] = 0x0E17; + t['thothanthai'] = 0x0E10; + t['thothongthai'] = 0x0E18; + t['thothungthai'] = 0x0E16; + t['thousandcyrillic'] = 0x0482; + t['thousandsseparatorarabic'] = 0x066C; + t['thousandsseparatorpersian'] = 0x066C; + t['three'] = 0x0033; + t['threearabic'] = 0x0663; + t['threebengali'] = 0x09E9; + t['threecircle'] = 0x2462; + t['threecircleinversesansserif'] = 0x278C; + t['threedeva'] = 0x0969; + t['threeeighths'] = 0x215C; + t['threegujarati'] = 0x0AE9; + t['threegurmukhi'] = 0x0A69; + t['threehackarabic'] = 0x0663; + t['threehangzhou'] = 0x3023; + t['threeideographicparen'] = 0x3222; + t['threeinferior'] = 0x2083; + t['threemonospace'] = 0xFF13; + t['threenumeratorbengali'] = 0x09F6; + t['threeoldstyle'] = 0xF733; + t['threeparen'] = 0x2476; + t['threeperiod'] = 0x248A; + t['threepersian'] = 0x06F3; + t['threequarters'] = 0x00BE; + t['threequartersemdash'] = 0xF6DE; + t['threeroman'] = 0x2172; + t['threesuperior'] = 0x00B3; + t['threethai'] = 0x0E53; + t['thzsquare'] = 0x3394; + t['tihiragana'] = 0x3061; + t['tikatakana'] = 0x30C1; + t['tikatakanahalfwidth'] = 0xFF81; + t['tikeutacirclekorean'] = 0x3270; + t['tikeutaparenkorean'] = 0x3210; + t['tikeutcirclekorean'] = 0x3262; + t['tikeutkorean'] = 0x3137; + t['tikeutparenkorean'] = 0x3202; + t['tilde'] = 0x02DC; + t['tildebelowcmb'] = 0x0330; + t['tildecmb'] = 0x0303; + t['tildecomb'] = 0x0303; + t['tildedoublecmb'] = 0x0360; + t['tildeoperator'] = 0x223C; + t['tildeoverlaycmb'] = 0x0334; + t['tildeverticalcmb'] = 0x033E; + t['timescircle'] = 0x2297; + t['tipehahebrew'] = 0x0596; + t['tipehalefthebrew'] = 0x0596; + t['tippigurmukhi'] = 0x0A70; + t['titlocyrilliccmb'] = 0x0483; + t['tiwnarmenian'] = 0x057F; + t['tlinebelow'] = 0x1E6F; + t['tmonospace'] = 0xFF54; + t['toarmenian'] = 0x0569; + t['tohiragana'] = 0x3068; + t['tokatakana'] = 0x30C8; + t['tokatakanahalfwidth'] = 0xFF84; + t['tonebarextrahighmod'] = 0x02E5; + t['tonebarextralowmod'] = 0x02E9; + t['tonebarhighmod'] = 0x02E6; + t['tonebarlowmod'] = 0x02E8; + t['tonebarmidmod'] = 0x02E7; + t['tonefive'] = 0x01BD; + t['tonesix'] = 0x0185; + t['tonetwo'] = 0x01A8; + t['tonos'] = 0x0384; + t['tonsquare'] = 0x3327; + t['topatakthai'] = 0x0E0F; + t['tortoiseshellbracketleft'] = 0x3014; + t['tortoiseshellbracketleftsmall'] = 0xFE5D; + t['tortoiseshellbracketleftvertical'] = 0xFE39; + t['tortoiseshellbracketright'] = 0x3015; + t['tortoiseshellbracketrightsmall'] = 0xFE5E; + t['tortoiseshellbracketrightvertical'] = 0xFE3A; + t['totaothai'] = 0x0E15; + t['tpalatalhook'] = 0x01AB; + t['tparen'] = 0x24AF; + t['trademark'] = 0x2122; + t['trademarksans'] = 0xF8EA; + t['trademarkserif'] = 0xF6DB; + t['tretroflexhook'] = 0x0288; + t['triagdn'] = 0x25BC; + t['triaglf'] = 0x25C4; + t['triagrt'] = 0x25BA; + t['triagup'] = 0x25B2; + t['ts'] = 0x02A6; + t['tsadi'] = 0x05E6; + t['tsadidagesh'] = 0xFB46; + t['tsadidageshhebrew'] = 0xFB46; + t['tsadihebrew'] = 0x05E6; + t['tsecyrillic'] = 0x0446; + t['tsere'] = 0x05B5; + t['tsere12'] = 0x05B5; + t['tsere1e'] = 0x05B5; + t['tsere2b'] = 0x05B5; + t['tserehebrew'] = 0x05B5; + t['tserenarrowhebrew'] = 0x05B5; + t['tserequarterhebrew'] = 0x05B5; + t['tserewidehebrew'] = 0x05B5; + t['tshecyrillic'] = 0x045B; + t['tsuperior'] = 0xF6F3; + t['ttabengali'] = 0x099F; + t['ttadeva'] = 0x091F; + t['ttagujarati'] = 0x0A9F; + t['ttagurmukhi'] = 0x0A1F; + t['tteharabic'] = 0x0679; + t['ttehfinalarabic'] = 0xFB67; + t['ttehinitialarabic'] = 0xFB68; + t['ttehmedialarabic'] = 0xFB69; + t['tthabengali'] = 0x09A0; + t['tthadeva'] = 0x0920; + t['tthagujarati'] = 0x0AA0; + t['tthagurmukhi'] = 0x0A20; + t['tturned'] = 0x0287; + t['tuhiragana'] = 0x3064; + t['tukatakana'] = 0x30C4; + t['tukatakanahalfwidth'] = 0xFF82; + t['tusmallhiragana'] = 0x3063; + t['tusmallkatakana'] = 0x30C3; + t['tusmallkatakanahalfwidth'] = 0xFF6F; + t['twelvecircle'] = 0x246B; + t['twelveparen'] = 0x247F; + t['twelveperiod'] = 0x2493; + t['twelveroman'] = 0x217B; + t['twentycircle'] = 0x2473; + t['twentyhangzhou'] = 0x5344; + t['twentyparen'] = 0x2487; + t['twentyperiod'] = 0x249B; + t['two'] = 0x0032; + t['twoarabic'] = 0x0662; + t['twobengali'] = 0x09E8; + t['twocircle'] = 0x2461; + t['twocircleinversesansserif'] = 0x278B; + t['twodeva'] = 0x0968; + t['twodotenleader'] = 0x2025; + t['twodotleader'] = 0x2025; + t['twodotleadervertical'] = 0xFE30; + t['twogujarati'] = 0x0AE8; + t['twogurmukhi'] = 0x0A68; + t['twohackarabic'] = 0x0662; + t['twohangzhou'] = 0x3022; + t['twoideographicparen'] = 0x3221; + t['twoinferior'] = 0x2082; + t['twomonospace'] = 0xFF12; + t['twonumeratorbengali'] = 0x09F5; + t['twooldstyle'] = 0xF732; + t['twoparen'] = 0x2475; + t['twoperiod'] = 0x2489; + t['twopersian'] = 0x06F2; + t['tworoman'] = 0x2171; + t['twostroke'] = 0x01BB; + t['twosuperior'] = 0x00B2; + t['twothai'] = 0x0E52; + t['twothirds'] = 0x2154; + t['u'] = 0x0075; + t['uacute'] = 0x00FA; + t['ubar'] = 0x0289; + t['ubengali'] = 0x0989; + t['ubopomofo'] = 0x3128; + t['ubreve'] = 0x016D; + t['ucaron'] = 0x01D4; + t['ucircle'] = 0x24E4; + t['ucircumflex'] = 0x00FB; + t['ucircumflexbelow'] = 0x1E77; + t['ucyrillic'] = 0x0443; + t['udattadeva'] = 0x0951; + t['udblacute'] = 0x0171; + t['udblgrave'] = 0x0215; + t['udeva'] = 0x0909; + t['udieresis'] = 0x00FC; + t['udieresisacute'] = 0x01D8; + t['udieresisbelow'] = 0x1E73; + t['udieresiscaron'] = 0x01DA; + t['udieresiscyrillic'] = 0x04F1; + t['udieresisgrave'] = 0x01DC; + t['udieresismacron'] = 0x01D6; + t['udotbelow'] = 0x1EE5; + t['ugrave'] = 0x00F9; + t['ugujarati'] = 0x0A89; + t['ugurmukhi'] = 0x0A09; + t['uhiragana'] = 0x3046; + t['uhookabove'] = 0x1EE7; + t['uhorn'] = 0x01B0; + t['uhornacute'] = 0x1EE9; + t['uhorndotbelow'] = 0x1EF1; + t['uhorngrave'] = 0x1EEB; + t['uhornhookabove'] = 0x1EED; + t['uhorntilde'] = 0x1EEF; + t['uhungarumlaut'] = 0x0171; + t['uhungarumlautcyrillic'] = 0x04F3; + t['uinvertedbreve'] = 0x0217; + t['ukatakana'] = 0x30A6; + t['ukatakanahalfwidth'] = 0xFF73; + t['ukcyrillic'] = 0x0479; + t['ukorean'] = 0x315C; + t['umacron'] = 0x016B; + t['umacroncyrillic'] = 0x04EF; + t['umacrondieresis'] = 0x1E7B; + t['umatragurmukhi'] = 0x0A41; + t['umonospace'] = 0xFF55; + t['underscore'] = 0x005F; + t['underscoredbl'] = 0x2017; + t['underscoremonospace'] = 0xFF3F; + t['underscorevertical'] = 0xFE33; + t['underscorewavy'] = 0xFE4F; + t['union'] = 0x222A; + t['universal'] = 0x2200; + t['uogonek'] = 0x0173; + t['uparen'] = 0x24B0; + t['upblock'] = 0x2580; + t['upperdothebrew'] = 0x05C4; + t['upsilon'] = 0x03C5; + t['upsilondieresis'] = 0x03CB; + t['upsilondieresistonos'] = 0x03B0; + t['upsilonlatin'] = 0x028A; + t['upsilontonos'] = 0x03CD; + t['uptackbelowcmb'] = 0x031D; + t['uptackmod'] = 0x02D4; + t['uragurmukhi'] = 0x0A73; + t['uring'] = 0x016F; + t['ushortcyrillic'] = 0x045E; + t['usmallhiragana'] = 0x3045; + t['usmallkatakana'] = 0x30A5; + t['usmallkatakanahalfwidth'] = 0xFF69; + t['ustraightcyrillic'] = 0x04AF; + t['ustraightstrokecyrillic'] = 0x04B1; + t['utilde'] = 0x0169; + t['utildeacute'] = 0x1E79; + t['utildebelow'] = 0x1E75; + t['uubengali'] = 0x098A; + t['uudeva'] = 0x090A; + t['uugujarati'] = 0x0A8A; + t['uugurmukhi'] = 0x0A0A; + t['uumatragurmukhi'] = 0x0A42; + t['uuvowelsignbengali'] = 0x09C2; + t['uuvowelsigndeva'] = 0x0942; + t['uuvowelsigngujarati'] = 0x0AC2; + t['uvowelsignbengali'] = 0x09C1; + t['uvowelsigndeva'] = 0x0941; + t['uvowelsigngujarati'] = 0x0AC1; + t['v'] = 0x0076; + t['vadeva'] = 0x0935; + t['vagujarati'] = 0x0AB5; + t['vagurmukhi'] = 0x0A35; + t['vakatakana'] = 0x30F7; + t['vav'] = 0x05D5; + t['vavdagesh'] = 0xFB35; + t['vavdagesh65'] = 0xFB35; + t['vavdageshhebrew'] = 0xFB35; + t['vavhebrew'] = 0x05D5; + t['vavholam'] = 0xFB4B; + t['vavholamhebrew'] = 0xFB4B; + t['vavvavhebrew'] = 0x05F0; + t['vavyodhebrew'] = 0x05F1; + t['vcircle'] = 0x24E5; + t['vdotbelow'] = 0x1E7F; + t['vecyrillic'] = 0x0432; + t['veharabic'] = 0x06A4; + t['vehfinalarabic'] = 0xFB6B; + t['vehinitialarabic'] = 0xFB6C; + t['vehmedialarabic'] = 0xFB6D; + t['vekatakana'] = 0x30F9; + t['venus'] = 0x2640; + t['verticalbar'] = 0x007C; + t['verticallineabovecmb'] = 0x030D; + t['verticallinebelowcmb'] = 0x0329; + t['verticallinelowmod'] = 0x02CC; + t['verticallinemod'] = 0x02C8; + t['vewarmenian'] = 0x057E; + t['vhook'] = 0x028B; + t['vikatakana'] = 0x30F8; + t['viramabengali'] = 0x09CD; + t['viramadeva'] = 0x094D; + t['viramagujarati'] = 0x0ACD; + t['visargabengali'] = 0x0983; + t['visargadeva'] = 0x0903; + t['visargagujarati'] = 0x0A83; + t['vmonospace'] = 0xFF56; + t['voarmenian'] = 0x0578; + t['voicediterationhiragana'] = 0x309E; + t['voicediterationkatakana'] = 0x30FE; + t['voicedmarkkana'] = 0x309B; + t['voicedmarkkanahalfwidth'] = 0xFF9E; + t['vokatakana'] = 0x30FA; + t['vparen'] = 0x24B1; + t['vtilde'] = 0x1E7D; + t['vturned'] = 0x028C; + t['vuhiragana'] = 0x3094; + t['vukatakana'] = 0x30F4; + t['w'] = 0x0077; + t['wacute'] = 0x1E83; + t['waekorean'] = 0x3159; + t['wahiragana'] = 0x308F; + t['wakatakana'] = 0x30EF; + t['wakatakanahalfwidth'] = 0xFF9C; + t['wakorean'] = 0x3158; + t['wasmallhiragana'] = 0x308E; + t['wasmallkatakana'] = 0x30EE; + t['wattosquare'] = 0x3357; + t['wavedash'] = 0x301C; + t['wavyunderscorevertical'] = 0xFE34; + t['wawarabic'] = 0x0648; + t['wawfinalarabic'] = 0xFEEE; + t['wawhamzaabovearabic'] = 0x0624; + t['wawhamzaabovefinalarabic'] = 0xFE86; + t['wbsquare'] = 0x33DD; + t['wcircle'] = 0x24E6; + t['wcircumflex'] = 0x0175; + t['wdieresis'] = 0x1E85; + t['wdotaccent'] = 0x1E87; + t['wdotbelow'] = 0x1E89; + t['wehiragana'] = 0x3091; + t['weierstrass'] = 0x2118; + t['wekatakana'] = 0x30F1; + t['wekorean'] = 0x315E; + t['weokorean'] = 0x315D; + t['wgrave'] = 0x1E81; + t['whitebullet'] = 0x25E6; + t['whitecircle'] = 0x25CB; + t['whitecircleinverse'] = 0x25D9; + t['whitecornerbracketleft'] = 0x300E; + t['whitecornerbracketleftvertical'] = 0xFE43; + t['whitecornerbracketright'] = 0x300F; + t['whitecornerbracketrightvertical'] = 0xFE44; + t['whitediamond'] = 0x25C7; + t['whitediamondcontainingblacksmalldiamond'] = 0x25C8; + t['whitedownpointingsmalltriangle'] = 0x25BF; + t['whitedownpointingtriangle'] = 0x25BD; + t['whiteleftpointingsmalltriangle'] = 0x25C3; + t['whiteleftpointingtriangle'] = 0x25C1; + t['whitelenticularbracketleft'] = 0x3016; + t['whitelenticularbracketright'] = 0x3017; + t['whiterightpointingsmalltriangle'] = 0x25B9; + t['whiterightpointingtriangle'] = 0x25B7; + t['whitesmallsquare'] = 0x25AB; + t['whitesmilingface'] = 0x263A; + t['whitesquare'] = 0x25A1; + t['whitestar'] = 0x2606; + t['whitetelephone'] = 0x260F; + t['whitetortoiseshellbracketleft'] = 0x3018; + t['whitetortoiseshellbracketright'] = 0x3019; + t['whiteuppointingsmalltriangle'] = 0x25B5; + t['whiteuppointingtriangle'] = 0x25B3; + t['wihiragana'] = 0x3090; + t['wikatakana'] = 0x30F0; + t['wikorean'] = 0x315F; + t['wmonospace'] = 0xFF57; + t['wohiragana'] = 0x3092; + t['wokatakana'] = 0x30F2; + t['wokatakanahalfwidth'] = 0xFF66; + t['won'] = 0x20A9; + t['wonmonospace'] = 0xFFE6; + t['wowaenthai'] = 0x0E27; + t['wparen'] = 0x24B2; + t['wring'] = 0x1E98; + t['wsuperior'] = 0x02B7; + t['wturned'] = 0x028D; + t['wynn'] = 0x01BF; + t['x'] = 0x0078; + t['xabovecmb'] = 0x033D; + t['xbopomofo'] = 0x3112; + t['xcircle'] = 0x24E7; + t['xdieresis'] = 0x1E8D; + t['xdotaccent'] = 0x1E8B; + t['xeharmenian'] = 0x056D; + t['xi'] = 0x03BE; + t['xmonospace'] = 0xFF58; + t['xparen'] = 0x24B3; + t['xsuperior'] = 0x02E3; + t['y'] = 0x0079; + t['yaadosquare'] = 0x334E; + t['yabengali'] = 0x09AF; + t['yacute'] = 0x00FD; + t['yadeva'] = 0x092F; + t['yaekorean'] = 0x3152; + t['yagujarati'] = 0x0AAF; + t['yagurmukhi'] = 0x0A2F; + t['yahiragana'] = 0x3084; + t['yakatakana'] = 0x30E4; + t['yakatakanahalfwidth'] = 0xFF94; + t['yakorean'] = 0x3151; + t['yamakkanthai'] = 0x0E4E; + t['yasmallhiragana'] = 0x3083; + t['yasmallkatakana'] = 0x30E3; + t['yasmallkatakanahalfwidth'] = 0xFF6C; + t['yatcyrillic'] = 0x0463; + t['ycircle'] = 0x24E8; + t['ycircumflex'] = 0x0177; + t['ydieresis'] = 0x00FF; + t['ydotaccent'] = 0x1E8F; + t['ydotbelow'] = 0x1EF5; + t['yeharabic'] = 0x064A; + t['yehbarreearabic'] = 0x06D2; + t['yehbarreefinalarabic'] = 0xFBAF; + t['yehfinalarabic'] = 0xFEF2; + t['yehhamzaabovearabic'] = 0x0626; + t['yehhamzaabovefinalarabic'] = 0xFE8A; + t['yehhamzaaboveinitialarabic'] = 0xFE8B; + t['yehhamzaabovemedialarabic'] = 0xFE8C; + t['yehinitialarabic'] = 0xFEF3; + t['yehmedialarabic'] = 0xFEF4; + t['yehmeeminitialarabic'] = 0xFCDD; + t['yehmeemisolatedarabic'] = 0xFC58; + t['yehnoonfinalarabic'] = 0xFC94; + t['yehthreedotsbelowarabic'] = 0x06D1; + t['yekorean'] = 0x3156; + t['yen'] = 0x00A5; + t['yenmonospace'] = 0xFFE5; + t['yeokorean'] = 0x3155; + t['yeorinhieuhkorean'] = 0x3186; + t['yerahbenyomohebrew'] = 0x05AA; + t['yerahbenyomolefthebrew'] = 0x05AA; + t['yericyrillic'] = 0x044B; + t['yerudieresiscyrillic'] = 0x04F9; + t['yesieungkorean'] = 0x3181; + t['yesieungpansioskorean'] = 0x3183; + t['yesieungsioskorean'] = 0x3182; + t['yetivhebrew'] = 0x059A; + t['ygrave'] = 0x1EF3; + t['yhook'] = 0x01B4; + t['yhookabove'] = 0x1EF7; + t['yiarmenian'] = 0x0575; + t['yicyrillic'] = 0x0457; + t['yikorean'] = 0x3162; + t['yinyang'] = 0x262F; + t['yiwnarmenian'] = 0x0582; + t['ymonospace'] = 0xFF59; + t['yod'] = 0x05D9; + t['yoddagesh'] = 0xFB39; + t['yoddageshhebrew'] = 0xFB39; + t['yodhebrew'] = 0x05D9; + t['yodyodhebrew'] = 0x05F2; + t['yodyodpatahhebrew'] = 0xFB1F; + t['yohiragana'] = 0x3088; + t['yoikorean'] = 0x3189; + t['yokatakana'] = 0x30E8; + t['yokatakanahalfwidth'] = 0xFF96; + t['yokorean'] = 0x315B; + t['yosmallhiragana'] = 0x3087; + t['yosmallkatakana'] = 0x30E7; + t['yosmallkatakanahalfwidth'] = 0xFF6E; + t['yotgreek'] = 0x03F3; + t['yoyaekorean'] = 0x3188; + t['yoyakorean'] = 0x3187; + t['yoyakthai'] = 0x0E22; + t['yoyingthai'] = 0x0E0D; + t['yparen'] = 0x24B4; + t['ypogegrammeni'] = 0x037A; + t['ypogegrammenigreekcmb'] = 0x0345; + t['yr'] = 0x01A6; + t['yring'] = 0x1E99; + t['ysuperior'] = 0x02B8; + t['ytilde'] = 0x1EF9; + t['yturned'] = 0x028E; + t['yuhiragana'] = 0x3086; + t['yuikorean'] = 0x318C; + t['yukatakana'] = 0x30E6; + t['yukatakanahalfwidth'] = 0xFF95; + t['yukorean'] = 0x3160; + t['yusbigcyrillic'] = 0x046B; + t['yusbigiotifiedcyrillic'] = 0x046D; + t['yuslittlecyrillic'] = 0x0467; + t['yuslittleiotifiedcyrillic'] = 0x0469; + t['yusmallhiragana'] = 0x3085; + t['yusmallkatakana'] = 0x30E5; + t['yusmallkatakanahalfwidth'] = 0xFF6D; + t['yuyekorean'] = 0x318B; + t['yuyeokorean'] = 0x318A; + t['yyabengali'] = 0x09DF; + t['yyadeva'] = 0x095F; + t['z'] = 0x007A; + t['zaarmenian'] = 0x0566; + t['zacute'] = 0x017A; + t['zadeva'] = 0x095B; + t['zagurmukhi'] = 0x0A5B; + t['zaharabic'] = 0x0638; + t['zahfinalarabic'] = 0xFEC6; + t['zahinitialarabic'] = 0xFEC7; + t['zahiragana'] = 0x3056; + t['zahmedialarabic'] = 0xFEC8; + t['zainarabic'] = 0x0632; + t['zainfinalarabic'] = 0xFEB0; + t['zakatakana'] = 0x30B6; + t['zaqefgadolhebrew'] = 0x0595; + t['zaqefqatanhebrew'] = 0x0594; + t['zarqahebrew'] = 0x0598; + t['zayin'] = 0x05D6; + t['zayindagesh'] = 0xFB36; + t['zayindageshhebrew'] = 0xFB36; + t['zayinhebrew'] = 0x05D6; + t['zbopomofo'] = 0x3117; + t['zcaron'] = 0x017E; + t['zcircle'] = 0x24E9; + t['zcircumflex'] = 0x1E91; + t['zcurl'] = 0x0291; + t['zdot'] = 0x017C; + t['zdotaccent'] = 0x017C; + t['zdotbelow'] = 0x1E93; + t['zecyrillic'] = 0x0437; + t['zedescendercyrillic'] = 0x0499; + t['zedieresiscyrillic'] = 0x04DF; + t['zehiragana'] = 0x305C; + t['zekatakana'] = 0x30BC; + t['zero'] = 0x0030; + t['zeroarabic'] = 0x0660; + t['zerobengali'] = 0x09E6; + t['zerodeva'] = 0x0966; + t['zerogujarati'] = 0x0AE6; + t['zerogurmukhi'] = 0x0A66; + t['zerohackarabic'] = 0x0660; + t['zeroinferior'] = 0x2080; + t['zeromonospace'] = 0xFF10; + t['zerooldstyle'] = 0xF730; + t['zeropersian'] = 0x06F0; + t['zerosuperior'] = 0x2070; + t['zerothai'] = 0x0E50; + t['zerowidthjoiner'] = 0xFEFF; + t['zerowidthnonjoiner'] = 0x200C; + t['zerowidthspace'] = 0x200B; + t['zeta'] = 0x03B6; + t['zhbopomofo'] = 0x3113; + t['zhearmenian'] = 0x056A; + t['zhebrevecyrillic'] = 0x04C2; + t['zhecyrillic'] = 0x0436; + t['zhedescendercyrillic'] = 0x0497; + t['zhedieresiscyrillic'] = 0x04DD; + t['zihiragana'] = 0x3058; + t['zikatakana'] = 0x30B8; + t['zinorhebrew'] = 0x05AE; + t['zlinebelow'] = 0x1E95; + t['zmonospace'] = 0xFF5A; + t['zohiragana'] = 0x305E; + t['zokatakana'] = 0x30BE; + t['zparen'] = 0x24B5; + t['zretroflexhook'] = 0x0290; + t['zstroke'] = 0x01B6; + t['zuhiragana'] = 0x305A; + t['zukatakana'] = 0x30BA; + t['.notdef'] = 0x0000; + t['angbracketleftbig'] = 0x2329; + t['angbracketleftBig'] = 0x2329; + t['angbracketleftbigg'] = 0x2329; + t['angbracketleftBigg'] = 0x2329; + t['angbracketrightBig'] = 0x232A; + t['angbracketrightbig'] = 0x232A; + t['angbracketrightBigg'] = 0x232A; + t['angbracketrightbigg'] = 0x232A; + t['arrowhookleft'] = 0x21AA; + t['arrowhookright'] = 0x21A9; + t['arrowlefttophalf'] = 0x21BC; + t['arrowleftbothalf'] = 0x21BD; + t['arrownortheast'] = 0x2197; + t['arrownorthwest'] = 0x2196; + t['arrowrighttophalf'] = 0x21C0; + t['arrowrightbothalf'] = 0x21C1; + t['arrowsoutheast'] = 0x2198; + t['arrowsouthwest'] = 0x2199; + t['backslashbig'] = 0x2216; + t['backslashBig'] = 0x2216; + t['backslashBigg'] = 0x2216; + t['backslashbigg'] = 0x2216; + t['bardbl'] = 0x2016; + t['bracehtipdownleft'] = 0xFE37; + t['bracehtipdownright'] = 0xFE37; + t['bracehtipupleft'] = 0xFE38; + t['bracehtipupright'] = 0xFE38; + t['braceleftBig'] = 0x007B; + t['braceleftbig'] = 0x007B; + t['braceleftbigg'] = 0x007B; + t['braceleftBigg'] = 0x007B; + t['bracerightBig'] = 0x007D; + t['bracerightbig'] = 0x007D; + t['bracerightbigg'] = 0x007D; + t['bracerightBigg'] = 0x007D; + t['bracketleftbig'] = 0x005B; + t['bracketleftBig'] = 0x005B; + t['bracketleftbigg'] = 0x005B; + t['bracketleftBigg'] = 0x005B; + t['bracketrightBig'] = 0x005D; + t['bracketrightbig'] = 0x005D; + t['bracketrightbigg'] = 0x005D; + t['bracketrightBigg'] = 0x005D; + t['ceilingleftbig'] = 0x2308; + t['ceilingleftBig'] = 0x2308; + t['ceilingleftBigg'] = 0x2308; + t['ceilingleftbigg'] = 0x2308; + t['ceilingrightbig'] = 0x2309; + t['ceilingrightBig'] = 0x2309; + t['ceilingrightbigg'] = 0x2309; + t['ceilingrightBigg'] = 0x2309; + t['circledotdisplay'] = 0x2299; + t['circledottext'] = 0x2299; + t['circlemultiplydisplay'] = 0x2297; + t['circlemultiplytext'] = 0x2297; + t['circleplusdisplay'] = 0x2295; + t['circleplustext'] = 0x2295; + t['contintegraldisplay'] = 0x222E; + t['contintegraltext'] = 0x222E; + t['coproductdisplay'] = 0x2210; + t['coproducttext'] = 0x2210; + t['floorleftBig'] = 0x230A; + t['floorleftbig'] = 0x230A; + t['floorleftbigg'] = 0x230A; + t['floorleftBigg'] = 0x230A; + t['floorrightbig'] = 0x230B; + t['floorrightBig'] = 0x230B; + t['floorrightBigg'] = 0x230B; + t['floorrightbigg'] = 0x230B; + t['hatwide'] = 0x0302; + t['hatwider'] = 0x0302; + t['hatwidest'] = 0x0302; + t['intercal'] = 0x1D40; + t['integraldisplay'] = 0x222B; + t['integraltext'] = 0x222B; + t['intersectiondisplay'] = 0x22C2; + t['intersectiontext'] = 0x22C2; + t['logicalanddisplay'] = 0x2227; + t['logicalandtext'] = 0x2227; + t['logicalordisplay'] = 0x2228; + t['logicalortext'] = 0x2228; + t['parenleftBig'] = 0x0028; + t['parenleftbig'] = 0x0028; + t['parenleftBigg'] = 0x0028; + t['parenleftbigg'] = 0x0028; + t['parenrightBig'] = 0x0029; + t['parenrightbig'] = 0x0029; + t['parenrightBigg'] = 0x0029; + t['parenrightbigg'] = 0x0029; + t['prime'] = 0x2032; + t['productdisplay'] = 0x220F; + t['producttext'] = 0x220F; + t['radicalbig'] = 0x221A; + t['radicalBig'] = 0x221A; + t['radicalBigg'] = 0x221A; + t['radicalbigg'] = 0x221A; + t['radicalbt'] = 0x221A; + t['radicaltp'] = 0x221A; + t['radicalvertex'] = 0x221A; + t['slashbig'] = 0x002F; + t['slashBig'] = 0x002F; + t['slashBigg'] = 0x002F; + t['slashbigg'] = 0x002F; + t['summationdisplay'] = 0x2211; + t['summationtext'] = 0x2211; + t['tildewide'] = 0x02DC; + t['tildewider'] = 0x02DC; + t['tildewidest'] = 0x02DC; + t['uniondisplay'] = 0x22C3; + t['unionmultidisplay'] = 0x228E; + t['unionmultitext'] = 0x228E; + t['unionsqdisplay'] = 0x2294; + t['unionsqtext'] = 0x2294; + t['uniontext'] = 0x22C3; + t['vextenddouble'] = 0x2225; + t['vextendsingle'] = 0x2223; + }); + var getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { + t['space'] = 0x0020; + t['a1'] = 0x2701; + t['a2'] = 0x2702; + t['a202'] = 0x2703; + t['a3'] = 0x2704; + t['a4'] = 0x260E; + t['a5'] = 0x2706; + t['a119'] = 0x2707; + t['a118'] = 0x2708; + t['a117'] = 0x2709; + t['a11'] = 0x261B; + t['a12'] = 0x261E; + t['a13'] = 0x270C; + t['a14'] = 0x270D; + t['a15'] = 0x270E; + t['a16'] = 0x270F; + t['a105'] = 0x2710; + t['a17'] = 0x2711; + t['a18'] = 0x2712; + t['a19'] = 0x2713; + t['a20'] = 0x2714; + t['a21'] = 0x2715; + t['a22'] = 0x2716; + t['a23'] = 0x2717; + t['a24'] = 0x2718; + t['a25'] = 0x2719; + t['a26'] = 0x271A; + t['a27'] = 0x271B; + t['a28'] = 0x271C; + t['a6'] = 0x271D; + t['a7'] = 0x271E; + t['a8'] = 0x271F; + t['a9'] = 0x2720; + t['a10'] = 0x2721; + t['a29'] = 0x2722; + t['a30'] = 0x2723; + t['a31'] = 0x2724; + t['a32'] = 0x2725; + t['a33'] = 0x2726; + t['a34'] = 0x2727; + t['a35'] = 0x2605; + t['a36'] = 0x2729; + t['a37'] = 0x272A; + t['a38'] = 0x272B; + t['a39'] = 0x272C; + t['a40'] = 0x272D; + t['a41'] = 0x272E; + t['a42'] = 0x272F; + t['a43'] = 0x2730; + t['a44'] = 0x2731; + t['a45'] = 0x2732; + t['a46'] = 0x2733; + t['a47'] = 0x2734; + t['a48'] = 0x2735; + t['a49'] = 0x2736; + t['a50'] = 0x2737; + t['a51'] = 0x2738; + t['a52'] = 0x2739; + t['a53'] = 0x273A; + t['a54'] = 0x273B; + t['a55'] = 0x273C; + t['a56'] = 0x273D; + t['a57'] = 0x273E; + t['a58'] = 0x273F; + t['a59'] = 0x2740; + t['a60'] = 0x2741; + t['a61'] = 0x2742; + t['a62'] = 0x2743; + t['a63'] = 0x2744; + t['a64'] = 0x2745; + t['a65'] = 0x2746; + t['a66'] = 0x2747; + t['a67'] = 0x2748; + t['a68'] = 0x2749; + t['a69'] = 0x274A; + t['a70'] = 0x274B; + t['a71'] = 0x25CF; + t['a72'] = 0x274D; + t['a73'] = 0x25A0; + t['a74'] = 0x274F; + t['a203'] = 0x2750; + t['a75'] = 0x2751; + t['a204'] = 0x2752; + t['a76'] = 0x25B2; + t['a77'] = 0x25BC; + t['a78'] = 0x25C6; + t['a79'] = 0x2756; + t['a81'] = 0x25D7; + t['a82'] = 0x2758; + t['a83'] = 0x2759; + t['a84'] = 0x275A; + t['a97'] = 0x275B; + t['a98'] = 0x275C; + t['a99'] = 0x275D; + t['a100'] = 0x275E; + t['a101'] = 0x2761; + t['a102'] = 0x2762; + t['a103'] = 0x2763; + t['a104'] = 0x2764; + t['a106'] = 0x2765; + t['a107'] = 0x2766; + t['a108'] = 0x2767; + t['a112'] = 0x2663; + t['a111'] = 0x2666; + t['a110'] = 0x2665; + t['a109'] = 0x2660; + t['a120'] = 0x2460; + t['a121'] = 0x2461; + t['a122'] = 0x2462; + t['a123'] = 0x2463; + t['a124'] = 0x2464; + t['a125'] = 0x2465; + t['a126'] = 0x2466; + t['a127'] = 0x2467; + t['a128'] = 0x2468; + t['a129'] = 0x2469; + t['a130'] = 0x2776; + t['a131'] = 0x2777; + t['a132'] = 0x2778; + t['a133'] = 0x2779; + t['a134'] = 0x277A; + t['a135'] = 0x277B; + t['a136'] = 0x277C; + t['a137'] = 0x277D; + t['a138'] = 0x277E; + t['a139'] = 0x277F; + t['a140'] = 0x2780; + t['a141'] = 0x2781; + t['a142'] = 0x2782; + t['a143'] = 0x2783; + t['a144'] = 0x2784; + t['a145'] = 0x2785; + t['a146'] = 0x2786; + t['a147'] = 0x2787; + t['a148'] = 0x2788; + t['a149'] = 0x2789; + t['a150'] = 0x278A; + t['a151'] = 0x278B; + t['a152'] = 0x278C; + t['a153'] = 0x278D; + t['a154'] = 0x278E; + t['a155'] = 0x278F; + t['a156'] = 0x2790; + t['a157'] = 0x2791; + t['a158'] = 0x2792; + t['a159'] = 0x2793; + t['a160'] = 0x2794; + t['a161'] = 0x2192; + t['a163'] = 0x2194; + t['a164'] = 0x2195; + t['a196'] = 0x2798; + t['a165'] = 0x2799; + t['a192'] = 0x279A; + t['a166'] = 0x279B; + t['a167'] = 0x279C; + t['a168'] = 0x279D; + t['a169'] = 0x279E; + t['a170'] = 0x279F; + t['a171'] = 0x27A0; + t['a172'] = 0x27A1; + t['a173'] = 0x27A2; + t['a162'] = 0x27A3; + t['a174'] = 0x27A4; + t['a175'] = 0x27A5; + t['a176'] = 0x27A6; + t['a177'] = 0x27A7; + t['a178'] = 0x27A8; + t['a179'] = 0x27A9; + t['a193'] = 0x27AA; + t['a180'] = 0x27AB; + t['a199'] = 0x27AC; + t['a181'] = 0x27AD; + t['a200'] = 0x27AE; + t['a182'] = 0x27AF; + t['a201'] = 0x27B1; + t['a183'] = 0x27B2; + t['a184'] = 0x27B3; + t['a197'] = 0x27B4; + t['a185'] = 0x27B5; + t['a194'] = 0x27B6; + t['a198'] = 0x27B7; + t['a186'] = 0x27B8; + t['a195'] = 0x27B9; + t['a187'] = 0x27BA; + t['a188'] = 0x27BB; + t['a189'] = 0x27BC; + t['a190'] = 0x27BD; + t['a191'] = 0x27BE; + t['a89'] = 0x2768; + t['a90'] = 0x2769; + t['a93'] = 0x276A; + t['a94'] = 0x276B; + t['a91'] = 0x276C; + t['a92'] = 0x276D; + t['a205'] = 0x276E; + t['a85'] = 0x276F; + t['a206'] = 0x2770; + t['a86'] = 0x2771; + t['a87'] = 0x2772; + t['a88'] = 0x2773; + t['a95'] = 0x2774; + t['a96'] = 0x2775; + t['.notdef'] = 0x0000; + }); + exports.getGlyphsUnicode = getGlyphsUnicode; + exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode; + })); + (function (root, factory) { + factory(root.pdfjsCoreJbig2 = {}, root.pdfjsSharedUtil, root.pdfjsCoreArithmeticDecoder); + }(this, function (exports, sharedUtil, coreArithmeticDecoder) { + var error = sharedUtil.error; + var log2 = sharedUtil.log2; + var readInt8 = sharedUtil.readInt8; + var readUint16 = sharedUtil.readUint16; + var readUint32 = sharedUtil.readUint32; + var shadow = sharedUtil.shadow; + var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; + var Jbig2Image = function Jbig2ImageClosure() { + function ContextCache() { + } + ContextCache.prototype = { + getContexts: function (id) { + if (id in this) { + return this[id]; + } + return this[id] = new Int8Array(1 << 16); + } + }; + function DecodingContext(data, start, end) { + this.data = data; + this.start = start; + this.end = end; + } + DecodingContext.prototype = { + get decoder() { + var decoder = new ArithmeticDecoder(this.data, this.start, this.end); + return shadow(this, 'decoder', decoder); + }, + get contextCache() { + var cache = new ContextCache(); + return shadow(this, 'contextCache', cache); + } + }; + function decodeInteger(contextCache, procedure, decoder) { + var contexts = contextCache.getContexts(procedure); + var prev = 1; + function readBits(length) { + var v = 0; + for (var i = 0; i < length; i++) { + var bit = decoder.readBit(contexts, prev); + prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256; + v = v << 1 | bit; + } + return v >>> 0; + } + var sign = readBits(1); + var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2); + return sign === 0 ? value : value > 0 ? -value : null; + } + function decodeIAID(contextCache, decoder, codeLength) { + var contexts = contextCache.getContexts('IAID'); + var prev = 1; + for (var i = 0; i < codeLength; i++) { + var bit = decoder.readBit(contexts, prev); + prev = prev << 1 | bit; + } + if (codeLength < 31) { + return prev & (1 << codeLength) - 1; + } + return prev & 0x7FFFFFFF; + } + var SegmentTypes = [ + 'SymbolDictionary', + null, + null, + null, + 'IntermediateTextRegion', + null, + 'ImmediateTextRegion', + 'ImmediateLosslessTextRegion', + null, + null, + null, + null, + null, + null, + null, + null, + 'patternDictionary', + null, + null, + null, + 'IntermediateHalftoneRegion', + null, + 'ImmediateHalftoneRegion', + 'ImmediateLosslessHalftoneRegion', + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 'IntermediateGenericRegion', + null, + 'ImmediateGenericRegion', + 'ImmediateLosslessGenericRegion', + 'IntermediateGenericRefinementRegion', + null, + 'ImmediateGenericRefinementRegion', + 'ImmediateLosslessGenericRefinementRegion', + null, + null, + null, + null, + 'PageInformation', + 'EndOfPage', + 'EndOfStripe', + 'EndOfFile', + 'Profiles', + 'Tables', + null, + null, + null, + null, + null, + null, + null, + null, + 'Extension' + ]; + var CodingTemplates = [ + [ + { + x: -1, + y: -2 + }, + { + x: 0, + y: -2 + }, + { + x: 1, + y: -2 + }, + { + x: -2, + y: -1 + }, + { + x: -1, + y: -1 + }, + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: 2, + y: -1 + }, + { + x: -4, + y: 0 + }, + { + x: -3, + y: 0 + }, + { + x: -2, + y: 0 + }, + { + x: -1, + y: 0 + } + ], + [ + { + x: -1, + y: -2 + }, + { + x: 0, + y: -2 + }, + { + x: 1, + y: -2 + }, + { + x: 2, + y: -2 + }, + { + x: -2, + y: -1 + }, + { + x: -1, + y: -1 + }, + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: 2, + y: -1 + }, + { + x: -3, + y: 0 + }, + { + x: -2, + y: 0 + }, + { + x: -1, + y: 0 + } + ], + [ + { + x: -1, + y: -2 + }, + { + x: 0, + y: -2 + }, + { + x: 1, + y: -2 + }, + { + x: -2, + y: -1 + }, + { + x: -1, + y: -1 + }, + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: -2, + y: 0 + }, + { + x: -1, + y: 0 + } + ], + [ + { + x: -3, + y: -1 + }, + { + x: -2, + y: -1 + }, + { + x: -1, + y: -1 + }, + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: -4, + y: 0 + }, + { + x: -3, + y: 0 + }, + { + x: -2, + y: 0 + }, + { + x: -1, + y: 0 + } + ] + ]; + var RefinementTemplates = [ + { + coding: [ + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: -1, + y: 0 + } + ], + reference: [ + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: -1, + y: 0 + }, + { + x: 0, + y: 0 + }, + { + x: 1, + y: 0 + }, + { + x: -1, + y: 1 + }, + { + x: 0, + y: 1 + }, + { + x: 1, + y: 1 + } + ] + }, + { + coding: [ + { + x: -1, + y: -1 + }, + { + x: 0, + y: -1 + }, + { + x: 1, + y: -1 + }, + { + x: -1, + y: 0 + } + ], + reference: [ + { + x: 0, + y: -1 + }, + { + x: -1, + y: 0 + }, + { + x: 0, + y: 0 + }, + { + x: 1, + y: 0 + }, + { + x: 0, + y: 1 + }, + { + x: 1, + y: 1 + } + ] + } + ]; + var ReusedContexts = [ + 0x9B25, + 0x0795, + 0x00E5, + 0x0195 + ]; + var RefinementReusedContexts = [ + 0x0020, + 0x0008 + ]; + function decodeBitmapTemplate0(width, height, decodingContext) { + var decoder = decodingContext.decoder; + var contexts = decodingContext.contextCache.getContexts('GB'); + var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; + var OLD_PIXEL_MASK = 0x7BF7; + for (i = 0; i < height; i++) { + row = bitmap[i] = new Uint8Array(width); + row1 = i < 1 ? row : bitmap[i - 1]; + row2 = i < 2 ? row : bitmap[i - 2]; + contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4; + for (j = 0; j < width; j++) { + row[j] = pixel = decoder.readBit(contexts, contextLabel); + contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; + } + } + return bitmap; + } + function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) { + if (mmr) { + error('JBIG2 error: MMR encoding is not supported'); + } + if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { + return decodeBitmapTemplate0(width, height, decodingContext); + } + var useskip = !!skip; + var template = CodingTemplates[templateIndex].concat(at); + template.sort(function (a, b) { + return a.y - b.y || a.x - b.x; + }); + var templateLength = template.length; + var templateX = new Int8Array(templateLength); + var templateY = new Int8Array(templateLength); + var changingTemplateEntries = []; + var reuseMask = 0, minX = 0, maxX = 0, minY = 0; + var c, k; + for (k = 0; k < templateLength; k++) { + templateX[k] = template[k].x; + templateY[k] = template[k].y; + minX = Math.min(minX, template[k].x); + maxX = Math.max(maxX, template[k].x); + minY = Math.min(minY, template[k].y); + if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) { + reuseMask |= 1 << templateLength - 1 - k; + } else { + changingTemplateEntries.push(k); + } + } + var changingEntriesLength = changingTemplateEntries.length; + var changingTemplateX = new Int8Array(changingEntriesLength); + var changingTemplateY = new Int8Array(changingEntriesLength); + var changingTemplateBit = new Uint16Array(changingEntriesLength); + for (c = 0; c < changingEntriesLength; c++) { + k = changingTemplateEntries[c]; + changingTemplateX[c] = template[k].x; + changingTemplateY[c] = template[k].y; + changingTemplateBit[c] = 1 << templateLength - 1 - k; + } + var sbb_left = -minX; + var sbb_top = -minY; + var sbb_right = width - maxX; + var pseudoPixelContext = ReusedContexts[templateIndex]; + var row = new Uint8Array(width); + var bitmap = []; + var decoder = decodingContext.decoder; + var contexts = decodingContext.contextCache.getContexts('GB'); + var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; + for (var i = 0; i < height; i++) { + if (prediction) { + var sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + bitmap.push(row); + continue; + } + } + row = new Uint8Array(row); + bitmap.push(row); + for (j = 0; j < width; j++) { + if (useskip && skip[i][j]) { + row[j] = 0; + continue; + } + if (j >= sbb_left && j < sbb_right && i >= sbb_top) { + contextLabel = contextLabel << 1 & reuseMask; + for (k = 0; k < changingEntriesLength; k++) { + i0 = i + changingTemplateY[k]; + j0 = j + changingTemplateX[k]; + bit = bitmap[i0][j0]; + if (bit) { + bit = changingTemplateBit[k]; + contextLabel |= bit; + } + } + } else { + contextLabel = 0; + shift = templateLength - 1; + for (k = 0; k < templateLength; k++, shift--) { + j0 = j + templateX[k]; + if (j0 >= 0 && j0 < width) { + i0 = i + templateY[k]; + if (i0 >= 0) { + bit = bitmap[i0][j0]; + if (bit) { + contextLabel |= bit << shift; + } + } + } + } + } + var pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; + } + function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) { + var codingTemplate = RefinementTemplates[templateIndex].coding; + if (templateIndex === 0) { + codingTemplate = codingTemplate.concat([at[0]]); + } + var codingTemplateLength = codingTemplate.length; + var codingTemplateX = new Int32Array(codingTemplateLength); + var codingTemplateY = new Int32Array(codingTemplateLength); + var k; + for (k = 0; k < codingTemplateLength; k++) { + codingTemplateX[k] = codingTemplate[k].x; + codingTemplateY[k] = codingTemplate[k].y; + } + var referenceTemplate = RefinementTemplates[templateIndex].reference; + if (templateIndex === 0) { + referenceTemplate = referenceTemplate.concat([at[1]]); + } + var referenceTemplateLength = referenceTemplate.length; + var referenceTemplateX = new Int32Array(referenceTemplateLength); + var referenceTemplateY = new Int32Array(referenceTemplateLength); + for (k = 0; k < referenceTemplateLength; k++) { + referenceTemplateX[k] = referenceTemplate[k].x; + referenceTemplateY[k] = referenceTemplate[k].y; + } + var referenceWidth = referenceBitmap[0].length; + var referenceHeight = referenceBitmap.length; + var pseudoPixelContext = RefinementReusedContexts[templateIndex]; + var bitmap = []; + var decoder = decodingContext.decoder; + var contexts = decodingContext.contextCache.getContexts('GR'); + var ltp = 0; + for (var i = 0; i < height; i++) { + if (prediction) { + var sltp = decoder.readBit(contexts, pseudoPixelContext); + ltp ^= sltp; + if (ltp) { + error('JBIG2 error: prediction is not supported'); + } + } + var row = new Uint8Array(width); + bitmap.push(row); + for (var j = 0; j < width; j++) { + var i0, j0; + var contextLabel = 0; + for (k = 0; k < codingTemplateLength; k++) { + i0 = i + codingTemplateY[k]; + j0 = j + codingTemplateX[k]; + if (i0 < 0 || j0 < 0 || j0 >= width) { + contextLabel <<= 1; + } else + { + contextLabel = contextLabel << 1 | bitmap[i0][j0]; + } + } + for (k = 0; k < referenceTemplateLength; k++) { + i0 = i + referenceTemplateY[k] + offsetY; + j0 = j + referenceTemplateX[k] + offsetX; + if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) { + contextLabel <<= 1; + } else + { + contextLabel = contextLabel << 1 | referenceBitmap[i0][j0]; + } + } + var pixel = decoder.readBit(contexts, contextLabel); + row[j] = pixel; + } + } + return bitmap; + } + function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext) { + if (huffman) { + error('JBIG2 error: huffman is not supported'); + } + var newSymbols = []; + var currentHeight = 0; + var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); + var decoder = decodingContext.decoder; + var contextCache = decodingContext.contextCache; + while (newSymbols.length < numberOfNewSymbols) { + var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); + currentHeight += deltaHeight; + var currentWidth = 0; + var totalWidth = 0; + while (true) { + var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); + if (deltaWidth === null) { + break; + } + currentWidth += deltaWidth; + totalWidth += currentWidth; + var bitmap; + if (refinement) { + var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder); + if (numberOfInstances > 1) { + bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext); + } else { + var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); + var rdx = decodeInteger(contextCache, 'IARDX', decoder); + var rdy = decodeInteger(contextCache, 'IARDY', decoder); + var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length]; + bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext); + } + } else { + bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext); + } + newSymbols.push(bitmap); + } + } + var exportedSymbols = []; + var flags = [], currentFlag = false; + var totalSymbolsLength = symbols.length + numberOfNewSymbols; + while (flags.length < totalSymbolsLength) { + var runLength = decodeInteger(contextCache, 'IAEX', decoder); + while (runLength--) { + flags.push(currentFlag); + } + currentFlag = !currentFlag; + } + for (var i = 0, ii = symbols.length; i < ii; i++) { + if (flags[i]) { + exportedSymbols.push(symbols[i]); + } + } + for (var j = 0; j < numberOfNewSymbols; i++, j++) { + if (flags[i]) { + exportedSymbols.push(newSymbols[j]); + } + } + return exportedSymbols; + } + function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext) { + if (huffman) { + error('JBIG2 error: huffman is not supported'); + } + var bitmap = []; + var i, row; + for (i = 0; i < height; i++) { + row = new Uint8Array(width); + if (defaultPixelValue) { + for (var j = 0; j < width; j++) { + row[j] = defaultPixelValue; + } + } + bitmap.push(row); + } + var decoder = decodingContext.decoder; + var contextCache = decodingContext.contextCache; + var stripT = -decodeInteger(contextCache, 'IADT', decoder); + var firstS = 0; + i = 0; + while (i < numberOfSymbolInstances) { + var deltaT = decodeInteger(contextCache, 'IADT', decoder); + stripT += deltaT; + var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); + firstS += deltaFirstS; + var currentS = firstS; + do { + var currentT = stripSize === 1 ? 0 : decodeInteger(contextCache, 'IAIT', decoder); + var t = stripSize * stripT + currentT; + var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); + var applyRefinement = refinement && decodeInteger(contextCache, 'IARI', decoder); + var symbolBitmap = inputSymbols[symbolId]; + var symbolWidth = symbolBitmap[0].length; + var symbolHeight = symbolBitmap.length; + if (applyRefinement) { + var rdw = decodeInteger(contextCache, 'IARDW', decoder); + var rdh = decodeInteger(contextCache, 'IARDH', decoder); + var rdx = decodeInteger(contextCache, 'IARDX', decoder); + var rdy = decodeInteger(contextCache, 'IARDY', decoder); + symbolWidth += rdw; + symbolHeight += rdh; + symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext); + } + var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight); + var offsetS = currentS - (referenceCorner & 2 ? symbolWidth : 0); + var s2, t2, symbolRow; + if (transposed) { + for (s2 = 0; s2 < symbolHeight; s2++) { + row = bitmap[offsetS + s2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[s2]; + var maxWidth = Math.min(width - offsetT, symbolWidth); + switch (combinationOperator) { + case 0: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] |= symbolRow[t2]; + } + break; + case 2: + for (t2 = 0; t2 < maxWidth; t2++) { + row[offsetT + t2] ^= symbolRow[t2]; + } + break; + default: + error('JBIG2 error: operator ' + combinationOperator + ' is not supported'); + } + } + currentS += symbolHeight - 1; + } else { + for (t2 = 0; t2 < symbolHeight; t2++) { + row = bitmap[offsetT + t2]; + if (!row) { + continue; + } + symbolRow = symbolBitmap[t2]; + switch (combinationOperator) { + case 0: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] |= symbolRow[s2]; + } + break; + case 2: + for (s2 = 0; s2 < symbolWidth; s2++) { + row[offsetS + s2] ^= symbolRow[s2]; + } + break; + default: + error('JBIG2 error: operator ' + combinationOperator + ' is not supported'); + } + } + currentS += symbolWidth - 1; + } + i++; + var deltaS = decodeInteger(contextCache, 'IADS', decoder); + if (deltaS === null) { + break; + } + currentS += deltaS + dsOffset; + } while (true); + } + return bitmap; + } + function readSegmentHeader(data, start) { + var segmentHeader = {}; + segmentHeader.number = readUint32(data, start); + var flags = data[start + 4]; + var segmentType = flags & 0x3F; + if (!SegmentTypes[segmentType]) { + error('JBIG2 error: invalid segment type: ' + segmentType); + } + segmentHeader.type = segmentType; + segmentHeader.typeName = SegmentTypes[segmentType]; + segmentHeader.deferredNonRetain = !!(flags & 0x80); + var pageAssociationFieldSize = !!(flags & 0x40); + var referredFlags = data[start + 5]; + var referredToCount = referredFlags >> 5 & 7; + var retainBits = [referredFlags & 31]; + var position = start + 6; + if (referredFlags === 7) { + referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF; + position += 3; + var bytes = referredToCount + 7 >> 3; + retainBits[0] = data[position++]; + while (--bytes > 0) { + retainBits.push(data[position++]); + } + } else if (referredFlags === 5 || referredFlags === 6) { + error('JBIG2 error: invalid referred-to flags'); + } + segmentHeader.retainBits = retainBits; + var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4; + var referredTo = []; + var i, ii; + for (i = 0; i < referredToCount; i++) { + var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? readUint16(data, position) : readUint32(data, position); + referredTo.push(number); + position += referredToSegmentNumberSize; + } + segmentHeader.referredTo = referredTo; + if (!pageAssociationFieldSize) { + segmentHeader.pageAssociation = data[position++]; + } else { + segmentHeader.pageAssociation = readUint32(data, position); + position += 4; + } + segmentHeader.length = readUint32(data, position); + position += 4; + if (segmentHeader.length === 0xFFFFFFFF) { + if (segmentType === 38) { + var genericRegionInfo = readRegionSegmentInformation(data, position); + var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength]; + var genericRegionMmr = !!(genericRegionSegmentFlags & 1); + var searchPatternLength = 6; + var searchPattern = new Uint8Array(searchPatternLength); + if (!genericRegionMmr) { + searchPattern[0] = 0xFF; + searchPattern[1] = 0xAC; + } + searchPattern[2] = genericRegionInfo.height >>> 24 & 0xFF; + searchPattern[3] = genericRegionInfo.height >> 16 & 0xFF; + searchPattern[4] = genericRegionInfo.height >> 8 & 0xFF; + searchPattern[5] = genericRegionInfo.height & 0xFF; + for (i = position, ii = data.length; i < ii; i++) { + var j = 0; + while (j < searchPatternLength && searchPattern[j] === data[i + j]) { + j++; + } + if (j === searchPatternLength) { + segmentHeader.length = i + searchPatternLength; + break; + } + } + if (segmentHeader.length === 0xFFFFFFFF) { + error('JBIG2 error: segment end was not found'); + } + } else { + error('JBIG2 error: invalid unknown segment length'); + } + } + segmentHeader.headerEnd = position; + return segmentHeader; + } + function readSegments(header, data, start, end) { + var segments = []; + var position = start; + while (position < end) { + var segmentHeader = readSegmentHeader(data, position); + position = segmentHeader.headerEnd; + var segment = { + header: segmentHeader, + data: data + }; + if (!header.randomAccess) { + segment.start = position; + position += segmentHeader.length; + segment.end = position; + } + segments.push(segment); + if (segmentHeader.type === 51) { + break; + } + } + if (header.randomAccess) { + for (var i = 0, ii = segments.length; i < ii; i++) { + segments[i].start = position; + position += segments[i].header.length; + segments[i].end = position; + } + } + return segments; + } + function readRegionSegmentInformation(data, start) { + return { + width: readUint32(data, start), + height: readUint32(data, start + 4), + x: readUint32(data, start + 8), + y: readUint32(data, start + 12), + combinationOperator: data[start + 16] & 7 + }; + } + var RegionSegmentInformationFieldLength = 17; + function processSegment(segment, visitor) { + var header = segment.header; + var data = segment.data, position = segment.start, end = segment.end; + var args, at, i, atLength; + switch (header.type) { + case 0: + var dictionary = {}; + var dictionaryFlags = readUint16(data, position); + dictionary.huffman = !!(dictionaryFlags & 1); + dictionary.refinement = !!(dictionaryFlags & 2); + dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3; + dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3; + dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1; + dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1; + dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); + dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); + dictionary.template = dictionaryFlags >> 10 & 3; + dictionary.refinementTemplate = dictionaryFlags >> 12 & 1; + position += 2; + if (!dictionary.huffman) { + atLength = dictionary.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + dictionary.at = at; + } + if (dictionary.refinement && !dictionary.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + dictionary.refinementAt = at; + } + dictionary.numberOfExportedSymbols = readUint32(data, position); + position += 4; + dictionary.numberOfNewSymbols = readUint32(data, position); + position += 4; + args = [ + dictionary, + header.number, + header.referredTo, + data, + position, + end + ]; + break; + case 6: + case 7: + var textRegion = {}; + textRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + var textRegionSegmentFlags = readUint16(data, position); + position += 2; + textRegion.huffman = !!(textRegionSegmentFlags & 1); + textRegion.refinement = !!(textRegionSegmentFlags & 2); + textRegion.stripSize = 1 << (textRegionSegmentFlags >> 2 & 3); + textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3; + textRegion.transposed = !!(textRegionSegmentFlags & 64); + textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3; + textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1; + textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27; + textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1; + if (textRegion.huffman) { + var textRegionHuffmanFlags = readUint16(data, position); + position += 2; + textRegion.huffmanFS = textRegionHuffmanFlags & 3; + textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3; + textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3; + textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3; + textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3; + textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3; + textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3; + textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 14); + } + if (textRegion.refinement && !textRegion.refinementTemplate) { + at = []; + for (i = 0; i < 2; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + textRegion.refinementAt = at; + } + textRegion.numberOfSymbolInstances = readUint32(data, position); + position += 4; + if (textRegion.huffman) { + error('JBIG2 error: huffman is not supported'); + } + args = [ + textRegion, + header.referredTo, + data, + position, + end + ]; + break; + case 38: + case 39: + var genericRegion = {}; + genericRegion.info = readRegionSegmentInformation(data, position); + position += RegionSegmentInformationFieldLength; + var genericRegionSegmentFlags = data[position++]; + genericRegion.mmr = !!(genericRegionSegmentFlags & 1); + genericRegion.template = genericRegionSegmentFlags >> 1 & 3; + genericRegion.prediction = !!(genericRegionSegmentFlags & 8); + if (!genericRegion.mmr) { + atLength = genericRegion.template === 0 ? 4 : 1; + at = []; + for (i = 0; i < atLength; i++) { + at.push({ + x: readInt8(data, position), + y: readInt8(data, position + 1) + }); + position += 2; + } + genericRegion.at = at; + } + args = [ + genericRegion, + data, + position, + end + ]; + break; + case 48: + var pageInfo = { + width: readUint32(data, position), + height: readUint32(data, position + 4), + resolutionX: readUint32(data, position + 8), + resolutionY: readUint32(data, position + 12) + }; + if (pageInfo.height === 0xFFFFFFFF) { + delete pageInfo.height; + } + var pageSegmentFlags = data[position + 16]; + var pageStripingInformation = readUint16(data, position + 17); + pageInfo.lossless = !!(pageSegmentFlags & 1); + pageInfo.refinement = !!(pageSegmentFlags & 2); + pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1; + pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3; + pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); + pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); + args = [pageInfo]; + break; + case 49: + break; + case 50: + break; + case 51: + break; + case 62: + break; + default: + error('JBIG2 error: segment type ' + header.typeName + '(' + header.type + ') is not implemented'); + } + var callbackName = 'on' + header.typeName; + if (callbackName in visitor) { + visitor[callbackName].apply(visitor, args); + } + } + function processSegments(segments, visitor) { + for (var i = 0, ii = segments.length; i < ii; i++) { + processSegment(segments[i], visitor); + } + } + function parseJbig2(data, start, end) { + var position = start; + if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) { + error('JBIG2 error: invalid header'); + } + var header = {}; + position += 8; + var flags = data[position++]; + header.randomAccess = !(flags & 1); + if (!(flags & 2)) { + header.numberOfPages = readUint32(data, position); + position += 4; + } + var segments = readSegments(header, data, position, end); + error('Not implemented'); + } + function parseJbig2Chunks(chunks) { + var visitor = new SimpleSegmentVisitor(); + for (var i = 0, ii = chunks.length; i < ii; i++) { + var chunk = chunks[i]; + var segments = readSegments({}, chunk.data, chunk.start, chunk.end); + processSegments(segments, visitor); + } + return visitor.buffer; + } + function SimpleSegmentVisitor() { + } + SimpleSegmentVisitor.prototype = { + onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { + this.currentPageInfo = info; + var rowSize = info.width + 7 >> 3; + var buffer = new Uint8Array(rowSize * info.height); + if (info.defaultPixelValue) { + for (var i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = 0xFF; + } + } + this.buffer = buffer; + }, + drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { + var pageInfo = this.currentPageInfo; + var width = regionInfo.width, height = regionInfo.height; + var rowSize = pageInfo.width + 7 >> 3; + var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator; + var buffer = this.buffer; + var mask0 = 128 >> (regionInfo.x & 7); + var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); + var i, j, mask, offset; + switch (combinationOperator) { + case 0: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] |= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + case 2: + for (i = 0; i < height; i++) { + mask = mask0; + offset = offset0; + for (j = 0; j < width; j++) { + if (bitmap[i][j]) { + buffer[offset] ^= mask; + } + mask >>= 1; + if (!mask) { + mask = 128; + offset++; + } + } + offset0 += rowSize; + } + break; + default: + error('JBIG2 error: operator ' + combinationOperator + ' is not supported'); + } + }, + onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) { + var regionInfo = region.info; + var decodingContext = new DecodingContext(data, start, end); + var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext); + this.drawBitmap(regionInfo, bitmap); + }, + onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { + this.onImmediateGenericRegion.apply(this, arguments); + }, + onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) { + var huffmanTables; + if (dictionary.huffman) { + error('JBIG2 error: huffman is not supported'); + } + var symbols = this.symbols; + if (!symbols) { + this.symbols = symbols = {}; + } + var inputSymbols = []; + for (var i = 0, ii = referredSegments.length; i < ii; i++) { + inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); + } + var decodingContext = new DecodingContext(data, start, end); + symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext); + }, + onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) { + var regionInfo = region.info; + var huffmanTables; + var symbols = this.symbols; + var inputSymbols = []; + for (var i = 0, ii = referredSegments.length; i < ii; i++) { + inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); + } + var symbolCodeLength = log2(inputSymbols.length); + var decodingContext = new DecodingContext(data, start, end); + var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext); + this.drawBitmap(regionInfo, bitmap); + }, + onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { + this.onImmediateTextRegion.apply(this, arguments); + } + }; + function Jbig2Image() { + } + Jbig2Image.prototype = { + parseChunks: function Jbig2Image_parseChunks(chunks) { + return parseJbig2Chunks(chunks); + } + }; + return Jbig2Image; + }(); + exports.Jbig2Image = Jbig2Image; + })); + (function (root, factory) { + factory(root.pdfjsCoreJpg = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var error = sharedUtil.error; + var JpegImage = function JpegImageClosure() { + var dctZigZag = new Uint8Array([ + 0, + 1, + 8, + 16, + 9, + 2, + 3, + 10, + 17, + 24, + 32, + 25, + 18, + 11, + 4, + 5, + 12, + 19, + 26, + 33, + 40, + 48, + 41, + 34, + 27, + 20, + 13, + 6, + 7, + 14, + 21, + 28, + 35, + 42, + 49, + 56, + 57, + 50, + 43, + 36, + 29, + 22, + 15, + 23, + 30, + 37, + 44, + 51, + 58, + 59, + 52, + 45, + 38, + 31, + 39, + 46, + 53, + 60, + 61, + 54, + 47, + 55, + 62, + 63 + ]); + var dctCos1 = 4017; + var dctSin1 = 799; + var dctCos3 = 3406; + var dctSin3 = 2276; + var dctCos6 = 1567; + var dctSin6 = 3784; + var dctSqrt2 = 5793; + var dctSqrt1d2 = 2896; + function JpegImage() { + this.decodeTransform = null; + this.colorTransform = -1; + } + function buildHuffmanTable(codeLengths, values) { + var k = 0, code = [], i, j, length = 16; + while (length > 0 && !codeLengths[length - 1]) { + length--; + } + code.push({ + children: [], + index: 0 + }); + var p = code[0], q; + for (i = 0; i < length; i++) { + for (j = 0; j < codeLengths[i]; j++) { + p = code.pop(); + p.children[p.index] = values[k]; + while (p.index > 0) { + p = code.pop(); + } + p.index++; + code.push(p); + while (code.length <= i) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + k++; + } + if (i + 1 < length) { + code.push(q = { + children: [], + index: 0 + }); + p.children[p.index] = q.children; + p = q; + } + } + return code[0].children; + } + function getBlockBufferOffset(component, row, col) { + return 64 * ((component.blocksPerLine + 1) * row + col); + } + function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) { + var mcusPerLine = frame.mcusPerLine; + var progressive = frame.progressive; + var startOffset = offset, bitsData = 0, bitsCount = 0; + function readBit() { + if (bitsCount > 0) { + bitsCount--; + return bitsData >> bitsCount & 1; + } + bitsData = data[offset++]; + if (bitsData === 0xFF) { + var nextByte = data[offset++]; + if (nextByte) { + error('JPEG error: unexpected marker ' + (bitsData << 8 | nextByte).toString(16)); + } + } + bitsCount = 7; + return bitsData >>> 7; + } + function decodeHuffman(tree) { + var node = tree; + while (true) { + node = node[readBit()]; + if (typeof node === 'number') { + return node; + } + if (typeof node !== 'object') { + error('JPEG error: invalid huffman sequence'); + } + } + } + function receive(length) { + var n = 0; + while (length > 0) { + n = n << 1 | readBit(); + length--; + } + return n; + } + function receiveAndExtend(length) { + if (length === 1) { + return readBit() === 1 ? 1 : -1; + } + var n = receive(length); + if (n >= 1 << length - 1) { + return n; + } + return n + (-1 << length) + 1; + } + function decodeBaseline(component, offset) { + var t = decodeHuffman(component.huffmanTableDC); + var diff = t === 0 ? 0 : receiveAndExtend(t); + component.blockData[offset] = component.pred += diff; + var k = 1; + while (k < 64) { + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) { + break; + } + k += 16; + continue; + } + k += r; + var z = dctZigZag[k]; + component.blockData[offset + z] = receiveAndExtend(s); + k++; + } + } + function decodeDCFirst(component, offset) { + var t = decodeHuffman(component.huffmanTableDC); + var diff = t === 0 ? 0 : receiveAndExtend(t) << successive; + component.blockData[offset] = component.pred += diff; + } + function decodeDCSuccessive(component, offset) { + component.blockData[offset] |= readBit() << successive; + } + var eobrun = 0; + function decodeACFirst(component, offset) { + if (eobrun > 0) { + eobrun--; + return; + } + var k = spectralStart, e = spectralEnd; + while (k <= e) { + var rs = decodeHuffman(component.huffmanTableAC); + var s = rs & 15, r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r) - 1; + break; + } + k += 16; + continue; + } + k += r; + var z = dctZigZag[k]; + component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive); + k++; + } + } + var successiveACState = 0, successiveACNextValue; + function decodeACSuccessive(component, offset) { + var k = spectralStart; + var e = spectralEnd; + var r = 0; + var s; + var rs; + while (k <= e) { + var z = dctZigZag[k]; + switch (successiveACState) { + case 0: + rs = decodeHuffman(component.huffmanTableAC); + s = rs & 15; + r = rs >> 4; + if (s === 0) { + if (r < 15) { + eobrun = receive(r) + (1 << r); + successiveACState = 4; + } else { + r = 16; + successiveACState = 1; + } + } else { + if (s !== 1) { + error('JPEG error: invalid ACn encoding'); + } + successiveACNextValue = receiveAndExtend(s); + successiveACState = r ? 2 : 3; + } + continue; + case 1: + case 2: + if (component.blockData[offset + z]) { + component.blockData[offset + z] += readBit() << successive; + } else { + r--; + if (r === 0) { + successiveACState = successiveACState === 2 ? 3 : 0; + } + } + break; + case 3: + if (component.blockData[offset + z]) { + component.blockData[offset + z] += readBit() << successive; + } else { + component.blockData[offset + z] = successiveACNextValue << successive; + successiveACState = 0; + } + break; + case 4: + if (component.blockData[offset + z]) { + component.blockData[offset + z] += readBit() << successive; + } + break; + } + k++; + } + if (successiveACState === 4) { + eobrun--; + if (eobrun === 0) { + successiveACState = 0; + } + } + } + function decodeMcu(component, decode, mcu, row, col) { + var mcuRow = mcu / mcusPerLine | 0; + var mcuCol = mcu % mcusPerLine; + var blockRow = mcuRow * component.v + row; + var blockCol = mcuCol * component.h + col; + var offset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, offset); + } + function decodeBlock(component, decode, mcu) { + var blockRow = mcu / component.blocksPerLine | 0; + var blockCol = mcu % component.blocksPerLine; + var offset = getBlockBufferOffset(component, blockRow, blockCol); + decode(component, offset); + } + var componentsLength = components.length; + var component, i, j, k, n; + var decodeFn; + if (progressive) { + if (spectralStart === 0) { + decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; + } else { + decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; + } + } else { + decodeFn = decodeBaseline; + } + var mcu = 0, marker; + var mcuExpected; + if (componentsLength === 1) { + mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; + } else { + mcuExpected = mcusPerLine * frame.mcusPerColumn; + } + if (!resetInterval) { + resetInterval = mcuExpected; + } + var h, v; + while (mcu < mcuExpected) { + for (i = 0; i < componentsLength; i++) { + components[i].pred = 0; + } + eobrun = 0; + if (componentsLength === 1) { + component = components[0]; + for (n = 0; n < resetInterval; n++) { + decodeBlock(component, decodeFn, mcu); + mcu++; + } + } else { + for (n = 0; n < resetInterval; n++) { + for (i = 0; i < componentsLength; i++) { + component = components[i]; + h = component.h; + v = component.v; + for (j = 0; j < v; j++) { + for (k = 0; k < h; k++) { + decodeMcu(component, decodeFn, mcu, j, k); + } + } + } + mcu++; + } + } + bitsCount = 0; + marker = data[offset] << 8 | data[offset + 1]; + while (data[offset] === 0x00 && offset < data.length - 1) { + offset++; + marker = data[offset] << 8 | data[offset + 1]; + } + if (marker <= 0xFF00) { + error('JPEG error: marker was not found'); + } + if (marker >= 0xFFD0 && marker <= 0xFFD7) { + offset += 2; + } else { + break; + } + } + return offset - startOffset; + } + function quantizeAndInverse(component, blockBufferOffset, p) { + var qt = component.quantizationTable, blockData = component.blockData; + var v0, v1, v2, v3, v4, v5, v6, v7; + var p0, p1, p2, p3, p4, p5, p6, p7; + var t; + if (!qt) { + error('JPEG error: missing required Quantization Table.'); + } + for (var row = 0; row < 64; row += 8) { + p0 = blockData[blockBufferOffset + row]; + p1 = blockData[blockBufferOffset + row + 1]; + p2 = blockData[blockBufferOffset + row + 2]; + p3 = blockData[blockBufferOffset + row + 3]; + p4 = blockData[blockBufferOffset + row + 4]; + p5 = blockData[blockBufferOffset + row + 5]; + p6 = blockData[blockBufferOffset + row + 6]; + p7 = blockData[blockBufferOffset + row + 7]; + p0 *= qt[row]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 512 >> 10; + p[row] = t; + p[row + 1] = t; + p[row + 2] = t; + p[row + 3] = t; + p[row + 4] = t; + p[row + 5] = t; + p[row + 6] = t; + p[row + 7] = t; + continue; + } + p1 *= qt[row + 1]; + p2 *= qt[row + 2]; + p3 *= qt[row + 3]; + p4 *= qt[row + 4]; + p5 *= qt[row + 5]; + p6 *= qt[row + 6]; + p7 *= qt[row + 7]; + v0 = dctSqrt2 * p0 + 128 >> 8; + v1 = dctSqrt2 * p4 + 128 >> 8; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8; + v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8; + v5 = p3 << 4; + v6 = p5 << 4; + v0 = v0 + v1 + 1 >> 1; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8; + v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p[row] = v0 + v7; + p[row + 7] = v0 - v7; + p[row + 1] = v1 + v6; + p[row + 6] = v1 - v6; + p[row + 2] = v2 + v5; + p[row + 5] = v2 - v5; + p[row + 3] = v3 + v4; + p[row + 4] = v3 - v4; + } + for (var col = 0; col < 8; ++col) { + p0 = p[col]; + p1 = p[col + 8]; + p2 = p[col + 16]; + p3 = p[col + 24]; + p4 = p[col + 32]; + p5 = p[col + 40]; + p6 = p[col + 48]; + p7 = p[col + 56]; + if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { + t = dctSqrt2 * p0 + 8192 >> 14; + t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4; + blockData[blockBufferOffset + col] = t; + blockData[blockBufferOffset + col + 8] = t; + blockData[blockBufferOffset + col + 16] = t; + blockData[blockBufferOffset + col + 24] = t; + blockData[blockBufferOffset + col + 32] = t; + blockData[blockBufferOffset + col + 40] = t; + blockData[blockBufferOffset + col + 48] = t; + blockData[blockBufferOffset + col + 56] = t; + continue; + } + v0 = dctSqrt2 * p0 + 2048 >> 12; + v1 = dctSqrt2 * p4 + 2048 >> 12; + v2 = p2; + v3 = p6; + v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12; + v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12; + v5 = p3; + v6 = p5; + v0 = (v0 + v1 + 1 >> 1) + 4112; + v1 = v0 - v1; + t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12; + v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12; + v3 = t; + v4 = v4 + v6 + 1 >> 1; + v6 = v4 - v6; + v7 = v7 + v5 + 1 >> 1; + v5 = v7 - v5; + v0 = v0 + v3 + 1 >> 1; + v3 = v0 - v3; + v1 = v1 + v2 + 1 >> 1; + v2 = v1 - v2; + t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12; + v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12; + v7 = t; + t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12; + v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12; + v6 = t; + p0 = v0 + v7; + p7 = v0 - v7; + p1 = v1 + v6; + p6 = v1 - v6; + p2 = v2 + v5; + p5 = v2 - v5; + p3 = v3 + v4; + p4 = v3 - v4; + p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4; + p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4; + p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4; + p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4; + p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4; + p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4; + p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4; + p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4; + blockData[blockBufferOffset + col] = p0; + blockData[blockBufferOffset + col + 8] = p1; + blockData[blockBufferOffset + col + 16] = p2; + blockData[blockBufferOffset + col + 24] = p3; + blockData[blockBufferOffset + col + 32] = p4; + blockData[blockBufferOffset + col + 40] = p5; + blockData[blockBufferOffset + col + 48] = p6; + blockData[blockBufferOffset + col + 56] = p7; + } + } + function buildComponentData(frame, component) { + var blocksPerLine = component.blocksPerLine; + var blocksPerColumn = component.blocksPerColumn; + var computationBuffer = new Int16Array(64); + for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { + for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { + var offset = getBlockBufferOffset(component, blockRow, blockCol); + quantizeAndInverse(component, offset, computationBuffer); + } + } + return component.blockData; + } + function clamp0to255(a) { + return a <= 0 ? 0 : a >= 255 ? 255 : a; + } + JpegImage.prototype = { + parse: function parse(data) { + function readUint16() { + var value = data[offset] << 8 | data[offset + 1]; + offset += 2; + return value; + } + function readDataBlock() { + var length = readUint16(); + var array = data.subarray(offset, offset + length - 2); + offset += array.length; + return array; + } + function prepareComponents(frame) { + var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); + var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); + for (var i = 0; i < frame.components.length; i++) { + component = frame.components[i]; + var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH); + var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV); + var blocksPerLineForMcu = mcusPerLine * component.h; + var blocksPerColumnForMcu = mcusPerColumn * component.v; + var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1); + component.blockData = new Int16Array(blocksBufferSize); + component.blocksPerLine = blocksPerLine; + component.blocksPerColumn = blocksPerColumn; + } + frame.mcusPerLine = mcusPerLine; + frame.mcusPerColumn = mcusPerColumn; + } + var offset = 0; + var jfif = null; + var adobe = null; + var frame, resetInterval; + var quantizationTables = []; + var huffmanTablesAC = [], huffmanTablesDC = []; + var fileMarker = readUint16(); + if (fileMarker !== 0xFFD8) { + error('JPEG error: SOI not found'); + } + fileMarker = readUint16(); + while (fileMarker !== 0xFFD9) { + var i, j, l; + switch (fileMarker) { + case 0xFFE0: + case 0xFFE1: + case 0xFFE2: + case 0xFFE3: + case 0xFFE4: + case 0xFFE5: + case 0xFFE6: + case 0xFFE7: + case 0xFFE8: + case 0xFFE9: + case 0xFFEA: + case 0xFFEB: + case 0xFFEC: + case 0xFFED: + case 0xFFEE: + case 0xFFEF: + case 0xFFFE: + var appData = readDataBlock(); + if (fileMarker === 0xFFE0) { + if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) { + jfif = { + version: { + major: appData[5], + minor: appData[6] + }, + densityUnits: appData[7], + xDensity: appData[8] << 8 | appData[9], + yDensity: appData[10] << 8 | appData[11], + thumbWidth: appData[12], + thumbHeight: appData[13], + thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) + }; + } + } + if (fileMarker === 0xFFEE) { + if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) { + adobe = { + version: appData[5] << 8 | appData[6], + flags0: appData[7] << 8 | appData[8], + flags1: appData[9] << 8 | appData[10], + transformCode: appData[11] + }; + } + } + break; + case 0xFFDB: + var quantizationTablesLength = readUint16(); + var quantizationTablesEnd = quantizationTablesLength + offset - 2; + var z; + while (offset < quantizationTablesEnd) { + var quantizationTableSpec = data[offset++]; + var tableData = new Uint16Array(64); + if (quantizationTableSpec >> 4 === 0) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = data[offset++]; + } + } else if (quantizationTableSpec >> 4 === 1) { + for (j = 0; j < 64; j++) { + z = dctZigZag[j]; + tableData[z] = readUint16(); + } + } else { + error('JPEG error: DQT - invalid table spec'); + } + quantizationTables[quantizationTableSpec & 15] = tableData; + } + break; + case 0xFFC0: + case 0xFFC1: + case 0xFFC2: + if (frame) { + error('JPEG error: Only single frame JPEGs supported'); + } + readUint16(); + frame = {}; + frame.extended = fileMarker === 0xFFC1; + frame.progressive = fileMarker === 0xFFC2; + frame.precision = data[offset++]; + frame.scanLines = readUint16(); + frame.samplesPerLine = readUint16(); + frame.components = []; + frame.componentIds = {}; + var componentsCount = data[offset++], componentId; + var maxH = 0, maxV = 0; + for (i = 0; i < componentsCount; i++) { + componentId = data[offset]; + var h = data[offset + 1] >> 4; + var v = data[offset + 1] & 15; + if (maxH < h) { + maxH = h; + } + if (maxV < v) { + maxV = v; + } + var qId = data[offset + 2]; + l = frame.components.push({ + h: h, + v: v, + quantizationId: qId, + quantizationTable: null + }); + frame.componentIds[componentId] = l - 1; + offset += 3; + } + frame.maxH = maxH; + frame.maxV = maxV; + prepareComponents(frame); + break; + case 0xFFC4: + var huffmanLength = readUint16(); + for (i = 2; i < huffmanLength;) { + var huffmanTableSpec = data[offset++]; + var codeLengths = new Uint8Array(16); + var codeLengthSum = 0; + for (j = 0; j < 16; j++, offset++) { + codeLengthSum += codeLengths[j] = data[offset]; + } + var huffmanValues = new Uint8Array(codeLengthSum); + for (j = 0; j < codeLengthSum; j++, offset++) { + huffmanValues[j] = data[offset]; + } + i += 17 + codeLengthSum; + (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues); + } + break; + case 0xFFDD: + readUint16(); + resetInterval = readUint16(); + break; + case 0xFFDA: + var scanLength = readUint16(); + var selectorsCount = data[offset++]; + var components = [], component; + for (i = 0; i < selectorsCount; i++) { + var componentIndex = frame.componentIds[data[offset++]]; + component = frame.components[componentIndex]; + var tableSpec = data[offset++]; + component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; + component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; + components.push(component); + } + var spectralStart = data[offset++]; + var spectralEnd = data[offset++]; + var successiveApproximation = data[offset++]; + var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15); + offset += processed; + break; + case 0xFFFF: + if (data[offset] !== 0xFF) { + offset--; + } + break; + default: + if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) { + offset -= 3; + break; + } + error('JPEG error: unknown marker ' + fileMarker.toString(16)); + } + fileMarker = readUint16(); + } + this.width = frame.samplesPerLine; + this.height = frame.scanLines; + this.jfif = jfif; + this.adobe = adobe; + this.components = []; + for (i = 0; i < frame.components.length; i++) { + component = frame.components[i]; + var quantizationTable = quantizationTables[component.quantizationId]; + if (quantizationTable) { + component.quantizationTable = quantizationTable; + } + this.components.push({ + output: buildComponentData(frame, component), + scaleX: component.h / frame.maxH, + scaleY: component.v / frame.maxV, + blocksPerLine: component.blocksPerLine, + blocksPerColumn: component.blocksPerColumn + }); + } + this.numComponents = this.components.length; + }, + _getLinearizedBlockData: function getLinearizedBlockData(width, height) { + var scaleX = this.width / width, scaleY = this.height / height; + var component, componentScaleX, componentScaleY, blocksPerScanline; + var x, y, i, j, k; + var index; + var offset = 0; + var output; + var numComponents = this.components.length; + var dataLength = width * height * numComponents; + var data = new Uint8Array(dataLength); + var xScaleBlockOffset = new Uint32Array(width); + var mask3LSB = 0xfffffff8; + for (i = 0; i < numComponents; i++) { + component = this.components[i]; + componentScaleX = component.scaleX * scaleX; + componentScaleY = component.scaleY * scaleY; + offset = i; + output = component.output; + blocksPerScanline = component.blocksPerLine + 1 << 3; + for (x = 0; x < width; x++) { + j = 0 | x * componentScaleX; + xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7; + } + for (y = 0; y < height; y++) { + j = 0 | y * componentScaleY; + index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3; + for (x = 0; x < width; x++) { + data[offset] = output[index + xScaleBlockOffset[x]]; + offset += numComponents; + } + } + } + var transform = this.decodeTransform; + if (transform) { + for (i = 0; i < dataLength;) { + for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { + data[i] = (data[i] * transform[k] >> 8) + transform[k + 1]; + } + } + } + return data; + }, + _isColorConversionNeeded: function isColorConversionNeeded() { + if (this.adobe && this.adobe.transformCode) { + return true; + } else if (this.numComponents === 3) { + if (!this.adobe && this.colorTransform === 0) { + return false; + } + return true; + } + if (!this.adobe && this.colorTransform === 1) { + return true; + } + return false; + }, + _convertYccToRgb: function convertYccToRgb(data) { + var Y, Cb, Cr; + for (var i = 0, length = data.length; i < length; i += 3) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = clamp0to255(Y - 179.456 + 1.402 * Cr); + data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); + data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); + } + return data; + }, + _convertYcckToRgb: function convertYcckToRgb(data) { + var Y, Cb, Cr, k; + var offset = 0; + for (var i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + k = data[i + 3]; + var r = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776); + var g = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665); + var b = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407); + data[offset++] = clamp0to255(r); + data[offset++] = clamp0to255(g); + data[offset++] = clamp0to255(b); + } + return data; + }, + _convertYcckToCmyk: function convertYcckToCmyk(data) { + var Y, Cb, Cr; + for (var i = 0, length = data.length; i < length; i += 4) { + Y = data[i]; + Cb = data[i + 1]; + Cr = data[i + 2]; + data[i] = clamp0to255(434.456 - Y - 1.402 * Cr); + data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); + data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); + } + return data; + }, + _convertCmykToRgb: function convertCmykToRgb(data) { + var c, m, y, k; + var offset = 0; + var min = -255 * 255 * 255; + var scale = 1 / 255 / 255; + for (var i = 0, length = data.length; i < length; i += 4) { + c = data[i]; + m = data[i + 1]; + y = data[i + 2]; + k = data[i + 3]; + var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 72734.4411664936) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 1401.7366389350734) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 4465.541406466231) - k * (21.86122147463605 * k + 48317.86113160301); + var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 20220.756542821975) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 48691.05921601825) + y * (4.444339102852739 * y + 9.8632861493405 * k - 6341.191035517494) - k * (20.737325471181034 * k + 47890.15695978492); + var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 3616.812083916688) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 28620.90484698408) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 49363.43385999684) - k * (22.33816807309886 * k + 45932.16563550634); + data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; + data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; + data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; + } + return data; + }, + getData: function getData(width, height, forceRGBoutput) { + if (this.numComponents > 4) { + error('JPEG error: Unsupported color mode'); + } + var data = this._getLinearizedBlockData(width, height); + if (this.numComponents === 1 && forceRGBoutput) { + var dataLength = data.length; + var rgbData = new Uint8Array(dataLength * 3); + var offset = 0; + for (var i = 0; i < dataLength; i++) { + var grayColor = data[i]; + rgbData[offset++] = grayColor; + rgbData[offset++] = grayColor; + rgbData[offset++] = grayColor; + } + return rgbData; + } else if (this.numComponents === 3 && this._isColorConversionNeeded()) { + return this._convertYccToRgb(data); + } else if (this.numComponents === 4) { + if (this._isColorConversionNeeded()) { + if (forceRGBoutput) { + return this._convertYcckToRgb(data); + } + return this._convertYcckToCmyk(data); + } else if (forceRGBoutput) { + return this._convertCmykToRgb(data); + } + } + return data; + } + }; + return JpegImage; + }(); + exports.JpegImage = JpegImage; + })); + (function (root, factory) { + factory(root.pdfjsCoreJpx = {}, root.pdfjsSharedUtil, root.pdfjsCoreArithmeticDecoder); + }(this, function (exports, sharedUtil, coreArithmeticDecoder) { + var info = sharedUtil.info; + var warn = sharedUtil.warn; + var error = sharedUtil.error; + var log2 = sharedUtil.log2; + var readUint16 = sharedUtil.readUint16; + var readUint32 = sharedUtil.readUint32; + var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; + var JpxImage = function JpxImageClosure() { + var SubbandsGainLog2 = { + 'LL': 0, + 'LH': 1, + 'HL': 1, + 'HH': 2 + }; + function JpxImage() { + this.failOnCorruptedImage = false; + } + JpxImage.prototype = { + parse: function JpxImage_parse(data) { + var head = readUint16(data, 0); + if (head === 0xFF4F) { + this.parseCodestream(data, 0, data.length); + return; + } + var position = 0, length = data.length; + while (position < length) { + var headerSize = 8; + var lbox = readUint32(data, position); + var tbox = readUint32(data, position + 4); + position += headerSize; + if (lbox === 1) { + lbox = readUint32(data, position) * 4294967296 + readUint32(data, position + 4); + position += 8; + headerSize += 8; + } + if (lbox === 0) { + lbox = length - position + headerSize; + } + if (lbox < headerSize) { + error('JPX Error: Invalid box field size'); + } + var dataLength = lbox - headerSize; + var jumpDataLength = true; + switch (tbox) { + case 0x6A703268: + jumpDataLength = false; + break; + case 0x636F6C72: + var method = data[position]; + if (method === 1) { + var colorspace = readUint32(data, position + 3); + switch (colorspace) { + case 16: + case 17: + case 18: + break; + default: + warn('Unknown colorspace ' + colorspace); + break; + } + } else if (method === 2) { + info('ICC profile not supported'); + } + break; + case 0x6A703263: + this.parseCodestream(data, position, position + dataLength); + break; + case 0x6A502020: + if (0x0d0a870a !== readUint32(data, position)) { + warn('Invalid JP2 signature'); + } + break; + case 0x6A501A1A: + case 0x66747970: + case 0x72726571: + case 0x72657320: + case 0x69686472: + break; + default: + var headerType = String.fromCharCode(tbox >> 24 & 0xFF, tbox >> 16 & 0xFF, tbox >> 8 & 0xFF, tbox & 0xFF); + warn('Unsupported header type ' + tbox + ' (' + headerType + ')'); + break; + } + if (jumpDataLength) { + position += dataLength; + } + } + }, + parseImageProperties: function JpxImage_parseImageProperties(stream) { + var newByte = stream.getByte(); + while (newByte >= 0) { + var oldByte = newByte; + newByte = stream.getByte(); + var code = oldByte << 8 | newByte; + if (code === 0xFF51) { + stream.skip(4); + var Xsiz = stream.getInt32() >>> 0; + var Ysiz = stream.getInt32() >>> 0; + var XOsiz = stream.getInt32() >>> 0; + var YOsiz = stream.getInt32() >>> 0; + stream.skip(16); + var Csiz = stream.getUint16(); + this.width = Xsiz - XOsiz; + this.height = Ysiz - YOsiz; + this.componentsCount = Csiz; + this.bitsPerComponent = 8; + return; + } + } + error('JPX Error: No size marker found in JPX stream'); + }, + parseCodestream: function JpxImage_parseCodestream(data, start, end) { + var context = {}; + var doNotRecover = false; + try { + var position = start; + while (position + 1 < end) { + var code = readUint16(data, position); + position += 2; + var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; + switch (code) { + case 0xFF4F: + context.mainHeader = true; + break; + case 0xFFD9: + break; + case 0xFF51: + length = readUint16(data, position); + var siz = {}; + siz.Xsiz = readUint32(data, position + 4); + siz.Ysiz = readUint32(data, position + 8); + siz.XOsiz = readUint32(data, position + 12); + siz.YOsiz = readUint32(data, position + 16); + siz.XTsiz = readUint32(data, position + 20); + siz.YTsiz = readUint32(data, position + 24); + siz.XTOsiz = readUint32(data, position + 28); + siz.YTOsiz = readUint32(data, position + 32); + var componentsCount = readUint16(data, position + 36); + siz.Csiz = componentsCount; + var components = []; + j = position + 38; + for (var i = 0; i < componentsCount; i++) { + var component = { + precision: (data[j] & 0x7F) + 1, + isSigned: !!(data[j] & 0x80), + XRsiz: data[j + 1], + YRsiz: data[j + 1] + }; + calculateComponentDimensions(component, siz); + components.push(component); + } + context.SIZ = siz; + context.components = components; + calculateTileGrids(context, components); + context.QCC = []; + context.COC = []; + break; + case 0xFF5C: + length = readUint16(data, position); + var qcd = {}; + j = position + 2; + sqcd = data[j++]; + switch (sqcd & 0x1F) { + case 0: + spqcdSize = 8; + scalarExpounded = true; + break; + case 1: + spqcdSize = 16; + scalarExpounded = false; + break; + case 2: + spqcdSize = 16; + scalarExpounded = true; + break; + default: + throw new Error('Invalid SQcd value ' + sqcd); + } + qcd.noQuantization = spqcdSize === 8; + qcd.scalarExpounded = scalarExpounded; + qcd.guardBits = sqcd >> 5; + spqcds = []; + while (j < length + position) { + var spqcd = {}; + if (spqcdSize === 8) { + spqcd.epsilon = data[j++] >> 3; + spqcd.mu = 0; + } else { + spqcd.epsilon = data[j] >> 3; + spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1]; + j += 2; + } + spqcds.push(spqcd); + } + qcd.SPqcds = spqcds; + if (context.mainHeader) { + context.QCD = qcd; + } else { + context.currentTile.QCD = qcd; + context.currentTile.QCC = []; + } + break; + case 0xFF5D: + length = readUint16(data, position); + var qcc = {}; + j = position + 2; + var cqcc; + if (context.SIZ.Csiz < 257) { + cqcc = data[j++]; + } else { + cqcc = readUint16(data, j); + j += 2; + } + sqcd = data[j++]; + switch (sqcd & 0x1F) { + case 0: + spqcdSize = 8; + scalarExpounded = true; + break; + case 1: + spqcdSize = 16; + scalarExpounded = false; + break; + case 2: + spqcdSize = 16; + scalarExpounded = true; + break; + default: + throw new Error('Invalid SQcd value ' + sqcd); + } + qcc.noQuantization = spqcdSize === 8; + qcc.scalarExpounded = scalarExpounded; + qcc.guardBits = sqcd >> 5; + spqcds = []; + while (j < length + position) { + spqcd = {}; + if (spqcdSize === 8) { + spqcd.epsilon = data[j++] >> 3; + spqcd.mu = 0; + } else { + spqcd.epsilon = data[j] >> 3; + spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1]; + j += 2; + } + spqcds.push(spqcd); + } + qcc.SPqcds = spqcds; + if (context.mainHeader) { + context.QCC[cqcc] = qcc; + } else { + context.currentTile.QCC[cqcc] = qcc; + } + break; + case 0xFF52: + length = readUint16(data, position); + var cod = {}; + j = position + 2; + var scod = data[j++]; + cod.entropyCoderWithCustomPrecincts = !!(scod & 1); + cod.sopMarkerUsed = !!(scod & 2); + cod.ephMarkerUsed = !!(scod & 4); + cod.progressionOrder = data[j++]; + cod.layersCount = readUint16(data, j); + j += 2; + cod.multipleComponentTransform = data[j++]; + cod.decompositionLevelsCount = data[j++]; + cod.xcb = (data[j++] & 0xF) + 2; + cod.ycb = (data[j++] & 0xF) + 2; + var blockStyle = data[j++]; + cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); + cod.resetContextProbabilities = !!(blockStyle & 2); + cod.terminationOnEachCodingPass = !!(blockStyle & 4); + cod.verticalyStripe = !!(blockStyle & 8); + cod.predictableTermination = !!(blockStyle & 16); + cod.segmentationSymbolUsed = !!(blockStyle & 32); + cod.reversibleTransformation = data[j++]; + if (cod.entropyCoderWithCustomPrecincts) { + var precinctsSizes = []; + while (j < length + position) { + var precinctsSize = data[j++]; + precinctsSizes.push({ + PPx: precinctsSize & 0xF, + PPy: precinctsSize >> 4 + }); + } + cod.precinctsSizes = precinctsSizes; + } + var unsupported = []; + if (cod.selectiveArithmeticCodingBypass) { + unsupported.push('selectiveArithmeticCodingBypass'); + } + if (cod.resetContextProbabilities) { + unsupported.push('resetContextProbabilities'); + } + if (cod.terminationOnEachCodingPass) { + unsupported.push('terminationOnEachCodingPass'); + } + if (cod.verticalyStripe) { + unsupported.push('verticalyStripe'); + } + if (cod.predictableTermination) { + unsupported.push('predictableTermination'); + } + if (unsupported.length > 0) { + doNotRecover = true; + throw new Error('Unsupported COD options (' + unsupported.join(', ') + ')'); + } + if (context.mainHeader) { + context.COD = cod; + } else { + context.currentTile.COD = cod; + context.currentTile.COC = []; + } + break; + case 0xFF90: + length = readUint16(data, position); + tile = {}; + tile.index = readUint16(data, position + 2); + tile.length = readUint32(data, position + 4); + tile.dataEnd = tile.length + position - 2; + tile.partIndex = data[position + 8]; + tile.partsCount = data[position + 9]; + context.mainHeader = false; + if (tile.partIndex === 0) { + tile.COD = context.COD; + tile.COC = context.COC.slice(0); + tile.QCD = context.QCD; + tile.QCC = context.QCC.slice(0); + } + context.currentTile = tile; + break; + case 0xFF93: + tile = context.currentTile; + if (tile.partIndex === 0) { + initializeTile(context, tile.index); + buildPackets(context); + } + length = tile.dataEnd - position; + parseTilePackets(context, data, position, length); + break; + case 0xFF55: + case 0xFF57: + case 0xFF58: + case 0xFF64: + length = readUint16(data, position); + break; + case 0xFF53: + throw new Error('Codestream code 0xFF53 (COC) is ' + 'not implemented'); + default: + throw new Error('Unknown codestream code: ' + code.toString(16)); + } + position += length; + } + } catch (e) { + if (doNotRecover || this.failOnCorruptedImage) { + error('JPX Error: ' + e.message); + } else { + warn('JPX: Trying to recover from: ' + e.message); + } + } + this.tiles = transformComponents(context); + this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; + this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; + this.componentsCount = context.SIZ.Csiz; + } + }; + function calculateComponentDimensions(component, siz) { + component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); + component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); + component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); + component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); + component.width = component.x1 - component.x0; + component.height = component.y1 - component.y0; + } + function calculateTileGrids(context, components) { + var siz = context.SIZ; + var tile, tiles = []; + var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); + var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); + for (var q = 0; q < numYtiles; q++) { + for (var p = 0; p < numXtiles; p++) { + tile = {}; + tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); + tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); + tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); + tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); + tile.width = tile.tx1 - tile.tx0; + tile.height = tile.ty1 - tile.ty0; + tile.components = []; + tiles.push(tile); + } + } + context.tiles = tiles; + var componentsCount = siz.Csiz; + for (var i = 0, ii = componentsCount; i < ii; i++) { + var component = components[i]; + for (var j = 0, jj = tiles.length; j < jj; j++) { + var tileComponent = {}; + tile = tiles[j]; + tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); + tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); + tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); + tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); + tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; + tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; + tile.components[i] = tileComponent; + } + } + } + function getBlocksDimensions(context, component, r) { + var codOrCoc = component.codingStyleParameters; + var result = {}; + if (!codOrCoc.entropyCoderWithCustomPrecincts) { + result.PPx = 15; + result.PPy = 15; + } else { + result.PPx = codOrCoc.precinctsSizes[r].PPx; + result.PPy = codOrCoc.precinctsSizes[r].PPy; + } + result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx); + result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy); + return result; + } + function buildPrecincts(context, resolution, dimensions) { + var precinctWidth = 1 << dimensions.PPx; + var precinctHeight = 1 << dimensions.PPy; + var isZeroRes = resolution.resLevel === 0; + var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1); + var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1); + var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0; + var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0; + var numprecincts = numprecinctswide * numprecinctshigh; + resolution.precinctParameters = { + precinctWidth: precinctWidth, + precinctHeight: precinctHeight, + numprecinctswide: numprecinctswide, + numprecinctshigh: numprecinctshigh, + numprecincts: numprecincts, + precinctWidthInSubband: precinctWidthInSubband, + precinctHeightInSubband: precinctHeightInSubband + }; + } + function buildCodeblocks(context, subband, dimensions) { + var xcb_ = dimensions.xcb_; + var ycb_ = dimensions.ycb_; + var codeblockWidth = 1 << xcb_; + var codeblockHeight = 1 << ycb_; + var cbx0 = subband.tbx0 >> xcb_; + var cby0 = subband.tby0 >> ycb_; + var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_; + var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_; + var precinctParameters = subband.resolution.precinctParameters; + var codeblocks = []; + var precincts = []; + var i, j, codeblock, precinctNumber; + for (j = cby0; j < cby1; j++) { + for (i = cbx0; i < cbx1; i++) { + codeblock = { + cbx: i, + cby: j, + tbx0: codeblockWidth * i, + tby0: codeblockHeight * j, + tbx1: codeblockWidth * (i + 1), + tby1: codeblockHeight * (j + 1) + }; + codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); + codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); + codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); + codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); + var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband); + var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband); + precinctNumber = pi + pj * precinctParameters.numprecinctswide; + codeblock.precinctNumber = precinctNumber; + codeblock.subbandType = subband.type; + codeblock.Lblock = 3; + if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) { + continue; + } + codeblocks.push(codeblock); + var precinct = precincts[precinctNumber]; + if (precinct !== undefined) { + if (i < precinct.cbxMin) { + precinct.cbxMin = i; + } else if (i > precinct.cbxMax) { + precinct.cbxMax = i; + } + if (j < precinct.cbyMin) { + precinct.cbxMin = j; + } else if (j > precinct.cbyMax) { + precinct.cbyMax = j; + } + } else { + precincts[precinctNumber] = precinct = { + cbxMin: i, + cbyMin: j, + cbxMax: i, + cbyMax: j + }; + } + codeblock.precinct = precinct; + } + } + subband.codeblockParameters = { + codeblockWidth: xcb_, + codeblockHeight: ycb_, + numcodeblockwide: cbx1 - cbx0 + 1, + numcodeblockhigh: cby1 - cby0 + 1 + }; + subband.codeblocks = codeblocks; + subband.precincts = precincts; + } + function createPacket(resolution, precinctNumber, layerNumber) { + var precinctCodeblocks = []; + var subbands = resolution.subbands; + for (var i = 0, ii = subbands.length; i < ii; i++) { + var subband = subbands[i]; + var codeblocks = subband.codeblocks; + for (var j = 0, jj = codeblocks.length; j < jj; j++) { + var codeblock = codeblocks[j]; + if (codeblock.precinctNumber !== precinctNumber) { + continue; + } + precinctCodeblocks.push(codeblock); + } + } + return { + layerNumber: layerNumber, + codeblocks: precinctCodeblocks + }; + } + function LayerResolutionComponentPositionIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var maxDecompositionLevelsCount = 0; + for (var q = 0; q < componentsCount; q++) { + maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); + } + var l = 0, r = 0, i = 0, k = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; l < layersCount; l++) { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; i < componentsCount; i++) { + var component = tile.components[i]; + if (r > component.codingStyleParameters.decompositionLevelsCount) { + continue; + } + var resolution = component.resolutions[r]; + var numprecincts = resolution.precinctParameters.numprecincts; + for (; k < numprecincts;) { + var packet = createPacket(resolution, k, l); + k++; + return packet; + } + k = 0; + } + i = 0; + } + r = 0; + } + error('JPX Error: Out of packets'); + }; + } + function ResolutionLayerComponentPositionIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var maxDecompositionLevelsCount = 0; + for (var q = 0; q < componentsCount; q++) { + maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount); + } + var r = 0, l = 0, i = 0, k = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; l < layersCount; l++) { + for (; i < componentsCount; i++) { + var component = tile.components[i]; + if (r > component.codingStyleParameters.decompositionLevelsCount) { + continue; + } + var resolution = component.resolutions[r]; + var numprecincts = resolution.precinctParameters.numprecincts; + for (; k < numprecincts;) { + var packet = createPacket(resolution, k, l); + k++; + return packet; + } + k = 0; + } + i = 0; + } + l = 0; + } + error('JPX Error: Out of packets'); + }; + } + function ResolutionPositionComponentLayerIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var l, r, c, p; + var maxDecompositionLevelsCount = 0; + for (c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount); + } + var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1); + for (r = 0; r <= maxDecompositionLevelsCount; ++r) { + var maxNumPrecincts = 0; + for (c = 0; c < componentsCount; ++c) { + var resolutions = tile.components[c].resolutions; + if (r < resolutions.length) { + maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts); + } + } + maxNumPrecinctsInLevel[r] = maxNumPrecincts; + } + l = 0; + r = 0; + c = 0; + p = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; r <= maxDecompositionLevelsCount; r++) { + for (; p < maxNumPrecinctsInLevel[r]; p++) { + for (; c < componentsCount; c++) { + var component = tile.components[c]; + if (r > component.codingStyleParameters.decompositionLevelsCount) { + continue; + } + var resolution = component.resolutions[r]; + var numprecincts = resolution.precinctParameters.numprecincts; + if (p >= numprecincts) { + continue; + } + for (; l < layersCount;) { + var packet = createPacket(resolution, p, l); + l++; + return packet; + } + l = 0; + } + c = 0; + } + p = 0; + } + error('JPX Error: Out of packets'); + }; + } + function PositionComponentResolutionLayerIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var precinctsSizes = getPrecinctSizesInImageScale(tile); + var precinctsIterationSizes = precinctsSizes; + var l = 0, r = 0, c = 0, px = 0, py = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; py < precinctsIterationSizes.maxNumHigh; py++) { + for (; px < precinctsIterationSizes.maxNumWide; px++) { + for (; c < componentsCount; c++) { + var component = tile.components[c]; + var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + for (; r <= decompositionLevelsCount; r++) { + var resolution = component.resolutions[r]; + var sizeInImageScale = precinctsSizes.components[c].resolutions[r]; + var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); + if (k === null) { + continue; + } + for (; l < layersCount;) { + var packet = createPacket(resolution, k, l); + l++; + return packet; + } + l = 0; + } + r = 0; + } + c = 0; + } + px = 0; + } + error('JPX Error: Out of packets'); + }; + } + function ComponentPositionResolutionLayerIterator(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var layersCount = tile.codingStyleDefaultParameters.layersCount; + var componentsCount = siz.Csiz; + var precinctsSizes = getPrecinctSizesInImageScale(tile); + var l = 0, r = 0, c = 0, px = 0, py = 0; + this.nextPacket = function JpxImage_nextPacket() { + for (; c < componentsCount; ++c) { + var component = tile.components[c]; + var precinctsIterationSizes = precinctsSizes.components[c]; + var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + for (; py < precinctsIterationSizes.maxNumHigh; py++) { + for (; px < precinctsIterationSizes.maxNumWide; px++) { + for (; r <= decompositionLevelsCount; r++) { + var resolution = component.resolutions[r]; + var sizeInImageScale = precinctsIterationSizes.resolutions[r]; + var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution); + if (k === null) { + continue; + } + for (; l < layersCount;) { + var packet = createPacket(resolution, k, l); + l++; + return packet; + } + l = 0; + } + r = 0; + } + px = 0; + } + py = 0; + } + error('JPX Error: Out of packets'); + }; + } + function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { + var posX = pxIndex * precinctIterationSizes.minWidth; + var posY = pyIndex * precinctIterationSizes.minHeight; + if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) { + return null; + } + var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide; + return posX / sizeInImageScale.height + startPrecinctRowIndex; + } + function getPrecinctSizesInImageScale(tile) { + var componentsCount = tile.components.length; + var minWidth = Number.MAX_VALUE; + var minHeight = Number.MAX_VALUE; + var maxNumWide = 0; + var maxNumHigh = 0; + var sizePerComponent = new Array(componentsCount); + for (var c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + var sizePerResolution = new Array(decompositionLevelsCount + 1); + var minWidthCurrentComponent = Number.MAX_VALUE; + var minHeightCurrentComponent = Number.MAX_VALUE; + var maxNumWideCurrentComponent = 0; + var maxNumHighCurrentComponent = 0; + var scale = 1; + for (var r = decompositionLevelsCount; r >= 0; --r) { + var resolution = component.resolutions[r]; + var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth; + var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight; + minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution); + minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution); + maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide); + maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh); + sizePerResolution[r] = { + width: widthCurrentResolution, + height: heightCurrentResolution + }; + scale <<= 1; + } + minWidth = Math.min(minWidth, minWidthCurrentComponent); + minHeight = Math.min(minHeight, minHeightCurrentComponent); + maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); + maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); + sizePerComponent[c] = { + resolutions: sizePerResolution, + minWidth: minWidthCurrentComponent, + minHeight: minHeightCurrentComponent, + maxNumWide: maxNumWideCurrentComponent, + maxNumHigh: maxNumHighCurrentComponent + }; + } + return { + components: sizePerComponent, + minWidth: minWidth, + minHeight: minHeight, + maxNumWide: maxNumWide, + maxNumHigh: maxNumHigh + }; + } + function buildPackets(context) { + var siz = context.SIZ; + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var componentsCount = siz.Csiz; + for (var c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount; + var resolutions = []; + var subbands = []; + for (var r = 0; r <= decompositionLevelsCount; r++) { + var blocksDimensions = getBlocksDimensions(context, component, r); + var resolution = {}; + var scale = 1 << decompositionLevelsCount - r; + resolution.trx0 = Math.ceil(component.tcx0 / scale); + resolution.try0 = Math.ceil(component.tcy0 / scale); + resolution.trx1 = Math.ceil(component.tcx1 / scale); + resolution.try1 = Math.ceil(component.tcy1 / scale); + resolution.resLevel = r; + buildPrecincts(context, resolution, blocksDimensions); + resolutions.push(resolution); + var subband; + if (r === 0) { + subband = {}; + subband.type = 'LL'; + subband.tbx0 = Math.ceil(component.tcx0 / scale); + subband.tby0 = Math.ceil(component.tcy0 / scale); + subband.tbx1 = Math.ceil(component.tcx1 / scale); + subband.tby1 = Math.ceil(component.tcy1 / scale); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolution.subbands = [subband]; + } else { + var bscale = 1 << decompositionLevelsCount - r + 1; + var resolutionSubbands = []; + subband = {}; + subband.type = 'HL'; + subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); + subband.tby0 = Math.ceil(component.tcy0 / bscale); + subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); + subband.tby1 = Math.ceil(component.tcy1 / bscale); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + subband = {}; + subband.type = 'LH'; + subband.tbx0 = Math.ceil(component.tcx0 / bscale); + subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); + subband.tbx1 = Math.ceil(component.tcx1 / bscale); + subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + subband = {}; + subband.type = 'HH'; + subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); + subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); + subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); + subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); + subband.resolution = resolution; + buildCodeblocks(context, subband, blocksDimensions); + subbands.push(subband); + resolutionSubbands.push(subband); + resolution.subbands = resolutionSubbands; + } + } + component.resolutions = resolutions; + component.subbands = subbands; + } + var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; + switch (progressionOrder) { + case 0: + tile.packetsIterator = new LayerResolutionComponentPositionIterator(context); + break; + case 1: + tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context); + break; + case 2: + tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context); + break; + case 3: + tile.packetsIterator = new PositionComponentResolutionLayerIterator(context); + break; + case 4: + tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context); + break; + default: + error('JPX Error: Unsupported progression order ' + progressionOrder); + } + } + function parseTilePackets(context, data, offset, dataLength) { + var position = 0; + var buffer, bufferSize = 0, skipNextBit = false; + function readBits(count) { + while (bufferSize < count) { + var b = data[offset + position]; + position++; + if (skipNextBit) { + buffer = buffer << 7 | b; + bufferSize += 7; + skipNextBit = false; + } else { + buffer = buffer << 8 | b; + bufferSize += 8; + } + if (b === 0xFF) { + skipNextBit = true; + } + } + bufferSize -= count; + return buffer >>> bufferSize & (1 << count) - 1; + } + function skipMarkerIfEqual(value) { + if (data[offset + position - 1] === 0xFF && data[offset + position] === value) { + skipBytes(1); + return true; + } else if (data[offset + position] === 0xFF && data[offset + position + 1] === value) { + skipBytes(2); + return true; + } + return false; + } + function skipBytes(count) { + position += count; + } + function alignToByte() { + bufferSize = 0; + if (skipNextBit) { + position++; + skipNextBit = false; + } + } + function readCodingpasses() { + if (readBits(1) === 0) { + return 1; + } + if (readBits(1) === 0) { + return 2; + } + var value = readBits(2); + if (value < 3) { + return value + 3; + } + value = readBits(5); + if (value < 31) { + return value + 6; + } + value = readBits(7); + return value + 37; + } + var tileIndex = context.currentTile.index; + var tile = context.tiles[tileIndex]; + var sopMarkerUsed = context.COD.sopMarkerUsed; + var ephMarkerUsed = context.COD.ephMarkerUsed; + var packetsIterator = tile.packetsIterator; + while (position < dataLength) { + alignToByte(); + if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { + skipBytes(4); + } + var packet = packetsIterator.nextPacket(); + if (!readBits(1)) { + continue; + } + var layerNumber = packet.layerNumber; + var queue = [], codeblock; + for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { + codeblock = packet.codeblocks[i]; + var precinct = codeblock.precinct; + var codeblockColumn = codeblock.cbx - precinct.cbxMin; + var codeblockRow = codeblock.cby - precinct.cbyMin; + var codeblockIncluded = false; + var firstTimeInclusion = false; + var valueReady; + if (codeblock['included'] !== undefined) { + codeblockIncluded = !!readBits(1); + } else { + precinct = codeblock.precinct; + var inclusionTree, zeroBitPlanesTree; + if (precinct['inclusionTree'] !== undefined) { + inclusionTree = precinct.inclusionTree; + } else { + var width = precinct.cbxMax - precinct.cbxMin + 1; + var height = precinct.cbyMax - precinct.cbyMin + 1; + inclusionTree = new InclusionTree(width, height, layerNumber); + zeroBitPlanesTree = new TagTree(width, height); + precinct.inclusionTree = inclusionTree; + precinct.zeroBitPlanesTree = zeroBitPlanesTree; + } + if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { + while (true) { + if (readBits(1)) { + valueReady = !inclusionTree.nextLevel(); + if (valueReady) { + codeblock.included = true; + codeblockIncluded = firstTimeInclusion = true; + break; + } + } else { + inclusionTree.incrementValue(layerNumber); + break; + } + } + } + } + if (!codeblockIncluded) { + continue; + } + if (firstTimeInclusion) { + zeroBitPlanesTree = precinct.zeroBitPlanesTree; + zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); + while (true) { + if (readBits(1)) { + valueReady = !zeroBitPlanesTree.nextLevel(); + if (valueReady) { + break; + } + } else { + zeroBitPlanesTree.incrementValue(); + } + } + codeblock.zeroBitPlanes = zeroBitPlanesTree.value; + } + var codingpasses = readCodingpasses(); + while (readBits(1)) { + codeblock.Lblock++; + } + var codingpassesLog2 = log2(codingpasses); + var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; + var codedDataLength = readBits(bits); + queue.push({ + codeblock: codeblock, + codingpasses: codingpasses, + dataLength: codedDataLength + }); + } + alignToByte(); + if (ephMarkerUsed) { + skipMarkerIfEqual(0x92); + } + while (queue.length > 0) { + var packetItem = queue.shift(); + codeblock = packetItem.codeblock; + if (codeblock['data'] === undefined) { + codeblock.data = []; + } + codeblock.data.push({ + data: data, + start: offset + position, + end: offset + position + packetItem.dataLength, + codingpasses: packetItem.codingpasses + }); + position += packetItem.dataLength; + } + } + return position; + } + function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) { + var x0 = subband.tbx0; + var y0 = subband.tby0; + var width = subband.tbx1 - subband.tbx0; + var codeblocks = subband.codeblocks; + var right = subband.type.charAt(0) === 'H' ? 1 : 0; + var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0; + for (var i = 0, ii = codeblocks.length; i < ii; ++i) { + var codeblock = codeblocks[i]; + var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; + var blockHeight = codeblock.tby1_ - codeblock.tby0_; + if (blockWidth === 0 || blockHeight === 0) { + continue; + } + if (codeblock['data'] === undefined) { + continue; + } + var bitModel, currentCodingpassType; + bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb); + currentCodingpassType = 2; + var data = codeblock.data, totalLength = 0, codingpasses = 0; + var j, jj, dataItem; + for (j = 0, jj = data.length; j < jj; j++) { + dataItem = data[j]; + totalLength += dataItem.end - dataItem.start; + codingpasses += dataItem.codingpasses; + } + var encodedData = new Uint8Array(totalLength); + var position = 0; + for (j = 0, jj = data.length; j < jj; j++) { + dataItem = data[j]; + var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); + encodedData.set(chunk, position); + position += chunk.length; + } + var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); + bitModel.setDecoder(decoder); + for (j = 0; j < codingpasses; j++) { + switch (currentCodingpassType) { + case 0: + bitModel.runSignificancePropagationPass(); + break; + case 1: + bitModel.runMagnitudeRefinementPass(); + break; + case 2: + bitModel.runCleanupPass(); + if (segmentationSymbolUsed) { + bitModel.checkSegmentationSymbol(); + } + break; + } + currentCodingpassType = (currentCodingpassType + 1) % 3; + } + var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width; + var sign = bitModel.coefficentsSign; + var magnitude = bitModel.coefficentsMagnitude; + var bitsDecoded = bitModel.bitsDecoded; + var magnitudeCorrection = reversible ? 0 : 0.5; + var k, n, nb; + position = 0; + var interleave = subband.type !== 'LL'; + for (j = 0; j < blockHeight; j++) { + var row = offset / width | 0; + var levelOffset = 2 * row * (levelWidth - width) + right + bottom; + for (k = 0; k < blockWidth; k++) { + n = magnitude[position]; + if (n !== 0) { + n = (n + magnitudeCorrection) * delta; + if (sign[position] !== 0) { + n = -n; + } + nb = bitsDecoded[position]; + var pos = interleave ? levelOffset + (offset << 1) : offset; + if (reversible && nb >= mb) { + coefficients[pos] = n; + } else { + coefficients[pos] = n * (1 << mb - nb); + } + } + offset++; + position++; + } + offset += width - blockWidth; + } + } + } + function transformTile(context, tile, c) { + var component = tile.components[c]; + var codingStyleParameters = component.codingStyleParameters; + var quantizationParameters = component.quantizationParameters; + var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount; + var spqcds = quantizationParameters.SPqcds; + var scalarExpounded = quantizationParameters.scalarExpounded; + var guardBits = quantizationParameters.guardBits; + var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; + var precision = context.components[c].precision; + var reversible = codingStyleParameters.reversibleTransformation; + var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform(); + var subbandCoefficients = []; + var b = 0; + for (var i = 0; i <= decompositionLevelsCount; i++) { + var resolution = component.resolutions[i]; + var width = resolution.trx1 - resolution.trx0; + var height = resolution.try1 - resolution.try0; + var coefficients = new Float32Array(width * height); + for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { + var mu, epsilon; + if (!scalarExpounded) { + mu = spqcds[0].mu; + epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); + } else { + mu = spqcds[b].mu; + epsilon = spqcds[b].epsilon; + b++; + } + var subband = resolution.subbands[j]; + var gainLog2 = SubbandsGainLog2[subband.type]; + var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048); + var mb = guardBits + epsilon - 1; + copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed); + } + subbandCoefficients.push({ + width: width, + height: height, + items: coefficients + }); + } + var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0); + return { + left: component.tcx0, + top: component.tcy0, + width: result.width, + height: result.height, + items: result.items + }; + } + function transformComponents(context) { + var siz = context.SIZ; + var components = context.components; + var componentsCount = siz.Csiz; + var resultImages = []; + for (var i = 0, ii = context.tiles.length; i < ii; i++) { + var tile = context.tiles[i]; + var transformedTiles = []; + var c; + for (c = 0; c < componentsCount; c++) { + transformedTiles[c] = transformTile(context, tile, c); + } + var tile0 = transformedTiles[0]; + var out = new Uint8Array(tile0.items.length * componentsCount); + var result = { + left: tile0.left, + top: tile0.top, + width: tile0.width, + height: tile0.height, + items: out + }; + var shift, offset, max, min, maxK; + var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; + if (tile.codingStyleDefaultParameters.multipleComponentTransform) { + var fourComponents = componentsCount === 4; + var y0items = transformedTiles[0].items; + var y1items = transformedTiles[1].items; + var y2items = transformedTiles[2].items; + var y3items = fourComponents ? transformedTiles[3].items : null; + shift = components[0].precision - 8; + offset = (128 << shift) + 0.5; + max = 255 * (1 << shift); + maxK = max * 0.5; + min = -maxK; + var component0 = tile.components[0]; + var alpha01 = componentsCount - 3; + jj = y0items.length; + if (!component0.codingStyleParameters.reversibleTransformation) { + for (j = 0; j < jj; j++, pos += alpha01) { + y0 = y0items[j] + offset; + y1 = y1items[j]; + y2 = y2items[j]; + r = y0 + 1.402 * y2; + g = y0 - 0.34413 * y1 - 0.71414 * y2; + b = y0 + 1.772 * y1; + out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; + out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; + out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; + } + } else { + for (j = 0; j < jj; j++, pos += alpha01) { + y0 = y0items[j] + offset; + y1 = y1items[j]; + y2 = y2items[j]; + g = y0 - (y2 + y1 >> 2); + r = g + y2; + b = g + y1; + out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; + out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; + out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; + } + } + if (fourComponents) { + for (j = 0, pos = 3; j < jj; j++, pos += 4) { + k = y3items[j]; + out[pos] = k <= min ? 0 : k >= maxK ? 255 : k + offset >> shift; + } + } + } else { + for (c = 0; c < componentsCount; c++) { + var items = transformedTiles[c].items; + shift = components[c].precision - 8; + offset = (128 << shift) + 0.5; + max = 127.5 * (1 << shift); + min = -max; + for (pos = c, j = 0, jj = items.length; j < jj; j++) { + val = items[j]; + out[pos] = val <= min ? 0 : val >= max ? 255 : val + offset >> shift; + pos += componentsCount; + } + } + } + resultImages.push(result); + } + return resultImages; + } + function initializeTile(context, tileIndex) { + var siz = context.SIZ; + var componentsCount = siz.Csiz; + var tile = context.tiles[tileIndex]; + for (var c = 0; c < componentsCount; c++) { + var component = tile.components[c]; + var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD; + component.quantizationParameters = qcdOrQcc; + var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD; + component.codingStyleParameters = codOrCoc; + } + tile.codingStyleDefaultParameters = context.currentTile.COD; + } + var TagTree = function TagTreeClosure() { + function TagTree(width, height) { + var levelsLength = log2(Math.max(width, height)) + 1; + this.levels = []; + for (var i = 0; i < levelsLength; i++) { + var level = { + width: width, + height: height, + items: [] + }; + this.levels.push(level); + width = Math.ceil(width / 2); + height = Math.ceil(height / 2); + } + } + TagTree.prototype = { + reset: function TagTree_reset(i, j) { + var currentLevel = 0, value = 0, level; + while (currentLevel < this.levels.length) { + level = this.levels[currentLevel]; + var index = i + j * level.width; + if (level.items[index] !== undefined) { + value = level.items[index]; + break; + } + level.index = index; + i >>= 1; + j >>= 1; + currentLevel++; + } + currentLevel--; + level = this.levels[currentLevel]; + level.items[level.index] = value; + this.currentLevel = currentLevel; + delete this.value; + }, + incrementValue: function TagTree_incrementValue() { + var level = this.levels[this.currentLevel]; + level.items[level.index]++; + }, + nextLevel: function TagTree_nextLevel() { + var currentLevel = this.currentLevel; + var level = this.levels[currentLevel]; + var value = level.items[level.index]; + currentLevel--; + if (currentLevel < 0) { + this.value = value; + return false; + } + this.currentLevel = currentLevel; + level = this.levels[currentLevel]; + level.items[level.index] = value; + return true; + } + }; + return TagTree; + }(); + var InclusionTree = function InclusionTreeClosure() { + function InclusionTree(width, height, defaultValue) { + var levelsLength = log2(Math.max(width, height)) + 1; + this.levels = []; + for (var i = 0; i < levelsLength; i++) { + var items = new Uint8Array(width * height); + for (var j = 0, jj = items.length; j < jj; j++) { + items[j] = defaultValue; + } + var level = { + width: width, + height: height, + items: items + }; + this.levels.push(level); + width = Math.ceil(width / 2); + height = Math.ceil(height / 2); + } + } + InclusionTree.prototype = { + reset: function InclusionTree_reset(i, j, stopValue) { + var currentLevel = 0; + while (currentLevel < this.levels.length) { + var level = this.levels[currentLevel]; + var index = i + j * level.width; + level.index = index; + var value = level.items[index]; + if (value === 0xFF) { + break; + } + if (value > stopValue) { + this.currentLevel = currentLevel; + this.propagateValues(); + return false; + } + i >>= 1; + j >>= 1; + currentLevel++; + } + this.currentLevel = currentLevel - 1; + return true; + }, + incrementValue: function InclusionTree_incrementValue(stopValue) { + var level = this.levels[this.currentLevel]; + level.items[level.index] = stopValue + 1; + this.propagateValues(); + }, + propagateValues: function InclusionTree_propagateValues() { + var levelIndex = this.currentLevel; + var level = this.levels[levelIndex]; + var currentValue = level.items[level.index]; + while (--levelIndex >= 0) { + level = this.levels[levelIndex]; + level.items[level.index] = currentValue; + } + }, + nextLevel: function InclusionTree_nextLevel() { + var currentLevel = this.currentLevel; + var level = this.levels[currentLevel]; + var value = level.items[level.index]; + level.items[level.index] = 0xFF; + currentLevel--; + if (currentLevel < 0) { + return false; + } + this.currentLevel = currentLevel; + level = this.levels[currentLevel]; + level.items[level.index] = value; + return true; + } + }; + return InclusionTree; + }(); + var BitModel = function BitModelClosure() { + var UNIFORM_CONTEXT = 17; + var RUNLENGTH_CONTEXT = 18; + var LLAndLHContextsLabel = new Uint8Array([ + 0, + 5, + 8, + 0, + 3, + 7, + 8, + 0, + 4, + 7, + 8, + 0, + 0, + 0, + 0, + 0, + 1, + 6, + 8, + 0, + 3, + 7, + 8, + 0, + 4, + 7, + 8, + 0, + 0, + 0, + 0, + 0, + 2, + 6, + 8, + 0, + 3, + 7, + 8, + 0, + 4, + 7, + 8, + 0, + 0, + 0, + 0, + 0, + 2, + 6, + 8, + 0, + 3, + 7, + 8, + 0, + 4, + 7, + 8, + 0, + 0, + 0, + 0, + 0, + 2, + 6, + 8, + 0, + 3, + 7, + 8, + 0, + 4, + 7, + 8 + ]); + var HLContextLabel = new Uint8Array([ + 0, + 3, + 4, + 0, + 5, + 7, + 7, + 0, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 0, + 1, + 3, + 4, + 0, + 6, + 7, + 7, + 0, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 0, + 2, + 3, + 4, + 0, + 6, + 7, + 7, + 0, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 0, + 2, + 3, + 4, + 0, + 6, + 7, + 7, + 0, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 0, + 2, + 3, + 4, + 0, + 6, + 7, + 7, + 0, + 8, + 8, + 8 + ]); + var HHContextLabel = new Uint8Array([ + 0, + 1, + 2, + 0, + 1, + 2, + 2, + 0, + 2, + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 3, + 4, + 5, + 0, + 4, + 5, + 5, + 0, + 5, + 5, + 5, + 0, + 0, + 0, + 0, + 0, + 6, + 7, + 7, + 0, + 7, + 7, + 7, + 0, + 7, + 7, + 7, + 0, + 0, + 0, + 0, + 0, + 8, + 8, + 8, + 0, + 8, + 8, + 8, + 0, + 8, + 8, + 8, + 0, + 0, + 0, + 0, + 0, + 8, + 8, + 8, + 0, + 8, + 8, + 8, + 0, + 8, + 8, + 8 + ]); + function BitModel(width, height, subband, zeroBitPlanes, mb) { + this.width = width; + this.height = height; + this.contextLabelTable = subband === 'HH' ? HHContextLabel : subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel; + var coefficientCount = width * height; + this.neighborsSignificance = new Uint8Array(coefficientCount); + this.coefficentsSign = new Uint8Array(coefficientCount); + this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount); + this.processingFlags = new Uint8Array(coefficientCount); + var bitsDecoded = new Uint8Array(coefficientCount); + if (zeroBitPlanes !== 0) { + for (var i = 0; i < coefficientCount; i++) { + bitsDecoded[i] = zeroBitPlanes; + } + } + this.bitsDecoded = bitsDecoded; + this.reset(); + } + BitModel.prototype = { + setDecoder: function BitModel_setDecoder(decoder) { + this.decoder = decoder; + }, + reset: function BitModel_reset() { + this.contexts = new Int8Array(19); + this.contexts[0] = 4 << 1 | 0; + this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0; + this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0; + }, + setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) { + var neighborsSignificance = this.neighborsSignificance; + var width = this.width, height = this.height; + var left = column > 0; + var right = column + 1 < width; + var i; + if (row > 0) { + i = index - width; + if (left) { + neighborsSignificance[i - 1] += 0x10; + } + if (right) { + neighborsSignificance[i + 1] += 0x10; + } + neighborsSignificance[i] += 0x04; + } + if (row + 1 < height) { + i = index + width; + if (left) { + neighborsSignificance[i - 1] += 0x10; + } + if (right) { + neighborsSignificance[i + 1] += 0x10; + } + neighborsSignificance[i] += 0x04; + } + if (left) { + neighborsSignificance[index - 1] += 0x01; + } + if (right) { + neighborsSignificance[index + 1] += 0x01; + } + neighborsSignificance[index] |= 0x80; + }, + runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() { + var decoder = this.decoder; + var width = this.width, height = this.height; + var coefficentsMagnitude = this.coefficentsMagnitude; + var coefficentsSign = this.coefficentsSign; + var neighborsSignificance = this.neighborsSignificance; + var processingFlags = this.processingFlags; + var contexts = this.contexts; + var labels = this.contextLabelTable; + var bitsDecoded = this.bitsDecoded; + var processedInverseMask = ~1; + var processedMask = 1; + var firstMagnitudeBitMask = 2; + for (var i0 = 0; i0 < height; i0 += 4) { + for (var j = 0; j < width; j++) { + var index = i0 * width + j; + for (var i1 = 0; i1 < 4; i1++, index += width) { + var i = i0 + i1; + if (i >= height) { + break; + } + processingFlags[index] &= processedInverseMask; + if (coefficentsMagnitude[index] || !neighborsSignificance[index]) { + continue; + } + var contextLabel = labels[neighborsSignificance[index]]; + var decision = decoder.readBit(contexts, contextLabel); + if (decision) { + var sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + } + bitsDecoded[index]++; + processingFlags[index] |= processedMask; + } + } + } + }, + decodeSignBit: function BitModel_decodeSignBit(row, column, index) { + var width = this.width, height = this.height; + var coefficentsMagnitude = this.coefficentsMagnitude; + var coefficentsSign = this.coefficentsSign; + var contribution, sign0, sign1, significance1; + var contextLabel, decoded; + significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0; + if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { + sign1 = coefficentsSign[index + 1]; + if (significance1) { + sign0 = coefficentsSign[index - 1]; + contribution = 1 - sign1 - sign0; + } else { + contribution = 1 - sign1 - sign1; + } + } else if (significance1) { + sign0 = coefficentsSign[index - 1]; + contribution = 1 - sign0 - sign0; + } else { + contribution = 0; + } + var horizontalContribution = 3 * contribution; + significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0; + if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { + sign1 = coefficentsSign[index + width]; + if (significance1) { + sign0 = coefficentsSign[index - width]; + contribution = 1 - sign1 - sign0 + horizontalContribution; + } else { + contribution = 1 - sign1 - sign1 + horizontalContribution; + } + } else if (significance1) { + sign0 = coefficentsSign[index - width]; + contribution = 1 - sign0 - sign0 + horizontalContribution; + } else { + contribution = horizontalContribution; + } + if (contribution >= 0) { + contextLabel = 9 + contribution; + decoded = this.decoder.readBit(this.contexts, contextLabel); + } else { + contextLabel = 9 - contribution; + decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; + } + return decoded; + }, + runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() { + var decoder = this.decoder; + var width = this.width, height = this.height; + var coefficentsMagnitude = this.coefficentsMagnitude; + var neighborsSignificance = this.neighborsSignificance; + var contexts = this.contexts; + var bitsDecoded = this.bitsDecoded; + var processingFlags = this.processingFlags; + var processedMask = 1; + var firstMagnitudeBitMask = 2; + var length = width * height; + var width4 = width * 4; + for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { + indexNext = Math.min(length, index0 + width4); + for (var j = 0; j < width; j++) { + for (var index = index0 + j; index < indexNext; index += width) { + if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { + continue; + } + var contextLabel = 16; + if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { + processingFlags[index] ^= firstMagnitudeBitMask; + var significance = neighborsSignificance[index] & 127; + contextLabel = significance === 0 ? 15 : 14; + } + var bit = decoder.readBit(contexts, contextLabel); + coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit; + bitsDecoded[index]++; + processingFlags[index] |= processedMask; + } + } + } + }, + runCleanupPass: function BitModel_runCleanupPass() { + var decoder = this.decoder; + var width = this.width, height = this.height; + var neighborsSignificance = this.neighborsSignificance; + var coefficentsMagnitude = this.coefficentsMagnitude; + var coefficentsSign = this.coefficentsSign; + var contexts = this.contexts; + var labels = this.contextLabelTable; + var bitsDecoded = this.bitsDecoded; + var processingFlags = this.processingFlags; + var processedMask = 1; + var firstMagnitudeBitMask = 2; + var oneRowDown = width; + var twoRowsDown = width * 2; + var threeRowsDown = width * 3; + var iNext; + for (var i0 = 0; i0 < height; i0 = iNext) { + iNext = Math.min(i0 + 4, height); + var indexBase = i0 * width; + var checkAllEmpty = i0 + 3 < height; + for (var j = 0; j < width; j++) { + var index0 = indexBase + j; + var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0; + var i1 = 0, index = index0; + var i = i0, sign; + if (allEmpty) { + var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT); + if (!hasSignificantCoefficent) { + bitsDecoded[index0]++; + bitsDecoded[index0 + oneRowDown]++; + bitsDecoded[index0 + twoRowsDown]++; + bitsDecoded[index0 + threeRowsDown]++; + continue; + } + i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT); + if (i1 !== 0) { + i = i0 + i1; + index += i1 * width; + } + sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + index = index0; + for (var i2 = i0; i2 <= i; i2++, index += width) { + bitsDecoded[index]++; + } + i1++; + } + for (i = i0 + i1; i < iNext; i++, index += width) { + if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) { + continue; + } + var contextLabel = labels[neighborsSignificance[index]]; + var decision = decoder.readBit(contexts, contextLabel); + if (decision === 1) { + sign = this.decodeSignBit(i, j, index); + coefficentsSign[index] = sign; + coefficentsMagnitude[index] = 1; + this.setNeighborsSignificance(i, j, index); + processingFlags[index] |= firstMagnitudeBitMask; + } + bitsDecoded[index]++; + } + } + } + }, + checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { + var decoder = this.decoder; + var contexts = this.contexts; + var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT); + if (symbol !== 0xA) { + error('JPX Error: Invalid segmentation symbol'); + } + } + }; + return BitModel; + }(); + var Transform = function TransformClosure() { + function Transform() { + } + Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) { + var ll = subbands[0]; + for (var i = 1, ii = subbands.length; i < ii; i++) { + ll = this.iterate(ll, subbands[i], u0, v0); + } + return ll; + }; + Transform.prototype.extend = function extend(buffer, offset, size) { + var i1 = offset - 1, j1 = offset + 1; + var i2 = offset + size - 2, j2 = offset + size; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1--] = buffer[j1++]; + buffer[j2++] = buffer[i2--]; + buffer[i1] = buffer[j1]; + buffer[j2] = buffer[i2]; + }; + Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) { + var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; + var width = hl_lh_hh.width; + var height = hl_lh_hh.height; + var items = hl_lh_hh.items; + var i, j, k, l, u, v; + for (k = 0, i = 0; i < llHeight; i++) { + l = i * 2 * width; + for (j = 0; j < llWidth; j++, k++, l += 2) { + items[l] = llItems[k]; + } + } + llItems = ll.items = null; + var bufferPadding = 4; + var rowBuffer = new Float32Array(width + 2 * bufferPadding); + if (width === 1) { + if ((u0 & 1) !== 0) { + for (v = 0, k = 0; v < height; v++, k += width) { + items[k] *= 0.5; + } + } + } else { + for (v = 0, k = 0; v < height; v++, k += width) { + rowBuffer.set(items.subarray(k, k + width), bufferPadding); + this.extend(rowBuffer, bufferPadding, width); + this.filter(rowBuffer, bufferPadding, width); + items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k); + } + } + var numBuffers = 16; + var colBuffers = []; + for (i = 0; i < numBuffers; i++) { + colBuffers.push(new Float32Array(height + 2 * bufferPadding)); + } + var b, currentBuffer = 0; + ll = bufferPadding + height; + if (height === 1) { + if ((v0 & 1) !== 0) { + for (u = 0; u < width; u++) { + items[u] *= 0.5; + } + } + } else { + for (u = 0; u < width; u++) { + if (currentBuffer === 0) { + numBuffers = Math.min(width - u, numBuffers); + for (k = u, l = bufferPadding; l < ll; k += width, l++) { + for (b = 0; b < numBuffers; b++) { + colBuffers[b][l] = items[k + b]; + } + } + currentBuffer = numBuffers; + } + currentBuffer--; + var buffer = colBuffers[currentBuffer]; + this.extend(buffer, bufferPadding, height); + this.filter(buffer, bufferPadding, height); + if (currentBuffer === 0) { + k = u - numBuffers + 1; + for (l = bufferPadding; l < ll; k += width, l++) { + for (b = 0; b < numBuffers; b++) { + items[k + b] = colBuffers[b][l]; + } + } + } + } + } + return { + width: width, + height: height, + items: items + }; + }; + return Transform; + }(); + var IrreversibleTransform = function IrreversibleTransformClosure() { + function IrreversibleTransform() { + Transform.call(this); + } + IrreversibleTransform.prototype = Object.create(Transform.prototype); + IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) { + var len = length >> 1; + offset = offset | 0; + var j, n, current, next; + var alpha = -1.586134342059924; + var beta = -0.052980118572961; + var gamma = 0.882911075530934; + var delta = 0.443506852043971; + var K = 1.230174104914001; + var K_ = 1 / K; + j = offset - 3; + for (n = len + 4; n--; j += 2) { + x[j] *= K_; + } + j = offset - 2; + current = delta * x[j - 1]; + for (n = len + 3; n--; j += 2) { + next = delta * x[j + 1]; + x[j] = K * x[j] - current - next; + if (n--) { + j += 2; + current = delta * x[j + 1]; + x[j] = K * x[j] - current - next; + } else { + break; + } + } + j = offset - 1; + current = gamma * x[j - 1]; + for (n = len + 2; n--; j += 2) { + next = gamma * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = gamma * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + j = offset; + current = beta * x[j - 1]; + for (n = len + 1; n--; j += 2) { + next = beta * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = beta * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + if (len !== 0) { + j = offset + 1; + current = alpha * x[j - 1]; + for (n = len; n--; j += 2) { + next = alpha * x[j + 1]; + x[j] -= current + next; + if (n--) { + j += 2; + current = alpha * x[j + 1]; + x[j] -= current + next; + } else { + break; + } + } + } + }; + return IrreversibleTransform; + }(); + var ReversibleTransform = function ReversibleTransformClosure() { + function ReversibleTransform() { + Transform.call(this); + } + ReversibleTransform.prototype = Object.create(Transform.prototype); + ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) { + var len = length >> 1; + offset = offset | 0; + var j, n; + for (j = offset, n = len + 1; n--; j += 2) { + x[j] -= x[j - 1] + x[j + 1] + 2 >> 2; + } + for (j = offset + 1, n = len; n--; j += 2) { + x[j] += x[j - 1] + x[j + 1] >> 1; + } + }; + return ReversibleTransform; + }(); + return JpxImage; + }(); + exports.JpxImage = JpxImage; + })); + (function (root, factory) { + factory(root.pdfjsCoreMetrics = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var getLookupTableFactory = sharedUtil.getLookupTableFactory; + var getMetrics = getLookupTableFactory(function (t) { + t['Courier'] = 600; + t['Courier-Bold'] = 600; + t['Courier-BoldOblique'] = 600; + t['Courier-Oblique'] = 600; + t['Helvetica'] = getLookupTableFactory(function (t) { + t['space'] = 278; + t['exclam'] = 278; + t['quotedbl'] = 355; + t['numbersign'] = 556; + t['dollar'] = 556; + t['percent'] = 889; + t['ampersand'] = 667; + t['quoteright'] = 222; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 389; + t['plus'] = 584; + t['comma'] = 278; + t['hyphen'] = 333; + t['period'] = 278; + t['slash'] = 278; + t['zero'] = 556; + t['one'] = 556; + t['two'] = 556; + t['three'] = 556; + t['four'] = 556; + t['five'] = 556; + t['six'] = 556; + t['seven'] = 556; + t['eight'] = 556; + t['nine'] = 556; + t['colon'] = 278; + t['semicolon'] = 278; + t['less'] = 584; + t['equal'] = 584; + t['greater'] = 584; + t['question'] = 556; + t['at'] = 1015; + t['A'] = 667; + t['B'] = 667; + t['C'] = 722; + t['D'] = 722; + t['E'] = 667; + t['F'] = 611; + t['G'] = 778; + t['H'] = 722; + t['I'] = 278; + t['J'] = 500; + t['K'] = 667; + t['L'] = 556; + t['M'] = 833; + t['N'] = 722; + t['O'] = 778; + t['P'] = 667; + t['Q'] = 778; + t['R'] = 722; + t['S'] = 667; + t['T'] = 611; + t['U'] = 722; + t['V'] = 667; + t['W'] = 944; + t['X'] = 667; + t['Y'] = 667; + t['Z'] = 611; + t['bracketleft'] = 278; + t['backslash'] = 278; + t['bracketright'] = 278; + t['asciicircum'] = 469; + t['underscore'] = 556; + t['quoteleft'] = 222; + t['a'] = 556; + t['b'] = 556; + t['c'] = 500; + t['d'] = 556; + t['e'] = 556; + t['f'] = 278; + t['g'] = 556; + t['h'] = 556; + t['i'] = 222; + t['j'] = 222; + t['k'] = 500; + t['l'] = 222; + t['m'] = 833; + t['n'] = 556; + t['o'] = 556; + t['p'] = 556; + t['q'] = 556; + t['r'] = 333; + t['s'] = 500; + t['t'] = 278; + t['u'] = 556; + t['v'] = 500; + t['w'] = 722; + t['x'] = 500; + t['y'] = 500; + t['z'] = 500; + t['braceleft'] = 334; + t['bar'] = 260; + t['braceright'] = 334; + t['asciitilde'] = 584; + t['exclamdown'] = 333; + t['cent'] = 556; + t['sterling'] = 556; + t['fraction'] = 167; + t['yen'] = 556; + t['florin'] = 556; + t['section'] = 556; + t['currency'] = 556; + t['quotesingle'] = 191; + t['quotedblleft'] = 333; + t['guillemotleft'] = 556; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 500; + t['fl'] = 500; + t['endash'] = 556; + t['dagger'] = 556; + t['daggerdbl'] = 556; + t['periodcentered'] = 278; + t['paragraph'] = 537; + t['bullet'] = 350; + t['quotesinglbase'] = 222; + t['quotedblbase'] = 333; + t['quotedblright'] = 333; + t['guillemotright'] = 556; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 611; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 1000; + t['ordfeminine'] = 370; + t['Lslash'] = 556; + t['Oslash'] = 778; + t['OE'] = 1000; + t['ordmasculine'] = 365; + t['ae'] = 889; + t['dotlessi'] = 278; + t['lslash'] = 222; + t['oslash'] = 611; + t['oe'] = 944; + t['germandbls'] = 611; + t['Idieresis'] = 278; + t['eacute'] = 556; + t['abreve'] = 556; + t['uhungarumlaut'] = 556; + t['ecaron'] = 556; + t['Ydieresis'] = 667; + t['divide'] = 584; + t['Yacute'] = 667; + t['Acircumflex'] = 667; + t['aacute'] = 556; + t['Ucircumflex'] = 722; + t['yacute'] = 500; + t['scommaaccent'] = 500; + t['ecircumflex'] = 556; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 556; + t['Uacute'] = 722; + t['uogonek'] = 556; + t['Edieresis'] = 667; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 737; + t['Emacron'] = 667; + t['ccaron'] = 500; + t['aring'] = 556; + t['Ncommaaccent'] = 722; + t['lacute'] = 222; + t['agrave'] = 556; + t['Tcommaaccent'] = 611; + t['Cacute'] = 722; + t['atilde'] = 556; + t['Edotaccent'] = 667; + t['scaron'] = 500; + t['scedilla'] = 500; + t['iacute'] = 278; + t['lozenge'] = 471; + t['Rcaron'] = 722; + t['Gcommaaccent'] = 778; + t['ucircumflex'] = 556; + t['acircumflex'] = 556; + t['Amacron'] = 667; + t['rcaron'] = 333; + t['ccedilla'] = 500; + t['Zdotaccent'] = 611; + t['Thorn'] = 667; + t['Omacron'] = 778; + t['Racute'] = 722; + t['Sacute'] = 667; + t['dcaron'] = 643; + t['Umacron'] = 722; + t['uring'] = 556; + t['threesuperior'] = 333; + t['Ograve'] = 778; + t['Agrave'] = 667; + t['Abreve'] = 667; + t['multiply'] = 584; + t['uacute'] = 556; + t['Tcaron'] = 611; + t['partialdiff'] = 476; + t['ydieresis'] = 500; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 667; + t['adieresis'] = 556; + t['edieresis'] = 556; + t['cacute'] = 500; + t['nacute'] = 556; + t['umacron'] = 556; + t['Ncaron'] = 722; + t['Iacute'] = 278; + t['plusminus'] = 584; + t['brokenbar'] = 260; + t['registered'] = 737; + t['Gbreve'] = 778; + t['Idotaccent'] = 278; + t['summation'] = 600; + t['Egrave'] = 667; + t['racute'] = 333; + t['omacron'] = 556; + t['Zacute'] = 611; + t['Zcaron'] = 611; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 722; + t['lcommaaccent'] = 222; + t['tcaron'] = 317; + t['eogonek'] = 556; + t['Uogonek'] = 722; + t['Aacute'] = 667; + t['Adieresis'] = 667; + t['egrave'] = 556; + t['zacute'] = 500; + t['iogonek'] = 222; + t['Oacute'] = 778; + t['oacute'] = 556; + t['amacron'] = 556; + t['sacute'] = 500; + t['idieresis'] = 278; + t['Ocircumflex'] = 778; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 556; + t['twosuperior'] = 333; + t['Odieresis'] = 778; + t['mu'] = 556; + t['igrave'] = 278; + t['ohungarumlaut'] = 556; + t['Eogonek'] = 667; + t['dcroat'] = 556; + t['threequarters'] = 834; + t['Scedilla'] = 667; + t['lcaron'] = 299; + t['Kcommaaccent'] = 667; + t['Lacute'] = 556; + t['trademark'] = 1000; + t['edotaccent'] = 556; + t['Igrave'] = 278; + t['Imacron'] = 278; + t['Lcaron'] = 556; + t['onehalf'] = 834; + t['lessequal'] = 549; + t['ocircumflex'] = 556; + t['ntilde'] = 556; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 667; + t['emacron'] = 556; + t['gbreve'] = 556; + t['onequarter'] = 834; + t['Scaron'] = 667; + t['Scommaaccent'] = 667; + t['Ohungarumlaut'] = 778; + t['degree'] = 400; + t['ograve'] = 556; + t['Ccaron'] = 722; + t['ugrave'] = 556; + t['radical'] = 453; + t['Dcaron'] = 722; + t['rcommaaccent'] = 333; + t['Ntilde'] = 722; + t['otilde'] = 556; + t['Rcommaaccent'] = 722; + t['Lcommaaccent'] = 556; + t['Atilde'] = 667; + t['Aogonek'] = 667; + t['Aring'] = 667; + t['Otilde'] = 778; + t['zdotaccent'] = 500; + t['Ecaron'] = 667; + t['Iogonek'] = 278; + t['kcommaaccent'] = 500; + t['minus'] = 584; + t['Icircumflex'] = 278; + t['ncaron'] = 556; + t['tcommaaccent'] = 278; + t['logicalnot'] = 584; + t['odieresis'] = 556; + t['udieresis'] = 556; + t['notequal'] = 549; + t['gcommaaccent'] = 556; + t['eth'] = 556; + t['zcaron'] = 500; + t['ncommaaccent'] = 556; + t['onesuperior'] = 333; + t['imacron'] = 278; + t['Euro'] = 556; + }); + t['Helvetica-Bold'] = getLookupTableFactory(function (t) { + t['space'] = 278; + t['exclam'] = 333; + t['quotedbl'] = 474; + t['numbersign'] = 556; + t['dollar'] = 556; + t['percent'] = 889; + t['ampersand'] = 722; + t['quoteright'] = 278; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 389; + t['plus'] = 584; + t['comma'] = 278; + t['hyphen'] = 333; + t['period'] = 278; + t['slash'] = 278; + t['zero'] = 556; + t['one'] = 556; + t['two'] = 556; + t['three'] = 556; + t['four'] = 556; + t['five'] = 556; + t['six'] = 556; + t['seven'] = 556; + t['eight'] = 556; + t['nine'] = 556; + t['colon'] = 333; + t['semicolon'] = 333; + t['less'] = 584; + t['equal'] = 584; + t['greater'] = 584; + t['question'] = 611; + t['at'] = 975; + t['A'] = 722; + t['B'] = 722; + t['C'] = 722; + t['D'] = 722; + t['E'] = 667; + t['F'] = 611; + t['G'] = 778; + t['H'] = 722; + t['I'] = 278; + t['J'] = 556; + t['K'] = 722; + t['L'] = 611; + t['M'] = 833; + t['N'] = 722; + t['O'] = 778; + t['P'] = 667; + t['Q'] = 778; + t['R'] = 722; + t['S'] = 667; + t['T'] = 611; + t['U'] = 722; + t['V'] = 667; + t['W'] = 944; + t['X'] = 667; + t['Y'] = 667; + t['Z'] = 611; + t['bracketleft'] = 333; + t['backslash'] = 278; + t['bracketright'] = 333; + t['asciicircum'] = 584; + t['underscore'] = 556; + t['quoteleft'] = 278; + t['a'] = 556; + t['b'] = 611; + t['c'] = 556; + t['d'] = 611; + t['e'] = 556; + t['f'] = 333; + t['g'] = 611; + t['h'] = 611; + t['i'] = 278; + t['j'] = 278; + t['k'] = 556; + t['l'] = 278; + t['m'] = 889; + t['n'] = 611; + t['o'] = 611; + t['p'] = 611; + t['q'] = 611; + t['r'] = 389; + t['s'] = 556; + t['t'] = 333; + t['u'] = 611; + t['v'] = 556; + t['w'] = 778; + t['x'] = 556; + t['y'] = 556; + t['z'] = 500; + t['braceleft'] = 389; + t['bar'] = 280; + t['braceright'] = 389; + t['asciitilde'] = 584; + t['exclamdown'] = 333; + t['cent'] = 556; + t['sterling'] = 556; + t['fraction'] = 167; + t['yen'] = 556; + t['florin'] = 556; + t['section'] = 556; + t['currency'] = 556; + t['quotesingle'] = 238; + t['quotedblleft'] = 500; + t['guillemotleft'] = 556; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 611; + t['fl'] = 611; + t['endash'] = 556; + t['dagger'] = 556; + t['daggerdbl'] = 556; + t['periodcentered'] = 278; + t['paragraph'] = 556; + t['bullet'] = 350; + t['quotesinglbase'] = 278; + t['quotedblbase'] = 500; + t['quotedblright'] = 500; + t['guillemotright'] = 556; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 611; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 1000; + t['ordfeminine'] = 370; + t['Lslash'] = 611; + t['Oslash'] = 778; + t['OE'] = 1000; + t['ordmasculine'] = 365; + t['ae'] = 889; + t['dotlessi'] = 278; + t['lslash'] = 278; + t['oslash'] = 611; + t['oe'] = 944; + t['germandbls'] = 611; + t['Idieresis'] = 278; + t['eacute'] = 556; + t['abreve'] = 556; + t['uhungarumlaut'] = 611; + t['ecaron'] = 556; + t['Ydieresis'] = 667; + t['divide'] = 584; + t['Yacute'] = 667; + t['Acircumflex'] = 722; + t['aacute'] = 556; + t['Ucircumflex'] = 722; + t['yacute'] = 556; + t['scommaaccent'] = 556; + t['ecircumflex'] = 556; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 556; + t['Uacute'] = 722; + t['uogonek'] = 611; + t['Edieresis'] = 667; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 737; + t['Emacron'] = 667; + t['ccaron'] = 556; + t['aring'] = 556; + t['Ncommaaccent'] = 722; + t['lacute'] = 278; + t['agrave'] = 556; + t['Tcommaaccent'] = 611; + t['Cacute'] = 722; + t['atilde'] = 556; + t['Edotaccent'] = 667; + t['scaron'] = 556; + t['scedilla'] = 556; + t['iacute'] = 278; + t['lozenge'] = 494; + t['Rcaron'] = 722; + t['Gcommaaccent'] = 778; + t['ucircumflex'] = 611; + t['acircumflex'] = 556; + t['Amacron'] = 722; + t['rcaron'] = 389; + t['ccedilla'] = 556; + t['Zdotaccent'] = 611; + t['Thorn'] = 667; + t['Omacron'] = 778; + t['Racute'] = 722; + t['Sacute'] = 667; + t['dcaron'] = 743; + t['Umacron'] = 722; + t['uring'] = 611; + t['threesuperior'] = 333; + t['Ograve'] = 778; + t['Agrave'] = 722; + t['Abreve'] = 722; + t['multiply'] = 584; + t['uacute'] = 611; + t['Tcaron'] = 611; + t['partialdiff'] = 494; + t['ydieresis'] = 556; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 667; + t['adieresis'] = 556; + t['edieresis'] = 556; + t['cacute'] = 556; + t['nacute'] = 611; + t['umacron'] = 611; + t['Ncaron'] = 722; + t['Iacute'] = 278; + t['plusminus'] = 584; + t['brokenbar'] = 280; + t['registered'] = 737; + t['Gbreve'] = 778; + t['Idotaccent'] = 278; + t['summation'] = 600; + t['Egrave'] = 667; + t['racute'] = 389; + t['omacron'] = 611; + t['Zacute'] = 611; + t['Zcaron'] = 611; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 722; + t['lcommaaccent'] = 278; + t['tcaron'] = 389; + t['eogonek'] = 556; + t['Uogonek'] = 722; + t['Aacute'] = 722; + t['Adieresis'] = 722; + t['egrave'] = 556; + t['zacute'] = 500; + t['iogonek'] = 278; + t['Oacute'] = 778; + t['oacute'] = 611; + t['amacron'] = 556; + t['sacute'] = 556; + t['idieresis'] = 278; + t['Ocircumflex'] = 778; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 611; + t['twosuperior'] = 333; + t['Odieresis'] = 778; + t['mu'] = 611; + t['igrave'] = 278; + t['ohungarumlaut'] = 611; + t['Eogonek'] = 667; + t['dcroat'] = 611; + t['threequarters'] = 834; + t['Scedilla'] = 667; + t['lcaron'] = 400; + t['Kcommaaccent'] = 722; + t['Lacute'] = 611; + t['trademark'] = 1000; + t['edotaccent'] = 556; + t['Igrave'] = 278; + t['Imacron'] = 278; + t['Lcaron'] = 611; + t['onehalf'] = 834; + t['lessequal'] = 549; + t['ocircumflex'] = 611; + t['ntilde'] = 611; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 667; + t['emacron'] = 556; + t['gbreve'] = 611; + t['onequarter'] = 834; + t['Scaron'] = 667; + t['Scommaaccent'] = 667; + t['Ohungarumlaut'] = 778; + t['degree'] = 400; + t['ograve'] = 611; + t['Ccaron'] = 722; + t['ugrave'] = 611; + t['radical'] = 549; + t['Dcaron'] = 722; + t['rcommaaccent'] = 389; + t['Ntilde'] = 722; + t['otilde'] = 611; + t['Rcommaaccent'] = 722; + t['Lcommaaccent'] = 611; + t['Atilde'] = 722; + t['Aogonek'] = 722; + t['Aring'] = 722; + t['Otilde'] = 778; + t['zdotaccent'] = 500; + t['Ecaron'] = 667; + t['Iogonek'] = 278; + t['kcommaaccent'] = 556; + t['minus'] = 584; + t['Icircumflex'] = 278; + t['ncaron'] = 611; + t['tcommaaccent'] = 333; + t['logicalnot'] = 584; + t['odieresis'] = 611; + t['udieresis'] = 611; + t['notequal'] = 549; + t['gcommaaccent'] = 611; + t['eth'] = 611; + t['zcaron'] = 500; + t['ncommaaccent'] = 611; + t['onesuperior'] = 333; + t['imacron'] = 278; + t['Euro'] = 556; + }); + t['Helvetica-BoldOblique'] = getLookupTableFactory(function (t) { + t['space'] = 278; + t['exclam'] = 333; + t['quotedbl'] = 474; + t['numbersign'] = 556; + t['dollar'] = 556; + t['percent'] = 889; + t['ampersand'] = 722; + t['quoteright'] = 278; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 389; + t['plus'] = 584; + t['comma'] = 278; + t['hyphen'] = 333; + t['period'] = 278; + t['slash'] = 278; + t['zero'] = 556; + t['one'] = 556; + t['two'] = 556; + t['three'] = 556; + t['four'] = 556; + t['five'] = 556; + t['six'] = 556; + t['seven'] = 556; + t['eight'] = 556; + t['nine'] = 556; + t['colon'] = 333; + t['semicolon'] = 333; + t['less'] = 584; + t['equal'] = 584; + t['greater'] = 584; + t['question'] = 611; + t['at'] = 975; + t['A'] = 722; + t['B'] = 722; + t['C'] = 722; + t['D'] = 722; + t['E'] = 667; + t['F'] = 611; + t['G'] = 778; + t['H'] = 722; + t['I'] = 278; + t['J'] = 556; + t['K'] = 722; + t['L'] = 611; + t['M'] = 833; + t['N'] = 722; + t['O'] = 778; + t['P'] = 667; + t['Q'] = 778; + t['R'] = 722; + t['S'] = 667; + t['T'] = 611; + t['U'] = 722; + t['V'] = 667; + t['W'] = 944; + t['X'] = 667; + t['Y'] = 667; + t['Z'] = 611; + t['bracketleft'] = 333; + t['backslash'] = 278; + t['bracketright'] = 333; + t['asciicircum'] = 584; + t['underscore'] = 556; + t['quoteleft'] = 278; + t['a'] = 556; + t['b'] = 611; + t['c'] = 556; + t['d'] = 611; + t['e'] = 556; + t['f'] = 333; + t['g'] = 611; + t['h'] = 611; + t['i'] = 278; + t['j'] = 278; + t['k'] = 556; + t['l'] = 278; + t['m'] = 889; + t['n'] = 611; + t['o'] = 611; + t['p'] = 611; + t['q'] = 611; + t['r'] = 389; + t['s'] = 556; + t['t'] = 333; + t['u'] = 611; + t['v'] = 556; + t['w'] = 778; + t['x'] = 556; + t['y'] = 556; + t['z'] = 500; + t['braceleft'] = 389; + t['bar'] = 280; + t['braceright'] = 389; + t['asciitilde'] = 584; + t['exclamdown'] = 333; + t['cent'] = 556; + t['sterling'] = 556; + t['fraction'] = 167; + t['yen'] = 556; + t['florin'] = 556; + t['section'] = 556; + t['currency'] = 556; + t['quotesingle'] = 238; + t['quotedblleft'] = 500; + t['guillemotleft'] = 556; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 611; + t['fl'] = 611; + t['endash'] = 556; + t['dagger'] = 556; + t['daggerdbl'] = 556; + t['periodcentered'] = 278; + t['paragraph'] = 556; + t['bullet'] = 350; + t['quotesinglbase'] = 278; + t['quotedblbase'] = 500; + t['quotedblright'] = 500; + t['guillemotright'] = 556; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 611; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 1000; + t['ordfeminine'] = 370; + t['Lslash'] = 611; + t['Oslash'] = 778; + t['OE'] = 1000; + t['ordmasculine'] = 365; + t['ae'] = 889; + t['dotlessi'] = 278; + t['lslash'] = 278; + t['oslash'] = 611; + t['oe'] = 944; + t['germandbls'] = 611; + t['Idieresis'] = 278; + t['eacute'] = 556; + t['abreve'] = 556; + t['uhungarumlaut'] = 611; + t['ecaron'] = 556; + t['Ydieresis'] = 667; + t['divide'] = 584; + t['Yacute'] = 667; + t['Acircumflex'] = 722; + t['aacute'] = 556; + t['Ucircumflex'] = 722; + t['yacute'] = 556; + t['scommaaccent'] = 556; + t['ecircumflex'] = 556; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 556; + t['Uacute'] = 722; + t['uogonek'] = 611; + t['Edieresis'] = 667; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 737; + t['Emacron'] = 667; + t['ccaron'] = 556; + t['aring'] = 556; + t['Ncommaaccent'] = 722; + t['lacute'] = 278; + t['agrave'] = 556; + t['Tcommaaccent'] = 611; + t['Cacute'] = 722; + t['atilde'] = 556; + t['Edotaccent'] = 667; + t['scaron'] = 556; + t['scedilla'] = 556; + t['iacute'] = 278; + t['lozenge'] = 494; + t['Rcaron'] = 722; + t['Gcommaaccent'] = 778; + t['ucircumflex'] = 611; + t['acircumflex'] = 556; + t['Amacron'] = 722; + t['rcaron'] = 389; + t['ccedilla'] = 556; + t['Zdotaccent'] = 611; + t['Thorn'] = 667; + t['Omacron'] = 778; + t['Racute'] = 722; + t['Sacute'] = 667; + t['dcaron'] = 743; + t['Umacron'] = 722; + t['uring'] = 611; + t['threesuperior'] = 333; + t['Ograve'] = 778; + t['Agrave'] = 722; + t['Abreve'] = 722; + t['multiply'] = 584; + t['uacute'] = 611; + t['Tcaron'] = 611; + t['partialdiff'] = 494; + t['ydieresis'] = 556; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 667; + t['adieresis'] = 556; + t['edieresis'] = 556; + t['cacute'] = 556; + t['nacute'] = 611; + t['umacron'] = 611; + t['Ncaron'] = 722; + t['Iacute'] = 278; + t['plusminus'] = 584; + t['brokenbar'] = 280; + t['registered'] = 737; + t['Gbreve'] = 778; + t['Idotaccent'] = 278; + t['summation'] = 600; + t['Egrave'] = 667; + t['racute'] = 389; + t['omacron'] = 611; + t['Zacute'] = 611; + t['Zcaron'] = 611; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 722; + t['lcommaaccent'] = 278; + t['tcaron'] = 389; + t['eogonek'] = 556; + t['Uogonek'] = 722; + t['Aacute'] = 722; + t['Adieresis'] = 722; + t['egrave'] = 556; + t['zacute'] = 500; + t['iogonek'] = 278; + t['Oacute'] = 778; + t['oacute'] = 611; + t['amacron'] = 556; + t['sacute'] = 556; + t['idieresis'] = 278; + t['Ocircumflex'] = 778; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 611; + t['twosuperior'] = 333; + t['Odieresis'] = 778; + t['mu'] = 611; + t['igrave'] = 278; + t['ohungarumlaut'] = 611; + t['Eogonek'] = 667; + t['dcroat'] = 611; + t['threequarters'] = 834; + t['Scedilla'] = 667; + t['lcaron'] = 400; + t['Kcommaaccent'] = 722; + t['Lacute'] = 611; + t['trademark'] = 1000; + t['edotaccent'] = 556; + t['Igrave'] = 278; + t['Imacron'] = 278; + t['Lcaron'] = 611; + t['onehalf'] = 834; + t['lessequal'] = 549; + t['ocircumflex'] = 611; + t['ntilde'] = 611; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 667; + t['emacron'] = 556; + t['gbreve'] = 611; + t['onequarter'] = 834; + t['Scaron'] = 667; + t['Scommaaccent'] = 667; + t['Ohungarumlaut'] = 778; + t['degree'] = 400; + t['ograve'] = 611; + t['Ccaron'] = 722; + t['ugrave'] = 611; + t['radical'] = 549; + t['Dcaron'] = 722; + t['rcommaaccent'] = 389; + t['Ntilde'] = 722; + t['otilde'] = 611; + t['Rcommaaccent'] = 722; + t['Lcommaaccent'] = 611; + t['Atilde'] = 722; + t['Aogonek'] = 722; + t['Aring'] = 722; + t['Otilde'] = 778; + t['zdotaccent'] = 500; + t['Ecaron'] = 667; + t['Iogonek'] = 278; + t['kcommaaccent'] = 556; + t['minus'] = 584; + t['Icircumflex'] = 278; + t['ncaron'] = 611; + t['tcommaaccent'] = 333; + t['logicalnot'] = 584; + t['odieresis'] = 611; + t['udieresis'] = 611; + t['notequal'] = 549; + t['gcommaaccent'] = 611; + t['eth'] = 611; + t['zcaron'] = 500; + t['ncommaaccent'] = 611; + t['onesuperior'] = 333; + t['imacron'] = 278; + t['Euro'] = 556; + }); + t['Helvetica-Oblique'] = getLookupTableFactory(function (t) { + t['space'] = 278; + t['exclam'] = 278; + t['quotedbl'] = 355; + t['numbersign'] = 556; + t['dollar'] = 556; + t['percent'] = 889; + t['ampersand'] = 667; + t['quoteright'] = 222; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 389; + t['plus'] = 584; + t['comma'] = 278; + t['hyphen'] = 333; + t['period'] = 278; + t['slash'] = 278; + t['zero'] = 556; + t['one'] = 556; + t['two'] = 556; + t['three'] = 556; + t['four'] = 556; + t['five'] = 556; + t['six'] = 556; + t['seven'] = 556; + t['eight'] = 556; + t['nine'] = 556; + t['colon'] = 278; + t['semicolon'] = 278; + t['less'] = 584; + t['equal'] = 584; + t['greater'] = 584; + t['question'] = 556; + t['at'] = 1015; + t['A'] = 667; + t['B'] = 667; + t['C'] = 722; + t['D'] = 722; + t['E'] = 667; + t['F'] = 611; + t['G'] = 778; + t['H'] = 722; + t['I'] = 278; + t['J'] = 500; + t['K'] = 667; + t['L'] = 556; + t['M'] = 833; + t['N'] = 722; + t['O'] = 778; + t['P'] = 667; + t['Q'] = 778; + t['R'] = 722; + t['S'] = 667; + t['T'] = 611; + t['U'] = 722; + t['V'] = 667; + t['W'] = 944; + t['X'] = 667; + t['Y'] = 667; + t['Z'] = 611; + t['bracketleft'] = 278; + t['backslash'] = 278; + t['bracketright'] = 278; + t['asciicircum'] = 469; + t['underscore'] = 556; + t['quoteleft'] = 222; + t['a'] = 556; + t['b'] = 556; + t['c'] = 500; + t['d'] = 556; + t['e'] = 556; + t['f'] = 278; + t['g'] = 556; + t['h'] = 556; + t['i'] = 222; + t['j'] = 222; + t['k'] = 500; + t['l'] = 222; + t['m'] = 833; + t['n'] = 556; + t['o'] = 556; + t['p'] = 556; + t['q'] = 556; + t['r'] = 333; + t['s'] = 500; + t['t'] = 278; + t['u'] = 556; + t['v'] = 500; + t['w'] = 722; + t['x'] = 500; + t['y'] = 500; + t['z'] = 500; + t['braceleft'] = 334; + t['bar'] = 260; + t['braceright'] = 334; + t['asciitilde'] = 584; + t['exclamdown'] = 333; + t['cent'] = 556; + t['sterling'] = 556; + t['fraction'] = 167; + t['yen'] = 556; + t['florin'] = 556; + t['section'] = 556; + t['currency'] = 556; + t['quotesingle'] = 191; + t['quotedblleft'] = 333; + t['guillemotleft'] = 556; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 500; + t['fl'] = 500; + t['endash'] = 556; + t['dagger'] = 556; + t['daggerdbl'] = 556; + t['periodcentered'] = 278; + t['paragraph'] = 537; + t['bullet'] = 350; + t['quotesinglbase'] = 222; + t['quotedblbase'] = 333; + t['quotedblright'] = 333; + t['guillemotright'] = 556; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 611; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 1000; + t['ordfeminine'] = 370; + t['Lslash'] = 556; + t['Oslash'] = 778; + t['OE'] = 1000; + t['ordmasculine'] = 365; + t['ae'] = 889; + t['dotlessi'] = 278; + t['lslash'] = 222; + t['oslash'] = 611; + t['oe'] = 944; + t['germandbls'] = 611; + t['Idieresis'] = 278; + t['eacute'] = 556; + t['abreve'] = 556; + t['uhungarumlaut'] = 556; + t['ecaron'] = 556; + t['Ydieresis'] = 667; + t['divide'] = 584; + t['Yacute'] = 667; + t['Acircumflex'] = 667; + t['aacute'] = 556; + t['Ucircumflex'] = 722; + t['yacute'] = 500; + t['scommaaccent'] = 500; + t['ecircumflex'] = 556; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 556; + t['Uacute'] = 722; + t['uogonek'] = 556; + t['Edieresis'] = 667; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 737; + t['Emacron'] = 667; + t['ccaron'] = 500; + t['aring'] = 556; + t['Ncommaaccent'] = 722; + t['lacute'] = 222; + t['agrave'] = 556; + t['Tcommaaccent'] = 611; + t['Cacute'] = 722; + t['atilde'] = 556; + t['Edotaccent'] = 667; + t['scaron'] = 500; + t['scedilla'] = 500; + t['iacute'] = 278; + t['lozenge'] = 471; + t['Rcaron'] = 722; + t['Gcommaaccent'] = 778; + t['ucircumflex'] = 556; + t['acircumflex'] = 556; + t['Amacron'] = 667; + t['rcaron'] = 333; + t['ccedilla'] = 500; + t['Zdotaccent'] = 611; + t['Thorn'] = 667; + t['Omacron'] = 778; + t['Racute'] = 722; + t['Sacute'] = 667; + t['dcaron'] = 643; + t['Umacron'] = 722; + t['uring'] = 556; + t['threesuperior'] = 333; + t['Ograve'] = 778; + t['Agrave'] = 667; + t['Abreve'] = 667; + t['multiply'] = 584; + t['uacute'] = 556; + t['Tcaron'] = 611; + t['partialdiff'] = 476; + t['ydieresis'] = 500; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 667; + t['adieresis'] = 556; + t['edieresis'] = 556; + t['cacute'] = 500; + t['nacute'] = 556; + t['umacron'] = 556; + t['Ncaron'] = 722; + t['Iacute'] = 278; + t['plusminus'] = 584; + t['brokenbar'] = 260; + t['registered'] = 737; + t['Gbreve'] = 778; + t['Idotaccent'] = 278; + t['summation'] = 600; + t['Egrave'] = 667; + t['racute'] = 333; + t['omacron'] = 556; + t['Zacute'] = 611; + t['Zcaron'] = 611; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 722; + t['lcommaaccent'] = 222; + t['tcaron'] = 317; + t['eogonek'] = 556; + t['Uogonek'] = 722; + t['Aacute'] = 667; + t['Adieresis'] = 667; + t['egrave'] = 556; + t['zacute'] = 500; + t['iogonek'] = 222; + t['Oacute'] = 778; + t['oacute'] = 556; + t['amacron'] = 556; + t['sacute'] = 500; + t['idieresis'] = 278; + t['Ocircumflex'] = 778; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 556; + t['twosuperior'] = 333; + t['Odieresis'] = 778; + t['mu'] = 556; + t['igrave'] = 278; + t['ohungarumlaut'] = 556; + t['Eogonek'] = 667; + t['dcroat'] = 556; + t['threequarters'] = 834; + t['Scedilla'] = 667; + t['lcaron'] = 299; + t['Kcommaaccent'] = 667; + t['Lacute'] = 556; + t['trademark'] = 1000; + t['edotaccent'] = 556; + t['Igrave'] = 278; + t['Imacron'] = 278; + t['Lcaron'] = 556; + t['onehalf'] = 834; + t['lessequal'] = 549; + t['ocircumflex'] = 556; + t['ntilde'] = 556; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 667; + t['emacron'] = 556; + t['gbreve'] = 556; + t['onequarter'] = 834; + t['Scaron'] = 667; + t['Scommaaccent'] = 667; + t['Ohungarumlaut'] = 778; + t['degree'] = 400; + t['ograve'] = 556; + t['Ccaron'] = 722; + t['ugrave'] = 556; + t['radical'] = 453; + t['Dcaron'] = 722; + t['rcommaaccent'] = 333; + t['Ntilde'] = 722; + t['otilde'] = 556; + t['Rcommaaccent'] = 722; + t['Lcommaaccent'] = 556; + t['Atilde'] = 667; + t['Aogonek'] = 667; + t['Aring'] = 667; + t['Otilde'] = 778; + t['zdotaccent'] = 500; + t['Ecaron'] = 667; + t['Iogonek'] = 278; + t['kcommaaccent'] = 500; + t['minus'] = 584; + t['Icircumflex'] = 278; + t['ncaron'] = 556; + t['tcommaaccent'] = 278; + t['logicalnot'] = 584; + t['odieresis'] = 556; + t['udieresis'] = 556; + t['notequal'] = 549; + t['gcommaaccent'] = 556; + t['eth'] = 556; + t['zcaron'] = 500; + t['ncommaaccent'] = 556; + t['onesuperior'] = 333; + t['imacron'] = 278; + t['Euro'] = 556; + }); + t['Symbol'] = getLookupTableFactory(function (t) { + t['space'] = 250; + t['exclam'] = 333; + t['universal'] = 713; + t['numbersign'] = 500; + t['existential'] = 549; + t['percent'] = 833; + t['ampersand'] = 778; + t['suchthat'] = 439; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asteriskmath'] = 500; + t['plus'] = 549; + t['comma'] = 250; + t['minus'] = 549; + t['period'] = 250; + t['slash'] = 278; + t['zero'] = 500; + t['one'] = 500; + t['two'] = 500; + t['three'] = 500; + t['four'] = 500; + t['five'] = 500; + t['six'] = 500; + t['seven'] = 500; + t['eight'] = 500; + t['nine'] = 500; + t['colon'] = 278; + t['semicolon'] = 278; + t['less'] = 549; + t['equal'] = 549; + t['greater'] = 549; + t['question'] = 444; + t['congruent'] = 549; + t['Alpha'] = 722; + t['Beta'] = 667; + t['Chi'] = 722; + t['Delta'] = 612; + t['Epsilon'] = 611; + t['Phi'] = 763; + t['Gamma'] = 603; + t['Eta'] = 722; + t['Iota'] = 333; + t['theta1'] = 631; + t['Kappa'] = 722; + t['Lambda'] = 686; + t['Mu'] = 889; + t['Nu'] = 722; + t['Omicron'] = 722; + t['Pi'] = 768; + t['Theta'] = 741; + t['Rho'] = 556; + t['Sigma'] = 592; + t['Tau'] = 611; + t['Upsilon'] = 690; + t['sigma1'] = 439; + t['Omega'] = 768; + t['Xi'] = 645; + t['Psi'] = 795; + t['Zeta'] = 611; + t['bracketleft'] = 333; + t['therefore'] = 863; + t['bracketright'] = 333; + t['perpendicular'] = 658; + t['underscore'] = 500; + t['radicalex'] = 500; + t['alpha'] = 631; + t['beta'] = 549; + t['chi'] = 549; + t['delta'] = 494; + t['epsilon'] = 439; + t['phi'] = 521; + t['gamma'] = 411; + t['eta'] = 603; + t['iota'] = 329; + t['phi1'] = 603; + t['kappa'] = 549; + t['lambda'] = 549; + t['mu'] = 576; + t['nu'] = 521; + t['omicron'] = 549; + t['pi'] = 549; + t['theta'] = 521; + t['rho'] = 549; + t['sigma'] = 603; + t['tau'] = 439; + t['upsilon'] = 576; + t['omega1'] = 713; + t['omega'] = 686; + t['xi'] = 493; + t['psi'] = 686; + t['zeta'] = 494; + t['braceleft'] = 480; + t['bar'] = 200; + t['braceright'] = 480; + t['similar'] = 549; + t['Euro'] = 750; + t['Upsilon1'] = 620; + t['minute'] = 247; + t['lessequal'] = 549; + t['fraction'] = 167; + t['infinity'] = 713; + t['florin'] = 500; + t['club'] = 753; + t['diamond'] = 753; + t['heart'] = 753; + t['spade'] = 753; + t['arrowboth'] = 1042; + t['arrowleft'] = 987; + t['arrowup'] = 603; + t['arrowright'] = 987; + t['arrowdown'] = 603; + t['degree'] = 400; + t['plusminus'] = 549; + t['second'] = 411; + t['greaterequal'] = 549; + t['multiply'] = 549; + t['proportional'] = 713; + t['partialdiff'] = 494; + t['bullet'] = 460; + t['divide'] = 549; + t['notequal'] = 549; + t['equivalence'] = 549; + t['approxequal'] = 549; + t['ellipsis'] = 1000; + t['arrowvertex'] = 603; + t['arrowhorizex'] = 1000; + t['carriagereturn'] = 658; + t['aleph'] = 823; + t['Ifraktur'] = 686; + t['Rfraktur'] = 795; + t['weierstrass'] = 987; + t['circlemultiply'] = 768; + t['circleplus'] = 768; + t['emptyset'] = 823; + t['intersection'] = 768; + t['union'] = 768; + t['propersuperset'] = 713; + t['reflexsuperset'] = 713; + t['notsubset'] = 713; + t['propersubset'] = 713; + t['reflexsubset'] = 713; + t['element'] = 713; + t['notelement'] = 713; + t['angle'] = 768; + t['gradient'] = 713; + t['registerserif'] = 790; + t['copyrightserif'] = 790; + t['trademarkserif'] = 890; + t['product'] = 823; + t['radical'] = 549; + t['dotmath'] = 250; + t['logicalnot'] = 713; + t['logicaland'] = 603; + t['logicalor'] = 603; + t['arrowdblboth'] = 1042; + t['arrowdblleft'] = 987; + t['arrowdblup'] = 603; + t['arrowdblright'] = 987; + t['arrowdbldown'] = 603; + t['lozenge'] = 494; + t['angleleft'] = 329; + t['registersans'] = 790; + t['copyrightsans'] = 790; + t['trademarksans'] = 786; + t['summation'] = 713; + t['parenlefttp'] = 384; + t['parenleftex'] = 384; + t['parenleftbt'] = 384; + t['bracketlefttp'] = 384; + t['bracketleftex'] = 384; + t['bracketleftbt'] = 384; + t['bracelefttp'] = 494; + t['braceleftmid'] = 494; + t['braceleftbt'] = 494; + t['braceex'] = 494; + t['angleright'] = 329; + t['integral'] = 274; + t['integraltp'] = 686; + t['integralex'] = 686; + t['integralbt'] = 686; + t['parenrighttp'] = 384; + t['parenrightex'] = 384; + t['parenrightbt'] = 384; + t['bracketrighttp'] = 384; + t['bracketrightex'] = 384; + t['bracketrightbt'] = 384; + t['bracerighttp'] = 494; + t['bracerightmid'] = 494; + t['bracerightbt'] = 494; + t['apple'] = 790; + }); + t['Times-Roman'] = getLookupTableFactory(function (t) { + t['space'] = 250; + t['exclam'] = 333; + t['quotedbl'] = 408; + t['numbersign'] = 500; + t['dollar'] = 500; + t['percent'] = 833; + t['ampersand'] = 778; + t['quoteright'] = 333; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 500; + t['plus'] = 564; + t['comma'] = 250; + t['hyphen'] = 333; + t['period'] = 250; + t['slash'] = 278; + t['zero'] = 500; + t['one'] = 500; + t['two'] = 500; + t['three'] = 500; + t['four'] = 500; + t['five'] = 500; + t['six'] = 500; + t['seven'] = 500; + t['eight'] = 500; + t['nine'] = 500; + t['colon'] = 278; + t['semicolon'] = 278; + t['less'] = 564; + t['equal'] = 564; + t['greater'] = 564; + t['question'] = 444; + t['at'] = 921; + t['A'] = 722; + t['B'] = 667; + t['C'] = 667; + t['D'] = 722; + t['E'] = 611; + t['F'] = 556; + t['G'] = 722; + t['H'] = 722; + t['I'] = 333; + t['J'] = 389; + t['K'] = 722; + t['L'] = 611; + t['M'] = 889; + t['N'] = 722; + t['O'] = 722; + t['P'] = 556; + t['Q'] = 722; + t['R'] = 667; + t['S'] = 556; + t['T'] = 611; + t['U'] = 722; + t['V'] = 722; + t['W'] = 944; + t['X'] = 722; + t['Y'] = 722; + t['Z'] = 611; + t['bracketleft'] = 333; + t['backslash'] = 278; + t['bracketright'] = 333; + t['asciicircum'] = 469; + t['underscore'] = 500; + t['quoteleft'] = 333; + t['a'] = 444; + t['b'] = 500; + t['c'] = 444; + t['d'] = 500; + t['e'] = 444; + t['f'] = 333; + t['g'] = 500; + t['h'] = 500; + t['i'] = 278; + t['j'] = 278; + t['k'] = 500; + t['l'] = 278; + t['m'] = 778; + t['n'] = 500; + t['o'] = 500; + t['p'] = 500; + t['q'] = 500; + t['r'] = 333; + t['s'] = 389; + t['t'] = 278; + t['u'] = 500; + t['v'] = 500; + t['w'] = 722; + t['x'] = 500; + t['y'] = 500; + t['z'] = 444; + t['braceleft'] = 480; + t['bar'] = 200; + t['braceright'] = 480; + t['asciitilde'] = 541; + t['exclamdown'] = 333; + t['cent'] = 500; + t['sterling'] = 500; + t['fraction'] = 167; + t['yen'] = 500; + t['florin'] = 500; + t['section'] = 500; + t['currency'] = 500; + t['quotesingle'] = 180; + t['quotedblleft'] = 444; + t['guillemotleft'] = 500; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 556; + t['fl'] = 556; + t['endash'] = 500; + t['dagger'] = 500; + t['daggerdbl'] = 500; + t['periodcentered'] = 250; + t['paragraph'] = 453; + t['bullet'] = 350; + t['quotesinglbase'] = 333; + t['quotedblbase'] = 444; + t['quotedblright'] = 444; + t['guillemotright'] = 500; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 444; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 889; + t['ordfeminine'] = 276; + t['Lslash'] = 611; + t['Oslash'] = 722; + t['OE'] = 889; + t['ordmasculine'] = 310; + t['ae'] = 667; + t['dotlessi'] = 278; + t['lslash'] = 278; + t['oslash'] = 500; + t['oe'] = 722; + t['germandbls'] = 500; + t['Idieresis'] = 333; + t['eacute'] = 444; + t['abreve'] = 444; + t['uhungarumlaut'] = 500; + t['ecaron'] = 444; + t['Ydieresis'] = 722; + t['divide'] = 564; + t['Yacute'] = 722; + t['Acircumflex'] = 722; + t['aacute'] = 444; + t['Ucircumflex'] = 722; + t['yacute'] = 500; + t['scommaaccent'] = 389; + t['ecircumflex'] = 444; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 444; + t['Uacute'] = 722; + t['uogonek'] = 500; + t['Edieresis'] = 611; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 760; + t['Emacron'] = 611; + t['ccaron'] = 444; + t['aring'] = 444; + t['Ncommaaccent'] = 722; + t['lacute'] = 278; + t['agrave'] = 444; + t['Tcommaaccent'] = 611; + t['Cacute'] = 667; + t['atilde'] = 444; + t['Edotaccent'] = 611; + t['scaron'] = 389; + t['scedilla'] = 389; + t['iacute'] = 278; + t['lozenge'] = 471; + t['Rcaron'] = 667; + t['Gcommaaccent'] = 722; + t['ucircumflex'] = 500; + t['acircumflex'] = 444; + t['Amacron'] = 722; + t['rcaron'] = 333; + t['ccedilla'] = 444; + t['Zdotaccent'] = 611; + t['Thorn'] = 556; + t['Omacron'] = 722; + t['Racute'] = 667; + t['Sacute'] = 556; + t['dcaron'] = 588; + t['Umacron'] = 722; + t['uring'] = 500; + t['threesuperior'] = 300; + t['Ograve'] = 722; + t['Agrave'] = 722; + t['Abreve'] = 722; + t['multiply'] = 564; + t['uacute'] = 500; + t['Tcaron'] = 611; + t['partialdiff'] = 476; + t['ydieresis'] = 500; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 611; + t['adieresis'] = 444; + t['edieresis'] = 444; + t['cacute'] = 444; + t['nacute'] = 500; + t['umacron'] = 500; + t['Ncaron'] = 722; + t['Iacute'] = 333; + t['plusminus'] = 564; + t['brokenbar'] = 200; + t['registered'] = 760; + t['Gbreve'] = 722; + t['Idotaccent'] = 333; + t['summation'] = 600; + t['Egrave'] = 611; + t['racute'] = 333; + t['omacron'] = 500; + t['Zacute'] = 611; + t['Zcaron'] = 611; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 667; + t['lcommaaccent'] = 278; + t['tcaron'] = 326; + t['eogonek'] = 444; + t['Uogonek'] = 722; + t['Aacute'] = 722; + t['Adieresis'] = 722; + t['egrave'] = 444; + t['zacute'] = 444; + t['iogonek'] = 278; + t['Oacute'] = 722; + t['oacute'] = 500; + t['amacron'] = 444; + t['sacute'] = 389; + t['idieresis'] = 278; + t['Ocircumflex'] = 722; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 500; + t['twosuperior'] = 300; + t['Odieresis'] = 722; + t['mu'] = 500; + t['igrave'] = 278; + t['ohungarumlaut'] = 500; + t['Eogonek'] = 611; + t['dcroat'] = 500; + t['threequarters'] = 750; + t['Scedilla'] = 556; + t['lcaron'] = 344; + t['Kcommaaccent'] = 722; + t['Lacute'] = 611; + t['trademark'] = 980; + t['edotaccent'] = 444; + t['Igrave'] = 333; + t['Imacron'] = 333; + t['Lcaron'] = 611; + t['onehalf'] = 750; + t['lessequal'] = 549; + t['ocircumflex'] = 500; + t['ntilde'] = 500; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 611; + t['emacron'] = 444; + t['gbreve'] = 500; + t['onequarter'] = 750; + t['Scaron'] = 556; + t['Scommaaccent'] = 556; + t['Ohungarumlaut'] = 722; + t['degree'] = 400; + t['ograve'] = 500; + t['Ccaron'] = 667; + t['ugrave'] = 500; + t['radical'] = 453; + t['Dcaron'] = 722; + t['rcommaaccent'] = 333; + t['Ntilde'] = 722; + t['otilde'] = 500; + t['Rcommaaccent'] = 667; + t['Lcommaaccent'] = 611; + t['Atilde'] = 722; + t['Aogonek'] = 722; + t['Aring'] = 722; + t['Otilde'] = 722; + t['zdotaccent'] = 444; + t['Ecaron'] = 611; + t['Iogonek'] = 333; + t['kcommaaccent'] = 500; + t['minus'] = 564; + t['Icircumflex'] = 333; + t['ncaron'] = 500; + t['tcommaaccent'] = 278; + t['logicalnot'] = 564; + t['odieresis'] = 500; + t['udieresis'] = 500; + t['notequal'] = 549; + t['gcommaaccent'] = 500; + t['eth'] = 500; + t['zcaron'] = 444; + t['ncommaaccent'] = 500; + t['onesuperior'] = 300; + t['imacron'] = 278; + t['Euro'] = 500; + }); + t['Times-Bold'] = getLookupTableFactory(function (t) { + t['space'] = 250; + t['exclam'] = 333; + t['quotedbl'] = 555; + t['numbersign'] = 500; + t['dollar'] = 500; + t['percent'] = 1000; + t['ampersand'] = 833; + t['quoteright'] = 333; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 500; + t['plus'] = 570; + t['comma'] = 250; + t['hyphen'] = 333; + t['period'] = 250; + t['slash'] = 278; + t['zero'] = 500; + t['one'] = 500; + t['two'] = 500; + t['three'] = 500; + t['four'] = 500; + t['five'] = 500; + t['six'] = 500; + t['seven'] = 500; + t['eight'] = 500; + t['nine'] = 500; + t['colon'] = 333; + t['semicolon'] = 333; + t['less'] = 570; + t['equal'] = 570; + t['greater'] = 570; + t['question'] = 500; + t['at'] = 930; + t['A'] = 722; + t['B'] = 667; + t['C'] = 722; + t['D'] = 722; + t['E'] = 667; + t['F'] = 611; + t['G'] = 778; + t['H'] = 778; + t['I'] = 389; + t['J'] = 500; + t['K'] = 778; + t['L'] = 667; + t['M'] = 944; + t['N'] = 722; + t['O'] = 778; + t['P'] = 611; + t['Q'] = 778; + t['R'] = 722; + t['S'] = 556; + t['T'] = 667; + t['U'] = 722; + t['V'] = 722; + t['W'] = 1000; + t['X'] = 722; + t['Y'] = 722; + t['Z'] = 667; + t['bracketleft'] = 333; + t['backslash'] = 278; + t['bracketright'] = 333; + t['asciicircum'] = 581; + t['underscore'] = 500; + t['quoteleft'] = 333; + t['a'] = 500; + t['b'] = 556; + t['c'] = 444; + t['d'] = 556; + t['e'] = 444; + t['f'] = 333; + t['g'] = 500; + t['h'] = 556; + t['i'] = 278; + t['j'] = 333; + t['k'] = 556; + t['l'] = 278; + t['m'] = 833; + t['n'] = 556; + t['o'] = 500; + t['p'] = 556; + t['q'] = 556; + t['r'] = 444; + t['s'] = 389; + t['t'] = 333; + t['u'] = 556; + t['v'] = 500; + t['w'] = 722; + t['x'] = 500; + t['y'] = 500; + t['z'] = 444; + t['braceleft'] = 394; + t['bar'] = 220; + t['braceright'] = 394; + t['asciitilde'] = 520; + t['exclamdown'] = 333; + t['cent'] = 500; + t['sterling'] = 500; + t['fraction'] = 167; + t['yen'] = 500; + t['florin'] = 500; + t['section'] = 500; + t['currency'] = 500; + t['quotesingle'] = 278; + t['quotedblleft'] = 500; + t['guillemotleft'] = 500; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 556; + t['fl'] = 556; + t['endash'] = 500; + t['dagger'] = 500; + t['daggerdbl'] = 500; + t['periodcentered'] = 250; + t['paragraph'] = 540; + t['bullet'] = 350; + t['quotesinglbase'] = 333; + t['quotedblbase'] = 500; + t['quotedblright'] = 500; + t['guillemotright'] = 500; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 500; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 1000; + t['ordfeminine'] = 300; + t['Lslash'] = 667; + t['Oslash'] = 778; + t['OE'] = 1000; + t['ordmasculine'] = 330; + t['ae'] = 722; + t['dotlessi'] = 278; + t['lslash'] = 278; + t['oslash'] = 500; + t['oe'] = 722; + t['germandbls'] = 556; + t['Idieresis'] = 389; + t['eacute'] = 444; + t['abreve'] = 500; + t['uhungarumlaut'] = 556; + t['ecaron'] = 444; + t['Ydieresis'] = 722; + t['divide'] = 570; + t['Yacute'] = 722; + t['Acircumflex'] = 722; + t['aacute'] = 500; + t['Ucircumflex'] = 722; + t['yacute'] = 500; + t['scommaaccent'] = 389; + t['ecircumflex'] = 444; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 500; + t['Uacute'] = 722; + t['uogonek'] = 556; + t['Edieresis'] = 667; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 747; + t['Emacron'] = 667; + t['ccaron'] = 444; + t['aring'] = 500; + t['Ncommaaccent'] = 722; + t['lacute'] = 278; + t['agrave'] = 500; + t['Tcommaaccent'] = 667; + t['Cacute'] = 722; + t['atilde'] = 500; + t['Edotaccent'] = 667; + t['scaron'] = 389; + t['scedilla'] = 389; + t['iacute'] = 278; + t['lozenge'] = 494; + t['Rcaron'] = 722; + t['Gcommaaccent'] = 778; + t['ucircumflex'] = 556; + t['acircumflex'] = 500; + t['Amacron'] = 722; + t['rcaron'] = 444; + t['ccedilla'] = 444; + t['Zdotaccent'] = 667; + t['Thorn'] = 611; + t['Omacron'] = 778; + t['Racute'] = 722; + t['Sacute'] = 556; + t['dcaron'] = 672; + t['Umacron'] = 722; + t['uring'] = 556; + t['threesuperior'] = 300; + t['Ograve'] = 778; + t['Agrave'] = 722; + t['Abreve'] = 722; + t['multiply'] = 570; + t['uacute'] = 556; + t['Tcaron'] = 667; + t['partialdiff'] = 494; + t['ydieresis'] = 500; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 667; + t['adieresis'] = 500; + t['edieresis'] = 444; + t['cacute'] = 444; + t['nacute'] = 556; + t['umacron'] = 556; + t['Ncaron'] = 722; + t['Iacute'] = 389; + t['plusminus'] = 570; + t['brokenbar'] = 220; + t['registered'] = 747; + t['Gbreve'] = 778; + t['Idotaccent'] = 389; + t['summation'] = 600; + t['Egrave'] = 667; + t['racute'] = 444; + t['omacron'] = 500; + t['Zacute'] = 667; + t['Zcaron'] = 667; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 722; + t['lcommaaccent'] = 278; + t['tcaron'] = 416; + t['eogonek'] = 444; + t['Uogonek'] = 722; + t['Aacute'] = 722; + t['Adieresis'] = 722; + t['egrave'] = 444; + t['zacute'] = 444; + t['iogonek'] = 278; + t['Oacute'] = 778; + t['oacute'] = 500; + t['amacron'] = 500; + t['sacute'] = 389; + t['idieresis'] = 278; + t['Ocircumflex'] = 778; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 556; + t['twosuperior'] = 300; + t['Odieresis'] = 778; + t['mu'] = 556; + t['igrave'] = 278; + t['ohungarumlaut'] = 500; + t['Eogonek'] = 667; + t['dcroat'] = 556; + t['threequarters'] = 750; + t['Scedilla'] = 556; + t['lcaron'] = 394; + t['Kcommaaccent'] = 778; + t['Lacute'] = 667; + t['trademark'] = 1000; + t['edotaccent'] = 444; + t['Igrave'] = 389; + t['Imacron'] = 389; + t['Lcaron'] = 667; + t['onehalf'] = 750; + t['lessequal'] = 549; + t['ocircumflex'] = 500; + t['ntilde'] = 556; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 667; + t['emacron'] = 444; + t['gbreve'] = 500; + t['onequarter'] = 750; + t['Scaron'] = 556; + t['Scommaaccent'] = 556; + t['Ohungarumlaut'] = 778; + t['degree'] = 400; + t['ograve'] = 500; + t['Ccaron'] = 722; + t['ugrave'] = 556; + t['radical'] = 549; + t['Dcaron'] = 722; + t['rcommaaccent'] = 444; + t['Ntilde'] = 722; + t['otilde'] = 500; + t['Rcommaaccent'] = 722; + t['Lcommaaccent'] = 667; + t['Atilde'] = 722; + t['Aogonek'] = 722; + t['Aring'] = 722; + t['Otilde'] = 778; + t['zdotaccent'] = 444; + t['Ecaron'] = 667; + t['Iogonek'] = 389; + t['kcommaaccent'] = 556; + t['minus'] = 570; + t['Icircumflex'] = 389; + t['ncaron'] = 556; + t['tcommaaccent'] = 333; + t['logicalnot'] = 570; + t['odieresis'] = 500; + t['udieresis'] = 556; + t['notequal'] = 549; + t['gcommaaccent'] = 500; + t['eth'] = 500; + t['zcaron'] = 444; + t['ncommaaccent'] = 556; + t['onesuperior'] = 300; + t['imacron'] = 278; + t['Euro'] = 500; + }); + t['Times-BoldItalic'] = getLookupTableFactory(function (t) { + t['space'] = 250; + t['exclam'] = 389; + t['quotedbl'] = 555; + t['numbersign'] = 500; + t['dollar'] = 500; + t['percent'] = 833; + t['ampersand'] = 778; + t['quoteright'] = 333; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 500; + t['plus'] = 570; + t['comma'] = 250; + t['hyphen'] = 333; + t['period'] = 250; + t['slash'] = 278; + t['zero'] = 500; + t['one'] = 500; + t['two'] = 500; + t['three'] = 500; + t['four'] = 500; + t['five'] = 500; + t['six'] = 500; + t['seven'] = 500; + t['eight'] = 500; + t['nine'] = 500; + t['colon'] = 333; + t['semicolon'] = 333; + t['less'] = 570; + t['equal'] = 570; + t['greater'] = 570; + t['question'] = 500; + t['at'] = 832; + t['A'] = 667; + t['B'] = 667; + t['C'] = 667; + t['D'] = 722; + t['E'] = 667; + t['F'] = 667; + t['G'] = 722; + t['H'] = 778; + t['I'] = 389; + t['J'] = 500; + t['K'] = 667; + t['L'] = 611; + t['M'] = 889; + t['N'] = 722; + t['O'] = 722; + t['P'] = 611; + t['Q'] = 722; + t['R'] = 667; + t['S'] = 556; + t['T'] = 611; + t['U'] = 722; + t['V'] = 667; + t['W'] = 889; + t['X'] = 667; + t['Y'] = 611; + t['Z'] = 611; + t['bracketleft'] = 333; + t['backslash'] = 278; + t['bracketright'] = 333; + t['asciicircum'] = 570; + t['underscore'] = 500; + t['quoteleft'] = 333; + t['a'] = 500; + t['b'] = 500; + t['c'] = 444; + t['d'] = 500; + t['e'] = 444; + t['f'] = 333; + t['g'] = 500; + t['h'] = 556; + t['i'] = 278; + t['j'] = 278; + t['k'] = 500; + t['l'] = 278; + t['m'] = 778; + t['n'] = 556; + t['o'] = 500; + t['p'] = 500; + t['q'] = 500; + t['r'] = 389; + t['s'] = 389; + t['t'] = 278; + t['u'] = 556; + t['v'] = 444; + t['w'] = 667; + t['x'] = 500; + t['y'] = 444; + t['z'] = 389; + t['braceleft'] = 348; + t['bar'] = 220; + t['braceright'] = 348; + t['asciitilde'] = 570; + t['exclamdown'] = 389; + t['cent'] = 500; + t['sterling'] = 500; + t['fraction'] = 167; + t['yen'] = 500; + t['florin'] = 500; + t['section'] = 500; + t['currency'] = 500; + t['quotesingle'] = 278; + t['quotedblleft'] = 500; + t['guillemotleft'] = 500; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 556; + t['fl'] = 556; + t['endash'] = 500; + t['dagger'] = 500; + t['daggerdbl'] = 500; + t['periodcentered'] = 250; + t['paragraph'] = 500; + t['bullet'] = 350; + t['quotesinglbase'] = 333; + t['quotedblbase'] = 500; + t['quotedblright'] = 500; + t['guillemotright'] = 500; + t['ellipsis'] = 1000; + t['perthousand'] = 1000; + t['questiondown'] = 500; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 1000; + t['AE'] = 944; + t['ordfeminine'] = 266; + t['Lslash'] = 611; + t['Oslash'] = 722; + t['OE'] = 944; + t['ordmasculine'] = 300; + t['ae'] = 722; + t['dotlessi'] = 278; + t['lslash'] = 278; + t['oslash'] = 500; + t['oe'] = 722; + t['germandbls'] = 500; + t['Idieresis'] = 389; + t['eacute'] = 444; + t['abreve'] = 500; + t['uhungarumlaut'] = 556; + t['ecaron'] = 444; + t['Ydieresis'] = 611; + t['divide'] = 570; + t['Yacute'] = 611; + t['Acircumflex'] = 667; + t['aacute'] = 500; + t['Ucircumflex'] = 722; + t['yacute'] = 444; + t['scommaaccent'] = 389; + t['ecircumflex'] = 444; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 500; + t['Uacute'] = 722; + t['uogonek'] = 556; + t['Edieresis'] = 667; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 747; + t['Emacron'] = 667; + t['ccaron'] = 444; + t['aring'] = 500; + t['Ncommaaccent'] = 722; + t['lacute'] = 278; + t['agrave'] = 500; + t['Tcommaaccent'] = 611; + t['Cacute'] = 667; + t['atilde'] = 500; + t['Edotaccent'] = 667; + t['scaron'] = 389; + t['scedilla'] = 389; + t['iacute'] = 278; + t['lozenge'] = 494; + t['Rcaron'] = 667; + t['Gcommaaccent'] = 722; + t['ucircumflex'] = 556; + t['acircumflex'] = 500; + t['Amacron'] = 667; + t['rcaron'] = 389; + t['ccedilla'] = 444; + t['Zdotaccent'] = 611; + t['Thorn'] = 611; + t['Omacron'] = 722; + t['Racute'] = 667; + t['Sacute'] = 556; + t['dcaron'] = 608; + t['Umacron'] = 722; + t['uring'] = 556; + t['threesuperior'] = 300; + t['Ograve'] = 722; + t['Agrave'] = 667; + t['Abreve'] = 667; + t['multiply'] = 570; + t['uacute'] = 556; + t['Tcaron'] = 611; + t['partialdiff'] = 494; + t['ydieresis'] = 444; + t['Nacute'] = 722; + t['icircumflex'] = 278; + t['Ecircumflex'] = 667; + t['adieresis'] = 500; + t['edieresis'] = 444; + t['cacute'] = 444; + t['nacute'] = 556; + t['umacron'] = 556; + t['Ncaron'] = 722; + t['Iacute'] = 389; + t['plusminus'] = 570; + t['brokenbar'] = 220; + t['registered'] = 747; + t['Gbreve'] = 722; + t['Idotaccent'] = 389; + t['summation'] = 600; + t['Egrave'] = 667; + t['racute'] = 389; + t['omacron'] = 500; + t['Zacute'] = 611; + t['Zcaron'] = 611; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 667; + t['lcommaaccent'] = 278; + t['tcaron'] = 366; + t['eogonek'] = 444; + t['Uogonek'] = 722; + t['Aacute'] = 667; + t['Adieresis'] = 667; + t['egrave'] = 444; + t['zacute'] = 389; + t['iogonek'] = 278; + t['Oacute'] = 722; + t['oacute'] = 500; + t['amacron'] = 500; + t['sacute'] = 389; + t['idieresis'] = 278; + t['Ocircumflex'] = 722; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 500; + t['twosuperior'] = 300; + t['Odieresis'] = 722; + t['mu'] = 576; + t['igrave'] = 278; + t['ohungarumlaut'] = 500; + t['Eogonek'] = 667; + t['dcroat'] = 500; + t['threequarters'] = 750; + t['Scedilla'] = 556; + t['lcaron'] = 382; + t['Kcommaaccent'] = 667; + t['Lacute'] = 611; + t['trademark'] = 1000; + t['edotaccent'] = 444; + t['Igrave'] = 389; + t['Imacron'] = 389; + t['Lcaron'] = 611; + t['onehalf'] = 750; + t['lessequal'] = 549; + t['ocircumflex'] = 500; + t['ntilde'] = 556; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 667; + t['emacron'] = 444; + t['gbreve'] = 500; + t['onequarter'] = 750; + t['Scaron'] = 556; + t['Scommaaccent'] = 556; + t['Ohungarumlaut'] = 722; + t['degree'] = 400; + t['ograve'] = 500; + t['Ccaron'] = 667; + t['ugrave'] = 556; + t['radical'] = 549; + t['Dcaron'] = 722; + t['rcommaaccent'] = 389; + t['Ntilde'] = 722; + t['otilde'] = 500; + t['Rcommaaccent'] = 667; + t['Lcommaaccent'] = 611; + t['Atilde'] = 667; + t['Aogonek'] = 667; + t['Aring'] = 667; + t['Otilde'] = 722; + t['zdotaccent'] = 389; + t['Ecaron'] = 667; + t['Iogonek'] = 389; + t['kcommaaccent'] = 500; + t['minus'] = 606; + t['Icircumflex'] = 389; + t['ncaron'] = 556; + t['tcommaaccent'] = 278; + t['logicalnot'] = 606; + t['odieresis'] = 500; + t['udieresis'] = 556; + t['notequal'] = 549; + t['gcommaaccent'] = 500; + t['eth'] = 500; + t['zcaron'] = 389; + t['ncommaaccent'] = 556; + t['onesuperior'] = 300; + t['imacron'] = 278; + t['Euro'] = 500; + }); + t['Times-Italic'] = getLookupTableFactory(function (t) { + t['space'] = 250; + t['exclam'] = 333; + t['quotedbl'] = 420; + t['numbersign'] = 500; + t['dollar'] = 500; + t['percent'] = 833; + t['ampersand'] = 778; + t['quoteright'] = 333; + t['parenleft'] = 333; + t['parenright'] = 333; + t['asterisk'] = 500; + t['plus'] = 675; + t['comma'] = 250; + t['hyphen'] = 333; + t['period'] = 250; + t['slash'] = 278; + t['zero'] = 500; + t['one'] = 500; + t['two'] = 500; + t['three'] = 500; + t['four'] = 500; + t['five'] = 500; + t['six'] = 500; + t['seven'] = 500; + t['eight'] = 500; + t['nine'] = 500; + t['colon'] = 333; + t['semicolon'] = 333; + t['less'] = 675; + t['equal'] = 675; + t['greater'] = 675; + t['question'] = 500; + t['at'] = 920; + t['A'] = 611; + t['B'] = 611; + t['C'] = 667; + t['D'] = 722; + t['E'] = 611; + t['F'] = 611; + t['G'] = 722; + t['H'] = 722; + t['I'] = 333; + t['J'] = 444; + t['K'] = 667; + t['L'] = 556; + t['M'] = 833; + t['N'] = 667; + t['O'] = 722; + t['P'] = 611; + t['Q'] = 722; + t['R'] = 611; + t['S'] = 500; + t['T'] = 556; + t['U'] = 722; + t['V'] = 611; + t['W'] = 833; + t['X'] = 611; + t['Y'] = 556; + t['Z'] = 556; + t['bracketleft'] = 389; + t['backslash'] = 278; + t['bracketright'] = 389; + t['asciicircum'] = 422; + t['underscore'] = 500; + t['quoteleft'] = 333; + t['a'] = 500; + t['b'] = 500; + t['c'] = 444; + t['d'] = 500; + t['e'] = 444; + t['f'] = 278; + t['g'] = 500; + t['h'] = 500; + t['i'] = 278; + t['j'] = 278; + t['k'] = 444; + t['l'] = 278; + t['m'] = 722; + t['n'] = 500; + t['o'] = 500; + t['p'] = 500; + t['q'] = 500; + t['r'] = 389; + t['s'] = 389; + t['t'] = 278; + t['u'] = 500; + t['v'] = 444; + t['w'] = 667; + t['x'] = 444; + t['y'] = 444; + t['z'] = 389; + t['braceleft'] = 400; + t['bar'] = 275; + t['braceright'] = 400; + t['asciitilde'] = 541; + t['exclamdown'] = 389; + t['cent'] = 500; + t['sterling'] = 500; + t['fraction'] = 167; + t['yen'] = 500; + t['florin'] = 500; + t['section'] = 500; + t['currency'] = 500; + t['quotesingle'] = 214; + t['quotedblleft'] = 556; + t['guillemotleft'] = 500; + t['guilsinglleft'] = 333; + t['guilsinglright'] = 333; + t['fi'] = 500; + t['fl'] = 500; + t['endash'] = 500; + t['dagger'] = 500; + t['daggerdbl'] = 500; + t['periodcentered'] = 250; + t['paragraph'] = 523; + t['bullet'] = 350; + t['quotesinglbase'] = 333; + t['quotedblbase'] = 556; + t['quotedblright'] = 556; + t['guillemotright'] = 500; + t['ellipsis'] = 889; + t['perthousand'] = 1000; + t['questiondown'] = 500; + t['grave'] = 333; + t['acute'] = 333; + t['circumflex'] = 333; + t['tilde'] = 333; + t['macron'] = 333; + t['breve'] = 333; + t['dotaccent'] = 333; + t['dieresis'] = 333; + t['ring'] = 333; + t['cedilla'] = 333; + t['hungarumlaut'] = 333; + t['ogonek'] = 333; + t['caron'] = 333; + t['emdash'] = 889; + t['AE'] = 889; + t['ordfeminine'] = 276; + t['Lslash'] = 556; + t['Oslash'] = 722; + t['OE'] = 944; + t['ordmasculine'] = 310; + t['ae'] = 667; + t['dotlessi'] = 278; + t['lslash'] = 278; + t['oslash'] = 500; + t['oe'] = 667; + t['germandbls'] = 500; + t['Idieresis'] = 333; + t['eacute'] = 444; + t['abreve'] = 500; + t['uhungarumlaut'] = 500; + t['ecaron'] = 444; + t['Ydieresis'] = 556; + t['divide'] = 675; + t['Yacute'] = 556; + t['Acircumflex'] = 611; + t['aacute'] = 500; + t['Ucircumflex'] = 722; + t['yacute'] = 444; + t['scommaaccent'] = 389; + t['ecircumflex'] = 444; + t['Uring'] = 722; + t['Udieresis'] = 722; + t['aogonek'] = 500; + t['Uacute'] = 722; + t['uogonek'] = 500; + t['Edieresis'] = 611; + t['Dcroat'] = 722; + t['commaaccent'] = 250; + t['copyright'] = 760; + t['Emacron'] = 611; + t['ccaron'] = 444; + t['aring'] = 500; + t['Ncommaaccent'] = 667; + t['lacute'] = 278; + t['agrave'] = 500; + t['Tcommaaccent'] = 556; + t['Cacute'] = 667; + t['atilde'] = 500; + t['Edotaccent'] = 611; + t['scaron'] = 389; + t['scedilla'] = 389; + t['iacute'] = 278; + t['lozenge'] = 471; + t['Rcaron'] = 611; + t['Gcommaaccent'] = 722; + t['ucircumflex'] = 500; + t['acircumflex'] = 500; + t['Amacron'] = 611; + t['rcaron'] = 389; + t['ccedilla'] = 444; + t['Zdotaccent'] = 556; + t['Thorn'] = 611; + t['Omacron'] = 722; + t['Racute'] = 611; + t['Sacute'] = 500; + t['dcaron'] = 544; + t['Umacron'] = 722; + t['uring'] = 500; + t['threesuperior'] = 300; + t['Ograve'] = 722; + t['Agrave'] = 611; + t['Abreve'] = 611; + t['multiply'] = 675; + t['uacute'] = 500; + t['Tcaron'] = 556; + t['partialdiff'] = 476; + t['ydieresis'] = 444; + t['Nacute'] = 667; + t['icircumflex'] = 278; + t['Ecircumflex'] = 611; + t['adieresis'] = 500; + t['edieresis'] = 444; + t['cacute'] = 444; + t['nacute'] = 500; + t['umacron'] = 500; + t['Ncaron'] = 667; + t['Iacute'] = 333; + t['plusminus'] = 675; + t['brokenbar'] = 275; + t['registered'] = 760; + t['Gbreve'] = 722; + t['Idotaccent'] = 333; + t['summation'] = 600; + t['Egrave'] = 611; + t['racute'] = 389; + t['omacron'] = 500; + t['Zacute'] = 556; + t['Zcaron'] = 556; + t['greaterequal'] = 549; + t['Eth'] = 722; + t['Ccedilla'] = 667; + t['lcommaaccent'] = 278; + t['tcaron'] = 300; + t['eogonek'] = 444; + t['Uogonek'] = 722; + t['Aacute'] = 611; + t['Adieresis'] = 611; + t['egrave'] = 444; + t['zacute'] = 389; + t['iogonek'] = 278; + t['Oacute'] = 722; + t['oacute'] = 500; + t['amacron'] = 500; + t['sacute'] = 389; + t['idieresis'] = 278; + t['Ocircumflex'] = 722; + t['Ugrave'] = 722; + t['Delta'] = 612; + t['thorn'] = 500; + t['twosuperior'] = 300; + t['Odieresis'] = 722; + t['mu'] = 500; + t['igrave'] = 278; + t['ohungarumlaut'] = 500; + t['Eogonek'] = 611; + t['dcroat'] = 500; + t['threequarters'] = 750; + t['Scedilla'] = 500; + t['lcaron'] = 300; + t['Kcommaaccent'] = 667; + t['Lacute'] = 556; + t['trademark'] = 980; + t['edotaccent'] = 444; + t['Igrave'] = 333; + t['Imacron'] = 333; + t['Lcaron'] = 611; + t['onehalf'] = 750; + t['lessequal'] = 549; + t['ocircumflex'] = 500; + t['ntilde'] = 500; + t['Uhungarumlaut'] = 722; + t['Eacute'] = 611; + t['emacron'] = 444; + t['gbreve'] = 500; + t['onequarter'] = 750; + t['Scaron'] = 500; + t['Scommaaccent'] = 500; + t['Ohungarumlaut'] = 722; + t['degree'] = 400; + t['ograve'] = 500; + t['Ccaron'] = 667; + t['ugrave'] = 500; + t['radical'] = 453; + t['Dcaron'] = 722; + t['rcommaaccent'] = 389; + t['Ntilde'] = 667; + t['otilde'] = 500; + t['Rcommaaccent'] = 611; + t['Lcommaaccent'] = 556; + t['Atilde'] = 611; + t['Aogonek'] = 611; + t['Aring'] = 611; + t['Otilde'] = 722; + t['zdotaccent'] = 389; + t['Ecaron'] = 611; + t['Iogonek'] = 333; + t['kcommaaccent'] = 444; + t['minus'] = 675; + t['Icircumflex'] = 333; + t['ncaron'] = 500; + t['tcommaaccent'] = 278; + t['logicalnot'] = 675; + t['odieresis'] = 500; + t['udieresis'] = 500; + t['notequal'] = 549; + t['gcommaaccent'] = 500; + t['eth'] = 500; + t['zcaron'] = 389; + t['ncommaaccent'] = 500; + t['onesuperior'] = 300; + t['imacron'] = 278; + t['Euro'] = 500; + }); + t['ZapfDingbats'] = getLookupTableFactory(function (t) { + t['space'] = 278; + t['a1'] = 974; + t['a2'] = 961; + t['a202'] = 974; + t['a3'] = 980; + t['a4'] = 719; + t['a5'] = 789; + t['a119'] = 790; + t['a118'] = 791; + t['a117'] = 690; + t['a11'] = 960; + t['a12'] = 939; + t['a13'] = 549; + t['a14'] = 855; + t['a15'] = 911; + t['a16'] = 933; + t['a105'] = 911; + t['a17'] = 945; + t['a18'] = 974; + t['a19'] = 755; + t['a20'] = 846; + t['a21'] = 762; + t['a22'] = 761; + t['a23'] = 571; + t['a24'] = 677; + t['a25'] = 763; + t['a26'] = 760; + t['a27'] = 759; + t['a28'] = 754; + t['a6'] = 494; + t['a7'] = 552; + t['a8'] = 537; + t['a9'] = 577; + t['a10'] = 692; + t['a29'] = 786; + t['a30'] = 788; + t['a31'] = 788; + t['a32'] = 790; + t['a33'] = 793; + t['a34'] = 794; + t['a35'] = 816; + t['a36'] = 823; + t['a37'] = 789; + t['a38'] = 841; + t['a39'] = 823; + t['a40'] = 833; + t['a41'] = 816; + t['a42'] = 831; + t['a43'] = 923; + t['a44'] = 744; + t['a45'] = 723; + t['a46'] = 749; + t['a47'] = 790; + t['a48'] = 792; + t['a49'] = 695; + t['a50'] = 776; + t['a51'] = 768; + t['a52'] = 792; + t['a53'] = 759; + t['a54'] = 707; + t['a55'] = 708; + t['a56'] = 682; + t['a57'] = 701; + t['a58'] = 826; + t['a59'] = 815; + t['a60'] = 789; + t['a61'] = 789; + t['a62'] = 707; + t['a63'] = 687; + t['a64'] = 696; + t['a65'] = 689; + t['a66'] = 786; + t['a67'] = 787; + t['a68'] = 713; + t['a69'] = 791; + t['a70'] = 785; + t['a71'] = 791; + t['a72'] = 873; + t['a73'] = 761; + t['a74'] = 762; + t['a203'] = 762; + t['a75'] = 759; + t['a204'] = 759; + t['a76'] = 892; + t['a77'] = 892; + t['a78'] = 788; + t['a79'] = 784; + t['a81'] = 438; + t['a82'] = 138; + t['a83'] = 277; + t['a84'] = 415; + t['a97'] = 392; + t['a98'] = 392; + t['a99'] = 668; + t['a100'] = 668; + t['a89'] = 390; + t['a90'] = 390; + t['a93'] = 317; + t['a94'] = 317; + t['a91'] = 276; + t['a92'] = 276; + t['a205'] = 509; + t['a85'] = 509; + t['a206'] = 410; + t['a86'] = 410; + t['a87'] = 234; + t['a88'] = 234; + t['a95'] = 334; + t['a96'] = 334; + t['a101'] = 732; + t['a102'] = 544; + t['a103'] = 544; + t['a104'] = 910; + t['a106'] = 667; + t['a107'] = 760; + t['a108'] = 760; + t['a112'] = 776; + t['a111'] = 595; + t['a110'] = 694; + t['a109'] = 626; + t['a120'] = 788; + t['a121'] = 788; + t['a122'] = 788; + t['a123'] = 788; + t['a124'] = 788; + t['a125'] = 788; + t['a126'] = 788; + t['a127'] = 788; + t['a128'] = 788; + t['a129'] = 788; + t['a130'] = 788; + t['a131'] = 788; + t['a132'] = 788; + t['a133'] = 788; + t['a134'] = 788; + t['a135'] = 788; + t['a136'] = 788; + t['a137'] = 788; + t['a138'] = 788; + t['a139'] = 788; + t['a140'] = 788; + t['a141'] = 788; + t['a142'] = 788; + t['a143'] = 788; + t['a144'] = 788; + t['a145'] = 788; + t['a146'] = 788; + t['a147'] = 788; + t['a148'] = 788; + t['a149'] = 788; + t['a150'] = 788; + t['a151'] = 788; + t['a152'] = 788; + t['a153'] = 788; + t['a154'] = 788; + t['a155'] = 788; + t['a156'] = 788; + t['a157'] = 788; + t['a158'] = 788; + t['a159'] = 788; + t['a160'] = 894; + t['a161'] = 838; + t['a163'] = 1016; + t['a164'] = 458; + t['a196'] = 748; + t['a165'] = 924; + t['a192'] = 748; + t['a166'] = 918; + t['a167'] = 927; + t['a168'] = 928; + t['a169'] = 928; + t['a170'] = 834; + t['a171'] = 873; + t['a172'] = 828; + t['a173'] = 924; + t['a162'] = 924; + t['a174'] = 917; + t['a175'] = 930; + t['a176'] = 931; + t['a177'] = 463; + t['a178'] = 883; + t['a179'] = 836; + t['a193'] = 836; + t['a180'] = 867; + t['a199'] = 867; + t['a181'] = 696; + t['a200'] = 696; + t['a182'] = 874; + t['a201'] = 874; + t['a183'] = 760; + t['a184'] = 946; + t['a197'] = 771; + t['a185'] = 865; + t['a194'] = 771; + t['a198'] = 888; + t['a186'] = 967; + t['a195'] = 888; + t['a187'] = 831; + t['a188'] = 873; + t['a189'] = 927; + t['a190'] = 970; + t['a191'] = 918; + }); + }); + exports.getMetrics = getMetrics; + })); + (function (root, factory) { + factory(root.pdfjsCoreMurmurHash3 = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var Uint32ArrayView = sharedUtil.Uint32ArrayView; + var MurmurHash3_64 = function MurmurHash3_64Closure(seed) { + var MASK_HIGH = 0xffff0000; + var MASK_LOW = 0xffff; + function MurmurHash3_64(seed) { + var SEED = 0xc3d2e1f0; + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + var alwaysUseUint32ArrayView = false; + try { + new Uint32Array(new Uint8Array(5).buffer, 0, 1); + } catch (e) { + alwaysUseUint32ArrayView = true; + } + MurmurHash3_64.prototype = { + update: function MurmurHash3_64_update(input) { + var useUint32ArrayView = alwaysUseUint32ArrayView; + var i; + if (typeof input === 'string') { + var data = new Uint8Array(input.length * 2); + var length = 0; + for (i = 0; i < input.length; i++) { + var code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (input instanceof Uint8Array) { + data = input; + length = data.length; + } else if (typeof input === 'object' && 'length' in input) { + data = input; + length = data.length; + useUint32ArrayView = true; + } else { + throw new Error('Wrong data format in MurmurHash3_64_update. ' + 'Input must be a string or array.'); + } + var blockCounts = length >> 2; + var tailLength = length - blockCounts * 4; + var dataUint32 = useUint32ArrayView ? new Uint32ArrayView(data, blockCounts) : new Uint32Array(data.buffer, 0, blockCounts); + var k1 = 0; + var k2 = 0; + var h1 = this.h1; + var h2 = this.h2; + var C1 = 0xcc9e2d51; + var C2 = 0x1b873593; + var C1_LOW = C1 & MASK_LOW; + var C2_LOW = C2 & MASK_LOW; + for (i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + return this; + }, + hexdigest: function MurmurHash3_64_hexdigest() { + var h1 = this.h1; + var h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + for (var i = 0, arr = [ + h1, + h2 + ], str = ''; i < arr.length; i++) { + var hex = (arr[i] >>> 0).toString(16); + while (hex.length < 8) { + hex = '0' + hex; + } + str += hex; + } + return str; + } + }; + return MurmurHash3_64; + }(); + exports.MurmurHash3_64 = MurmurHash3_64; + })); + (function (root, factory) { + factory(root.pdfjsCorePrimitives = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var isArray = sharedUtil.isArray; + var Name = function NameClosure() { + function Name(name) { + this.name = name; + } + Name.prototype = {}; + var nameCache = Object.create(null); + Name.get = function Name_get(name) { + var nameValue = nameCache[name]; + return nameValue ? nameValue : nameCache[name] = new Name(name); + }; + return Name; + }(); + var Cmd = function CmdClosure() { + function Cmd(cmd) { + this.cmd = cmd; + } + Cmd.prototype = {}; + var cmdCache = Object.create(null); + Cmd.get = function Cmd_get(cmd) { + var cmdValue = cmdCache[cmd]; + return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd); + }; + return Cmd; + }(); + var Dict = function DictClosure() { + var nonSerializable = function nonSerializableClosure() { + return nonSerializable; + }; + function Dict(xref) { + this.map = Object.create(null); + this.xref = xref; + this.objId = null; + this.suppressEncryption = false; + this.__nonSerializable__ = nonSerializable; + } + Dict.prototype = { + assignXref: function Dict_assignXref(newXref) { + this.xref = newXref; + }, + get: function Dict_get(key1, key2, key3) { + var value; + var xref = this.xref, suppressEncryption = this.suppressEncryption; + if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; + } + if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; + } + value = this.map[key3] || null; + return xref ? xref.fetchIfRef(value, suppressEncryption) : value; + }, + getAsync: function Dict_getAsync(key1, key2, key3) { + var value; + var xref = this.xref, suppressEncryption = this.suppressEncryption; + if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || typeof key2 === 'undefined') { + if (xref) { + return xref.fetchIfRefAsync(value, suppressEncryption); + } + return Promise.resolve(value); + } + if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || typeof key3 === 'undefined') { + if (xref) { + return xref.fetchIfRefAsync(value, suppressEncryption); + } + return Promise.resolve(value); + } + value = this.map[key3] || null; + if (xref) { + return xref.fetchIfRefAsync(value, suppressEncryption); + } + return Promise.resolve(value); + }, + getArray: function Dict_getArray(key1, key2, key3) { + var value = this.get(key1, key2, key3); + var xref = this.xref, suppressEncryption = this.suppressEncryption; + if (!isArray(value) || !xref) { + return value; + } + value = value.slice(); + for (var i = 0, ii = value.length; i < ii; i++) { + if (!isRef(value[i])) { + continue; + } + value[i] = xref.fetch(value[i], suppressEncryption); + } + return value; + }, + getRaw: function Dict_getRaw(key) { + return this.map[key]; + }, + getKeys: function Dict_getKeys() { + return Object.keys(this.map); + }, + 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)); + } + } + }; + Dict.empty = new Dict(null); + Dict.merge = function Dict_merge(xref, dictArray) { + var mergedDict = new Dict(xref); + for (var i = 0, ii = dictArray.length; i < ii; i++) { + var dict = dictArray[i]; + if (!isDict(dict)) { + continue; + } + for (var keyName in dict.map) { + if (mergedDict.map[keyName]) { + continue; + } + mergedDict.map[keyName] = dict.map[keyName]; + } + } + return mergedDict; + }; + return Dict; + }(); + var Ref = function RefClosure() { + function Ref(num, gen) { + this.num = num; + this.gen = gen; + } + Ref.prototype = { + toString: function Ref_toString() { + var str = this.num + 'R'; + if (this.gen !== 0) { + str += this.gen; + } + return str; + } + }; + return Ref; + }(); + var RefSet = function RefSetClosure() { + function RefSet() { + this.dict = Object.create(null); + } + RefSet.prototype = { + has: function RefSet_has(ref) { + return ref.toString() in this.dict; + }, + put: function RefSet_put(ref) { + this.dict[ref.toString()] = true; + }, + remove: function RefSet_remove(ref) { + delete this.dict[ref.toString()]; + } + }; + return RefSet; + }(); + var RefSetCache = function RefSetCacheClosure() { + function RefSetCache() { + this.dict = Object.create(null); + } + RefSetCache.prototype = { + get: function RefSetCache_get(ref) { + return this.dict[ref.toString()]; + }, + has: function RefSetCache_has(ref) { + return ref.toString() in this.dict; + }, + put: function RefSetCache_put(ref, obj) { + this.dict[ref.toString()] = obj; + }, + putAlias: function RefSetCache_putAlias(ref, aliasRef) { + this.dict[ref.toString()] = this.get(aliasRef); + }, + forEach: function RefSetCache_forEach(fn, thisArg) { + for (var i in this.dict) { + fn.call(thisArg, this.dict[i]); + } + }, + clear: function RefSetCache_clear() { + this.dict = Object.create(null); + } + }; + return RefSetCache; + }(); + function isName(v, name) { + return v instanceof Name && (name === undefined || v.name === name); + } + function isCmd(v, cmd) { + return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); + } + function isDict(v, type) { + return v instanceof Dict && (type === undefined || isName(v.get('Type'), type)); + } + function isRef(v) { + return v instanceof Ref; + } + function isRefsEqual(v1, v2) { + return v1.num === v2.num && v1.gen === v2.gen; + } + function isStream(v) { + return typeof v === 'object' && v !== null && v.getBytes !== undefined; + } + exports.Cmd = Cmd; + exports.Dict = Dict; + exports.Name = Name; + exports.Ref = Ref; + exports.RefSet = RefSet; + exports.RefSetCache = RefSetCache; + exports.isCmd = isCmd; + exports.isDict = isDict; + exports.isName = isName; + exports.isRef = isRef; + exports.isRefsEqual = isRefsEqual; + exports.isStream = isStream; + })); + (function (root, factory) { + factory(root.pdfjsCoreStandardFonts = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var getLookupTableFactory = sharedUtil.getLookupTableFactory; + var getStdFontMap = getLookupTableFactory(function (t) { + t['ArialNarrow'] = 'Helvetica'; + t['ArialNarrow-Bold'] = 'Helvetica-Bold'; + t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique'; + t['ArialNarrow-Italic'] = 'Helvetica-Oblique'; + t['ArialBlack'] = 'Helvetica'; + t['ArialBlack-Bold'] = 'Helvetica-Bold'; + t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique'; + t['ArialBlack-Italic'] = 'Helvetica-Oblique'; + t['Arial-Black'] = 'Helvetica'; + t['Arial-Black-Bold'] = 'Helvetica-Bold'; + t['Arial-Black-BoldItalic'] = 'Helvetica-BoldOblique'; + t['Arial-Black-Italic'] = 'Helvetica-Oblique'; + t['Arial'] = 'Helvetica'; + t['Arial-Bold'] = 'Helvetica-Bold'; + t['Arial-BoldItalic'] = 'Helvetica-BoldOblique'; + t['Arial-Italic'] = 'Helvetica-Oblique'; + t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique'; + t['Arial-BoldMT'] = 'Helvetica-Bold'; + t['Arial-ItalicMT'] = 'Helvetica-Oblique'; + t['ArialMT'] = 'Helvetica'; + t['Courier-Bold'] = 'Courier-Bold'; + t['Courier-BoldItalic'] = 'Courier-BoldOblique'; + t['Courier-Italic'] = 'Courier-Oblique'; + t['CourierNew'] = 'Courier'; + t['CourierNew-Bold'] = 'Courier-Bold'; + t['CourierNew-BoldItalic'] = 'Courier-BoldOblique'; + t['CourierNew-Italic'] = 'Courier-Oblique'; + t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique'; + t['CourierNewPS-BoldMT'] = 'Courier-Bold'; + t['CourierNewPS-ItalicMT'] = 'Courier-Oblique'; + t['CourierNewPSMT'] = 'Courier'; + t['Helvetica'] = 'Helvetica'; + t['Helvetica-Bold'] = 'Helvetica-Bold'; + t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique'; + t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique'; + t['Helvetica-Italic'] = 'Helvetica-Oblique'; + t['Helvetica-Oblique'] = 'Helvetica-Oblique'; + t['Symbol-Bold'] = 'Symbol'; + t['Symbol-BoldItalic'] = 'Symbol'; + t['Symbol-Italic'] = 'Symbol'; + t['TimesNewRoman'] = 'Times-Roman'; + t['TimesNewRoman-Bold'] = 'Times-Bold'; + t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic'; + t['TimesNewRoman-Italic'] = 'Times-Italic'; + t['TimesNewRomanPS'] = 'Times-Roman'; + t['TimesNewRomanPS-Bold'] = 'Times-Bold'; + t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic'; + t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic'; + t['TimesNewRomanPS-BoldMT'] = 'Times-Bold'; + t['TimesNewRomanPS-Italic'] = 'Times-Italic'; + t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic'; + t['TimesNewRomanPSMT'] = 'Times-Roman'; + t['TimesNewRomanPSMT-Bold'] = 'Times-Bold'; + t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic'; + t['TimesNewRomanPSMT-Italic'] = 'Times-Italic'; + }); + var getNonStdFontMap = getLookupTableFactory(function (t) { + t['CenturyGothic'] = 'Helvetica'; + t['CenturyGothic-Bold'] = 'Helvetica-Bold'; + t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique'; + t['CenturyGothic-Italic'] = 'Helvetica-Oblique'; + t['ComicSansMS'] = 'Comic Sans MS'; + t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold'; + t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic'; + t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic'; + t['LucidaConsole'] = 'Courier'; + t['LucidaConsole-Bold'] = 'Courier-Bold'; + t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique'; + t['LucidaConsole-Italic'] = 'Courier-Oblique'; + t['MS-Gothic'] = 'MS Gothic'; + t['MS-Gothic-Bold'] = 'MS Gothic-Bold'; + t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic'; + t['MS-Gothic-Italic'] = 'MS Gothic-Italic'; + t['MS-Mincho'] = 'MS Mincho'; + t['MS-Mincho-Bold'] = 'MS Mincho-Bold'; + t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic'; + t['MS-Mincho-Italic'] = 'MS Mincho-Italic'; + t['MS-PGothic'] = 'MS PGothic'; + t['MS-PGothic-Bold'] = 'MS PGothic-Bold'; + t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic'; + t['MS-PGothic-Italic'] = 'MS PGothic-Italic'; + t['MS-PMincho'] = 'MS PMincho'; + t['MS-PMincho-Bold'] = 'MS PMincho-Bold'; + t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic'; + t['MS-PMincho-Italic'] = 'MS PMincho-Italic'; + t['NuptialScript'] = 'Times-Italic'; + t['Wingdings'] = 'ZapfDingbats'; + }); + var getSerifFonts = getLookupTableFactory(function (t) { + t['Adobe Jenson'] = true; + t['Adobe Text'] = true; + t['Albertus'] = true; + t['Aldus'] = true; + t['Alexandria'] = true; + t['Algerian'] = true; + t['American Typewriter'] = true; + t['Antiqua'] = true; + t['Apex'] = true; + t['Arno'] = true; + t['Aster'] = true; + t['Aurora'] = true; + t['Baskerville'] = true; + t['Bell'] = true; + t['Bembo'] = true; + t['Bembo Schoolbook'] = true; + t['Benguiat'] = true; + t['Berkeley Old Style'] = true; + t['Bernhard Modern'] = true; + t['Berthold City'] = true; + t['Bodoni'] = true; + t['Bauer Bodoni'] = true; + t['Book Antiqua'] = true; + t['Bookman'] = true; + t['Bordeaux Roman'] = true; + t['Californian FB'] = true; + t['Calisto'] = true; + t['Calvert'] = true; + t['Capitals'] = true; + t['Cambria'] = true; + t['Cartier'] = true; + t['Caslon'] = true; + t['Catull'] = true; + t['Centaur'] = true; + t['Century Old Style'] = true; + t['Century Schoolbook'] = true; + t['Chaparral'] = true; + t['Charis SIL'] = true; + t['Cheltenham'] = true; + t['Cholla Slab'] = true; + t['Clarendon'] = true; + t['Clearface'] = true; + t['Cochin'] = true; + t['Colonna'] = true; + t['Computer Modern'] = true; + t['Concrete Roman'] = true; + t['Constantia'] = true; + t['Cooper Black'] = true; + t['Corona'] = true; + t['Ecotype'] = true; + t['Egyptienne'] = true; + t['Elephant'] = true; + t['Excelsior'] = true; + t['Fairfield'] = true; + t['FF Scala'] = true; + t['Folkard'] = true; + t['Footlight'] = true; + t['FreeSerif'] = true; + t['Friz Quadrata'] = true; + t['Garamond'] = true; + t['Gentium'] = true; + t['Georgia'] = true; + t['Gloucester'] = true; + t['Goudy Old Style'] = true; + t['Goudy Schoolbook'] = true; + t['Goudy Pro Font'] = true; + t['Granjon'] = true; + t['Guardian Egyptian'] = true; + t['Heather'] = true; + t['Hercules'] = true; + t['High Tower Text'] = true; + t['Hiroshige'] = true; + t['Hoefler Text'] = true; + t['Humana Serif'] = true; + t['Imprint'] = true; + t['Ionic No. 5'] = true; + t['Janson'] = true; + t['Joanna'] = true; + t['Korinna'] = true; + t['Lexicon'] = true; + t['Liberation Serif'] = true; + t['Linux Libertine'] = true; + t['Literaturnaya'] = true; + t['Lucida'] = true; + t['Lucida Bright'] = true; + t['Melior'] = true; + t['Memphis'] = true; + t['Miller'] = true; + t['Minion'] = true; + t['Modern'] = true; + t['Mona Lisa'] = true; + t['Mrs Eaves'] = true; + t['MS Serif'] = true; + t['Museo Slab'] = true; + t['New York'] = true; + t['Nimbus Roman'] = true; + t['NPS Rawlinson Roadway'] = true; + t['NuptialScript'] = true; + t['Palatino'] = true; + t['Perpetua'] = true; + t['Plantin'] = true; + t['Plantin Schoolbook'] = true; + t['Playbill'] = true; + t['Poor Richard'] = true; + t['Rawlinson Roadway'] = true; + t['Renault'] = true; + t['Requiem'] = true; + t['Rockwell'] = true; + t['Roman'] = true; + t['Rotis Serif'] = true; + t['Sabon'] = true; + t['Scala'] = true; + t['Seagull'] = true; + t['Sistina'] = true; + t['Souvenir'] = true; + t['STIX'] = true; + t['Stone Informal'] = true; + t['Stone Serif'] = true; + t['Sylfaen'] = true; + t['Times'] = true; + t['Trajan'] = true; + t['Trinité'] = true; + t['Trump Mediaeval'] = true; + t['Utopia'] = true; + t['Vale Type'] = true; + t['Bitstream Vera'] = true; + t['Vera Serif'] = true; + t['Versailles'] = true; + t['Wanted'] = true; + t['Weiss'] = true; + t['Wide Latin'] = true; + t['Windsor'] = true; + t['XITS'] = true; + }); + var getSymbolsFonts = getLookupTableFactory(function (t) { + t['Dingbats'] = true; + t['Symbol'] = true; + t['ZapfDingbats'] = true; + }); + var getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { + t[2] = 10; + t[3] = 32; + t[4] = 33; + t[5] = 34; + t[6] = 35; + t[7] = 36; + t[8] = 37; + t[9] = 38; + t[10] = 39; + t[11] = 40; + t[12] = 41; + t[13] = 42; + t[14] = 43; + t[15] = 44; + t[16] = 45; + t[17] = 46; + t[18] = 47; + t[19] = 48; + t[20] = 49; + t[21] = 50; + t[22] = 51; + t[23] = 52; + t[24] = 53; + t[25] = 54; + t[26] = 55; + t[27] = 56; + t[28] = 57; + t[29] = 58; + t[30] = 894; + t[31] = 60; + t[32] = 61; + t[33] = 62; + t[34] = 63; + t[35] = 64; + t[36] = 65; + t[37] = 66; + t[38] = 67; + t[39] = 68; + t[40] = 69; + t[41] = 70; + t[42] = 71; + t[43] = 72; + t[44] = 73; + t[45] = 74; + t[46] = 75; + t[47] = 76; + t[48] = 77; + t[49] = 78; + t[50] = 79; + t[51] = 80; + t[52] = 81; + t[53] = 82; + t[54] = 83; + t[55] = 84; + t[56] = 85; + t[57] = 86; + t[58] = 87; + t[59] = 88; + t[60] = 89; + t[61] = 90; + t[62] = 91; + t[63] = 92; + t[64] = 93; + t[65] = 94; + t[66] = 95; + t[67] = 96; + t[68] = 97; + t[69] = 98; + t[70] = 99; + t[71] = 100; + t[72] = 101; + t[73] = 102; + t[74] = 103; + t[75] = 104; + t[76] = 105; + t[77] = 106; + t[78] = 107; + t[79] = 108; + t[80] = 109; + t[81] = 110; + t[82] = 111; + t[83] = 112; + t[84] = 113; + t[85] = 114; + t[86] = 115; + t[87] = 116; + t[88] = 117; + t[89] = 118; + t[90] = 119; + t[91] = 120; + t[92] = 121; + t[93] = 122; + t[94] = 123; + t[95] = 124; + t[96] = 125; + t[97] = 126; + t[98] = 196; + t[99] = 197; + t[100] = 199; + t[101] = 201; + t[102] = 209; + t[103] = 214; + t[104] = 220; + t[105] = 225; + t[106] = 224; + t[107] = 226; + t[108] = 228; + t[109] = 227; + t[110] = 229; + t[111] = 231; + t[112] = 233; + t[113] = 232; + t[114] = 234; + t[115] = 235; + t[116] = 237; + t[117] = 236; + t[118] = 238; + t[119] = 239; + t[120] = 241; + t[121] = 243; + t[122] = 242; + t[123] = 244; + t[124] = 246; + t[125] = 245; + t[126] = 250; + t[127] = 249; + t[128] = 251; + t[129] = 252; + t[130] = 8224; + t[131] = 176; + t[132] = 162; + t[133] = 163; + t[134] = 167; + t[135] = 8226; + t[136] = 182; + t[137] = 223; + t[138] = 174; + t[139] = 169; + t[140] = 8482; + t[141] = 180; + t[142] = 168; + t[143] = 8800; + t[144] = 198; + t[145] = 216; + t[146] = 8734; + t[147] = 177; + t[148] = 8804; + t[149] = 8805; + t[150] = 165; + t[151] = 181; + t[152] = 8706; + t[153] = 8721; + t[154] = 8719; + t[156] = 8747; + t[157] = 170; + t[158] = 186; + t[159] = 8486; + t[160] = 230; + t[161] = 248; + t[162] = 191; + t[163] = 161; + t[164] = 172; + t[165] = 8730; + t[166] = 402; + t[167] = 8776; + t[168] = 8710; + t[169] = 171; + t[170] = 187; + t[171] = 8230; + t[210] = 218; + t[223] = 711; + t[224] = 321; + t[225] = 322; + t[227] = 353; + t[229] = 382; + t[234] = 253; + t[252] = 263; + t[253] = 268; + t[254] = 269; + t[258] = 258; + t[260] = 260; + t[261] = 261; + t[265] = 280; + t[266] = 281; + t[268] = 283; + t[269] = 313; + t[275] = 323; + t[276] = 324; + t[278] = 328; + t[284] = 345; + t[285] = 346; + t[286] = 347; + t[292] = 367; + t[295] = 377; + t[296] = 378; + t[298] = 380; + t[305] = 963; + t[306] = 964; + t[307] = 966; + t[308] = 8215; + t[309] = 8252; + t[310] = 8319; + t[311] = 8359; + t[312] = 8592; + t[313] = 8593; + t[337] = 9552; + t[493] = 1039; + t[494] = 1040; + t[705] = 1524; + t[706] = 8362; + t[710] = 64288; + t[711] = 64298; + t[759] = 1617; + t[761] = 1776; + t[763] = 1778; + t[775] = 1652; + t[777] = 1764; + t[778] = 1780; + t[779] = 1781; + t[780] = 1782; + t[782] = 771; + t[783] = 64726; + t[786] = 8363; + t[788] = 8532; + t[790] = 768; + t[791] = 769; + t[792] = 768; + t[795] = 803; + t[797] = 64336; + t[798] = 64337; + t[799] = 64342; + t[800] = 64343; + t[801] = 64344; + t[802] = 64345; + t[803] = 64362; + t[804] = 64363; + t[805] = 64364; + t[2424] = 7821; + t[2425] = 7822; + t[2426] = 7823; + t[2427] = 7824; + t[2428] = 7825; + t[2429] = 7826; + t[2430] = 7827; + t[2433] = 7682; + t[2678] = 8045; + t[2679] = 8046; + t[2830] = 1552; + t[2838] = 686; + t[2840] = 751; + t[2842] = 753; + t[2843] = 754; + t[2844] = 755; + t[2846] = 757; + t[2856] = 767; + t[2857] = 848; + t[2858] = 849; + t[2862] = 853; + t[2863] = 854; + t[2864] = 855; + t[2865] = 861; + t[2866] = 862; + t[2906] = 7460; + t[2908] = 7462; + t[2909] = 7463; + t[2910] = 7464; + t[2912] = 7466; + t[2913] = 7467; + t[2914] = 7468; + t[2916] = 7470; + t[2917] = 7471; + t[2918] = 7472; + t[2920] = 7474; + t[2921] = 7475; + t[2922] = 7476; + t[2924] = 7478; + t[2925] = 7479; + t[2926] = 7480; + t[2928] = 7482; + t[2929] = 7483; + t[2930] = 7484; + t[2932] = 7486; + t[2933] = 7487; + t[2934] = 7488; + t[2936] = 7490; + t[2937] = 7491; + t[2938] = 7492; + t[2940] = 7494; + t[2941] = 7495; + t[2942] = 7496; + t[2944] = 7498; + t[2946] = 7500; + t[2948] = 7502; + t[2950] = 7504; + t[2951] = 7505; + t[2952] = 7506; + t[2954] = 7508; + t[2955] = 7509; + t[2956] = 7510; + t[2958] = 7512; + t[2959] = 7513; + t[2960] = 7514; + t[2962] = 7516; + t[2963] = 7517; + t[2964] = 7518; + t[2966] = 7520; + t[2967] = 7521; + t[2968] = 7522; + t[2970] = 7524; + t[2971] = 7525; + t[2972] = 7526; + t[2974] = 7528; + t[2975] = 7529; + t[2976] = 7530; + t[2978] = 1537; + t[2979] = 1538; + t[2980] = 1539; + t[2982] = 1549; + t[2983] = 1551; + t[2984] = 1552; + t[2986] = 1554; + t[2987] = 1555; + t[2988] = 1556; + t[2990] = 1623; + t[2991] = 1624; + t[2995] = 1775; + t[2999] = 1791; + t[3002] = 64290; + t[3003] = 64291; + t[3004] = 64292; + t[3006] = 64294; + t[3007] = 64295; + t[3008] = 64296; + t[3011] = 1900; + t[3014] = 8223; + t[3015] = 8244; + t[3017] = 7532; + t[3018] = 7533; + t[3019] = 7534; + t[3075] = 7590; + t[3076] = 7591; + t[3079] = 7594; + t[3080] = 7595; + t[3083] = 7598; + t[3084] = 7599; + t[3087] = 7602; + t[3088] = 7603; + t[3091] = 7606; + t[3092] = 7607; + t[3095] = 7610; + t[3096] = 7611; + t[3099] = 7614; + t[3100] = 7615; + t[3103] = 7618; + t[3104] = 7619; + t[3107] = 8337; + t[3108] = 8338; + t[3116] = 1884; + t[3119] = 1885; + t[3120] = 1885; + t[3123] = 1886; + t[3124] = 1886; + t[3127] = 1887; + t[3128] = 1887; + t[3131] = 1888; + t[3132] = 1888; + t[3135] = 1889; + t[3136] = 1889; + t[3139] = 1890; + t[3140] = 1890; + t[3143] = 1891; + t[3144] = 1891; + t[3147] = 1892; + t[3148] = 1892; + t[3153] = 580; + t[3154] = 581; + t[3157] = 584; + t[3158] = 585; + t[3161] = 588; + t[3162] = 589; + t[3165] = 891; + t[3166] = 892; + t[3169] = 1274; + t[3170] = 1275; + t[3173] = 1278; + t[3174] = 1279; + t[3181] = 7622; + t[3182] = 7623; + t[3282] = 11799; + t[3316] = 578; + t[3379] = 42785; + t[3393] = 1159; + t[3416] = 8377; + }); + var getSupplementalGlyphMapForArialBlack = getLookupTableFactory(function (t) { + t[227] = 322; + t[264] = 261; + t[291] = 346; + }); + exports.getStdFontMap = getStdFontMap; + exports.getNonStdFontMap = getNonStdFontMap; + exports.getSerifFonts = getSerifFonts; + exports.getSymbolsFonts = getSymbolsFonts; + exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts; + exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack; + })); + (function (root, factory) { + factory(root.pdfjsCoreUnicode = {}, root.pdfjsSharedUtil); + }(this, function (exports, sharedUtil) { + var getLookupTableFactory = sharedUtil.getLookupTableFactory; + var getSpecialPUASymbols = getLookupTableFactory(function (t) { + t[63721] = 0x00A9; + t[63193] = 0x00A9; + t[63720] = 0x00AE; + t[63194] = 0x00AE; + t[63722] = 0x2122; + t[63195] = 0x2122; + t[63729] = 0x23A7; + t[63730] = 0x23A8; + t[63731] = 0x23A9; + t[63740] = 0x23AB; + t[63741] = 0x23AC; + t[63742] = 0x23AD; + t[63726] = 0x23A1; + t[63727] = 0x23A2; + t[63728] = 0x23A3; + t[63737] = 0x23A4; + t[63738] = 0x23A5; + t[63739] = 0x23A6; + t[63723] = 0x239B; + t[63724] = 0x239C; + t[63725] = 0x239D; + t[63734] = 0x239E; + t[63735] = 0x239F; + t[63736] = 0x23A0; + }); + function mapSpecialUnicodeValues(code) { + if (code >= 0xFFF0 && code <= 0xFFFF) { + return 0; + } else if (code >= 0xF600 && code <= 0xF8FF) { + return getSpecialPUASymbols()[code] || code; + } + return code; + } + function getUnicodeForGlyph(name, glyphsUnicodeMap) { + var unicode = glyphsUnicodeMap[name]; + if (unicode !== undefined) { + return unicode; + } + if (!name) { + return -1; + } + if (name[0] === 'u') { + var nameLen = name.length, hexStr; + if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') { + hexStr = name.substr(3); + } else if (nameLen >= 5 && nameLen <= 7) { + hexStr = name.substr(1); + } else { + return -1; + } + if (hexStr === hexStr.toUpperCase()) { + unicode = parseInt(hexStr, 16); + if (unicode >= 0) { + return unicode; + } + } + } + return -1; + } + var UnicodeRanges = [ + { + 'begin': 0x0000, + 'end': 0x007F + }, + { + 'begin': 0x0080, + 'end': 0x00FF + }, + { + 'begin': 0x0100, + 'end': 0x017F + }, + { + 'begin': 0x0180, + 'end': 0x024F + }, + { + 'begin': 0x0250, + 'end': 0x02AF + }, + { + 'begin': 0x02B0, + 'end': 0x02FF + }, + { + 'begin': 0x0300, + 'end': 0x036F + }, + { + 'begin': 0x0370, + 'end': 0x03FF + }, + { + 'begin': 0x2C80, + 'end': 0x2CFF + }, + { + 'begin': 0x0400, + 'end': 0x04FF + }, + { + 'begin': 0x0530, + 'end': 0x058F + }, + { + 'begin': 0x0590, + 'end': 0x05FF + }, + { + 'begin': 0xA500, + 'end': 0xA63F + }, + { + 'begin': 0x0600, + 'end': 0x06FF + }, + { + 'begin': 0x07C0, + 'end': 0x07FF + }, + { + 'begin': 0x0900, + 'end': 0x097F + }, + { + 'begin': 0x0980, + 'end': 0x09FF + }, + { + 'begin': 0x0A00, + 'end': 0x0A7F + }, + { + 'begin': 0x0A80, + 'end': 0x0AFF + }, + { + 'begin': 0x0B00, + 'end': 0x0B7F + }, + { + 'begin': 0x0B80, + 'end': 0x0BFF + }, + { + 'begin': 0x0C00, + 'end': 0x0C7F + }, + { + 'begin': 0x0C80, + 'end': 0x0CFF + }, + { + 'begin': 0x0D00, + 'end': 0x0D7F + }, + { + 'begin': 0x0E00, + 'end': 0x0E7F + }, + { + 'begin': 0x0E80, + 'end': 0x0EFF + }, + { + 'begin': 0x10A0, + 'end': 0x10FF + }, + { + 'begin': 0x1B00, + 'end': 0x1B7F + }, + { + 'begin': 0x1100, + 'end': 0x11FF + }, + { + 'begin': 0x1E00, + 'end': 0x1EFF + }, + { + 'begin': 0x1F00, + 'end': 0x1FFF + }, + { + 'begin': 0x2000, + 'end': 0x206F + }, + { + 'begin': 0x2070, + 'end': 0x209F + }, + { + 'begin': 0x20A0, + 'end': 0x20CF + }, + { + 'begin': 0x20D0, + 'end': 0x20FF + }, + { + 'begin': 0x2100, + 'end': 0x214F + }, + { + 'begin': 0x2150, + 'end': 0x218F + }, + { + 'begin': 0x2190, + 'end': 0x21FF + }, + { + 'begin': 0x2200, + 'end': 0x22FF + }, + { + 'begin': 0x2300, + 'end': 0x23FF + }, + { + 'begin': 0x2400, + 'end': 0x243F + }, + { + 'begin': 0x2440, + 'end': 0x245F + }, + { + 'begin': 0x2460, + 'end': 0x24FF + }, + { + 'begin': 0x2500, + 'end': 0x257F + }, + { + 'begin': 0x2580, + 'end': 0x259F + }, + { + 'begin': 0x25A0, + 'end': 0x25FF + }, + { + 'begin': 0x2600, + 'end': 0x26FF + }, + { + 'begin': 0x2700, + 'end': 0x27BF + }, + { + 'begin': 0x3000, + 'end': 0x303F + }, + { + 'begin': 0x3040, + 'end': 0x309F + }, + { + 'begin': 0x30A0, + 'end': 0x30FF + }, + { + 'begin': 0x3100, + 'end': 0x312F + }, + { + 'begin': 0x3130, + 'end': 0x318F + }, + { + 'begin': 0xA840, + 'end': 0xA87F + }, + { + 'begin': 0x3200, + 'end': 0x32FF + }, + { + 'begin': 0x3300, + 'end': 0x33FF + }, + { + 'begin': 0xAC00, + 'end': 0xD7AF + }, + { + 'begin': 0xD800, + 'end': 0xDFFF + }, + { + 'begin': 0x10900, + 'end': 0x1091F + }, + { + 'begin': 0x4E00, + 'end': 0x9FFF + }, + { + 'begin': 0xE000, + 'end': 0xF8FF + }, + { + 'begin': 0x31C0, + 'end': 0x31EF + }, + { + 'begin': 0xFB00, + 'end': 0xFB4F + }, + { + 'begin': 0xFB50, + 'end': 0xFDFF + }, + { + 'begin': 0xFE20, + 'end': 0xFE2F + }, + { + 'begin': 0xFE10, + 'end': 0xFE1F + }, + { + 'begin': 0xFE50, + 'end': 0xFE6F + }, + { + 'begin': 0xFE70, + 'end': 0xFEFF + }, + { + 'begin': 0xFF00, + 'end': 0xFFEF + }, + { + 'begin': 0xFFF0, + 'end': 0xFFFF + }, + { + 'begin': 0x0F00, + 'end': 0x0FFF + }, + { + 'begin': 0x0700, + 'end': 0x074F + }, + { + 'begin': 0x0780, + 'end': 0x07BF + }, + { + 'begin': 0x0D80, + 'end': 0x0DFF + }, + { + 'begin': 0x1000, + 'end': 0x109F + }, + { + 'begin': 0x1200, + 'end': 0x137F + }, + { + 'begin': 0x13A0, + 'end': 0x13FF + }, + { + 'begin': 0x1400, + 'end': 0x167F + }, + { + 'begin': 0x1680, + 'end': 0x169F + }, + { + 'begin': 0x16A0, + 'end': 0x16FF + }, + { + 'begin': 0x1780, + 'end': 0x17FF + }, + { + 'begin': 0x1800, + 'end': 0x18AF + }, + { + 'begin': 0x2800, + 'end': 0x28FF + }, + { + 'begin': 0xA000, + 'end': 0xA48F + }, + { + 'begin': 0x1700, + 'end': 0x171F + }, + { + 'begin': 0x10300, + 'end': 0x1032F + }, + { + 'begin': 0x10330, + 'end': 0x1034F + }, + { + 'begin': 0x10400, + 'end': 0x1044F + }, + { + 'begin': 0x1D000, + 'end': 0x1D0FF + }, + { + 'begin': 0x1D400, + 'end': 0x1D7FF + }, + { + 'begin': 0xFF000, + 'end': 0xFFFFD + }, + { + 'begin': 0xFE00, + 'end': 0xFE0F + }, + { + 'begin': 0xE0000, + 'end': 0xE007F + }, + { + 'begin': 0x1900, + 'end': 0x194F + }, + { + 'begin': 0x1950, + 'end': 0x197F + }, + { + 'begin': 0x1980, + 'end': 0x19DF + }, + { + 'begin': 0x1A00, + 'end': 0x1A1F + }, + { + 'begin': 0x2C00, + 'end': 0x2C5F + }, + { + 'begin': 0x2D30, + 'end': 0x2D7F + }, + { + 'begin': 0x4DC0, + 'end': 0x4DFF + }, + { + 'begin': 0xA800, + 'end': 0xA82F + }, + { + 'begin': 0x10000, + 'end': 0x1007F + }, + { + 'begin': 0x10140, + 'end': 0x1018F + }, + { + 'begin': 0x10380, + 'end': 0x1039F + }, + { + 'begin': 0x103A0, + 'end': 0x103DF + }, + { + 'begin': 0x10450, + 'end': 0x1047F + }, + { + 'begin': 0x10480, + 'end': 0x104AF + }, + { + 'begin': 0x10800, + 'end': 0x1083F + }, + { + 'begin': 0x10A00, + 'end': 0x10A5F + }, + { + 'begin': 0x1D300, + 'end': 0x1D35F + }, + { + 'begin': 0x12000, + 'end': 0x123FF + }, + { + 'begin': 0x1D360, + 'end': 0x1D37F + }, + { + 'begin': 0x1B80, + 'end': 0x1BBF + }, + { + 'begin': 0x1C00, + 'end': 0x1C4F + }, + { + 'begin': 0x1C50, + 'end': 0x1C7F + }, + { + 'begin': 0xA880, + 'end': 0xA8DF + }, + { + 'begin': 0xA900, + 'end': 0xA92F + }, + { + 'begin': 0xA930, + 'end': 0xA95F + }, + { + 'begin': 0xAA00, + 'end': 0xAA5F + }, + { + 'begin': 0x10190, + 'end': 0x101CF + }, + { + 'begin': 0x101D0, + 'end': 0x101FF + }, + { + 'begin': 0x102A0, + 'end': 0x102DF + }, + { + 'begin': 0x1F030, + 'end': 0x1F09F + } + ]; + function getUnicodeRangeFor(value) { + for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { + var range = UnicodeRanges[i]; + if (value >= range.begin && value < range.end) { + return i; + } + } + return -1; + } + function isRTLRangeFor(value) { + var range = UnicodeRanges[13]; + if (value >= range.begin && value < range.end) { + return true; + } + range = UnicodeRanges[11]; + if (value >= range.begin && value < range.end) { + return true; + } + return false; + } + var getNormalizedUnicodes = getLookupTableFactory(function (t) { + t['\u00A8'] = '\u0020\u0308'; + t['\u00AF'] = '\u0020\u0304'; + t['\u00B4'] = '\u0020\u0301'; + t['\u00B5'] = '\u03BC'; + t['\u00B8'] = '\u0020\u0327'; + t['\u0132'] = '\u0049\u004A'; + t['\u0133'] = '\u0069\u006A'; + t['\u013F'] = '\u004C\u00B7'; + t['\u0140'] = '\u006C\u00B7'; + t['\u0149'] = '\u02BC\u006E'; + t['\u017F'] = '\u0073'; + t['\u01C4'] = '\u0044\u017D'; + t['\u01C5'] = '\u0044\u017E'; + t['\u01C6'] = '\u0064\u017E'; + t['\u01C7'] = '\u004C\u004A'; + t['\u01C8'] = '\u004C\u006A'; + t['\u01C9'] = '\u006C\u006A'; + t['\u01CA'] = '\u004E\u004A'; + t['\u01CB'] = '\u004E\u006A'; + t['\u01CC'] = '\u006E\u006A'; + t['\u01F1'] = '\u0044\u005A'; + t['\u01F2'] = '\u0044\u007A'; + t['\u01F3'] = '\u0064\u007A'; + t['\u02D8'] = '\u0020\u0306'; + t['\u02D9'] = '\u0020\u0307'; + t['\u02DA'] = '\u0020\u030A'; + t['\u02DB'] = '\u0020\u0328'; + t['\u02DC'] = '\u0020\u0303'; + t['\u02DD'] = '\u0020\u030B'; + t['\u037A'] = '\u0020\u0345'; + t['\u0384'] = '\u0020\u0301'; + t['\u03D0'] = '\u03B2'; + t['\u03D1'] = '\u03B8'; + t['\u03D2'] = '\u03A5'; + t['\u03D5'] = '\u03C6'; + t['\u03D6'] = '\u03C0'; + t['\u03F0'] = '\u03BA'; + t['\u03F1'] = '\u03C1'; + t['\u03F2'] = '\u03C2'; + t['\u03F4'] = '\u0398'; + t['\u03F5'] = '\u03B5'; + t['\u03F9'] = '\u03A3'; + t['\u0587'] = '\u0565\u0582'; + t['\u0675'] = '\u0627\u0674'; + t['\u0676'] = '\u0648\u0674'; + t['\u0677'] = '\u06C7\u0674'; + t['\u0678'] = '\u064A\u0674'; + t['\u0E33'] = '\u0E4D\u0E32'; + t['\u0EB3'] = '\u0ECD\u0EB2'; + t['\u0EDC'] = '\u0EAB\u0E99'; + t['\u0EDD'] = '\u0EAB\u0EA1'; + t['\u0F77'] = '\u0FB2\u0F81'; + t['\u0F79'] = '\u0FB3\u0F81'; + t['\u1E9A'] = '\u0061\u02BE'; + t['\u1FBD'] = '\u0020\u0313'; + t['\u1FBF'] = '\u0020\u0313'; + t['\u1FC0'] = '\u0020\u0342'; + t['\u1FFE'] = '\u0020\u0314'; + t['\u2002'] = '\u0020'; + t['\u2003'] = '\u0020'; + t['\u2004'] = '\u0020'; + t['\u2005'] = '\u0020'; + t['\u2006'] = '\u0020'; + t['\u2008'] = '\u0020'; + t['\u2009'] = '\u0020'; + t['\u200A'] = '\u0020'; + t['\u2017'] = '\u0020\u0333'; + t['\u2024'] = '\u002E'; + t['\u2025'] = '\u002E\u002E'; + t['\u2026'] = '\u002E\u002E\u002E'; + t['\u2033'] = '\u2032\u2032'; + t['\u2034'] = '\u2032\u2032\u2032'; + t['\u2036'] = '\u2035\u2035'; + t['\u2037'] = '\u2035\u2035\u2035'; + t['\u203C'] = '\u0021\u0021'; + t['\u203E'] = '\u0020\u0305'; + t['\u2047'] = '\u003F\u003F'; + t['\u2048'] = '\u003F\u0021'; + t['\u2049'] = '\u0021\u003F'; + t['\u2057'] = '\u2032\u2032\u2032\u2032'; + t['\u205F'] = '\u0020'; + t['\u20A8'] = '\u0052\u0073'; + t['\u2100'] = '\u0061\u002F\u0063'; + t['\u2101'] = '\u0061\u002F\u0073'; + t['\u2103'] = '\u00B0\u0043'; + t['\u2105'] = '\u0063\u002F\u006F'; + t['\u2106'] = '\u0063\u002F\u0075'; + t['\u2107'] = '\u0190'; + t['\u2109'] = '\u00B0\u0046'; + t['\u2116'] = '\u004E\u006F'; + t['\u2121'] = '\u0054\u0045\u004C'; + t['\u2135'] = '\u05D0'; + t['\u2136'] = '\u05D1'; + t['\u2137'] = '\u05D2'; + t['\u2138'] = '\u05D3'; + t['\u213B'] = '\u0046\u0041\u0058'; + t['\u2160'] = '\u0049'; + t['\u2161'] = '\u0049\u0049'; + t['\u2162'] = '\u0049\u0049\u0049'; + t['\u2163'] = '\u0049\u0056'; + t['\u2164'] = '\u0056'; + t['\u2165'] = '\u0056\u0049'; + t['\u2166'] = '\u0056\u0049\u0049'; + t['\u2167'] = '\u0056\u0049\u0049\u0049'; + t['\u2168'] = '\u0049\u0058'; + t['\u2169'] = '\u0058'; + t['\u216A'] = '\u0058\u0049'; + t['\u216B'] = '\u0058\u0049\u0049'; + t['\u216C'] = '\u004C'; + t['\u216D'] = '\u0043'; + t['\u216E'] = '\u0044'; + t['\u216F'] = '\u004D'; + t['\u2170'] = '\u0069'; + t['\u2171'] = '\u0069\u0069'; + t['\u2172'] = '\u0069\u0069\u0069'; + t['\u2173'] = '\u0069\u0076'; + t['\u2174'] = '\u0076'; + t['\u2175'] = '\u0076\u0069'; + t['\u2176'] = '\u0076\u0069\u0069'; + t['\u2177'] = '\u0076\u0069\u0069\u0069'; + t['\u2178'] = '\u0069\u0078'; + t['\u2179'] = '\u0078'; + t['\u217A'] = '\u0078\u0069'; + t['\u217B'] = '\u0078\u0069\u0069'; + t['\u217C'] = '\u006C'; + t['\u217D'] = '\u0063'; + t['\u217E'] = '\u0064'; + t['\u217F'] = '\u006D'; + t['\u222C'] = '\u222B\u222B'; + t['\u222D'] = '\u222B\u222B\u222B'; + t['\u222F'] = '\u222E\u222E'; + t['\u2230'] = '\u222E\u222E\u222E'; + t['\u2474'] = '\u0028\u0031\u0029'; + t['\u2475'] = '\u0028\u0032\u0029'; + t['\u2476'] = '\u0028\u0033\u0029'; + t['\u2477'] = '\u0028\u0034\u0029'; + t['\u2478'] = '\u0028\u0035\u0029'; + t['\u2479'] = '\u0028\u0036\u0029'; + t['\u247A'] = '\u0028\u0037\u0029'; + t['\u247B'] = '\u0028\u0038\u0029'; + t['\u247C'] = '\u0028\u0039\u0029'; + t['\u247D'] = '\u0028\u0031\u0030\u0029'; + t['\u247E'] = '\u0028\u0031\u0031\u0029'; + t['\u247F'] = '\u0028\u0031\u0032\u0029'; + t['\u2480'] = '\u0028\u0031\u0033\u0029'; + t['\u2481'] = '\u0028\u0031\u0034\u0029'; + t['\u2482'] = '\u0028\u0031\u0035\u0029'; + t['\u2483'] = '\u0028\u0031\u0036\u0029'; + t['\u2484'] = '\u0028\u0031\u0037\u0029'; + t['\u2485'] = '\u0028\u0031\u0038\u0029'; + t['\u2486'] = '\u0028\u0031\u0039\u0029'; + t['\u2487'] = '\u0028\u0032\u0030\u0029'; + t['\u2488'] = '\u0031\u002E'; + t['\u2489'] = '\u0032\u002E'; + t['\u248A'] = '\u0033\u002E'; + t['\u248B'] = '\u0034\u002E'; + t['\u248C'] = '\u0035\u002E'; + t['\u248D'] = '\u0036\u002E'; + t['\u248E'] = '\u0037\u002E'; + t['\u248F'] = '\u0038\u002E'; + t['\u2490'] = '\u0039\u002E'; + t['\u2491'] = '\u0031\u0030\u002E'; + t['\u2492'] = '\u0031\u0031\u002E'; + t['\u2493'] = '\u0031\u0032\u002E'; + t['\u2494'] = '\u0031\u0033\u002E'; + t['\u2495'] = '\u0031\u0034\u002E'; + t['\u2496'] = '\u0031\u0035\u002E'; + t['\u2497'] = '\u0031\u0036\u002E'; + t['\u2498'] = '\u0031\u0037\u002E'; + t['\u2499'] = '\u0031\u0038\u002E'; + t['\u249A'] = '\u0031\u0039\u002E'; + t['\u249B'] = '\u0032\u0030\u002E'; + t['\u249C'] = '\u0028\u0061\u0029'; + t['\u249D'] = '\u0028\u0062\u0029'; + t['\u249E'] = '\u0028\u0063\u0029'; + t['\u249F'] = '\u0028\u0064\u0029'; + t['\u24A0'] = '\u0028\u0065\u0029'; + t['\u24A1'] = '\u0028\u0066\u0029'; + t['\u24A2'] = '\u0028\u0067\u0029'; + t['\u24A3'] = '\u0028\u0068\u0029'; + t['\u24A4'] = '\u0028\u0069\u0029'; + t['\u24A5'] = '\u0028\u006A\u0029'; + t['\u24A6'] = '\u0028\u006B\u0029'; + t['\u24A7'] = '\u0028\u006C\u0029'; + t['\u24A8'] = '\u0028\u006D\u0029'; + t['\u24A9'] = '\u0028\u006E\u0029'; + t['\u24AA'] = '\u0028\u006F\u0029'; + t['\u24AB'] = '\u0028\u0070\u0029'; + t['\u24AC'] = '\u0028\u0071\u0029'; + t['\u24AD'] = '\u0028\u0072\u0029'; + t['\u24AE'] = '\u0028\u0073\u0029'; + t['\u24AF'] = '\u0028\u0074\u0029'; + t['\u24B0'] = '\u0028\u0075\u0029'; + t['\u24B1'] = '\u0028\u0076\u0029'; + t['\u24B2'] = '\u0028\u0077\u0029'; + t['\u24B3'] = '\u0028\u0078\u0029'; + t['\u24B4'] = '\u0028\u0079\u0029'; + t['\u24B5'] = '\u0028\u007A\u0029'; + t['\u2A0C'] = '\u222B\u222B\u222B\u222B'; + t['\u2A74'] = '\u003A\u003A\u003D'; + t['\u2A75'] = '\u003D\u003D'; + t['\u2A76'] = '\u003D\u003D\u003D'; + t['\u2E9F'] = '\u6BCD'; + t['\u2EF3'] = '\u9F9F'; + t['\u2F00'] = '\u4E00'; + t['\u2F01'] = '\u4E28'; + t['\u2F02'] = '\u4E36'; + t['\u2F03'] = '\u4E3F'; + t['\u2F04'] = '\u4E59'; + t['\u2F05'] = '\u4E85'; + t['\u2F06'] = '\u4E8C'; + t['\u2F07'] = '\u4EA0'; + t['\u2F08'] = '\u4EBA'; + t['\u2F09'] = '\u513F'; + t['\u2F0A'] = '\u5165'; + t['\u2F0B'] = '\u516B'; + t['\u2F0C'] = '\u5182'; + t['\u2F0D'] = '\u5196'; + t['\u2F0E'] = '\u51AB'; + t['\u2F0F'] = '\u51E0'; + t['\u2F10'] = '\u51F5'; + t['\u2F11'] = '\u5200'; + t['\u2F12'] = '\u529B'; + t['\u2F13'] = '\u52F9'; + t['\u2F14'] = '\u5315'; + t['\u2F15'] = '\u531A'; + t['\u2F16'] = '\u5338'; + t['\u2F17'] = '\u5341'; + t['\u2F18'] = '\u535C'; + t['\u2F19'] = '\u5369'; + t['\u2F1A'] = '\u5382'; + t['\u2F1B'] = '\u53B6'; + t['\u2F1C'] = '\u53C8'; + t['\u2F1D'] = '\u53E3'; + t['\u2F1E'] = '\u56D7'; + t['\u2F1F'] = '\u571F'; + t['\u2F20'] = '\u58EB'; + t['\u2F21'] = '\u5902'; + t['\u2F22'] = '\u590A'; + t['\u2F23'] = '\u5915'; + t['\u2F24'] = '\u5927'; + t['\u2F25'] = '\u5973'; + t['\u2F26'] = '\u5B50'; + t['\u2F27'] = '\u5B80'; + t['\u2F28'] = '\u5BF8'; + t['\u2F29'] = '\u5C0F'; + t['\u2F2A'] = '\u5C22'; + t['\u2F2B'] = '\u5C38'; + t['\u2F2C'] = '\u5C6E'; + t['\u2F2D'] = '\u5C71'; + t['\u2F2E'] = '\u5DDB'; + t['\u2F2F'] = '\u5DE5'; + t['\u2F30'] = '\u5DF1'; + t['\u2F31'] = '\u5DFE'; + t['\u2F32'] = '\u5E72'; + t['\u2F33'] = '\u5E7A'; + t['\u2F34'] = '\u5E7F'; + t['\u2F35'] = '\u5EF4'; + t['\u2F36'] = '\u5EFE'; + t['\u2F37'] = '\u5F0B'; + t['\u2F38'] = '\u5F13'; + t['\u2F39'] = '\u5F50'; + t['\u2F3A'] = '\u5F61'; + t['\u2F3B'] = '\u5F73'; + t['\u2F3C'] = '\u5FC3'; + t['\u2F3D'] = '\u6208'; + t['\u2F3E'] = '\u6236'; + t['\u2F3F'] = '\u624B'; + t['\u2F40'] = '\u652F'; + t['\u2F41'] = '\u6534'; + t['\u2F42'] = '\u6587'; + t['\u2F43'] = '\u6597'; + t['\u2F44'] = '\u65A4'; + t['\u2F45'] = '\u65B9'; + t['\u2F46'] = '\u65E0'; + t['\u2F47'] = '\u65E5'; + t['\u2F48'] = '\u66F0'; + t['\u2F49'] = '\u6708'; + t['\u2F4A'] = '\u6728'; + t['\u2F4B'] = '\u6B20'; + t['\u2F4C'] = '\u6B62'; + t['\u2F4D'] = '\u6B79'; + t['\u2F4E'] = '\u6BB3'; + t['\u2F4F'] = '\u6BCB'; + t['\u2F50'] = '\u6BD4'; + t['\u2F51'] = '\u6BDB'; + t['\u2F52'] = '\u6C0F'; + t['\u2F53'] = '\u6C14'; + t['\u2F54'] = '\u6C34'; + t['\u2F55'] = '\u706B'; + t['\u2F56'] = '\u722A'; + t['\u2F57'] = '\u7236'; + t['\u2F58'] = '\u723B'; + t['\u2F59'] = '\u723F'; + t['\u2F5A'] = '\u7247'; + t['\u2F5B'] = '\u7259'; + t['\u2F5C'] = '\u725B'; + t['\u2F5D'] = '\u72AC'; + t['\u2F5E'] = '\u7384'; + t['\u2F5F'] = '\u7389'; + t['\u2F60'] = '\u74DC'; + t['\u2F61'] = '\u74E6'; + t['\u2F62'] = '\u7518'; + t['\u2F63'] = '\u751F'; + t['\u2F64'] = '\u7528'; + t['\u2F65'] = '\u7530'; + t['\u2F66'] = '\u758B'; + t['\u2F67'] = '\u7592'; + t['\u2F68'] = '\u7676'; + t['\u2F69'] = '\u767D'; + t['\u2F6A'] = '\u76AE'; + t['\u2F6B'] = '\u76BF'; + t['\u2F6C'] = '\u76EE'; + t['\u2F6D'] = '\u77DB'; + t['\u2F6E'] = '\u77E2'; + t['\u2F6F'] = '\u77F3'; + t['\u2F70'] = '\u793A'; + t['\u2F71'] = '\u79B8'; + t['\u2F72'] = '\u79BE'; + t['\u2F73'] = '\u7A74'; + t['\u2F74'] = '\u7ACB'; + t['\u2F75'] = '\u7AF9'; + t['\u2F76'] = '\u7C73'; + t['\u2F77'] = '\u7CF8'; + t['\u2F78'] = '\u7F36'; + t['\u2F79'] = '\u7F51'; + t['\u2F7A'] = '\u7F8A'; + t['\u2F7B'] = '\u7FBD'; + t['\u2F7C'] = '\u8001'; + t['\u2F7D'] = '\u800C'; + t['\u2F7E'] = '\u8012'; + t['\u2F7F'] = '\u8033'; + t['\u2F80'] = '\u807F'; + t['\u2F81'] = '\u8089'; + t['\u2F82'] = '\u81E3'; + t['\u2F83'] = '\u81EA'; + t['\u2F84'] = '\u81F3'; + t['\u2F85'] = '\u81FC'; + t['\u2F86'] = '\u820C'; + t['\u2F87'] = '\u821B'; + t['\u2F88'] = '\u821F'; + t['\u2F89'] = '\u826E'; + t['\u2F8A'] = '\u8272'; + t['\u2F8B'] = '\u8278'; + t['\u2F8C'] = '\u864D'; + t['\u2F8D'] = '\u866B'; + t['\u2F8E'] = '\u8840'; + t['\u2F8F'] = '\u884C'; + t['\u2F90'] = '\u8863'; + t['\u2F91'] = '\u897E'; + t['\u2F92'] = '\u898B'; + t['\u2F93'] = '\u89D2'; + t['\u2F94'] = '\u8A00'; + t['\u2F95'] = '\u8C37'; + t['\u2F96'] = '\u8C46'; + t['\u2F97'] = '\u8C55'; + t['\u2F98'] = '\u8C78'; + t['\u2F99'] = '\u8C9D'; + t['\u2F9A'] = '\u8D64'; + t['\u2F9B'] = '\u8D70'; + t['\u2F9C'] = '\u8DB3'; + t['\u2F9D'] = '\u8EAB'; + t['\u2F9E'] = '\u8ECA'; + t['\u2F9F'] = '\u8F9B'; + t['\u2FA0'] = '\u8FB0'; + t['\u2FA1'] = '\u8FB5'; + t['\u2FA2'] = '\u9091'; + t['\u2FA3'] = '\u9149'; + t['\u2FA4'] = '\u91C6'; + t['\u2FA5'] = '\u91CC'; + t['\u2FA6'] = '\u91D1'; + t['\u2FA7'] = '\u9577'; + t['\u2FA8'] = '\u9580'; + t['\u2FA9'] = '\u961C'; + t['\u2FAA'] = '\u96B6'; + t['\u2FAB'] = '\u96B9'; + t['\u2FAC'] = '\u96E8'; + t['\u2FAD'] = '\u9751'; + t['\u2FAE'] = '\u975E'; + t['\u2FAF'] = '\u9762'; + t['\u2FB0'] = '\u9769'; + t['\u2FB1'] = '\u97CB'; + t['\u2FB2'] = '\u97ED'; + t['\u2FB3'] = '\u97F3'; + t['\u2FB4'] = '\u9801'; + t['\u2FB5'] = '\u98A8'; + t['\u2FB6'] = '\u98DB'; + t['\u2FB7'] = '\u98DF'; + t['\u2FB8'] = '\u9996'; + t['\u2FB9'] = '\u9999'; + t['\u2FBA'] = '\u99AC'; + t['\u2FBB'] = '\u9AA8'; + t['\u2FBC'] = '\u9AD8'; + t['\u2FBD'] = '\u9ADF'; + t['\u2FBE'] = '\u9B25'; + t['\u2FBF'] = '\u9B2F'; + t['\u2FC0'] = '\u9B32'; + t['\u2FC1'] = '\u9B3C'; + t['\u2FC2'] = '\u9B5A'; + t['\u2FC3'] = '\u9CE5'; + t['\u2FC4'] = '\u9E75'; + t['\u2FC5'] = '\u9E7F'; + t['\u2FC6'] = '\u9EA5'; + t['\u2FC7'] = '\u9EBB'; + t['\u2FC8'] = '\u9EC3'; + t['\u2FC9'] = '\u9ECD'; + t['\u2FCA'] = '\u9ED1'; + t['\u2FCB'] = '\u9EF9'; + t['\u2FCC'] = '\u9EFD'; + t['\u2FCD'] = '\u9F0E'; + t['\u2FCE'] = '\u9F13'; + t['\u2FCF'] = '\u9F20'; + t['\u2FD0'] = '\u9F3B'; + t['\u2FD1'] = '\u9F4A'; + t['\u2FD2'] = '\u9F52'; + t['\u2FD3'] = '\u9F8D'; + t['\u2FD4'] = '\u9F9C'; + t['\u2FD5'] = '\u9FA0'; + t['\u3036'] = '\u3012'; + t['\u3038'] = '\u5341'; + t['\u3039'] = '\u5344'; + t['\u303A'] = '\u5345'; + t['\u309B'] = '\u0020\u3099'; + t['\u309C'] = '\u0020\u309A'; + t['\u3131'] = '\u1100'; + t['\u3132'] = '\u1101'; + t['\u3133'] = '\u11AA'; + t['\u3134'] = '\u1102'; + t['\u3135'] = '\u11AC'; + t['\u3136'] = '\u11AD'; + t['\u3137'] = '\u1103'; + t['\u3138'] = '\u1104'; + t['\u3139'] = '\u1105'; + t['\u313A'] = '\u11B0'; + t['\u313B'] = '\u11B1'; + t['\u313C'] = '\u11B2'; + t['\u313D'] = '\u11B3'; + t['\u313E'] = '\u11B4'; + t['\u313F'] = '\u11B5'; + t['\u3140'] = '\u111A'; + t['\u3141'] = '\u1106'; + t['\u3142'] = '\u1107'; + t['\u3143'] = '\u1108'; + t['\u3144'] = '\u1121'; + t['\u3145'] = '\u1109'; + t['\u3146'] = '\u110A'; + t['\u3147'] = '\u110B'; + t['\u3148'] = '\u110C'; + t['\u3149'] = '\u110D'; + t['\u314A'] = '\u110E'; + t['\u314B'] = '\u110F'; + t['\u314C'] = '\u1110'; + t['\u314D'] = '\u1111'; + t['\u314E'] = '\u1112'; + t['\u314F'] = '\u1161'; + t['\u3150'] = '\u1162'; + t['\u3151'] = '\u1163'; + t['\u3152'] = '\u1164'; + t['\u3153'] = '\u1165'; + t['\u3154'] = '\u1166'; + t['\u3155'] = '\u1167'; + t['\u3156'] = '\u1168'; + t['\u3157'] = '\u1169'; + t['\u3158'] = '\u116A'; + t['\u3159'] = '\u116B'; + t['\u315A'] = '\u116C'; + t['\u315B'] = '\u116D'; + t['\u315C'] = '\u116E'; + t['\u315D'] = '\u116F'; + t['\u315E'] = '\u1170'; + t['\u315F'] = '\u1171'; + t['\u3160'] = '\u1172'; + t['\u3161'] = '\u1173'; + t['\u3162'] = '\u1174'; + t['\u3163'] = '\u1175'; + t['\u3164'] = '\u1160'; + t['\u3165'] = '\u1114'; + t['\u3166'] = '\u1115'; + t['\u3167'] = '\u11C7'; + t['\u3168'] = '\u11C8'; + t['\u3169'] = '\u11CC'; + t['\u316A'] = '\u11CE'; + t['\u316B'] = '\u11D3'; + t['\u316C'] = '\u11D7'; + t['\u316D'] = '\u11D9'; + t['\u316E'] = '\u111C'; + t['\u316F'] = '\u11DD'; + t['\u3170'] = '\u11DF'; + t['\u3171'] = '\u111D'; + t['\u3172'] = '\u111E'; + t['\u3173'] = '\u1120'; + t['\u3174'] = '\u1122'; + t['\u3175'] = '\u1123'; + t['\u3176'] = '\u1127'; + t['\u3177'] = '\u1129'; + t['\u3178'] = '\u112B'; + t['\u3179'] = '\u112C'; + t['\u317A'] = '\u112D'; + t['\u317B'] = '\u112E'; + t['\u317C'] = '\u112F'; + t['\u317D'] = '\u1132'; + t['\u317E'] = '\u1136'; + t['\u317F'] = '\u1140'; + t['\u3180'] = '\u1147'; + t['\u3181'] = '\u114C'; + t['\u3182'] = '\u11F1'; + t['\u3183'] = '\u11F2'; + t['\u3184'] = '\u1157'; + t['\u3185'] = '\u1158'; + t['\u3186'] = '\u1159'; + t['\u3187'] = '\u1184'; + t['\u3188'] = '\u1185'; + t['\u3189'] = '\u1188'; + t['\u318A'] = '\u1191'; + t['\u318B'] = '\u1192'; + t['\u318C'] = '\u1194'; + t['\u318D'] = '\u119E'; + t['\u318E'] = '\u11A1'; + t['\u3200'] = '\u0028\u1100\u0029'; + t['\u3201'] = '\u0028\u1102\u0029'; + t['\u3202'] = '\u0028\u1103\u0029'; + t['\u3203'] = '\u0028\u1105\u0029'; + t['\u3204'] = '\u0028\u1106\u0029'; + t['\u3205'] = '\u0028\u1107\u0029'; + t['\u3206'] = '\u0028\u1109\u0029'; + t['\u3207'] = '\u0028\u110B\u0029'; + t['\u3208'] = '\u0028\u110C\u0029'; + t['\u3209'] = '\u0028\u110E\u0029'; + t['\u320A'] = '\u0028\u110F\u0029'; + t['\u320B'] = '\u0028\u1110\u0029'; + t['\u320C'] = '\u0028\u1111\u0029'; + t['\u320D'] = '\u0028\u1112\u0029'; + t['\u320E'] = '\u0028\u1100\u1161\u0029'; + t['\u320F'] = '\u0028\u1102\u1161\u0029'; + t['\u3210'] = '\u0028\u1103\u1161\u0029'; + t['\u3211'] = '\u0028\u1105\u1161\u0029'; + t['\u3212'] = '\u0028\u1106\u1161\u0029'; + t['\u3213'] = '\u0028\u1107\u1161\u0029'; + t['\u3214'] = '\u0028\u1109\u1161\u0029'; + t['\u3215'] = '\u0028\u110B\u1161\u0029'; + t['\u3216'] = '\u0028\u110C\u1161\u0029'; + t['\u3217'] = '\u0028\u110E\u1161\u0029'; + t['\u3218'] = '\u0028\u110F\u1161\u0029'; + t['\u3219'] = '\u0028\u1110\u1161\u0029'; + t['\u321A'] = '\u0028\u1111\u1161\u0029'; + t['\u321B'] = '\u0028\u1112\u1161\u0029'; + t['\u321C'] = '\u0028\u110C\u116E\u0029'; + t['\u321D'] = '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029'; + t['\u321E'] = '\u0028\u110B\u1169\u1112\u116E\u0029'; + t['\u3220'] = '\u0028\u4E00\u0029'; + t['\u3221'] = '\u0028\u4E8C\u0029'; + t['\u3222'] = '\u0028\u4E09\u0029'; + t['\u3223'] = '\u0028\u56DB\u0029'; + t['\u3224'] = '\u0028\u4E94\u0029'; + t['\u3225'] = '\u0028\u516D\u0029'; + t['\u3226'] = '\u0028\u4E03\u0029'; + t['\u3227'] = '\u0028\u516B\u0029'; + t['\u3228'] = '\u0028\u4E5D\u0029'; + t['\u3229'] = '\u0028\u5341\u0029'; + t['\u322A'] = '\u0028\u6708\u0029'; + t['\u322B'] = '\u0028\u706B\u0029'; + t['\u322C'] = '\u0028\u6C34\u0029'; + t['\u322D'] = '\u0028\u6728\u0029'; + t['\u322E'] = '\u0028\u91D1\u0029'; + t['\u322F'] = '\u0028\u571F\u0029'; + t['\u3230'] = '\u0028\u65E5\u0029'; + t['\u3231'] = '\u0028\u682A\u0029'; + t['\u3232'] = '\u0028\u6709\u0029'; + t['\u3233'] = '\u0028\u793E\u0029'; + t['\u3234'] = '\u0028\u540D\u0029'; + t['\u3235'] = '\u0028\u7279\u0029'; + t['\u3236'] = '\u0028\u8CA1\u0029'; + t['\u3237'] = '\u0028\u795D\u0029'; + t['\u3238'] = '\u0028\u52B4\u0029'; + t['\u3239'] = '\u0028\u4EE3\u0029'; + t['\u323A'] = '\u0028\u547C\u0029'; + t['\u323B'] = '\u0028\u5B66\u0029'; + t['\u323C'] = '\u0028\u76E3\u0029'; + t['\u323D'] = '\u0028\u4F01\u0029'; + t['\u323E'] = '\u0028\u8CC7\u0029'; + t['\u323F'] = '\u0028\u5354\u0029'; + t['\u3240'] = '\u0028\u796D\u0029'; + t['\u3241'] = '\u0028\u4F11\u0029'; + t['\u3242'] = '\u0028\u81EA\u0029'; + t['\u3243'] = '\u0028\u81F3\u0029'; + t['\u32C0'] = '\u0031\u6708'; + t['\u32C1'] = '\u0032\u6708'; + t['\u32C2'] = '\u0033\u6708'; + t['\u32C3'] = '\u0034\u6708'; + t['\u32C4'] = '\u0035\u6708'; + t['\u32C5'] = '\u0036\u6708'; + t['\u32C6'] = '\u0037\u6708'; + t['\u32C7'] = '\u0038\u6708'; + t['\u32C8'] = '\u0039\u6708'; + t['\u32C9'] = '\u0031\u0030\u6708'; + t['\u32CA'] = '\u0031\u0031\u6708'; + t['\u32CB'] = '\u0031\u0032\u6708'; + t['\u3358'] = '\u0030\u70B9'; + t['\u3359'] = '\u0031\u70B9'; + t['\u335A'] = '\u0032\u70B9'; + t['\u335B'] = '\u0033\u70B9'; + t['\u335C'] = '\u0034\u70B9'; + t['\u335D'] = '\u0035\u70B9'; + t['\u335E'] = '\u0036\u70B9'; + t['\u335F'] = '\u0037\u70B9'; + t['\u3360'] = '\u0038\u70B9'; + t['\u3361'] = '\u0039\u70B9'; + t['\u3362'] = '\u0031\u0030\u70B9'; + t['\u3363'] = '\u0031\u0031\u70B9'; + t['\u3364'] = '\u0031\u0032\u70B9'; + t['\u3365'] = '\u0031\u0033\u70B9'; + t['\u3366'] = '\u0031\u0034\u70B9'; + t['\u3367'] = '\u0031\u0035\u70B9'; + t['\u3368'] = '\u0031\u0036\u70B9'; + t['\u3369'] = '\u0031\u0037\u70B9'; + t['\u336A'] = '\u0031\u0038\u70B9'; + t['\u336B'] = '\u0031\u0039\u70B9'; + t['\u336C'] = '\u0032\u0030\u70B9'; + t['\u336D'] = '\u0032\u0031\u70B9'; + t['\u336E'] = '\u0032\u0032\u70B9'; + t['\u336F'] = '\u0032\u0033\u70B9'; + t['\u3370'] = '\u0032\u0034\u70B9'; + t['\u33E0'] = '\u0031\u65E5'; + t['\u33E1'] = '\u0032\u65E5'; + t['\u33E2'] = '\u0033\u65E5'; + t['\u33E3'] = '\u0034\u65E5'; + t['\u33E4'] = '\u0035\u65E5'; + t['\u33E5'] = '\u0036\u65E5'; + t['\u33E6'] = '\u0037\u65E5'; + t['\u33E7'] = '\u0038\u65E5'; + t['\u33E8'] = '\u0039\u65E5'; + t['\u33E9'] = '\u0031\u0030\u65E5'; + t['\u33EA'] = '\u0031\u0031\u65E5'; + t['\u33EB'] = '\u0031\u0032\u65E5'; + t['\u33EC'] = '\u0031\u0033\u65E5'; + t['\u33ED'] = '\u0031\u0034\u65E5'; + t['\u33EE'] = '\u0031\u0035\u65E5'; + t['\u33EF'] = '\u0031\u0036\u65E5'; + t['\u33F0'] = '\u0031\u0037\u65E5'; + t['\u33F1'] = '\u0031\u0038\u65E5'; + t['\u33F2'] = '\u0031\u0039\u65E5'; + t['\u33F3'] = '\u0032\u0030\u65E5'; + t['\u33F4'] = '\u0032\u0031\u65E5'; + t['\u33F5'] = '\u0032\u0032\u65E5'; + t['\u33F6'] = '\u0032\u0033\u65E5'; + t['\u33F7'] = '\u0032\u0034\u65E5'; + t['\u33F8'] = '\u0032\u0035\u65E5'; + t['\u33F9'] = '\u0032\u0036\u65E5'; + t['\u33FA'] = '\u0032\u0037\u65E5'; + t['\u33FB'] = '\u0032\u0038\u65E5'; + t['\u33FC'] = '\u0032\u0039\u65E5'; + t['\u33FD'] = '\u0033\u0030\u65E5'; + t['\u33FE'] = '\u0033\u0031\u65E5'; + t['\uFB00'] = '\u0066\u0066'; + t['\uFB01'] = '\u0066\u0069'; + t['\uFB02'] = '\u0066\u006C'; + t['\uFB03'] = '\u0066\u0066\u0069'; + t['\uFB04'] = '\u0066\u0066\u006C'; + t['\uFB05'] = '\u017F\u0074'; + t['\uFB06'] = '\u0073\u0074'; + t['\uFB13'] = '\u0574\u0576'; + t['\uFB14'] = '\u0574\u0565'; + t['\uFB15'] = '\u0574\u056B'; + t['\uFB16'] = '\u057E\u0576'; + t['\uFB17'] = '\u0574\u056D'; + t['\uFB4F'] = '\u05D0\u05DC'; + t['\uFB50'] = '\u0671'; + t['\uFB51'] = '\u0671'; + t['\uFB52'] = '\u067B'; + t['\uFB53'] = '\u067B'; + t['\uFB54'] = '\u067B'; + t['\uFB55'] = '\u067B'; + t['\uFB56'] = '\u067E'; + t['\uFB57'] = '\u067E'; + t['\uFB58'] = '\u067E'; + t['\uFB59'] = '\u067E'; + t['\uFB5A'] = '\u0680'; + t['\uFB5B'] = '\u0680'; + t['\uFB5C'] = '\u0680'; + t['\uFB5D'] = '\u0680'; + t['\uFB5E'] = '\u067A'; + t['\uFB5F'] = '\u067A'; + t['\uFB60'] = '\u067A'; + t['\uFB61'] = '\u067A'; + t['\uFB62'] = '\u067F'; + t['\uFB63'] = '\u067F'; + t['\uFB64'] = '\u067F'; + t['\uFB65'] = '\u067F'; + t['\uFB66'] = '\u0679'; + t['\uFB67'] = '\u0679'; + t['\uFB68'] = '\u0679'; + t['\uFB69'] = '\u0679'; + t['\uFB6A'] = '\u06A4'; + t['\uFB6B'] = '\u06A4'; + t['\uFB6C'] = '\u06A4'; + t['\uFB6D'] = '\u06A4'; + t['\uFB6E'] = '\u06A6'; + t['\uFB6F'] = '\u06A6'; + t['\uFB70'] = '\u06A6'; + t['\uFB71'] = '\u06A6'; + t['\uFB72'] = '\u0684'; + t['\uFB73'] = '\u0684'; + t['\uFB74'] = '\u0684'; + t['\uFB75'] = '\u0684'; + t['\uFB76'] = '\u0683'; + t['\uFB77'] = '\u0683'; + t['\uFB78'] = '\u0683'; + t['\uFB79'] = '\u0683'; + t['\uFB7A'] = '\u0686'; + t['\uFB7B'] = '\u0686'; + t['\uFB7C'] = '\u0686'; + t['\uFB7D'] = '\u0686'; + t['\uFB7E'] = '\u0687'; + t['\uFB7F'] = '\u0687'; + t['\uFB80'] = '\u0687'; + t['\uFB81'] = '\u0687'; + t['\uFB82'] = '\u068D'; + t['\uFB83'] = '\u068D'; + t['\uFB84'] = '\u068C'; + t['\uFB85'] = '\u068C'; + t['\uFB86'] = '\u068E'; + t['\uFB87'] = '\u068E'; + t['\uFB88'] = '\u0688'; + t['\uFB89'] = '\u0688'; + t['\uFB8A'] = '\u0698'; + t['\uFB8B'] = '\u0698'; + t['\uFB8C'] = '\u0691'; + t['\uFB8D'] = '\u0691'; + t['\uFB8E'] = '\u06A9'; + t['\uFB8F'] = '\u06A9'; + t['\uFB90'] = '\u06A9'; + t['\uFB91'] = '\u06A9'; + t['\uFB92'] = '\u06AF'; + t['\uFB93'] = '\u06AF'; + t['\uFB94'] = '\u06AF'; + t['\uFB95'] = '\u06AF'; + t['\uFB96'] = '\u06B3'; + t['\uFB97'] = '\u06B3'; + t['\uFB98'] = '\u06B3'; + t['\uFB99'] = '\u06B3'; + t['\uFB9A'] = '\u06B1'; + t['\uFB9B'] = '\u06B1'; + t['\uFB9C'] = '\u06B1'; + t['\uFB9D'] = '\u06B1'; + t['\uFB9E'] = '\u06BA'; + t['\uFB9F'] = '\u06BA'; + t['\uFBA0'] = '\u06BB'; + t['\uFBA1'] = '\u06BB'; + t['\uFBA2'] = '\u06BB'; + t['\uFBA3'] = '\u06BB'; + t['\uFBA4'] = '\u06C0'; + t['\uFBA5'] = '\u06C0'; + t['\uFBA6'] = '\u06C1'; + t['\uFBA7'] = '\u06C1'; + t['\uFBA8'] = '\u06C1'; + t['\uFBA9'] = '\u06C1'; + t['\uFBAA'] = '\u06BE'; + t['\uFBAB'] = '\u06BE'; + t['\uFBAC'] = '\u06BE'; + t['\uFBAD'] = '\u06BE'; + t['\uFBAE'] = '\u06D2'; + t['\uFBAF'] = '\u06D2'; + t['\uFBB0'] = '\u06D3'; + t['\uFBB1'] = '\u06D3'; + t['\uFBD3'] = '\u06AD'; + t['\uFBD4'] = '\u06AD'; + t['\uFBD5'] = '\u06AD'; + t['\uFBD6'] = '\u06AD'; + t['\uFBD7'] = '\u06C7'; + t['\uFBD8'] = '\u06C7'; + t['\uFBD9'] = '\u06C6'; + t['\uFBDA'] = '\u06C6'; + t['\uFBDB'] = '\u06C8'; + t['\uFBDC'] = '\u06C8'; + t['\uFBDD'] = '\u0677'; + t['\uFBDE'] = '\u06CB'; + t['\uFBDF'] = '\u06CB'; + t['\uFBE0'] = '\u06C5'; + t['\uFBE1'] = '\u06C5'; + t['\uFBE2'] = '\u06C9'; + t['\uFBE3'] = '\u06C9'; + t['\uFBE4'] = '\u06D0'; + t['\uFBE5'] = '\u06D0'; + t['\uFBE6'] = '\u06D0'; + t['\uFBE7'] = '\u06D0'; + t['\uFBE8'] = '\u0649'; + t['\uFBE9'] = '\u0649'; + t['\uFBEA'] = '\u0626\u0627'; + t['\uFBEB'] = '\u0626\u0627'; + t['\uFBEC'] = '\u0626\u06D5'; + t['\uFBED'] = '\u0626\u06D5'; + t['\uFBEE'] = '\u0626\u0648'; + t['\uFBEF'] = '\u0626\u0648'; + t['\uFBF0'] = '\u0626\u06C7'; + t['\uFBF1'] = '\u0626\u06C7'; + t['\uFBF2'] = '\u0626\u06C6'; + t['\uFBF3'] = '\u0626\u06C6'; + t['\uFBF4'] = '\u0626\u06C8'; + t['\uFBF5'] = '\u0626\u06C8'; + t['\uFBF6'] = '\u0626\u06D0'; + t['\uFBF7'] = '\u0626\u06D0'; + t['\uFBF8'] = '\u0626\u06D0'; + t['\uFBF9'] = '\u0626\u0649'; + t['\uFBFA'] = '\u0626\u0649'; + t['\uFBFB'] = '\u0626\u0649'; + t['\uFBFC'] = '\u06CC'; + t['\uFBFD'] = '\u06CC'; + t['\uFBFE'] = '\u06CC'; + t['\uFBFF'] = '\u06CC'; + t['\uFC00'] = '\u0626\u062C'; + t['\uFC01'] = '\u0626\u062D'; + t['\uFC02'] = '\u0626\u0645'; + t['\uFC03'] = '\u0626\u0649'; + t['\uFC04'] = '\u0626\u064A'; + t['\uFC05'] = '\u0628\u062C'; + t['\uFC06'] = '\u0628\u062D'; + t['\uFC07'] = '\u0628\u062E'; + t['\uFC08'] = '\u0628\u0645'; + t['\uFC09'] = '\u0628\u0649'; + t['\uFC0A'] = '\u0628\u064A'; + t['\uFC0B'] = '\u062A\u062C'; + t['\uFC0C'] = '\u062A\u062D'; + t['\uFC0D'] = '\u062A\u062E'; + t['\uFC0E'] = '\u062A\u0645'; + t['\uFC0F'] = '\u062A\u0649'; + t['\uFC10'] = '\u062A\u064A'; + t['\uFC11'] = '\u062B\u062C'; + t['\uFC12'] = '\u062B\u0645'; + t['\uFC13'] = '\u062B\u0649'; + t['\uFC14'] = '\u062B\u064A'; + t['\uFC15'] = '\u062C\u062D'; + t['\uFC16'] = '\u062C\u0645'; + t['\uFC17'] = '\u062D\u062C'; + t['\uFC18'] = '\u062D\u0645'; + t['\uFC19'] = '\u062E\u062C'; + t['\uFC1A'] = '\u062E\u062D'; + t['\uFC1B'] = '\u062E\u0645'; + t['\uFC1C'] = '\u0633\u062C'; + t['\uFC1D'] = '\u0633\u062D'; + t['\uFC1E'] = '\u0633\u062E'; + t['\uFC1F'] = '\u0633\u0645'; + t['\uFC20'] = '\u0635\u062D'; + t['\uFC21'] = '\u0635\u0645'; + t['\uFC22'] = '\u0636\u062C'; + t['\uFC23'] = '\u0636\u062D'; + t['\uFC24'] = '\u0636\u062E'; + t['\uFC25'] = '\u0636\u0645'; + t['\uFC26'] = '\u0637\u062D'; + t['\uFC27'] = '\u0637\u0645'; + t['\uFC28'] = '\u0638\u0645'; + t['\uFC29'] = '\u0639\u062C'; + t['\uFC2A'] = '\u0639\u0645'; + t['\uFC2B'] = '\u063A\u062C'; + t['\uFC2C'] = '\u063A\u0645'; + t['\uFC2D'] = '\u0641\u062C'; + t['\uFC2E'] = '\u0641\u062D'; + t['\uFC2F'] = '\u0641\u062E'; + t['\uFC30'] = '\u0641\u0645'; + t['\uFC31'] = '\u0641\u0649'; + t['\uFC32'] = '\u0641\u064A'; + t['\uFC33'] = '\u0642\u062D'; + t['\uFC34'] = '\u0642\u0645'; + t['\uFC35'] = '\u0642\u0649'; + t['\uFC36'] = '\u0642\u064A'; + t['\uFC37'] = '\u0643\u0627'; + t['\uFC38'] = '\u0643\u062C'; + t['\uFC39'] = '\u0643\u062D'; + t['\uFC3A'] = '\u0643\u062E'; + t['\uFC3B'] = '\u0643\u0644'; + t['\uFC3C'] = '\u0643\u0645'; + t['\uFC3D'] = '\u0643\u0649'; + t['\uFC3E'] = '\u0643\u064A'; + t['\uFC3F'] = '\u0644\u062C'; + t['\uFC40'] = '\u0644\u062D'; + t['\uFC41'] = '\u0644\u062E'; + t['\uFC42'] = '\u0644\u0645'; + t['\uFC43'] = '\u0644\u0649'; + t['\uFC44'] = '\u0644\u064A'; + t['\uFC45'] = '\u0645\u062C'; + t['\uFC46'] = '\u0645\u062D'; + t['\uFC47'] = '\u0645\u062E'; + t['\uFC48'] = '\u0645\u0645'; + t['\uFC49'] = '\u0645\u0649'; + t['\uFC4A'] = '\u0645\u064A'; + t['\uFC4B'] = '\u0646\u062C'; + t['\uFC4C'] = '\u0646\u062D'; + t['\uFC4D'] = '\u0646\u062E'; + t['\uFC4E'] = '\u0646\u0645'; + t['\uFC4F'] = '\u0646\u0649'; + t['\uFC50'] = '\u0646\u064A'; + t['\uFC51'] = '\u0647\u062C'; + t['\uFC52'] = '\u0647\u0645'; + t['\uFC53'] = '\u0647\u0649'; + t['\uFC54'] = '\u0647\u064A'; + t['\uFC55'] = '\u064A\u062C'; + t['\uFC56'] = '\u064A\u062D'; + t['\uFC57'] = '\u064A\u062E'; + t['\uFC58'] = '\u064A\u0645'; + t['\uFC59'] = '\u064A\u0649'; + t['\uFC5A'] = '\u064A\u064A'; + t['\uFC5B'] = '\u0630\u0670'; + t['\uFC5C'] = '\u0631\u0670'; + t['\uFC5D'] = '\u0649\u0670'; + t['\uFC5E'] = '\u0020\u064C\u0651'; + t['\uFC5F'] = '\u0020\u064D\u0651'; + t['\uFC60'] = '\u0020\u064E\u0651'; + t['\uFC61'] = '\u0020\u064F\u0651'; + t['\uFC62'] = '\u0020\u0650\u0651'; + t['\uFC63'] = '\u0020\u0651\u0670'; + t['\uFC64'] = '\u0626\u0631'; + t['\uFC65'] = '\u0626\u0632'; + t['\uFC66'] = '\u0626\u0645'; + t['\uFC67'] = '\u0626\u0646'; + t['\uFC68'] = '\u0626\u0649'; + t['\uFC69'] = '\u0626\u064A'; + t['\uFC6A'] = '\u0628\u0631'; + t['\uFC6B'] = '\u0628\u0632'; + t['\uFC6C'] = '\u0628\u0645'; + t['\uFC6D'] = '\u0628\u0646'; + t['\uFC6E'] = '\u0628\u0649'; + t['\uFC6F'] = '\u0628\u064A'; + t['\uFC70'] = '\u062A\u0631'; + t['\uFC71'] = '\u062A\u0632'; + t['\uFC72'] = '\u062A\u0645'; + t['\uFC73'] = '\u062A\u0646'; + t['\uFC74'] = '\u062A\u0649'; + t['\uFC75'] = '\u062A\u064A'; + t['\uFC76'] = '\u062B\u0631'; + t['\uFC77'] = '\u062B\u0632'; + t['\uFC78'] = '\u062B\u0645'; + t['\uFC79'] = '\u062B\u0646'; + t['\uFC7A'] = '\u062B\u0649'; + t['\uFC7B'] = '\u062B\u064A'; + t['\uFC7C'] = '\u0641\u0649'; + t['\uFC7D'] = '\u0641\u064A'; + t['\uFC7E'] = '\u0642\u0649'; + t['\uFC7F'] = '\u0642\u064A'; + t['\uFC80'] = '\u0643\u0627'; + t['\uFC81'] = '\u0643\u0644'; + t['\uFC82'] = '\u0643\u0645'; + t['\uFC83'] = '\u0643\u0649'; + t['\uFC84'] = '\u0643\u064A'; + t['\uFC85'] = '\u0644\u0645'; + t['\uFC86'] = '\u0644\u0649'; + t['\uFC87'] = '\u0644\u064A'; + t['\uFC88'] = '\u0645\u0627'; + t['\uFC89'] = '\u0645\u0645'; + t['\uFC8A'] = '\u0646\u0631'; + t['\uFC8B'] = '\u0646\u0632'; + t['\uFC8C'] = '\u0646\u0645'; + t['\uFC8D'] = '\u0646\u0646'; + t['\uFC8E'] = '\u0646\u0649'; + t['\uFC8F'] = '\u0646\u064A'; + t['\uFC90'] = '\u0649\u0670'; + t['\uFC91'] = '\u064A\u0631'; + t['\uFC92'] = '\u064A\u0632'; + t['\uFC93'] = '\u064A\u0645'; + t['\uFC94'] = '\u064A\u0646'; + t['\uFC95'] = '\u064A\u0649'; + t['\uFC96'] = '\u064A\u064A'; + t['\uFC97'] = '\u0626\u062C'; + t['\uFC98'] = '\u0626\u062D'; + t['\uFC99'] = '\u0626\u062E'; + t['\uFC9A'] = '\u0626\u0645'; + t['\uFC9B'] = '\u0626\u0647'; + t['\uFC9C'] = '\u0628\u062C'; + t['\uFC9D'] = '\u0628\u062D'; + t['\uFC9E'] = '\u0628\u062E'; + t['\uFC9F'] = '\u0628\u0645'; + t['\uFCA0'] = '\u0628\u0647'; + t['\uFCA1'] = '\u062A\u062C'; + t['\uFCA2'] = '\u062A\u062D'; + t['\uFCA3'] = '\u062A\u062E'; + t['\uFCA4'] = '\u062A\u0645'; + t['\uFCA5'] = '\u062A\u0647'; + t['\uFCA6'] = '\u062B\u0645'; + t['\uFCA7'] = '\u062C\u062D'; + t['\uFCA8'] = '\u062C\u0645'; + t['\uFCA9'] = '\u062D\u062C'; + t['\uFCAA'] = '\u062D\u0645'; + t['\uFCAB'] = '\u062E\u062C'; + t['\uFCAC'] = '\u062E\u0645'; + t['\uFCAD'] = '\u0633\u062C'; + t['\uFCAE'] = '\u0633\u062D'; + t['\uFCAF'] = '\u0633\u062E'; + t['\uFCB0'] = '\u0633\u0645'; + t['\uFCB1'] = '\u0635\u062D'; + t['\uFCB2'] = '\u0635\u062E'; + t['\uFCB3'] = '\u0635\u0645'; + t['\uFCB4'] = '\u0636\u062C'; + t['\uFCB5'] = '\u0636\u062D'; + t['\uFCB6'] = '\u0636\u062E'; + t['\uFCB7'] = '\u0636\u0645'; + t['\uFCB8'] = '\u0637\u062D'; + t['\uFCB9'] = '\u0638\u0645'; + t['\uFCBA'] = '\u0639\u062C'; + t['\uFCBB'] = '\u0639\u0645'; + t['\uFCBC'] = '\u063A\u062C'; + t['\uFCBD'] = '\u063A\u0645'; + t['\uFCBE'] = '\u0641\u062C'; + t['\uFCBF'] = '\u0641\u062D'; + t['\uFCC0'] = '\u0641\u062E'; + t['\uFCC1'] = '\u0641\u0645'; + t['\uFCC2'] = '\u0642\u062D'; + t['\uFCC3'] = '\u0642\u0645'; + t['\uFCC4'] = '\u0643\u062C'; + t['\uFCC5'] = '\u0643\u062D'; + t['\uFCC6'] = '\u0643\u062E'; + t['\uFCC7'] = '\u0643\u0644'; + t['\uFCC8'] = '\u0643\u0645'; + t['\uFCC9'] = '\u0644\u062C'; + t['\uFCCA'] = '\u0644\u062D'; + t['\uFCCB'] = '\u0644\u062E'; + t['\uFCCC'] = '\u0644\u0645'; + t['\uFCCD'] = '\u0644\u0647'; + t['\uFCCE'] = '\u0645\u062C'; + t['\uFCCF'] = '\u0645\u062D'; + t['\uFCD0'] = '\u0645\u062E'; + t['\uFCD1'] = '\u0645\u0645'; + t['\uFCD2'] = '\u0646\u062C'; + t['\uFCD3'] = '\u0646\u062D'; + t['\uFCD4'] = '\u0646\u062E'; + t['\uFCD5'] = '\u0646\u0645'; + t['\uFCD6'] = '\u0646\u0647'; + t['\uFCD7'] = '\u0647\u062C'; + t['\uFCD8'] = '\u0647\u0645'; + t['\uFCD9'] = '\u0647\u0670'; + t['\uFCDA'] = '\u064A\u062C'; + t['\uFCDB'] = '\u064A\u062D'; + t['\uFCDC'] = '\u064A\u062E'; + t['\uFCDD'] = '\u064A\u0645'; + t['\uFCDE'] = '\u064A\u0647'; + t['\uFCDF'] = '\u0626\u0645'; + t['\uFCE0'] = '\u0626\u0647'; + t['\uFCE1'] = '\u0628\u0645'; + t['\uFCE2'] = '\u0628\u0647'; + t['\uFCE3'] = '\u062A\u0645'; + t['\uFCE4'] = '\u062A\u0647'; + t['\uFCE5'] = '\u062B\u0645'; + t['\uFCE6'] = '\u062B\u0647'; + t['\uFCE7'] = '\u0633\u0645'; + t['\uFCE8'] = '\u0633\u0647'; + t['\uFCE9'] = '\u0634\u0645'; + t['\uFCEA'] = '\u0634\u0647'; + t['\uFCEB'] = '\u0643\u0644'; + t['\uFCEC'] = '\u0643\u0645'; + t['\uFCED'] = '\u0644\u0645'; + t['\uFCEE'] = '\u0646\u0645'; + t['\uFCEF'] = '\u0646\u0647'; + t['\uFCF0'] = '\u064A\u0645'; + t['\uFCF1'] = '\u064A\u0647'; + t['\uFCF2'] = '\u0640\u064E\u0651'; + t['\uFCF3'] = '\u0640\u064F\u0651'; + t['\uFCF4'] = '\u0640\u0650\u0651'; + t['\uFCF5'] = '\u0637\u0649'; + t['\uFCF6'] = '\u0637\u064A'; + t['\uFCF7'] = '\u0639\u0649'; + t['\uFCF8'] = '\u0639\u064A'; + t['\uFCF9'] = '\u063A\u0649'; + t['\uFCFA'] = '\u063A\u064A'; + t['\uFCFB'] = '\u0633\u0649'; + t['\uFCFC'] = '\u0633\u064A'; + t['\uFCFD'] = '\u0634\u0649'; + t['\uFCFE'] = '\u0634\u064A'; + t['\uFCFF'] = '\u062D\u0649'; + t['\uFD00'] = '\u062D\u064A'; + t['\uFD01'] = '\u062C\u0649'; + t['\uFD02'] = '\u062C\u064A'; + t['\uFD03'] = '\u062E\u0649'; + t['\uFD04'] = '\u062E\u064A'; + t['\uFD05'] = '\u0635\u0649'; + t['\uFD06'] = '\u0635\u064A'; + t['\uFD07'] = '\u0636\u0649'; + t['\uFD08'] = '\u0636\u064A'; + t['\uFD09'] = '\u0634\u062C'; + t['\uFD0A'] = '\u0634\u062D'; + t['\uFD0B'] = '\u0634\u062E'; + t['\uFD0C'] = '\u0634\u0645'; + t['\uFD0D'] = '\u0634\u0631'; + t['\uFD0E'] = '\u0633\u0631'; + t['\uFD0F'] = '\u0635\u0631'; + t['\uFD10'] = '\u0636\u0631'; + t['\uFD11'] = '\u0637\u0649'; + t['\uFD12'] = '\u0637\u064A'; + t['\uFD13'] = '\u0639\u0649'; + t['\uFD14'] = '\u0639\u064A'; + t['\uFD15'] = '\u063A\u0649'; + t['\uFD16'] = '\u063A\u064A'; + t['\uFD17'] = '\u0633\u0649'; + t['\uFD18'] = '\u0633\u064A'; + t['\uFD19'] = '\u0634\u0649'; + t['\uFD1A'] = '\u0634\u064A'; + t['\uFD1B'] = '\u062D\u0649'; + t['\uFD1C'] = '\u062D\u064A'; + t['\uFD1D'] = '\u062C\u0649'; + t['\uFD1E'] = '\u062C\u064A'; + t['\uFD1F'] = '\u062E\u0649'; + t['\uFD20'] = '\u062E\u064A'; + t['\uFD21'] = '\u0635\u0649'; + t['\uFD22'] = '\u0635\u064A'; + t['\uFD23'] = '\u0636\u0649'; + t['\uFD24'] = '\u0636\u064A'; + t['\uFD25'] = '\u0634\u062C'; + t['\uFD26'] = '\u0634\u062D'; + t['\uFD27'] = '\u0634\u062E'; + t['\uFD28'] = '\u0634\u0645'; + t['\uFD29'] = '\u0634\u0631'; + t['\uFD2A'] = '\u0633\u0631'; + t['\uFD2B'] = '\u0635\u0631'; + t['\uFD2C'] = '\u0636\u0631'; + t['\uFD2D'] = '\u0634\u062C'; + t['\uFD2E'] = '\u0634\u062D'; + t['\uFD2F'] = '\u0634\u062E'; + t['\uFD30'] = '\u0634\u0645'; + t['\uFD31'] = '\u0633\u0647'; + t['\uFD32'] = '\u0634\u0647'; + t['\uFD33'] = '\u0637\u0645'; + t['\uFD34'] = '\u0633\u062C'; + t['\uFD35'] = '\u0633\u062D'; + t['\uFD36'] = '\u0633\u062E'; + t['\uFD37'] = '\u0634\u062C'; + t['\uFD38'] = '\u0634\u062D'; + t['\uFD39'] = '\u0634\u062E'; + t['\uFD3A'] = '\u0637\u0645'; + t['\uFD3B'] = '\u0638\u0645'; + t['\uFD3C'] = '\u0627\u064B'; + t['\uFD3D'] = '\u0627\u064B'; + t['\uFD50'] = '\u062A\u062C\u0645'; + t['\uFD51'] = '\u062A\u062D\u062C'; + t['\uFD52'] = '\u062A\u062D\u062C'; + t['\uFD53'] = '\u062A\u062D\u0645'; + t['\uFD54'] = '\u062A\u062E\u0645'; + t['\uFD55'] = '\u062A\u0645\u062C'; + t['\uFD56'] = '\u062A\u0645\u062D'; + t['\uFD57'] = '\u062A\u0645\u062E'; + t['\uFD58'] = '\u062C\u0645\u062D'; + t['\uFD59'] = '\u062C\u0645\u062D'; + t['\uFD5A'] = '\u062D\u0645\u064A'; + t['\uFD5B'] = '\u062D\u0645\u0649'; + t['\uFD5C'] = '\u0633\u062D\u062C'; + t['\uFD5D'] = '\u0633\u062C\u062D'; + t['\uFD5E'] = '\u0633\u062C\u0649'; + t['\uFD5F'] = '\u0633\u0645\u062D'; + t['\uFD60'] = '\u0633\u0645\u062D'; + t['\uFD61'] = '\u0633\u0645\u062C'; + t['\uFD62'] = '\u0633\u0645\u0645'; + t['\uFD63'] = '\u0633\u0645\u0645'; + t['\uFD64'] = '\u0635\u062D\u062D'; + t['\uFD65'] = '\u0635\u062D\u062D'; + t['\uFD66'] = '\u0635\u0645\u0645'; + t['\uFD67'] = '\u0634\u062D\u0645'; + t['\uFD68'] = '\u0634\u062D\u0645'; + t['\uFD69'] = '\u0634\u062C\u064A'; + t['\uFD6A'] = '\u0634\u0645\u062E'; + t['\uFD6B'] = '\u0634\u0645\u062E'; + t['\uFD6C'] = '\u0634\u0645\u0645'; + t['\uFD6D'] = '\u0634\u0645\u0645'; + t['\uFD6E'] = '\u0636\u062D\u0649'; + t['\uFD6F'] = '\u0636\u062E\u0645'; + t['\uFD70'] = '\u0636\u062E\u0645'; + t['\uFD71'] = '\u0637\u0645\u062D'; + t['\uFD72'] = '\u0637\u0645\u062D'; + t['\uFD73'] = '\u0637\u0645\u0645'; + t['\uFD74'] = '\u0637\u0645\u064A'; + t['\uFD75'] = '\u0639\u062C\u0645'; + t['\uFD76'] = '\u0639\u0645\u0645'; + t['\uFD77'] = '\u0639\u0645\u0645'; + t['\uFD78'] = '\u0639\u0645\u0649'; + t['\uFD79'] = '\u063A\u0645\u0645'; + t['\uFD7A'] = '\u063A\u0645\u064A'; + t['\uFD7B'] = '\u063A\u0645\u0649'; + t['\uFD7C'] = '\u0641\u062E\u0645'; + t['\uFD7D'] = '\u0641\u062E\u0645'; + t['\uFD7E'] = '\u0642\u0645\u062D'; + t['\uFD7F'] = '\u0642\u0645\u0645'; + t['\uFD80'] = '\u0644\u062D\u0645'; + t['\uFD81'] = '\u0644\u062D\u064A'; + t['\uFD82'] = '\u0644\u062D\u0649'; + t['\uFD83'] = '\u0644\u062C\u062C'; + t['\uFD84'] = '\u0644\u062C\u062C'; + t['\uFD85'] = '\u0644\u062E\u0645'; + t['\uFD86'] = '\u0644\u062E\u0645'; + t['\uFD87'] = '\u0644\u0645\u062D'; + t['\uFD88'] = '\u0644\u0645\u062D'; + t['\uFD89'] = '\u0645\u062D\u062C'; + t['\uFD8A'] = '\u0645\u062D\u0645'; + t['\uFD8B'] = '\u0645\u062D\u064A'; + t['\uFD8C'] = '\u0645\u062C\u062D'; + t['\uFD8D'] = '\u0645\u062C\u0645'; + t['\uFD8E'] = '\u0645\u062E\u062C'; + t['\uFD8F'] = '\u0645\u062E\u0645'; + t['\uFD92'] = '\u0645\u062C\u062E'; + t['\uFD93'] = '\u0647\u0645\u062C'; + t['\uFD94'] = '\u0647\u0645\u0645'; + t['\uFD95'] = '\u0646\u062D\u0645'; + t['\uFD96'] = '\u0646\u062D\u0649'; + t['\uFD97'] = '\u0646\u062C\u0645'; + t['\uFD98'] = '\u0646\u062C\u0645'; + t['\uFD99'] = '\u0646\u062C\u0649'; + t['\uFD9A'] = '\u0646\u0645\u064A'; + t['\uFD9B'] = '\u0646\u0645\u0649'; + t['\uFD9C'] = '\u064A\u0645\u0645'; + t['\uFD9D'] = '\u064A\u0645\u0645'; + t['\uFD9E'] = '\u0628\u062E\u064A'; + t['\uFD9F'] = '\u062A\u062C\u064A'; + t['\uFDA0'] = '\u062A\u062C\u0649'; + t['\uFDA1'] = '\u062A\u062E\u064A'; + t['\uFDA2'] = '\u062A\u062E\u0649'; + t['\uFDA3'] = '\u062A\u0645\u064A'; + t['\uFDA4'] = '\u062A\u0645\u0649'; + t['\uFDA5'] = '\u062C\u0645\u064A'; + t['\uFDA6'] = '\u062C\u062D\u0649'; + t['\uFDA7'] = '\u062C\u0645\u0649'; + t['\uFDA8'] = '\u0633\u062E\u0649'; + t['\uFDA9'] = '\u0635\u062D\u064A'; + t['\uFDAA'] = '\u0634\u062D\u064A'; + t['\uFDAB'] = '\u0636\u062D\u064A'; + t['\uFDAC'] = '\u0644\u062C\u064A'; + t['\uFDAD'] = '\u0644\u0645\u064A'; + t['\uFDAE'] = '\u064A\u062D\u064A'; + t['\uFDAF'] = '\u064A\u062C\u064A'; + t['\uFDB0'] = '\u064A\u0645\u064A'; + t['\uFDB1'] = '\u0645\u0645\u064A'; + t['\uFDB2'] = '\u0642\u0645\u064A'; + t['\uFDB3'] = '\u0646\u062D\u064A'; + t['\uFDB4'] = '\u0642\u0645\u062D'; + t['\uFDB5'] = '\u0644\u062D\u0645'; + t['\uFDB6'] = '\u0639\u0645\u064A'; + t['\uFDB7'] = '\u0643\u0645\u064A'; + t['\uFDB8'] = '\u0646\u062C\u062D'; + t['\uFDB9'] = '\u0645\u062E\u064A'; + t['\uFDBA'] = '\u0644\u062C\u0645'; + t['\uFDBB'] = '\u0643\u0645\u0645'; + t['\uFDBC'] = '\u0644\u062C\u0645'; + t['\uFDBD'] = '\u0646\u062C\u062D'; + t['\uFDBE'] = '\u062C\u062D\u064A'; + t['\uFDBF'] = '\u062D\u062C\u064A'; + t['\uFDC0'] = '\u0645\u062C\u064A'; + t['\uFDC1'] = '\u0641\u0645\u064A'; + t['\uFDC2'] = '\u0628\u062D\u064A'; + t['\uFDC3'] = '\u0643\u0645\u0645'; + t['\uFDC4'] = '\u0639\u062C\u0645'; + t['\uFDC5'] = '\u0635\u0645\u0645'; + t['\uFDC6'] = '\u0633\u062E\u064A'; + t['\uFDC7'] = '\u0646\u062C\u064A'; + t['\uFE49'] = '\u203E'; + t['\uFE4A'] = '\u203E'; + t['\uFE4B'] = '\u203E'; + t['\uFE4C'] = '\u203E'; + t['\uFE4D'] = '\u005F'; + t['\uFE4E'] = '\u005F'; + t['\uFE4F'] = '\u005F'; + t['\uFE80'] = '\u0621'; + t['\uFE81'] = '\u0622'; + t['\uFE82'] = '\u0622'; + t['\uFE83'] = '\u0623'; + t['\uFE84'] = '\u0623'; + t['\uFE85'] = '\u0624'; + t['\uFE86'] = '\u0624'; + t['\uFE87'] = '\u0625'; + t['\uFE88'] = '\u0625'; + t['\uFE89'] = '\u0626'; + t['\uFE8A'] = '\u0626'; + t['\uFE8B'] = '\u0626'; + t['\uFE8C'] = '\u0626'; + t['\uFE8D'] = '\u0627'; + t['\uFE8E'] = '\u0627'; + t['\uFE8F'] = '\u0628'; + t['\uFE90'] = '\u0628'; + t['\uFE91'] = '\u0628'; + t['\uFE92'] = '\u0628'; + t['\uFE93'] = '\u0629'; + t['\uFE94'] = '\u0629'; + t['\uFE95'] = '\u062A'; + t['\uFE96'] = '\u062A'; + t['\uFE97'] = '\u062A'; + t['\uFE98'] = '\u062A'; + t['\uFE99'] = '\u062B'; + t['\uFE9A'] = '\u062B'; + t['\uFE9B'] = '\u062B'; + t['\uFE9C'] = '\u062B'; + t['\uFE9D'] = '\u062C'; + t['\uFE9E'] = '\u062C'; + t['\uFE9F'] = '\u062C'; + t['\uFEA0'] = '\u062C'; + t['\uFEA1'] = '\u062D'; + t['\uFEA2'] = '\u062D'; + t['\uFEA3'] = '\u062D'; + t['\uFEA4'] = '\u062D'; + t['\uFEA5'] = '\u062E'; + t['\uFEA6'] = '\u062E'; + t['\uFEA7'] = '\u062E'; + t['\uFEA8'] = '\u062E'; + t['\uFEA9'] = '\u062F'; + t['\uFEAA'] = '\u062F'; + t['\uFEAB'] = '\u0630'; + t['\uFEAC'] = '\u0630'; + t['\uFEAD'] = '\u0631'; + t['\uFEAE'] = '\u0631'; + t['\uFEAF'] = '\u0632'; + t['\uFEB0'] = '\u0632'; + t['\uFEB1'] = '\u0633'; + t['\uFEB2'] = '\u0633'; + t['\uFEB3'] = '\u0633'; + t['\uFEB4'] = '\u0633'; + t['\uFEB5'] = '\u0634'; + t['\uFEB6'] = '\u0634'; + t['\uFEB7'] = '\u0634'; + t['\uFEB8'] = '\u0634'; + t['\uFEB9'] = '\u0635'; + t['\uFEBA'] = '\u0635'; + t['\uFEBB'] = '\u0635'; + t['\uFEBC'] = '\u0635'; + t['\uFEBD'] = '\u0636'; + t['\uFEBE'] = '\u0636'; + t['\uFEBF'] = '\u0636'; + t['\uFEC0'] = '\u0636'; + t['\uFEC1'] = '\u0637'; + t['\uFEC2'] = '\u0637'; + t['\uFEC3'] = '\u0637'; + t['\uFEC4'] = '\u0637'; + t['\uFEC5'] = '\u0638'; + t['\uFEC6'] = '\u0638'; + t['\uFEC7'] = '\u0638'; + t['\uFEC8'] = '\u0638'; + t['\uFEC9'] = '\u0639'; + t['\uFECA'] = '\u0639'; + t['\uFECB'] = '\u0639'; + t['\uFECC'] = '\u0639'; + t['\uFECD'] = '\u063A'; + t['\uFECE'] = '\u063A'; + t['\uFECF'] = '\u063A'; + t['\uFED0'] = '\u063A'; + t['\uFED1'] = '\u0641'; + t['\uFED2'] = '\u0641'; + t['\uFED3'] = '\u0641'; + t['\uFED4'] = '\u0641'; + t['\uFED5'] = '\u0642'; + t['\uFED6'] = '\u0642'; + t['\uFED7'] = '\u0642'; + t['\uFED8'] = '\u0642'; + t['\uFED9'] = '\u0643'; + t['\uFEDA'] = '\u0643'; + t['\uFEDB'] = '\u0643'; + t['\uFEDC'] = '\u0643'; + t['\uFEDD'] = '\u0644'; + t['\uFEDE'] = '\u0644'; + t['\uFEDF'] = '\u0644'; + t['\uFEE0'] = '\u0644'; + t['\uFEE1'] = '\u0645'; + t['\uFEE2'] = '\u0645'; + t['\uFEE3'] = '\u0645'; + t['\uFEE4'] = '\u0645'; + t['\uFEE5'] = '\u0646'; + t['\uFEE6'] = '\u0646'; + t['\uFEE7'] = '\u0646'; + t['\uFEE8'] = '\u0646'; + t['\uFEE9'] = '\u0647'; + t['\uFEEA'] = '\u0647'; + t['\uFEEB'] = '\u0647'; + t['\uFEEC'] = '\u0647'; + t['\uFEED'] = '\u0648'; + t['\uFEEE'] = '\u0648'; + t['\uFEEF'] = '\u0649'; + t['\uFEF0'] = '\u0649'; + t['\uFEF1'] = '\u064A'; + t['\uFEF2'] = '\u064A'; + t['\uFEF3'] = '\u064A'; + t['\uFEF4'] = '\u064A'; + t['\uFEF5'] = '\u0644\u0622'; + t['\uFEF6'] = '\u0644\u0622'; + t['\uFEF7'] = '\u0644\u0623'; + t['\uFEF8'] = '\u0644\u0623'; + t['\uFEF9'] = '\u0644\u0625'; + t['\uFEFA'] = '\u0644\u0625'; + t['\uFEFB'] = '\u0644\u0627'; + t['\uFEFC'] = '\u0644\u0627'; + }); + function reverseIfRtl(chars) { + var charsLength = chars.length; + if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { + return chars; + } + var s = ''; + for (var ii = charsLength - 1; ii >= 0; ii--) { + s += chars[ii]; + } + return s; + } + exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues; + exports.reverseIfRtl = reverseIfRtl; + exports.getUnicodeRangeFor = getUnicodeRangeFor; + exports.getNormalizedUnicodes = getNormalizedUnicodes; + exports.getUnicodeForGlyph = getUnicodeForGlyph; + })); + (function (root, factory) { + factory(root.pdfjsCoreStream = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreJbig2, root.pdfjsCoreJpg, root.pdfjsCoreJpx); + }(this, function (exports, sharedUtil, corePrimitives, coreJbig2, coreJpg, coreJpx) { + var Util = sharedUtil.Util; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isInt = sharedUtil.isInt; + var isArray = sharedUtil.isArray; + var createObjectURL = sharedUtil.createObjectURL; + var shadow = sharedUtil.shadow; + var warn = sharedUtil.warn; + var isSpace = sharedUtil.isSpace; + var Dict = corePrimitives.Dict; + var isDict = corePrimitives.isDict; + var isStream = corePrimitives.isStream; + var Jbig2Image = coreJbig2.Jbig2Image; + var JpegImage = coreJpg.JpegImage; + var JpxImage = coreJpx.JpxImage; + var Stream = function StreamClosure() { + function Stream(arrayBuffer, start, length, dict) { + this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer); + this.start = start || 0; + this.pos = this.start; + this.end = start + length || this.bytes.length; + this.dict = dict; + } + Stream.prototype = { + get length() { + return this.end - this.start; + }, + get isEmpty() { + return this.length === 0; + }, + getByte: function Stream_getByte() { + if (this.pos >= this.end) { + return -1; + } + return this.bytes[this.pos++]; + }, + getUint16: function Stream_getUint16() { + var b0 = this.getByte(); + var b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + }, + getInt32: function Stream_getInt32() { + var b0 = this.getByte(); + var b1 = this.getByte(); + var b2 = this.getByte(); + var b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + }, + getBytes: function Stream_getBytes(length) { + var bytes = this.bytes; + var pos = this.pos; + var strEnd = this.end; + if (!length) { + return bytes.subarray(pos, strEnd); + } + var end = pos + length; + if (end > strEnd) { + end = strEnd; + } + this.pos = end; + return bytes.subarray(pos, end); + }, + peekByte: function Stream_peekByte() { + var peekedByte = this.getByte(); + this.pos--; + return peekedByte; + }, + peekBytes: function Stream_peekBytes(length) { + var bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; + }, + skip: function Stream_skip(n) { + if (!n) { + n = 1; + } + this.pos += n; + }, + reset: function Stream_reset() { + this.pos = this.start; + }, + moveStart: function Stream_moveStart() { + this.start = this.pos; + }, + makeSubStream: function Stream_makeSubStream(start, length, dict) { + return new Stream(this.bytes.buffer, start, length, dict); + }, + isStream: true + }; + return Stream; + }(); + var StringStream = function StringStreamClosure() { + function StringStream(str) { + var length = str.length; + var bytes = new Uint8Array(length); + for (var n = 0; n < length; ++n) { + bytes[n] = str.charCodeAt(n); + } + Stream.call(this, bytes); + } + StringStream.prototype = Stream.prototype; + return StringStream; + }(); + var DecodeStream = function DecodeStreamClosure() { + var emptyBuffer = new Uint8Array(0); + function DecodeStream(maybeMinBufferLength) { + this.pos = 0; + this.bufferLength = 0; + this.eof = false; + this.buffer = emptyBuffer; + this.minBufferLength = 512; + if (maybeMinBufferLength) { + while (this.minBufferLength < maybeMinBufferLength) { + this.minBufferLength *= 2; + } + } + } + DecodeStream.prototype = { + get isEmpty() { + while (!this.eof && this.bufferLength === 0) { + this.readBlock(); + } + return this.bufferLength === 0; + }, + ensureBuffer: function DecodeStream_ensureBuffer(requested) { + var buffer = this.buffer; + if (requested <= buffer.byteLength) { + return buffer; + } + var size = this.minBufferLength; + while (size < requested) { + size *= 2; + } + var buffer2 = new Uint8Array(size); + buffer2.set(buffer); + return this.buffer = buffer2; + }, + getByte: function DecodeStream_getByte() { + var pos = this.pos; + while (this.bufferLength <= pos) { + if (this.eof) { + return -1; + } + this.readBlock(); + } + return this.buffer[this.pos++]; + }, + getUint16: function DecodeStream_getUint16() { + var b0 = this.getByte(); + var b1 = this.getByte(); + if (b0 === -1 || b1 === -1) { + return -1; + } + return (b0 << 8) + b1; + }, + getInt32: function DecodeStream_getInt32() { + var b0 = this.getByte(); + var b1 = this.getByte(); + var b2 = this.getByte(); + var b3 = this.getByte(); + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + }, + getBytes: function DecodeStream_getBytes(length) { + var end, pos = this.pos; + if (length) { + this.ensureBuffer(pos + length); + end = pos + length; + while (!this.eof && this.bufferLength < end) { + this.readBlock(); + } + var bufEnd = this.bufferLength; + if (end > bufEnd) { + end = bufEnd; + } + } else { + while (!this.eof) { + this.readBlock(); + } + end = this.bufferLength; + } + this.pos = end; + return this.buffer.subarray(pos, end); + }, + peekByte: function DecodeStream_peekByte() { + var peekedByte = this.getByte(); + this.pos--; + return peekedByte; + }, + peekBytes: function DecodeStream_peekBytes(length) { + var bytes = this.getBytes(length); + this.pos -= bytes.length; + return bytes; + }, + makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { + var end = start + length; + while (this.bufferLength <= end && !this.eof) { + this.readBlock(); + } + return new Stream(this.buffer, start, length, dict); + }, + skip: function DecodeStream_skip(n) { + if (!n) { + n = 1; + } + this.pos += n; + }, + reset: function DecodeStream_reset() { + this.pos = 0; + }, + getBaseStreams: function DecodeStream_getBaseStreams() { + if (this.str && this.str.getBaseStreams) { + return this.str.getBaseStreams(); + } + return []; + } + }; + return DecodeStream; + }(); + var StreamsSequenceStream = function StreamsSequenceStreamClosure() { + function StreamsSequenceStream(streams) { + this.streams = streams; + DecodeStream.call(this, null); + } + StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); + StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() { + var streams = this.streams; + if (streams.length === 0) { + this.eof = true; + return; + } + var stream = streams.shift(); + var chunk = stream.getBytes(); + var bufferLength = this.bufferLength; + var newLength = bufferLength + chunk.length; + var buffer = this.ensureBuffer(newLength); + buffer.set(chunk, bufferLength); + this.bufferLength = newLength; + }; + StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() { + var baseStreams = []; + for (var i = 0, ii = this.streams.length; i < ii; i++) { + var stream = this.streams[i]; + if (stream.getBaseStreams) { + Util.appendToArray(baseStreams, stream.getBaseStreams()); + } + } + return baseStreams; + }; + return StreamsSequenceStream; + }(); + var FlateStream = function FlateStreamClosure() { + var codeLenCodeMap = new Int32Array([ + 16, + 17, + 18, + 0, + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15 + ]); + var lengthDecode = new Int32Array([ + 0x00003, + 0x00004, + 0x00005, + 0x00006, + 0x00007, + 0x00008, + 0x00009, + 0x0000a, + 0x1000b, + 0x1000d, + 0x1000f, + 0x10011, + 0x20013, + 0x20017, + 0x2001b, + 0x2001f, + 0x30023, + 0x3002b, + 0x30033, + 0x3003b, + 0x40043, + 0x40053, + 0x40063, + 0x40073, + 0x50083, + 0x500a3, + 0x500c3, + 0x500e3, + 0x00102, + 0x00102, + 0x00102 + ]); + var distDecode = new Int32Array([ + 0x00001, + 0x00002, + 0x00003, + 0x00004, + 0x10005, + 0x10007, + 0x20009, + 0x2000d, + 0x30011, + 0x30019, + 0x40021, + 0x40031, + 0x50041, + 0x50061, + 0x60081, + 0x600c1, + 0x70101, + 0x70181, + 0x80201, + 0x80301, + 0x90401, + 0x90601, + 0xa0801, + 0xa0c01, + 0xb1001, + 0xb1801, + 0xc2001, + 0xc3001, + 0xd4001, + 0xd6001 + ]); + var fixedLitCodeTab = [ + new Int32Array([ + 0x70100, + 0x80050, + 0x80010, + 0x80118, + 0x70110, + 0x80070, + 0x80030, + 0x900c0, + 0x70108, + 0x80060, + 0x80020, + 0x900a0, + 0x80000, + 0x80080, + 0x80040, + 0x900e0, + 0x70104, + 0x80058, + 0x80018, + 0x90090, + 0x70114, + 0x80078, + 0x80038, + 0x900d0, + 0x7010c, + 0x80068, + 0x80028, + 0x900b0, + 0x80008, + 0x80088, + 0x80048, + 0x900f0, + 0x70102, + 0x80054, + 0x80014, + 0x8011c, + 0x70112, + 0x80074, + 0x80034, + 0x900c8, + 0x7010a, + 0x80064, + 0x80024, + 0x900a8, + 0x80004, + 0x80084, + 0x80044, + 0x900e8, + 0x70106, + 0x8005c, + 0x8001c, + 0x90098, + 0x70116, + 0x8007c, + 0x8003c, + 0x900d8, + 0x7010e, + 0x8006c, + 0x8002c, + 0x900b8, + 0x8000c, + 0x8008c, + 0x8004c, + 0x900f8, + 0x70101, + 0x80052, + 0x80012, + 0x8011a, + 0x70111, + 0x80072, + 0x80032, + 0x900c4, + 0x70109, + 0x80062, + 0x80022, + 0x900a4, + 0x80002, + 0x80082, + 0x80042, + 0x900e4, + 0x70105, + 0x8005a, + 0x8001a, + 0x90094, + 0x70115, + 0x8007a, + 0x8003a, + 0x900d4, + 0x7010d, + 0x8006a, + 0x8002a, + 0x900b4, + 0x8000a, + 0x8008a, + 0x8004a, + 0x900f4, + 0x70103, + 0x80056, + 0x80016, + 0x8011e, + 0x70113, + 0x80076, + 0x80036, + 0x900cc, + 0x7010b, + 0x80066, + 0x80026, + 0x900ac, + 0x80006, + 0x80086, + 0x80046, + 0x900ec, + 0x70107, + 0x8005e, + 0x8001e, + 0x9009c, + 0x70117, + 0x8007e, + 0x8003e, + 0x900dc, + 0x7010f, + 0x8006e, + 0x8002e, + 0x900bc, + 0x8000e, + 0x8008e, + 0x8004e, + 0x900fc, + 0x70100, + 0x80051, + 0x80011, + 0x80119, + 0x70110, + 0x80071, + 0x80031, + 0x900c2, + 0x70108, + 0x80061, + 0x80021, + 0x900a2, + 0x80001, + 0x80081, + 0x80041, + 0x900e2, + 0x70104, + 0x80059, + 0x80019, + 0x90092, + 0x70114, + 0x80079, + 0x80039, + 0x900d2, + 0x7010c, + 0x80069, + 0x80029, + 0x900b2, + 0x80009, + 0x80089, + 0x80049, + 0x900f2, + 0x70102, + 0x80055, + 0x80015, + 0x8011d, + 0x70112, + 0x80075, + 0x80035, + 0x900ca, + 0x7010a, + 0x80065, + 0x80025, + 0x900aa, + 0x80005, + 0x80085, + 0x80045, + 0x900ea, + 0x70106, + 0x8005d, + 0x8001d, + 0x9009a, + 0x70116, + 0x8007d, + 0x8003d, + 0x900da, + 0x7010e, + 0x8006d, + 0x8002d, + 0x900ba, + 0x8000d, + 0x8008d, + 0x8004d, + 0x900fa, + 0x70101, + 0x80053, + 0x80013, + 0x8011b, + 0x70111, + 0x80073, + 0x80033, + 0x900c6, + 0x70109, + 0x80063, + 0x80023, + 0x900a6, + 0x80003, + 0x80083, + 0x80043, + 0x900e6, + 0x70105, + 0x8005b, + 0x8001b, + 0x90096, + 0x70115, + 0x8007b, + 0x8003b, + 0x900d6, + 0x7010d, + 0x8006b, + 0x8002b, + 0x900b6, + 0x8000b, + 0x8008b, + 0x8004b, + 0x900f6, + 0x70103, + 0x80057, + 0x80017, + 0x8011f, + 0x70113, + 0x80077, + 0x80037, + 0x900ce, + 0x7010b, + 0x80067, + 0x80027, + 0x900ae, + 0x80007, + 0x80087, + 0x80047, + 0x900ee, + 0x70107, + 0x8005f, + 0x8001f, + 0x9009e, + 0x70117, + 0x8007f, + 0x8003f, + 0x900de, + 0x7010f, + 0x8006f, + 0x8002f, + 0x900be, + 0x8000f, + 0x8008f, + 0x8004f, + 0x900fe, + 0x70100, + 0x80050, + 0x80010, + 0x80118, + 0x70110, + 0x80070, + 0x80030, + 0x900c1, + 0x70108, + 0x80060, + 0x80020, + 0x900a1, + 0x80000, + 0x80080, + 0x80040, + 0x900e1, + 0x70104, + 0x80058, + 0x80018, + 0x90091, + 0x70114, + 0x80078, + 0x80038, + 0x900d1, + 0x7010c, + 0x80068, + 0x80028, + 0x900b1, + 0x80008, + 0x80088, + 0x80048, + 0x900f1, + 0x70102, + 0x80054, + 0x80014, + 0x8011c, + 0x70112, + 0x80074, + 0x80034, + 0x900c9, + 0x7010a, + 0x80064, + 0x80024, + 0x900a9, + 0x80004, + 0x80084, + 0x80044, + 0x900e9, + 0x70106, + 0x8005c, + 0x8001c, + 0x90099, + 0x70116, + 0x8007c, + 0x8003c, + 0x900d9, + 0x7010e, + 0x8006c, + 0x8002c, + 0x900b9, + 0x8000c, + 0x8008c, + 0x8004c, + 0x900f9, + 0x70101, + 0x80052, + 0x80012, + 0x8011a, + 0x70111, + 0x80072, + 0x80032, + 0x900c5, + 0x70109, + 0x80062, + 0x80022, + 0x900a5, + 0x80002, + 0x80082, + 0x80042, + 0x900e5, + 0x70105, + 0x8005a, + 0x8001a, + 0x90095, + 0x70115, + 0x8007a, + 0x8003a, + 0x900d5, + 0x7010d, + 0x8006a, + 0x8002a, + 0x900b5, + 0x8000a, + 0x8008a, + 0x8004a, + 0x900f5, + 0x70103, + 0x80056, + 0x80016, + 0x8011e, + 0x70113, + 0x80076, + 0x80036, + 0x900cd, + 0x7010b, + 0x80066, + 0x80026, + 0x900ad, + 0x80006, + 0x80086, + 0x80046, + 0x900ed, + 0x70107, + 0x8005e, + 0x8001e, + 0x9009d, + 0x70117, + 0x8007e, + 0x8003e, + 0x900dd, + 0x7010f, + 0x8006e, + 0x8002e, + 0x900bd, + 0x8000e, + 0x8008e, + 0x8004e, + 0x900fd, + 0x70100, + 0x80051, + 0x80011, + 0x80119, + 0x70110, + 0x80071, + 0x80031, + 0x900c3, + 0x70108, + 0x80061, + 0x80021, + 0x900a3, + 0x80001, + 0x80081, + 0x80041, + 0x900e3, + 0x70104, + 0x80059, + 0x80019, + 0x90093, + 0x70114, + 0x80079, + 0x80039, + 0x900d3, + 0x7010c, + 0x80069, + 0x80029, + 0x900b3, + 0x80009, + 0x80089, + 0x80049, + 0x900f3, + 0x70102, + 0x80055, + 0x80015, + 0x8011d, + 0x70112, + 0x80075, + 0x80035, + 0x900cb, + 0x7010a, + 0x80065, + 0x80025, + 0x900ab, + 0x80005, + 0x80085, + 0x80045, + 0x900eb, + 0x70106, + 0x8005d, + 0x8001d, + 0x9009b, + 0x70116, + 0x8007d, + 0x8003d, + 0x900db, + 0x7010e, + 0x8006d, + 0x8002d, + 0x900bb, + 0x8000d, + 0x8008d, + 0x8004d, + 0x900fb, + 0x70101, + 0x80053, + 0x80013, + 0x8011b, + 0x70111, + 0x80073, + 0x80033, + 0x900c7, + 0x70109, + 0x80063, + 0x80023, + 0x900a7, + 0x80003, + 0x80083, + 0x80043, + 0x900e7, + 0x70105, + 0x8005b, + 0x8001b, + 0x90097, + 0x70115, + 0x8007b, + 0x8003b, + 0x900d7, + 0x7010d, + 0x8006b, + 0x8002b, + 0x900b7, + 0x8000b, + 0x8008b, + 0x8004b, + 0x900f7, + 0x70103, + 0x80057, + 0x80017, + 0x8011f, + 0x70113, + 0x80077, + 0x80037, + 0x900cf, + 0x7010b, + 0x80067, + 0x80027, + 0x900af, + 0x80007, + 0x80087, + 0x80047, + 0x900ef, + 0x70107, + 0x8005f, + 0x8001f, + 0x9009f, + 0x70117, + 0x8007f, + 0x8003f, + 0x900df, + 0x7010f, + 0x8006f, + 0x8002f, + 0x900bf, + 0x8000f, + 0x8008f, + 0x8004f, + 0x900ff + ]), + 9 + ]; + var fixedDistCodeTab = [ + new Int32Array([ + 0x50000, + 0x50010, + 0x50008, + 0x50018, + 0x50004, + 0x50014, + 0x5000c, + 0x5001c, + 0x50002, + 0x50012, + 0x5000a, + 0x5001a, + 0x50006, + 0x50016, + 0x5000e, + 0x00000, + 0x50001, + 0x50011, + 0x50009, + 0x50019, + 0x50005, + 0x50015, + 0x5000d, + 0x5001d, + 0x50003, + 0x50013, + 0x5000b, + 0x5001b, + 0x50007, + 0x50017, + 0x5000f, + 0x00000 + ]), + 5 + ]; + function FlateStream(str, maybeLength) { + this.str = str; + this.dict = str.dict; + var cmf = str.getByte(); + var flg = str.getByte(); + if (cmf === -1 || flg === -1) { + error('Invalid header in flate stream: ' + cmf + ', ' + flg); + } + if ((cmf & 0x0f) !== 0x08) { + error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); + } + if (((cmf << 8) + flg) % 31 !== 0) { + error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); + } + if (flg & 0x20) { + error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); + } + this.codeSize = 0; + this.codeBuf = 0; + DecodeStream.call(this, maybeLength); + } + FlateStream.prototype = Object.create(DecodeStream.prototype); + FlateStream.prototype.getBits = function FlateStream_getBits(bits) { + var str = this.str; + var codeSize = this.codeSize; + var codeBuf = this.codeBuf; + var b; + while (codeSize < bits) { + if ((b = str.getByte()) === -1) { + error('Bad encoding in flate stream'); + } + codeBuf |= b << codeSize; + codeSize += 8; + } + b = codeBuf & (1 << bits) - 1; + this.codeBuf = codeBuf >> bits; + this.codeSize = codeSize -= bits; + return b; + }; + FlateStream.prototype.getCode = function FlateStream_getCode(table) { + var str = this.str; + var codes = table[0]; + var maxLen = table[1]; + var codeSize = this.codeSize; + var codeBuf = this.codeBuf; + var b; + while (codeSize < maxLen) { + if ((b = str.getByte()) === -1) { + break; + } + codeBuf |= b << codeSize; + codeSize += 8; + } + var code = codes[codeBuf & (1 << maxLen) - 1]; + var codeLen = code >> 16; + var codeVal = code & 0xffff; + if (codeLen < 1 || codeSize < codeLen) { + error('Bad encoding in flate stream'); + } + this.codeBuf = codeBuf >> codeLen; + this.codeSize = codeSize - codeLen; + return codeVal; + }; + FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) { + var n = lengths.length; + var maxLen = 0; + var i; + for (i = 0; i < n; ++i) { + if (lengths[i] > maxLen) { + maxLen = lengths[i]; + } + } + var size = 1 << maxLen; + var codes = new Int32Array(size); + for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) { + for (var val = 0; val < n; ++val) { + if (lengths[val] === len) { + var code2 = 0; + var t = code; + for (i = 0; i < len; ++i) { + code2 = code2 << 1 | t & 1; + t >>= 1; + } + for (i = code2; i < size; i += skip) { + codes[i] = len << 16 | val; + } + ++code; + } + } + } + return [ + codes, + maxLen + ]; + }; + FlateStream.prototype.readBlock = function FlateStream_readBlock() { + var buffer, len; + var str = this.str; + var hdr = this.getBits(3); + if (hdr & 1) { + this.eof = true; + } + hdr >>= 1; + if (hdr === 0) { + var b; + if ((b = str.getByte()) === -1) { + error('Bad block header in flate stream'); + } + var blockLen = b; + if ((b = str.getByte()) === -1) { + error('Bad block header in flate stream'); + } + blockLen |= b << 8; + if ((b = str.getByte()) === -1) { + error('Bad block header in flate stream'); + } + var check = b; + if ((b = str.getByte()) === -1) { + error('Bad block header in flate stream'); + } + check |= b << 8; + if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) { + error('Bad uncompressed block length in flate stream'); + } + this.codeBuf = 0; + this.codeSize = 0; + var bufferLength = this.bufferLength; + buffer = this.ensureBuffer(bufferLength + blockLen); + var end = bufferLength + blockLen; + this.bufferLength = end; + if (blockLen === 0) { + if (str.peekByte() === -1) { + this.eof = true; + } + } else { + for (var n = bufferLength; n < end; ++n) { + if ((b = str.getByte()) === -1) { + this.eof = true; + break; + } + buffer[n] = b; + } + } + return; + } + var litCodeTable; + var distCodeTable; + if (hdr === 1) { + litCodeTable = fixedLitCodeTab; + distCodeTable = fixedDistCodeTab; + } else if (hdr === 2) { + var numLitCodes = this.getBits(5) + 257; + var numDistCodes = this.getBits(5) + 1; + var numCodeLenCodes = this.getBits(4) + 4; + var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); + var i; + for (i = 0; i < numCodeLenCodes; ++i) { + codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); + } + var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); + len = 0; + i = 0; + var codes = numLitCodes + numDistCodes; + var codeLengths = new Uint8Array(codes); + var bitsLength, bitsOffset, what; + while (i < codes) { + var code = this.getCode(codeLenCodeTab); + if (code === 16) { + bitsLength = 2; + bitsOffset = 3; + what = len; + } else if (code === 17) { + bitsLength = 3; + bitsOffset = 3; + what = len = 0; + } else if (code === 18) { + bitsLength = 7; + bitsOffset = 11; + what = len = 0; + } else { + codeLengths[i++] = len = code; + continue; + } + var repeatLength = this.getBits(bitsLength) + bitsOffset; + while (repeatLength-- > 0) { + codeLengths[i++] = what; + } + } + litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); + distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); + } else { + error('Unknown block type in flate stream'); + } + buffer = this.buffer; + var limit = buffer ? buffer.length : 0; + var pos = this.bufferLength; + while (true) { + var code1 = this.getCode(litCodeTable); + if (code1 < 256) { + if (pos + 1 >= limit) { + buffer = this.ensureBuffer(pos + 1); + limit = buffer.length; + } + buffer[pos++] = code1; + continue; + } + if (code1 === 256) { + this.bufferLength = pos; + return; + } + code1 -= 257; + code1 = lengthDecode[code1]; + var code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + len = (code1 & 0xffff) + code2; + code1 = this.getCode(distCodeTable); + code1 = distDecode[code1]; + code2 = code1 >> 16; + if (code2 > 0) { + code2 = this.getBits(code2); + } + var dist = (code1 & 0xffff) + code2; + if (pos + len >= limit) { + buffer = this.ensureBuffer(pos + len); + limit = buffer.length; + } + for (var k = 0; k < len; ++k, ++pos) { + buffer[pos] = buffer[pos - dist]; + } + } + }; + return FlateStream; + }(); + var PredictorStream = function PredictorStreamClosure() { + function PredictorStream(str, maybeLength, params) { + if (!isDict(params)) { + return str; + } + var predictor = this.predictor = params.get('Predictor') || 1; + if (predictor <= 1) { + return str; + } + if (predictor !== 2 && (predictor < 10 || predictor > 15)) { + error('Unsupported predictor: ' + predictor); + } + if (predictor === 2) { + this.readBlock = this.readBlockTiff; + } else { + this.readBlock = this.readBlockPng; + } + this.str = str; + this.dict = str.dict; + var colors = this.colors = params.get('Colors') || 1; + var bits = this.bits = params.get('BitsPerComponent') || 8; + var columns = this.columns = params.get('Columns') || 1; + this.pixBytes = colors * bits + 7 >> 3; + this.rowBytes = columns * colors * bits + 7 >> 3; + DecodeStream.call(this, maybeLength); + return this; + } + PredictorStream.prototype = Object.create(DecodeStream.prototype); + PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() { + var rowBytes = this.rowBytes; + var bufferLength = this.bufferLength; + var buffer = this.ensureBuffer(bufferLength + rowBytes); + var bits = this.bits; + var colors = this.colors; + var rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + var inbuf = 0, outbuf = 0; + var inbits = 0, outbits = 0; + var pos = bufferLength; + var i; + if (bits === 1 && colors === 1) { + for (i = 0; i < rowBytes; ++i) { + var c = rawBytes[i] ^ inbuf; + c ^= c >> 1; + c ^= c >> 2; + c ^= c >> 4; + inbuf = (c & 1) << 7; + buffer[pos++] = c; + } + } else if (bits === 8) { + for (i = 0; i < colors; ++i) { + buffer[pos++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[pos] = buffer[pos - colors] + rawBytes[i]; + pos++; + } + } else { + var compArray = new Uint8Array(colors + 1); + var bitMask = (1 << bits) - 1; + var j = 0, k = bufferLength; + var columns = this.columns; + for (i = 0; i < columns; ++i) { + for (var kk = 0; kk < colors; ++kk) { + if (inbits < bits) { + inbuf = inbuf << 8 | rawBytes[j++] & 0xFF; + inbits += 8; + } + compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask; + inbits -= bits; + outbuf = outbuf << bits | compArray[kk]; + outbits += bits; + if (outbits >= 8) { + buffer[k++] = outbuf >> outbits - 8 & 0xFF; + outbits -= 8; + } + } + } + if (outbits > 0) { + buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1); + } + } + this.bufferLength += rowBytes; + }; + PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() { + var rowBytes = this.rowBytes; + var pixBytes = this.pixBytes; + var predictor = this.str.getByte(); + var rawBytes = this.str.getBytes(rowBytes); + this.eof = !rawBytes.length; + if (this.eof) { + return; + } + var bufferLength = this.bufferLength; + var buffer = this.ensureBuffer(bufferLength + rowBytes); + var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); + if (prevRow.length === 0) { + prevRow = new Uint8Array(rowBytes); + } + var i, j = bufferLength, up, c; + switch (predictor) { + case 0: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + break; + case 1: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xFF; + j++; + } + break; + case 2: + for (i = 0; i < rowBytes; ++i) { + buffer[j++] = prevRow[i] + rawBytes[i] & 0xFF; + } + break; + case 3: + for (i = 0; i < pixBytes; ++i) { + buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; + } + for (; i < rowBytes; ++i) { + buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xFF; + j++; + } + break; + case 4: + for (i = 0; i < pixBytes; ++i) { + up = prevRow[i]; + c = rawBytes[i]; + buffer[j++] = up + c; + } + for (; i < rowBytes; ++i) { + up = prevRow[i]; + var upLeft = prevRow[i - pixBytes]; + var left = buffer[j - pixBytes]; + var p = left + up - upLeft; + var pa = p - left; + if (pa < 0) { + pa = -pa; + } + var pb = p - up; + if (pb < 0) { + pb = -pb; + } + var pc = p - upLeft; + if (pc < 0) { + pc = -pc; + } + c = rawBytes[i]; + if (pa <= pb && pa <= pc) { + buffer[j++] = left + c; + } else if (pb <= pc) { + buffer[j++] = up + c; + } else { + buffer[j++] = upLeft + c; + } + } + break; + default: + error('Unsupported predictor: ' + predictor); + } + this.bufferLength += rowBytes; + }; + return PredictorStream; + }(); + var JpegStream = function JpegStreamClosure() { + function JpegStream(stream, maybeLength, dict, params) { + var ch; + while ((ch = stream.getByte()) !== -1) { + if (ch === 0xFF) { + stream.skip(-1); + break; + } + } + this.stream = stream; + this.maybeLength = maybeLength; + this.dict = dict; + this.params = params; + DecodeStream.call(this, maybeLength); + } + JpegStream.prototype = Object.create(DecodeStream.prototype); + Object.defineProperty(JpegStream.prototype, 'bytes', { + get: function JpegStream_bytes() { + return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); + }, + configurable: true + }); + JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { + if (this.bufferLength) { + return; + } + var jpegImage = new JpegImage(); + var decodeArr = this.dict.getArray('Decode', 'D'); + if (this.forceRGB && isArray(decodeArr)) { + var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; + var decodeArrLength = decodeArr.length; + var transform = new Int32Array(decodeArrLength); + var transformNeeded = false; + var maxValue = (1 << bitsPerComponent) - 1; + for (var i = 0; i < decodeArrLength; i += 2) { + transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0; + transform[i + 1] = decodeArr[i] * maxValue | 0; + if (transform[i] !== 256 || transform[i + 1] !== 0) { + transformNeeded = true; + } + } + if (transformNeeded) { + jpegImage.decodeTransform = transform; + } + } + if (isDict(this.params)) { + var colorTransform = this.params.get('ColorTransform'); + if (isInt(colorTransform)) { + jpegImage.colorTransform = colorTransform; + } + } + jpegImage.parse(this.bytes); + var data = jpegImage.getData(this.drawWidth, this.drawHeight, this.forceRGB); + this.buffer = data; + this.bufferLength = data.length; + this.eof = true; + }; + JpegStream.prototype.getBytes = function JpegStream_getBytes(length) { + this.ensureBuffer(); + return this.buffer; + }; + JpegStream.prototype.getIR = function JpegStream_getIR(forceDataSchema) { + return createObjectURL(this.bytes, 'image/jpeg', forceDataSchema); + }; + return JpegStream; + }(); + var JpxStream = function JpxStreamClosure() { + function JpxStream(stream, maybeLength, dict, params) { + this.stream = stream; + this.maybeLength = maybeLength; + this.dict = dict; + this.params = params; + DecodeStream.call(this, maybeLength); + } + JpxStream.prototype = Object.create(DecodeStream.prototype); + Object.defineProperty(JpxStream.prototype, 'bytes', { + get: function JpxStream_bytes() { + return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); + }, + configurable: true + }); + JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { + if (this.bufferLength) { + return; + } + var jpxImage = new JpxImage(); + jpxImage.parse(this.bytes); + var width = jpxImage.width; + var height = jpxImage.height; + var componentsCount = jpxImage.componentsCount; + var tileCount = jpxImage.tiles.length; + if (tileCount === 1) { + this.buffer = jpxImage.tiles[0].items; + } else { + var data = new Uint8Array(width * height * componentsCount); + for (var k = 0; k < tileCount; k++) { + var tileComponents = jpxImage.tiles[k]; + var tileWidth = tileComponents.width; + var tileHeight = tileComponents.height; + var tileLeft = tileComponents.left; + var tileTop = tileComponents.top; + var src = tileComponents.items; + var srcPosition = 0; + var dataPosition = (width * tileTop + tileLeft) * componentsCount; + var imgRowSize = width * componentsCount; + var tileRowSize = tileWidth * componentsCount; + for (var j = 0; j < tileHeight; j++) { + var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); + data.set(rowBytes, dataPosition); + srcPosition += tileRowSize; + dataPosition += imgRowSize; + } + } + this.buffer = data; + } + this.bufferLength = this.buffer.length; + this.eof = true; + }; + return JpxStream; + }(); + var Jbig2Stream = function Jbig2StreamClosure() { + function Jbig2Stream(stream, maybeLength, dict, params) { + this.stream = stream; + this.maybeLength = maybeLength; + this.dict = dict; + this.params = params; + DecodeStream.call(this, maybeLength); + } + Jbig2Stream.prototype = Object.create(DecodeStream.prototype); + Object.defineProperty(Jbig2Stream.prototype, 'bytes', { + get: function Jbig2Stream_bytes() { + return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); + }, + configurable: true + }); + Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) { + if (this.bufferLength) { + return; + } + var jbig2Image = new Jbig2Image(); + var chunks = []; + if (isDict(this.params)) { + var globalsStream = this.params.get('JBIG2Globals'); + if (isStream(globalsStream)) { + var globals = globalsStream.getBytes(); + chunks.push({ + data: globals, + start: 0, + end: globals.length + }); + } + } + chunks.push({ + data: this.bytes, + start: 0, + end: this.bytes.length + }); + var data = jbig2Image.parseChunks(chunks); + var dataLength = data.length; + for (var i = 0; i < dataLength; i++) { + data[i] ^= 0xFF; + } + this.buffer = data; + this.bufferLength = dataLength; + this.eof = true; + }; + return Jbig2Stream; + }(); + var DecryptStream = function DecryptStreamClosure() { + function DecryptStream(str, maybeLength, decrypt) { + this.str = str; + this.dict = str.dict; + this.decrypt = decrypt; + this.nextChunk = null; + this.initialized = false; + DecodeStream.call(this, maybeLength); + } + var chunkSize = 512; + DecryptStream.prototype = Object.create(DecodeStream.prototype); + DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { + var chunk; + if (this.initialized) { + chunk = this.nextChunk; + } else { + chunk = this.str.getBytes(chunkSize); + this.initialized = true; + } + if (!chunk || chunk.length === 0) { + this.eof = true; + return; + } + this.nextChunk = this.str.getBytes(chunkSize); + var hasMoreData = this.nextChunk && this.nextChunk.length > 0; + var decrypt = this.decrypt; + chunk = decrypt(chunk, !hasMoreData); + var bufferLength = this.bufferLength; + var i, n = chunk.length; + var buffer = this.ensureBuffer(bufferLength + n); + for (i = 0; i < n; i++) { + buffer[bufferLength++] = chunk[i]; + } + this.bufferLength = bufferLength; + }; + return DecryptStream; + }(); + var Ascii85Stream = function Ascii85StreamClosure() { + function Ascii85Stream(str, maybeLength) { + this.str = str; + this.dict = str.dict; + this.input = new Uint8Array(5); + if (maybeLength) { + maybeLength = 0.8 * maybeLength; + } + DecodeStream.call(this, maybeLength); + } + Ascii85Stream.prototype = Object.create(DecodeStream.prototype); + Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { + var TILDA_CHAR = 0x7E; + var Z_LOWER_CHAR = 0x7A; + var EOF = -1; + var str = this.str; + var c = str.getByte(); + while (isSpace(c)) { + c = str.getByte(); + } + if (c === EOF || c === TILDA_CHAR) { + this.eof = true; + return; + } + var bufferLength = this.bufferLength, buffer; + var i; + if (c === Z_LOWER_CHAR) { + buffer = this.ensureBuffer(bufferLength + 4); + for (i = 0; i < 4; ++i) { + buffer[bufferLength + i] = 0; + } + this.bufferLength += 4; + } else { + var input = this.input; + input[0] = c; + for (i = 1; i < 5; ++i) { + c = str.getByte(); + while (isSpace(c)) { + c = str.getByte(); + } + input[i] = c; + if (c === EOF || c === TILDA_CHAR) { + break; + } + } + buffer = this.ensureBuffer(bufferLength + i - 1); + this.bufferLength += i - 1; + if (i < 5) { + for (; i < 5; ++i) { + input[i] = 0x21 + 84; + } + this.eof = true; + } + var t = 0; + for (i = 0; i < 5; ++i) { + t = t * 85 + (input[i] - 0x21); + } + for (i = 3; i >= 0; --i) { + buffer[bufferLength + i] = t & 0xFF; + t >>= 8; + } + } + }; + return Ascii85Stream; + }(); + var AsciiHexStream = function AsciiHexStreamClosure() { + function AsciiHexStream(str, maybeLength) { + this.str = str; + this.dict = str.dict; + this.firstDigit = -1; + if (maybeLength) { + maybeLength = 0.5 * maybeLength; + } + DecodeStream.call(this, maybeLength); + } + AsciiHexStream.prototype = Object.create(DecodeStream.prototype); + AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { + var UPSTREAM_BLOCK_SIZE = 8000; + var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); + if (!bytes.length) { + this.eof = true; + return; + } + var maxDecodeLength = bytes.length + 1 >> 1; + var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); + var bufferLength = this.bufferLength; + var firstDigit = this.firstDigit; + for (var i = 0, ii = bytes.length; i < ii; i++) { + var ch = bytes[i], digit; + if (ch >= 0x30 && ch <= 0x39) { + digit = ch & 0x0F; + } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + digit = (ch & 0x0F) + 9; + } else if (ch === 0x3E) { + this.eof = true; + break; + } else { + continue; + } + if (firstDigit < 0) { + firstDigit = digit; + } else { + buffer[bufferLength++] = firstDigit << 4 | digit; + firstDigit = -1; + } + } + if (firstDigit >= 0 && this.eof) { + buffer[bufferLength++] = firstDigit << 4; + firstDigit = -1; + } + this.firstDigit = firstDigit; + this.bufferLength = bufferLength; + }; + return AsciiHexStream; + }(); + var RunLengthStream = function RunLengthStreamClosure() { + function RunLengthStream(str, maybeLength) { + this.str = str; + this.dict = str.dict; + DecodeStream.call(this, maybeLength); + } + RunLengthStream.prototype = Object.create(DecodeStream.prototype); + RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { + var repeatHeader = this.str.getBytes(2); + if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { + this.eof = true; + return; + } + var buffer; + var bufferLength = this.bufferLength; + var n = repeatHeader[0]; + if (n < 128) { + buffer = this.ensureBuffer(bufferLength + n + 1); + buffer[bufferLength++] = repeatHeader[1]; + if (n > 0) { + var source = this.str.getBytes(n); + buffer.set(source, bufferLength); + bufferLength += n; + } + } else { + n = 257 - n; + var b = repeatHeader[1]; + buffer = this.ensureBuffer(bufferLength + n + 1); + for (var i = 0; i < n; i++) { + buffer[bufferLength++] = b; + } + } + this.bufferLength = bufferLength; + }; + return RunLengthStream; + }(); + var CCITTFaxStream = function CCITTFaxStreamClosure() { + var ccittEOL = -2; + var ccittEOF = -1; + var twoDimPass = 0; + var twoDimHoriz = 1; + var twoDimVert0 = 2; + var twoDimVertR1 = 3; + var twoDimVertL1 = 4; + var twoDimVertR2 = 5; + var twoDimVertL2 = 6; + var twoDimVertR3 = 7; + var twoDimVertL3 = 8; + var twoDimTable = [ + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + 7, + twoDimVertL3 + ], + [ + 7, + twoDimVertR3 + ], + [ + 6, + twoDimVertL2 + ], + [ + 6, + twoDimVertL2 + ], + [ + 6, + twoDimVertR2 + ], + [ + 6, + twoDimVertR2 + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 4, + twoDimPass + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimHoriz + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertL1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 3, + twoDimVertR1 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ], + [ + 1, + twoDimVert0 + ] + ]; + var whiteTable1 = [ + [ + -1, + -1 + ], + [ + 12, + ccittEOL + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + 11, + 1792 + ], + [ + 11, + 1792 + ], + [ + 12, + 1984 + ], + [ + 12, + 2048 + ], + [ + 12, + 2112 + ], + [ + 12, + 2176 + ], + [ + 12, + 2240 + ], + [ + 12, + 2304 + ], + [ + 11, + 1856 + ], + [ + 11, + 1856 + ], + [ + 11, + 1920 + ], + [ + 11, + 1920 + ], + [ + 12, + 2368 + ], + [ + 12, + 2432 + ], + [ + 12, + 2496 + ], + [ + 12, + 2560 + ] + ]; + var whiteTable2 = [ + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + 8, + 29 + ], + [ + 8, + 29 + ], + [ + 8, + 30 + ], + [ + 8, + 30 + ], + [ + 8, + 45 + ], + [ + 8, + 45 + ], + [ + 8, + 46 + ], + [ + 8, + 46 + ], + [ + 7, + 22 + ], + [ + 7, + 22 + ], + [ + 7, + 22 + ], + [ + 7, + 22 + ], + [ + 7, + 23 + ], + [ + 7, + 23 + ], + [ + 7, + 23 + ], + [ + 7, + 23 + ], + [ + 8, + 47 + ], + [ + 8, + 47 + ], + [ + 8, + 48 + ], + [ + 8, + 48 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 6, + 13 + ], + [ + 7, + 20 + ], + [ + 7, + 20 + ], + [ + 7, + 20 + ], + [ + 7, + 20 + ], + [ + 8, + 33 + ], + [ + 8, + 33 + ], + [ + 8, + 34 + ], + [ + 8, + 34 + ], + [ + 8, + 35 + ], + [ + 8, + 35 + ], + [ + 8, + 36 + ], + [ + 8, + 36 + ], + [ + 8, + 37 + ], + [ + 8, + 37 + ], + [ + 8, + 38 + ], + [ + 8, + 38 + ], + [ + 7, + 19 + ], + [ + 7, + 19 + ], + [ + 7, + 19 + ], + [ + 7, + 19 + ], + [ + 8, + 31 + ], + [ + 8, + 31 + ], + [ + 8, + 32 + ], + [ + 8, + 32 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 1 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 6, + 12 + ], + [ + 8, + 53 + ], + [ + 8, + 53 + ], + [ + 8, + 54 + ], + [ + 8, + 54 + ], + [ + 7, + 26 + ], + [ + 7, + 26 + ], + [ + 7, + 26 + ], + [ + 7, + 26 + ], + [ + 8, + 39 + ], + [ + 8, + 39 + ], + [ + 8, + 40 + ], + [ + 8, + 40 + ], + [ + 8, + 41 + ], + [ + 8, + 41 + ], + [ + 8, + 42 + ], + [ + 8, + 42 + ], + [ + 8, + 43 + ], + [ + 8, + 43 + ], + [ + 8, + 44 + ], + [ + 8, + 44 + ], + [ + 7, + 21 + ], + [ + 7, + 21 + ], + [ + 7, + 21 + ], + [ + 7, + 21 + ], + [ + 7, + 28 + ], + [ + 7, + 28 + ], + [ + 7, + 28 + ], + [ + 7, + 28 + ], + [ + 8, + 61 + ], + [ + 8, + 61 + ], + [ + 8, + 62 + ], + [ + 8, + 62 + ], + [ + 8, + 63 + ], + [ + 8, + 63 + ], + [ + 8, + 0 + ], + [ + 8, + 0 + ], + [ + 8, + 320 + ], + [ + 8, + 320 + ], + [ + 8, + 384 + ], + [ + 8, + 384 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 10 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 5, + 11 + ], + [ + 7, + 27 + ], + [ + 7, + 27 + ], + [ + 7, + 27 + ], + [ + 7, + 27 + ], + [ + 8, + 59 + ], + [ + 8, + 59 + ], + [ + 8, + 60 + ], + [ + 8, + 60 + ], + [ + 9, + 1472 + ], + [ + 9, + 1536 + ], + [ + 9, + 1600 + ], + [ + 9, + 1728 + ], + [ + 7, + 18 + ], + [ + 7, + 18 + ], + [ + 7, + 18 + ], + [ + 7, + 18 + ], + [ + 7, + 24 + ], + [ + 7, + 24 + ], + [ + 7, + 24 + ], + [ + 7, + 24 + ], + [ + 8, + 49 + ], + [ + 8, + 49 + ], + [ + 8, + 50 + ], + [ + 8, + 50 + ], + [ + 8, + 51 + ], + [ + 8, + 51 + ], + [ + 8, + 52 + ], + [ + 8, + 52 + ], + [ + 7, + 25 + ], + [ + 7, + 25 + ], + [ + 7, + 25 + ], + [ + 7, + 25 + ], + [ + 8, + 55 + ], + [ + 8, + 55 + ], + [ + 8, + 56 + ], + [ + 8, + 56 + ], + [ + 8, + 57 + ], + [ + 8, + 57 + ], + [ + 8, + 58 + ], + [ + 8, + 58 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 192 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 6, + 1664 + ], + [ + 8, + 448 + ], + [ + 8, + 448 + ], + [ + 8, + 512 + ], + [ + 8, + 512 + ], + [ + 9, + 704 + ], + [ + 9, + 768 + ], + [ + 8, + 640 + ], + [ + 8, + 640 + ], + [ + 8, + 576 + ], + [ + 8, + 576 + ], + [ + 9, + 832 + ], + [ + 9, + 896 + ], + [ + 9, + 960 + ], + [ + 9, + 1024 + ], + [ + 9, + 1088 + ], + [ + 9, + 1152 + ], + [ + 9, + 1216 + ], + [ + 9, + 1280 + ], + [ + 9, + 1344 + ], + [ + 9, + 1408 + ], + [ + 7, + 256 + ], + [ + 7, + 256 + ], + [ + 7, + 256 + ], + [ + 7, + 256 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 2 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 4, + 3 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 128 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 8 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 5, + 9 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 16 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 6, + 17 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 4 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 14 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 6, + 15 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 5, + 64 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ], + [ + 4, + 7 + ] + ]; + var blackTable1 = [ + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + 12, + ccittEOL + ], + [ + 12, + ccittEOL + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + 11, + 1792 + ], + [ + 11, + 1792 + ], + [ + 11, + 1792 + ], + [ + 11, + 1792 + ], + [ + 12, + 1984 + ], + [ + 12, + 1984 + ], + [ + 12, + 2048 + ], + [ + 12, + 2048 + ], + [ + 12, + 2112 + ], + [ + 12, + 2112 + ], + [ + 12, + 2176 + ], + [ + 12, + 2176 + ], + [ + 12, + 2240 + ], + [ + 12, + 2240 + ], + [ + 12, + 2304 + ], + [ + 12, + 2304 + ], + [ + 11, + 1856 + ], + [ + 11, + 1856 + ], + [ + 11, + 1856 + ], + [ + 11, + 1856 + ], + [ + 11, + 1920 + ], + [ + 11, + 1920 + ], + [ + 11, + 1920 + ], + [ + 11, + 1920 + ], + [ + 12, + 2368 + ], + [ + 12, + 2368 + ], + [ + 12, + 2432 + ], + [ + 12, + 2432 + ], + [ + 12, + 2496 + ], + [ + 12, + 2496 + ], + [ + 12, + 2560 + ], + [ + 12, + 2560 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 10, + 18 + ], + [ + 12, + 52 + ], + [ + 12, + 52 + ], + [ + 13, + 640 + ], + [ + 13, + 704 + ], + [ + 13, + 768 + ], + [ + 13, + 832 + ], + [ + 12, + 55 + ], + [ + 12, + 55 + ], + [ + 12, + 56 + ], + [ + 12, + 56 + ], + [ + 13, + 1280 + ], + [ + 13, + 1344 + ], + [ + 13, + 1408 + ], + [ + 13, + 1472 + ], + [ + 12, + 59 + ], + [ + 12, + 59 + ], + [ + 12, + 60 + ], + [ + 12, + 60 + ], + [ + 13, + 1536 + ], + [ + 13, + 1600 + ], + [ + 11, + 24 + ], + [ + 11, + 24 + ], + [ + 11, + 24 + ], + [ + 11, + 24 + ], + [ + 11, + 25 + ], + [ + 11, + 25 + ], + [ + 11, + 25 + ], + [ + 11, + 25 + ], + [ + 13, + 1664 + ], + [ + 13, + 1728 + ], + [ + 12, + 320 + ], + [ + 12, + 320 + ], + [ + 12, + 384 + ], + [ + 12, + 384 + ], + [ + 12, + 448 + ], + [ + 12, + 448 + ], + [ + 13, + 512 + ], + [ + 13, + 576 + ], + [ + 12, + 53 + ], + [ + 12, + 53 + ], + [ + 12, + 54 + ], + [ + 12, + 54 + ], + [ + 13, + 896 + ], + [ + 13, + 960 + ], + [ + 13, + 1024 + ], + [ + 13, + 1088 + ], + [ + 13, + 1152 + ], + [ + 13, + 1216 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ], + [ + 10, + 64 + ] + ]; + var blackTable2 = [ + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 8, + 13 + ], + [ + 11, + 23 + ], + [ + 11, + 23 + ], + [ + 12, + 50 + ], + [ + 12, + 51 + ], + [ + 12, + 44 + ], + [ + 12, + 45 + ], + [ + 12, + 46 + ], + [ + 12, + 47 + ], + [ + 12, + 57 + ], + [ + 12, + 58 + ], + [ + 12, + 61 + ], + [ + 12, + 256 + ], + [ + 10, + 16 + ], + [ + 10, + 16 + ], + [ + 10, + 16 + ], + [ + 10, + 16 + ], + [ + 10, + 17 + ], + [ + 10, + 17 + ], + [ + 10, + 17 + ], + [ + 10, + 17 + ], + [ + 12, + 48 + ], + [ + 12, + 49 + ], + [ + 12, + 62 + ], + [ + 12, + 63 + ], + [ + 12, + 30 + ], + [ + 12, + 31 + ], + [ + 12, + 32 + ], + [ + 12, + 33 + ], + [ + 12, + 40 + ], + [ + 12, + 41 + ], + [ + 11, + 22 + ], + [ + 11, + 22 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 8, + 14 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 10 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 7, + 11 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 9, + 15 + ], + [ + 12, + 128 + ], + [ + 12, + 192 + ], + [ + 12, + 26 + ], + [ + 12, + 27 + ], + [ + 12, + 28 + ], + [ + 12, + 29 + ], + [ + 11, + 19 + ], + [ + 11, + 19 + ], + [ + 11, + 20 + ], + [ + 11, + 20 + ], + [ + 12, + 34 + ], + [ + 12, + 35 + ], + [ + 12, + 36 + ], + [ + 12, + 37 + ], + [ + 12, + 38 + ], + [ + 12, + 39 + ], + [ + 11, + 21 + ], + [ + 11, + 21 + ], + [ + 12, + 42 + ], + [ + 12, + 43 + ], + [ + 10, + 0 + ], + [ + 10, + 0 + ], + [ + 10, + 0 + ], + [ + 10, + 0 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ], + [ + 7, + 12 + ] + ]; + var blackTable3 = [ + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + -1, + -1 + ], + [ + 6, + 9 + ], + [ + 6, + 8 + ], + [ + 5, + 7 + ], + [ + 5, + 7 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 6 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 4, + 5 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 1 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 3, + 4 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 3 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ], + [ + 2, + 2 + ] + ]; + function CCITTFaxStream(str, maybeLength, params) { + this.str = str; + this.dict = str.dict; + params = params || Dict.empty; + this.encoding = params.get('K') || 0; + this.eoline = params.get('EndOfLine') || false; + this.byteAlign = params.get('EncodedByteAlign') || false; + this.columns = params.get('Columns') || 1728; + this.rows = params.get('Rows') || 0; + var eoblock = params.get('EndOfBlock'); + if (eoblock === null || eoblock === undefined) { + eoblock = true; + } + this.eoblock = eoblock; + this.black = params.get('BlackIs1') || false; + this.codingLine = new Uint32Array(this.columns + 1); + this.refLine = new Uint32Array(this.columns + 2); + this.codingLine[0] = this.columns; + this.codingPos = 0; + this.row = 0; + this.nextLine2D = this.encoding < 0; + this.inputBits = 0; + this.inputBuf = 0; + this.outputBits = 0; + var code1; + while ((code1 = this.lookBits(12)) === 0) { + this.eatBits(1); + } + if (code1 === 1) { + this.eatBits(12); + } + if (this.encoding > 0) { + this.nextLine2D = !this.lookBits(1); + this.eatBits(1); + } + DecodeStream.call(this, maybeLength); + } + CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); + CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { + while (!this.eof) { + var c = this.lookChar(); + this.ensureBuffer(this.bufferLength + 1); + this.buffer[this.bufferLength++] = c; + } + }; + CCITTFaxStream.prototype.addPixels = function ccittFaxStreamAddPixels(a1, blackPixels) { + var codingLine = this.codingLine; + var codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info('row is wrong length'); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + }; + CCITTFaxStream.prototype.addPixelsNeg = function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { + var codingLine = this.codingLine; + var codingPos = this.codingPos; + if (a1 > codingLine[codingPos]) { + if (a1 > this.columns) { + info('row is wrong length'); + this.err = true; + a1 = this.columns; + } + if (codingPos & 1 ^ blackPixels) { + ++codingPos; + } + codingLine[codingPos] = a1; + } else if (a1 < codingLine[codingPos]) { + if (a1 < 0) { + info('invalid code'); + this.err = true; + a1 = 0; + } + while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { + --codingPos; + } + codingLine[codingPos] = a1; + } + this.codingPos = codingPos; + }; + CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { + var refLine = this.refLine; + var codingLine = this.codingLine; + var columns = this.columns; + var refPos, blackPixels, bits, i; + if (this.outputBits === 0) { + if (this.eof) { + return null; + } + this.err = false; + var code1, code2, code3; + if (this.nextLine2D) { + for (i = 0; codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + refLine[i++] = columns; + refLine[i] = columns; + codingLine[0] = 0; + this.codingPos = 0; + refPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = this.getTwoDimCode(); + switch (code1) { + case twoDimPass: + this.addPixels(refLine[refPos + 1], blackPixels); + if (refLine[refPos + 1] < columns) { + refPos += 2; + } + break; + case twoDimHoriz: + code1 = code2 = 0; + if (blackPixels) { + do { + code1 += code3 = this.getBlackCode(); + } while (code3 >= 64); + do { + code2 += code3 = this.getWhiteCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this.getWhiteCode(); + } while (code3 >= 64); + do { + code2 += code3 = this.getBlackCode(); + } while (code3 >= 64); + } + this.addPixels(codingLine[this.codingPos] + code1, blackPixels); + if (codingLine[this.codingPos] < columns) { + this.addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1); + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + break; + case twoDimVertR3: + this.addPixels(refLine[refPos] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR2: + this.addPixels(refLine[refPos] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertR1: + this.addPixels(refLine[refPos] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVert0: + this.addPixels(refLine[refPos], blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + ++refPos; + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL3: + this.addPixelsNeg(refLine[refPos] - 3, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL2: + this.addPixelsNeg(refLine[refPos] - 2, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case twoDimVertL1: + this.addPixelsNeg(refLine[refPos] - 1, blackPixels); + blackPixels ^= 1; + if (codingLine[this.codingPos] < columns) { + if (refPos > 0) { + --refPos; + } else { + ++refPos; + } + while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) { + refPos += 2; + } + } + break; + case ccittEOF: + this.addPixels(columns, 0); + this.eof = true; + break; + default: + info('bad 2d code'); + this.addPixels(columns, 0); + this.err = true; + } + } + } else { + codingLine[0] = 0; + this.codingPos = 0; + blackPixels = 0; + while (codingLine[this.codingPos] < columns) { + code1 = 0; + if (blackPixels) { + do { + code1 += code3 = this.getBlackCode(); + } while (code3 >= 64); + } else { + do { + code1 += code3 = this.getWhiteCode(); + } while (code3 >= 64); + } + this.addPixels(codingLine[this.codingPos] + code1, blackPixels); + blackPixels ^= 1; + } + } + var gotEOL = false; + if (this.byteAlign) { + this.inputBits &= ~7; + } + if (!this.eoblock && this.row === this.rows - 1) { + this.eof = true; + } else { + code1 = this.lookBits(12); + if (this.eoline) { + while (code1 !== ccittEOF && code1 !== 1) { + this.eatBits(1); + code1 = this.lookBits(12); + } + } else { + while (code1 === 0) { + this.eatBits(1); + code1 = this.lookBits(12); + } + } + if (code1 === 1) { + this.eatBits(12); + gotEOL = true; + } else if (code1 === ccittEOF) { + this.eof = true; + } + } + if (!this.eof && this.encoding > 0) { + this.nextLine2D = !this.lookBits(1); + this.eatBits(1); + } + if (this.eoblock && gotEOL && this.byteAlign) { + code1 = this.lookBits(12); + if (code1 === 1) { + this.eatBits(12); + if (this.encoding > 0) { + this.lookBits(1); + this.eatBits(1); + } + if (this.encoding >= 0) { + for (i = 0; i < 4; ++i) { + code1 = this.lookBits(12); + if (code1 !== 1) { + info('bad rtc code: ' + code1); + } + this.eatBits(12); + if (this.encoding > 0) { + this.lookBits(1); + this.eatBits(1); + } + } + } + this.eof = true; + } + } else if (this.err && this.eoline) { + while (true) { + code1 = this.lookBits(13); + if (code1 === ccittEOF) { + this.eof = true; + return null; + } + if (code1 >> 1 === 1) { + break; + } + this.eatBits(1); + } + this.eatBits(12); + if (this.encoding > 0) { + this.eatBits(1); + this.nextLine2D = !(code1 & 1); + } + } + if (codingLine[0] > 0) { + this.outputBits = codingLine[this.codingPos = 0]; + } else { + this.outputBits = codingLine[this.codingPos = 1]; + } + this.row++; + } + var c; + if (this.outputBits >= 8) { + c = this.codingPos & 1 ? 0 : 0xFF; + this.outputBits -= 8; + if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } + } else { + bits = 8; + c = 0; + do { + if (this.outputBits > bits) { + c <<= bits; + if (!(this.codingPos & 1)) { + c |= 0xFF >> 8 - bits; + } + this.outputBits -= bits; + bits = 0; + } else { + c <<= this.outputBits; + if (!(this.codingPos & 1)) { + c |= 0xFF >> 8 - this.outputBits; + } + bits -= this.outputBits; + this.outputBits = 0; + if (codingLine[this.codingPos] < columns) { + this.codingPos++; + this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1]; + } else if (bits > 0) { + c <<= bits; + bits = 0; + } + } + } while (bits); + } + if (this.black) { + c ^= 0xFF; + } + return c; + }; + CCITTFaxStream.prototype.findTableCode = function ccittFaxStreamFindTableCode(start, end, table, limit) { + var limitValue = limit || 0; + for (var i = start; i <= end; ++i) { + var code = this.lookBits(i); + if (code === ccittEOF) { + return [ + true, + 1, + false + ]; + } + if (i < end) { + code <<= end - i; + } + if (!limitValue || code >= limitValue) { + var p = table[code - limitValue]; + if (p[0] === i) { + this.eatBits(i); + return [ + true, + p[1], + true + ]; + } + } + } + return [ + false, + 0, + false + ]; + }; + CCITTFaxStream.prototype.getTwoDimCode = function ccittFaxStreamGetTwoDimCode() { + var code = 0; + var p; + if (this.eoblock) { + code = this.lookBits(7); + p = twoDimTable[code]; + if (p && p[0] > 0) { + this.eatBits(p[0]); + return p[1]; + } + } else { + var result = this.findTableCode(1, 7, twoDimTable); + if (result[0] && result[2]) { + return result[1]; + } + } + info('Bad two dim code'); + return ccittEOF; + }; + CCITTFaxStream.prototype.getWhiteCode = function ccittFaxStreamGetWhiteCode() { + var code = 0; + var p; + if (this.eoblock) { + code = this.lookBits(12); + if (code === ccittEOF) { + return 1; + } + if (code >> 5 === 0) { + p = whiteTable1[code]; + } else { + p = whiteTable2[code >> 3]; + } + if (p[0] > 0) { + this.eatBits(p[0]); + return p[1]; + } + } else { + var result = this.findTableCode(1, 9, whiteTable2); + if (result[0]) { + return result[1]; + } + result = this.findTableCode(11, 12, whiteTable1); + if (result[0]) { + return result[1]; + } + } + info('bad white code'); + this.eatBits(1); + return 1; + }; + CCITTFaxStream.prototype.getBlackCode = function ccittFaxStreamGetBlackCode() { + var code, p; + if (this.eoblock) { + code = this.lookBits(13); + if (code === ccittEOF) { + return 1; + } + if (code >> 7 === 0) { + p = blackTable1[code]; + } else if (code >> 9 === 0 && code >> 7 !== 0) { + p = blackTable2[(code >> 1) - 64]; + } else { + p = blackTable3[code >> 7]; + } + if (p[0] > 0) { + this.eatBits(p[0]); + return p[1]; + } + } else { + var result = this.findTableCode(2, 6, blackTable3); + if (result[0]) { + return result[1]; + } + result = this.findTableCode(7, 12, blackTable2, 64); + if (result[0]) { + return result[1]; + } + result = this.findTableCode(10, 13, blackTable1); + if (result[0]) { + return result[1]; + } + } + info('bad black code'); + this.eatBits(1); + return 1; + }; + CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { + var c; + while (this.inputBits < n) { + if ((c = this.str.getByte()) === -1) { + if (this.inputBits === 0) { + return ccittEOF; + } + return this.inputBuf << n - this.inputBits & 0xFFFF >> 16 - n; + } + this.inputBuf = this.inputBuf << 8 | c; + this.inputBits += 8; + } + return this.inputBuf >> this.inputBits - n & 0xFFFF >> 16 - n; + }; + CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { + if ((this.inputBits -= n) < 0) { + this.inputBits = 0; + } + }; + return CCITTFaxStream; + }(); + var LZWStream = function LZWStreamClosure() { + function LZWStream(str, maybeLength, earlyChange) { + this.str = str; + this.dict = str.dict; + this.cachedData = 0; + this.bitsCached = 0; + var maxLzwDictionarySize = 4096; + var lzwState = { + earlyChange: earlyChange, + codeLength: 9, + nextCode: 258, + dictionaryValues: new Uint8Array(maxLzwDictionarySize), + dictionaryLengths: new Uint16Array(maxLzwDictionarySize), + dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), + currentSequence: new Uint8Array(maxLzwDictionarySize), + currentSequenceLength: 0 + }; + for (var i = 0; i < 256; ++i) { + lzwState.dictionaryValues[i] = i; + lzwState.dictionaryLengths[i] = 1; + } + this.lzwState = lzwState; + DecodeStream.call(this, maybeLength); + } + LZWStream.prototype = Object.create(DecodeStream.prototype); + LZWStream.prototype.readBits = function LZWStream_readBits(n) { + var bitsCached = this.bitsCached; + var cachedData = this.cachedData; + while (bitsCached < n) { + var c = this.str.getByte(); + if (c === -1) { + this.eof = true; + return null; + } + cachedData = cachedData << 8 | c; + bitsCached += 8; + } + this.bitsCached = bitsCached -= n; + this.cachedData = cachedData; + this.lastCode = null; + return cachedData >>> bitsCached & (1 << n) - 1; + }; + LZWStream.prototype.readBlock = function LZWStream_readBlock() { + var blockSize = 512; + var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; + var i, j, q; + var lzwState = this.lzwState; + if (!lzwState) { + return; + } + var earlyChange = lzwState.earlyChange; + var nextCode = lzwState.nextCode; + var dictionaryValues = lzwState.dictionaryValues; + var dictionaryLengths = lzwState.dictionaryLengths; + var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; + var codeLength = lzwState.codeLength; + var prevCode = lzwState.prevCode; + var currentSequence = lzwState.currentSequence; + var currentSequenceLength = lzwState.currentSequenceLength; + var decodedLength = 0; + var currentBufferLength = this.bufferLength; + var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + for (i = 0; i < blockSize; i++) { + var code = this.readBits(codeLength); + var hasPrev = currentSequenceLength > 0; + if (code < 256) { + currentSequence[0] = code; + currentSequenceLength = 1; + } else if (code >= 258) { + if (code < nextCode) { + currentSequenceLength = dictionaryLengths[code]; + for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { + currentSequence[j] = dictionaryValues[q]; + q = dictionaryPrevCodes[q]; + } + } else { + currentSequence[currentSequenceLength++] = currentSequence[0]; + } + } else if (code === 256) { + codeLength = 9; + nextCode = 258; + currentSequenceLength = 0; + continue; + } else { + this.eof = true; + delete this.lzwState; + break; + } + if (hasPrev) { + dictionaryPrevCodes[nextCode] = prevCode; + dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; + dictionaryValues[nextCode] = currentSequence[0]; + nextCode++; + codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0; + } + prevCode = code; + decodedLength += currentSequenceLength; + if (estimatedDecodedSize < decodedLength) { + do { + estimatedDecodedSize += decodedSizeDelta; + } while (estimatedDecodedSize < decodedLength); + buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); + } + for (j = 0; j < currentSequenceLength; j++) { + buffer[currentBufferLength++] = currentSequence[j]; + } + } + lzwState.nextCode = nextCode; + lzwState.codeLength = codeLength; + lzwState.prevCode = prevCode; + lzwState.currentSequenceLength = currentSequenceLength; + this.bufferLength = currentBufferLength; + }; + return LZWStream; + }(); + var NullStream = function NullStreamClosure() { + function NullStream() { + Stream.call(this, new Uint8Array(0)); + } + NullStream.prototype = Stream.prototype; + return NullStream; + }(); + exports.Ascii85Stream = Ascii85Stream; + exports.AsciiHexStream = AsciiHexStream; + exports.CCITTFaxStream = CCITTFaxStream; + exports.DecryptStream = DecryptStream; + exports.DecodeStream = DecodeStream; + exports.FlateStream = FlateStream; + exports.Jbig2Stream = Jbig2Stream; + exports.JpegStream = JpegStream; + exports.JpxStream = JpxStream; + exports.NullStream = NullStream; + exports.PredictorStream = PredictorStream; + exports.RunLengthStream = RunLengthStream; + exports.Stream = Stream; + exports.StreamsSequenceStream = StreamsSequenceStream; + exports.StringStream = StringStream; + exports.LZWStream = LZWStream; + })); + (function (root, factory) { + factory(root.pdfjsCoreCrypto = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream); + }(this, function (exports, sharedUtil, corePrimitives, coreStream) { + var PasswordException = sharedUtil.PasswordException; + var PasswordResponses = sharedUtil.PasswordResponses; + var bytesToString = sharedUtil.bytesToString; + var warn = sharedUtil.warn; + var error = sharedUtil.error; + var assert = sharedUtil.assert; + var isInt = sharedUtil.isInt; + var stringToBytes = sharedUtil.stringToBytes; + var utf8StringToString = sharedUtil.utf8StringToString; + var Name = corePrimitives.Name; + var isName = corePrimitives.isName; + var isDict = corePrimitives.isDict; + var DecryptStream = coreStream.DecryptStream; + var ARCFourCipher = function ARCFourCipherClosure() { + function ARCFourCipher(key) { + this.a = 0; + this.b = 0; + var s = new Uint8Array(256); + var i, j = 0, tmp, keyLength = key.length; + for (i = 0; i < 256; ++i) { + s[i] = i; + } + for (i = 0; i < 256; ++i) { + tmp = s[i]; + j = j + tmp + key[i % keyLength] & 0xFF; + s[i] = s[j]; + s[j] = tmp; + } + this.s = s; + } + ARCFourCipher.prototype = { + encryptBlock: function ARCFourCipher_encryptBlock(data) { + var i, n = data.length, tmp, tmp2; + var a = this.a, b = this.b, s = this.s; + var output = new Uint8Array(n); + for (i = 0; i < n; ++i) { + a = a + 1 & 0xFF; + tmp = s[a]; + b = b + tmp & 0xFF; + tmp2 = s[b]; + s[a] = tmp2; + s[b] = tmp; + output[i] = data[i] ^ s[tmp + tmp2 & 0xFF]; + } + this.a = a; + this.b = b; + return output; + } + }; + ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; + return ARCFourCipher; + }(); + var calculateMD5 = function calculateMD5Closure() { + var r = new Uint8Array([ + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21 + ]); + var k = new Int32Array([ + -680876936, + -389564586, + 606105819, + -1044525330, + -176418897, + 1200080426, + -1473231341, + -45705983, + 1770035416, + -1958414417, + -42063, + -1990404162, + 1804603682, + -40341101, + -1502002290, + 1236535329, + -165796510, + -1069501632, + 643717713, + -373897302, + -701558691, + 38016083, + -660478335, + -405537848, + 568446438, + -1019803690, + -187363961, + 1163531501, + -1444681467, + -51403784, + 1735328473, + -1926607734, + -378558, + -2022574463, + 1839030562, + -35309556, + -1530992060, + 1272893353, + -155497632, + -1094730640, + 681279174, + -358537222, + -722521979, + 76029189, + -640364487, + -421815835, + 530742520, + -995338651, + -198630844, + 1126891415, + -1416354905, + -57434055, + 1700485571, + -1894986606, + -1051523, + -2054922799, + 1873313359, + -30611744, + -1560198380, + 1309151649, + -145523070, + -1120210379, + 718787259, + -343485551 + ]); + function hash(data, offset, length) { + var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; + var paddedLength = length + 72 & ~63; + var padded = new Uint8Array(paddedLength); + var i, j, n; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = length << 3 & 0xFF; + padded[i++] = length >> 5 & 0xFF; + padded[i++] = length >> 13 & 0xFF; + padded[i++] = length >> 21 & 0xFF; + padded[i++] = length >>> 29 & 0xFF; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + var w = new Int32Array(16); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + var a = h0, b = h1, c = h2, d = h3, f, g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + var tmp = d, rotateArg = a + f + k[j] + w[g] | 0, rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return new Uint8Array([ + h0 & 0xFF, + h0 >> 8 & 0xFF, + h0 >> 16 & 0xFF, + h0 >>> 24 & 0xFF, + h1 & 0xFF, + h1 >> 8 & 0xFF, + h1 >> 16 & 0xFF, + h1 >>> 24 & 0xFF, + h2 & 0xFF, + h2 >> 8 & 0xFF, + h2 >> 16 & 0xFF, + h2 >>> 24 & 0xFF, + h3 & 0xFF, + h3 >> 8 & 0xFF, + h3 >> 16 & 0xFF, + h3 >>> 24 & 0xFF + ]); + } + return hash; + }(); + var Word64 = function Word64Closure() { + function Word64(highInteger, lowInteger) { + this.high = highInteger | 0; + this.low = lowInteger | 0; + } + Word64.prototype = { + and: function Word64_and(word) { + this.high &= word.high; + this.low &= word.low; + }, + xor: function Word64_xor(word) { + this.high ^= word.high; + this.low ^= word.low; + }, + or: function Word64_or(word) { + this.high |= word.high; + this.low |= word.low; + }, + shiftRight: function Word64_shiftRight(places) { + if (places >= 32) { + this.low = this.high >>> places - 32 | 0; + this.high = 0; + } else { + this.low = this.low >>> places | this.high << 32 - places; + this.high = this.high >>> places | 0; + } + }, + shiftLeft: function Word64_shiftLeft(places) { + if (places >= 32) { + this.high = this.low << places - 32; + this.low = 0; + } else { + this.high = this.high << places | this.low >>> 32 - places; + this.low = this.low << places; + } + }, + rotateRight: function Word64_rotateRight(places) { + var low, high; + if (places & 32) { + high = this.low; + low = this.high; + } else { + low = this.low; + high = this.high; + } + places &= 31; + this.low = low >>> places | high << 32 - places; + this.high = high >>> places | low << 32 - places; + }, + not: function Word64_not() { + this.high = ~this.high; + this.low = ~this.low; + }, + add: function Word64_add(word) { + var lowAdd = (this.low >>> 0) + (word.low >>> 0); + var highAdd = (this.high >>> 0) + (word.high >>> 0); + if (lowAdd > 0xFFFFFFFF) { + highAdd += 1; + } + this.low = lowAdd | 0; + this.high = highAdd | 0; + }, + copyTo: function Word64_copyTo(bytes, offset) { + bytes[offset] = this.high >>> 24 & 0xFF; + bytes[offset + 1] = this.high >> 16 & 0xFF; + bytes[offset + 2] = this.high >> 8 & 0xFF; + bytes[offset + 3] = this.high & 0xFF; + bytes[offset + 4] = this.low >>> 24 & 0xFF; + bytes[offset + 5] = this.low >> 16 & 0xFF; + bytes[offset + 6] = this.low >> 8 & 0xFF; + bytes[offset + 7] = this.low & 0xFF; + }, + assign: function Word64_assign(word) { + this.high = word.high; + this.low = word.low; + } + }; + return Word64; + }(); + var calculateSHA256 = function calculateSHA256Closure() { + function rotr(x, n) { + return x >>> n | x << 32 - n; + } + function ch(x, y, z) { + return x & y ^ ~x & z; + } + function maj(x, y, z) { + return x & y ^ x & z ^ y & z; + } + function sigma(x) { + return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); + } + function sigmaPrime(x) { + return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); + } + function littleSigma(x) { + return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; + } + function littleSigmaPrime(x) { + return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; + } + var k = [ + 0x428a2f98, + 0x71374491, + 0xb5c0fbcf, + 0xe9b5dba5, + 0x3956c25b, + 0x59f111f1, + 0x923f82a4, + 0xab1c5ed5, + 0xd807aa98, + 0x12835b01, + 0x243185be, + 0x550c7dc3, + 0x72be5d74, + 0x80deb1fe, + 0x9bdc06a7, + 0xc19bf174, + 0xe49b69c1, + 0xefbe4786, + 0x0fc19dc6, + 0x240ca1cc, + 0x2de92c6f, + 0x4a7484aa, + 0x5cb0a9dc, + 0x76f988da, + 0x983e5152, + 0xa831c66d, + 0xb00327c8, + 0xbf597fc7, + 0xc6e00bf3, + 0xd5a79147, + 0x06ca6351, + 0x14292967, + 0x27b70a85, + 0x2e1b2138, + 0x4d2c6dfc, + 0x53380d13, + 0x650a7354, + 0x766a0abb, + 0x81c2c92e, + 0x92722c85, + 0xa2bfe8a1, + 0xa81a664b, + 0xc24b8b70, + 0xc76c51a3, + 0xd192e819, + 0xd6990624, + 0xf40e3585, + 0x106aa070, + 0x19a4c116, + 0x1e376c08, + 0x2748774c, + 0x34b0bcb5, + 0x391c0cb3, + 0x4ed8aa4a, + 0x5b9cca4f, + 0x682e6ff3, + 0x748f82ee, + 0x78a5636f, + 0x84c87814, + 0x8cc70208, + 0x90befffa, + 0xa4506ceb, + 0xbef9a3f7, + 0xc67178f2 + ]; + function hash(data, offset, length) { + var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19; + var paddedLength = Math.ceil((length + 9) / 64) * 64; + var padded = new Uint8Array(paddedLength); + var i, j, n; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xFF; + padded[i++] = length >> 21 & 0xFF; + padded[i++] = length >> 13 & 0xFF; + padded[i++] = length >> 5 & 0xFF; + padded[i++] = length << 3 & 0xFF; + var w = new Uint32Array(64); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + i += 4; + } + for (j = 16; j < 64; ++j) { + w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0; + } + var a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, t1, t2; + for (j = 0; j < 64; ++j) { + t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; + t2 = sigma(a) + maj(a, b, c); + h = g; + g = f; + f = e; + e = d + t1 | 0; + d = c; + c = b; + b = a; + a = t1 + t2 | 0; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + h4 = h4 + e | 0; + h5 = h5 + f | 0; + h6 = h6 + g | 0; + h7 = h7 + h | 0; + } + return new Uint8Array([ + h0 >> 24 & 0xFF, + h0 >> 16 & 0xFF, + h0 >> 8 & 0xFF, + h0 & 0xFF, + h1 >> 24 & 0xFF, + h1 >> 16 & 0xFF, + h1 >> 8 & 0xFF, + h1 & 0xFF, + h2 >> 24 & 0xFF, + h2 >> 16 & 0xFF, + h2 >> 8 & 0xFF, + h2 & 0xFF, + h3 >> 24 & 0xFF, + h3 >> 16 & 0xFF, + h3 >> 8 & 0xFF, + h3 & 0xFF, + h4 >> 24 & 0xFF, + h4 >> 16 & 0xFF, + h4 >> 8 & 0xFF, + h4 & 0xFF, + h5 >> 24 & 0xFF, + h5 >> 16 & 0xFF, + h5 >> 8 & 0xFF, + h5 & 0xFF, + h6 >> 24 & 0xFF, + h6 >> 16 & 0xFF, + h6 >> 8 & 0xFF, + h6 & 0xFF, + h7 >> 24 & 0xFF, + h7 >> 16 & 0xFF, + h7 >> 8 & 0xFF, + h7 & 0xFF + ]); + } + return hash; + }(); + var calculateSHA512 = function calculateSHA512Closure() { + function ch(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.not(); + tmp.and(z); + result.xor(tmp); + } + function maj(result, x, y, z, tmp) { + result.assign(x); + result.and(y); + tmp.assign(x); + tmp.and(z); + result.xor(tmp); + tmp.assign(y); + tmp.and(z); + result.xor(tmp); + } + function sigma(result, x, tmp) { + result.assign(x); + result.rotateRight(28); + tmp.assign(x); + tmp.rotateRight(34); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(39); + result.xor(tmp); + } + function sigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(14); + tmp.assign(x); + tmp.rotateRight(18); + result.xor(tmp); + tmp.assign(x); + tmp.rotateRight(41); + result.xor(tmp); + } + function littleSigma(result, x, tmp) { + result.assign(x); + result.rotateRight(1); + tmp.assign(x); + tmp.rotateRight(8); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(7); + result.xor(tmp); + } + function littleSigmaPrime(result, x, tmp) { + result.assign(x); + result.rotateRight(19); + tmp.assign(x); + tmp.rotateRight(61); + result.xor(tmp); + tmp.assign(x); + tmp.shiftRight(6); + result.xor(tmp); + } + var k = [ + new Word64(0x428a2f98, 0xd728ae22), + new Word64(0x71374491, 0x23ef65cd), + new Word64(0xb5c0fbcf, 0xec4d3b2f), + new Word64(0xe9b5dba5, 0x8189dbbc), + new Word64(0x3956c25b, 0xf348b538), + new Word64(0x59f111f1, 0xb605d019), + new Word64(0x923f82a4, 0xaf194f9b), + new Word64(0xab1c5ed5, 0xda6d8118), + new Word64(0xd807aa98, 0xa3030242), + new Word64(0x12835b01, 0x45706fbe), + new Word64(0x243185be, 0x4ee4b28c), + new Word64(0x550c7dc3, 0xd5ffb4e2), + new Word64(0x72be5d74, 0xf27b896f), + new Word64(0x80deb1fe, 0x3b1696b1), + new Word64(0x9bdc06a7, 0x25c71235), + new Word64(0xc19bf174, 0xcf692694), + new Word64(0xe49b69c1, 0x9ef14ad2), + new Word64(0xefbe4786, 0x384f25e3), + new Word64(0x0fc19dc6, 0x8b8cd5b5), + new Word64(0x240ca1cc, 0x77ac9c65), + new Word64(0x2de92c6f, 0x592b0275), + new Word64(0x4a7484aa, 0x6ea6e483), + new Word64(0x5cb0a9dc, 0xbd41fbd4), + new Word64(0x76f988da, 0x831153b5), + new Word64(0x983e5152, 0xee66dfab), + new Word64(0xa831c66d, 0x2db43210), + new Word64(0xb00327c8, 0x98fb213f), + new Word64(0xbf597fc7, 0xbeef0ee4), + new Word64(0xc6e00bf3, 0x3da88fc2), + new Word64(0xd5a79147, 0x930aa725), + new Word64(0x06ca6351, 0xe003826f), + new Word64(0x14292967, 0x0a0e6e70), + new Word64(0x27b70a85, 0x46d22ffc), + new Word64(0x2e1b2138, 0x5c26c926), + new Word64(0x4d2c6dfc, 0x5ac42aed), + new Word64(0x53380d13, 0x9d95b3df), + new Word64(0x650a7354, 0x8baf63de), + new Word64(0x766a0abb, 0x3c77b2a8), + new Word64(0x81c2c92e, 0x47edaee6), + new Word64(0x92722c85, 0x1482353b), + new Word64(0xa2bfe8a1, 0x4cf10364), + new Word64(0xa81a664b, 0xbc423001), + new Word64(0xc24b8b70, 0xd0f89791), + new Word64(0xc76c51a3, 0x0654be30), + new Word64(0xd192e819, 0xd6ef5218), + new Word64(0xd6990624, 0x5565a910), + new Word64(0xf40e3585, 0x5771202a), + new Word64(0x106aa070, 0x32bbd1b8), + new Word64(0x19a4c116, 0xb8d2d0c8), + new Word64(0x1e376c08, 0x5141ab53), + new Word64(0x2748774c, 0xdf8eeb99), + new Word64(0x34b0bcb5, 0xe19b48a8), + new Word64(0x391c0cb3, 0xc5c95a63), + new Word64(0x4ed8aa4a, 0xe3418acb), + new Word64(0x5b9cca4f, 0x7763e373), + new Word64(0x682e6ff3, 0xd6b2b8a3), + new Word64(0x748f82ee, 0x5defb2fc), + new Word64(0x78a5636f, 0x43172f60), + new Word64(0x84c87814, 0xa1f0ab72), + new Word64(0x8cc70208, 0x1a6439ec), + new Word64(0x90befffa, 0x23631e28), + new Word64(0xa4506ceb, 0xde82bde9), + new Word64(0xbef9a3f7, 0xb2c67915), + new Word64(0xc67178f2, 0xe372532b), + new Word64(0xca273ece, 0xea26619c), + new Word64(0xd186b8c7, 0x21c0c207), + new Word64(0xeada7dd6, 0xcde0eb1e), + new Word64(0xf57d4f7f, 0xee6ed178), + new Word64(0x06f067aa, 0x72176fba), + new Word64(0x0a637dc5, 0xa2c898a6), + new Word64(0x113f9804, 0xbef90dae), + new Word64(0x1b710b35, 0x131c471b), + new Word64(0x28db77f5, 0x23047d84), + new Word64(0x32caab7b, 0x40c72493), + new Word64(0x3c9ebe0a, 0x15c9bebc), + new Word64(0x431d67c4, 0x9c100d4c), + new Word64(0x4cc5d4be, 0xcb3e42b6), + new Word64(0x597f299c, 0xfc657e2a), + new Word64(0x5fcb6fab, 0x3ad6faec), + new Word64(0x6c44198c, 0x4a475817) + ]; + function hash(data, offset, length, mode384) { + mode384 = !!mode384; + var h0, h1, h2, h3, h4, h5, h6, h7; + if (!mode384) { + h0 = new Word64(0x6a09e667, 0xf3bcc908); + h1 = new Word64(0xbb67ae85, 0x84caa73b); + h2 = new Word64(0x3c6ef372, 0xfe94f82b); + h3 = new Word64(0xa54ff53a, 0x5f1d36f1); + h4 = new Word64(0x510e527f, 0xade682d1); + h5 = new Word64(0x9b05688c, 0x2b3e6c1f); + h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); + h7 = new Word64(0x5be0cd19, 0x137e2179); + } else { + h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); + h1 = new Word64(0x629a292a, 0x367cd507); + h2 = new Word64(0x9159015a, 0x3070dd17); + h3 = new Word64(0x152fecd8, 0xf70e5939); + h4 = new Word64(0x67332667, 0xffc00b31); + h5 = new Word64(0x8eb44a87, 0x68581511); + h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); + h7 = new Word64(0x47b5481d, 0xbefa4fa4); + } + var paddedLength = Math.ceil((length + 17) / 128) * 128; + var padded = new Uint8Array(paddedLength); + var i, j, n; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 0x80; + n = paddedLength - 16; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = length >>> 29 & 0xFF; + padded[i++] = length >> 21 & 0xFF; + padded[i++] = length >> 13 & 0xFF; + padded[i++] = length >> 5 & 0xFF; + padded[i++] = length << 3 & 0xFF; + var w = new Array(80); + for (i = 0; i < 80; i++) { + w[i] = new Word64(0, 0); + } + var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0); + var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0); + var g = new Word64(0, 0), h = new Word64(0, 0); + var t1 = new Word64(0, 0), t2 = new Word64(0, 0); + var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3; + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j) { + w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3]; + w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7]; + i += 8; + } + for (j = 16; j < 80; ++j) { + tmp3 = w[j]; + littleSigmaPrime(tmp3, w[j - 2], tmp2); + tmp3.add(w[j - 7]); + littleSigma(tmp1, w[j - 15], tmp2); + tmp3.add(tmp1); + tmp3.add(w[j - 16]); + } + a.assign(h0); + b.assign(h1); + c.assign(h2); + d.assign(h3); + e.assign(h4); + f.assign(h5); + g.assign(h6); + h.assign(h7); + for (j = 0; j < 80; ++j) { + t1.assign(h); + sigmaPrime(tmp1, e, tmp2); + t1.add(tmp1); + ch(tmp1, e, f, g, tmp2); + t1.add(tmp1); + t1.add(k[j]); + t1.add(w[j]); + sigma(t2, a, tmp2); + maj(tmp1, a, b, c, tmp2); + t2.add(tmp1); + tmp3 = h; + h = g; + g = f; + f = e; + d.add(t1); + e = d; + d = c; + c = b; + b = a; + tmp3.assign(t1); + tmp3.add(t2); + a = tmp3; + } + h0.add(a); + h1.add(b); + h2.add(c); + h3.add(d); + h4.add(e); + h5.add(f); + h6.add(g); + h7.add(h); + } + var result; + if (!mode384) { + result = new Uint8Array(64); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + h6.copyTo(result, 48); + h7.copyTo(result, 56); + } else { + result = new Uint8Array(48); + h0.copyTo(result, 0); + h1.copyTo(result, 8); + h2.copyTo(result, 16); + h3.copyTo(result, 24); + h4.copyTo(result, 32); + h5.copyTo(result, 40); + } + return result; + } + return hash; + }(); + var calculateSHA384 = function calculateSHA384Closure() { + function hash(data, offset, length) { + return calculateSHA512(data, offset, length, true); + } + return hash; + }(); + var NullCipher = function NullCipherClosure() { + function NullCipher() { + } + NullCipher.prototype = { + decryptBlock: function NullCipher_decryptBlock(data) { + return data; + } + }; + return NullCipher; + }(); + var AES128Cipher = function AES128CipherClosure() { + var rcon = new Uint8Array([ + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d + ]); + var s = new Uint8Array([ + 0x63, + 0x7c, + 0x77, + 0x7b, + 0xf2, + 0x6b, + 0x6f, + 0xc5, + 0x30, + 0x01, + 0x67, + 0x2b, + 0xfe, + 0xd7, + 0xab, + 0x76, + 0xca, + 0x82, + 0xc9, + 0x7d, + 0xfa, + 0x59, + 0x47, + 0xf0, + 0xad, + 0xd4, + 0xa2, + 0xaf, + 0x9c, + 0xa4, + 0x72, + 0xc0, + 0xb7, + 0xfd, + 0x93, + 0x26, + 0x36, + 0x3f, + 0xf7, + 0xcc, + 0x34, + 0xa5, + 0xe5, + 0xf1, + 0x71, + 0xd8, + 0x31, + 0x15, + 0x04, + 0xc7, + 0x23, + 0xc3, + 0x18, + 0x96, + 0x05, + 0x9a, + 0x07, + 0x12, + 0x80, + 0xe2, + 0xeb, + 0x27, + 0xb2, + 0x75, + 0x09, + 0x83, + 0x2c, + 0x1a, + 0x1b, + 0x6e, + 0x5a, + 0xa0, + 0x52, + 0x3b, + 0xd6, + 0xb3, + 0x29, + 0xe3, + 0x2f, + 0x84, + 0x53, + 0xd1, + 0x00, + 0xed, + 0x20, + 0xfc, + 0xb1, + 0x5b, + 0x6a, + 0xcb, + 0xbe, + 0x39, + 0x4a, + 0x4c, + 0x58, + 0xcf, + 0xd0, + 0xef, + 0xaa, + 0xfb, + 0x43, + 0x4d, + 0x33, + 0x85, + 0x45, + 0xf9, + 0x02, + 0x7f, + 0x50, + 0x3c, + 0x9f, + 0xa8, + 0x51, + 0xa3, + 0x40, + 0x8f, + 0x92, + 0x9d, + 0x38, + 0xf5, + 0xbc, + 0xb6, + 0xda, + 0x21, + 0x10, + 0xff, + 0xf3, + 0xd2, + 0xcd, + 0x0c, + 0x13, + 0xec, + 0x5f, + 0x97, + 0x44, + 0x17, + 0xc4, + 0xa7, + 0x7e, + 0x3d, + 0x64, + 0x5d, + 0x19, + 0x73, + 0x60, + 0x81, + 0x4f, + 0xdc, + 0x22, + 0x2a, + 0x90, + 0x88, + 0x46, + 0xee, + 0xb8, + 0x14, + 0xde, + 0x5e, + 0x0b, + 0xdb, + 0xe0, + 0x32, + 0x3a, + 0x0a, + 0x49, + 0x06, + 0x24, + 0x5c, + 0xc2, + 0xd3, + 0xac, + 0x62, + 0x91, + 0x95, + 0xe4, + 0x79, + 0xe7, + 0xc8, + 0x37, + 0x6d, + 0x8d, + 0xd5, + 0x4e, + 0xa9, + 0x6c, + 0x56, + 0xf4, + 0xea, + 0x65, + 0x7a, + 0xae, + 0x08, + 0xba, + 0x78, + 0x25, + 0x2e, + 0x1c, + 0xa6, + 0xb4, + 0xc6, + 0xe8, + 0xdd, + 0x74, + 0x1f, + 0x4b, + 0xbd, + 0x8b, + 0x8a, + 0x70, + 0x3e, + 0xb5, + 0x66, + 0x48, + 0x03, + 0xf6, + 0x0e, + 0x61, + 0x35, + 0x57, + 0xb9, + 0x86, + 0xc1, + 0x1d, + 0x9e, + 0xe1, + 0xf8, + 0x98, + 0x11, + 0x69, + 0xd9, + 0x8e, + 0x94, + 0x9b, + 0x1e, + 0x87, + 0xe9, + 0xce, + 0x55, + 0x28, + 0xdf, + 0x8c, + 0xa1, + 0x89, + 0x0d, + 0xbf, + 0xe6, + 0x42, + 0x68, + 0x41, + 0x99, + 0x2d, + 0x0f, + 0xb0, + 0x54, + 0xbb, + 0x16 + ]); + var inv_s = new Uint8Array([ + 0x52, + 0x09, + 0x6a, + 0xd5, + 0x30, + 0x36, + 0xa5, + 0x38, + 0xbf, + 0x40, + 0xa3, + 0x9e, + 0x81, + 0xf3, + 0xd7, + 0xfb, + 0x7c, + 0xe3, + 0x39, + 0x82, + 0x9b, + 0x2f, + 0xff, + 0x87, + 0x34, + 0x8e, + 0x43, + 0x44, + 0xc4, + 0xde, + 0xe9, + 0xcb, + 0x54, + 0x7b, + 0x94, + 0x32, + 0xa6, + 0xc2, + 0x23, + 0x3d, + 0xee, + 0x4c, + 0x95, + 0x0b, + 0x42, + 0xfa, + 0xc3, + 0x4e, + 0x08, + 0x2e, + 0xa1, + 0x66, + 0x28, + 0xd9, + 0x24, + 0xb2, + 0x76, + 0x5b, + 0xa2, + 0x49, + 0x6d, + 0x8b, + 0xd1, + 0x25, + 0x72, + 0xf8, + 0xf6, + 0x64, + 0x86, + 0x68, + 0x98, + 0x16, + 0xd4, + 0xa4, + 0x5c, + 0xcc, + 0x5d, + 0x65, + 0xb6, + 0x92, + 0x6c, + 0x70, + 0x48, + 0x50, + 0xfd, + 0xed, + 0xb9, + 0xda, + 0x5e, + 0x15, + 0x46, + 0x57, + 0xa7, + 0x8d, + 0x9d, + 0x84, + 0x90, + 0xd8, + 0xab, + 0x00, + 0x8c, + 0xbc, + 0xd3, + 0x0a, + 0xf7, + 0xe4, + 0x58, + 0x05, + 0xb8, + 0xb3, + 0x45, + 0x06, + 0xd0, + 0x2c, + 0x1e, + 0x8f, + 0xca, + 0x3f, + 0x0f, + 0x02, + 0xc1, + 0xaf, + 0xbd, + 0x03, + 0x01, + 0x13, + 0x8a, + 0x6b, + 0x3a, + 0x91, + 0x11, + 0x41, + 0x4f, + 0x67, + 0xdc, + 0xea, + 0x97, + 0xf2, + 0xcf, + 0xce, + 0xf0, + 0xb4, + 0xe6, + 0x73, + 0x96, + 0xac, + 0x74, + 0x22, + 0xe7, + 0xad, + 0x35, + 0x85, + 0xe2, + 0xf9, + 0x37, + 0xe8, + 0x1c, + 0x75, + 0xdf, + 0x6e, + 0x47, + 0xf1, + 0x1a, + 0x71, + 0x1d, + 0x29, + 0xc5, + 0x89, + 0x6f, + 0xb7, + 0x62, + 0x0e, + 0xaa, + 0x18, + 0xbe, + 0x1b, + 0xfc, + 0x56, + 0x3e, + 0x4b, + 0xc6, + 0xd2, + 0x79, + 0x20, + 0x9a, + 0xdb, + 0xc0, + 0xfe, + 0x78, + 0xcd, + 0x5a, + 0xf4, + 0x1f, + 0xdd, + 0xa8, + 0x33, + 0x88, + 0x07, + 0xc7, + 0x31, + 0xb1, + 0x12, + 0x10, + 0x59, + 0x27, + 0x80, + 0xec, + 0x5f, + 0x60, + 0x51, + 0x7f, + 0xa9, + 0x19, + 0xb5, + 0x4a, + 0x0d, + 0x2d, + 0xe5, + 0x7a, + 0x9f, + 0x93, + 0xc9, + 0x9c, + 0xef, + 0xa0, + 0xe0, + 0x3b, + 0x4d, + 0xae, + 0x2a, + 0xf5, + 0xb0, + 0xc8, + 0xeb, + 0xbb, + 0x3c, + 0x83, + 0x53, + 0x99, + 0x61, + 0x17, + 0x2b, + 0x04, + 0x7e, + 0xba, + 0x77, + 0xd6, + 0x26, + 0xe1, + 0x69, + 0x14, + 0x63, + 0x55, + 0x21, + 0x0c, + 0x7d + ]); + var mixCol = new Uint8Array(256); + for (var i = 0; i < 256; i++) { + if (i < 128) { + mixCol[i] = i << 1; + } else { + mixCol[i] = i << 1 ^ 0x1b; + } + } + var mix = new Uint32Array([ + 0x00000000, + 0x0e090d0b, + 0x1c121a16, + 0x121b171d, + 0x3824342c, + 0x362d3927, + 0x24362e3a, + 0x2a3f2331, + 0x70486858, + 0x7e416553, + 0x6c5a724e, + 0x62537f45, + 0x486c5c74, + 0x4665517f, + 0x547e4662, + 0x5a774b69, + 0xe090d0b0, + 0xee99ddbb, + 0xfc82caa6, + 0xf28bc7ad, + 0xd8b4e49c, + 0xd6bde997, + 0xc4a6fe8a, + 0xcaaff381, + 0x90d8b8e8, + 0x9ed1b5e3, + 0x8ccaa2fe, + 0x82c3aff5, + 0xa8fc8cc4, + 0xa6f581cf, + 0xb4ee96d2, + 0xbae79bd9, + 0xdb3bbb7b, + 0xd532b670, + 0xc729a16d, + 0xc920ac66, + 0xe31f8f57, + 0xed16825c, + 0xff0d9541, + 0xf104984a, + 0xab73d323, + 0xa57ade28, + 0xb761c935, + 0xb968c43e, + 0x9357e70f, + 0x9d5eea04, + 0x8f45fd19, + 0x814cf012, + 0x3bab6bcb, + 0x35a266c0, + 0x27b971dd, + 0x29b07cd6, + 0x038f5fe7, + 0x0d8652ec, + 0x1f9d45f1, + 0x119448fa, + 0x4be30393, + 0x45ea0e98, + 0x57f11985, + 0x59f8148e, + 0x73c737bf, + 0x7dce3ab4, + 0x6fd52da9, + 0x61dc20a2, + 0xad766df6, + 0xa37f60fd, + 0xb16477e0, + 0xbf6d7aeb, + 0x955259da, + 0x9b5b54d1, + 0x894043cc, + 0x87494ec7, + 0xdd3e05ae, + 0xd33708a5, + 0xc12c1fb8, + 0xcf2512b3, + 0xe51a3182, + 0xeb133c89, + 0xf9082b94, + 0xf701269f, + 0x4de6bd46, + 0x43efb04d, + 0x51f4a750, + 0x5ffdaa5b, + 0x75c2896a, + 0x7bcb8461, + 0x69d0937c, + 0x67d99e77, + 0x3daed51e, + 0x33a7d815, + 0x21bccf08, + 0x2fb5c203, + 0x058ae132, + 0x0b83ec39, + 0x1998fb24, + 0x1791f62f, + 0x764dd68d, + 0x7844db86, + 0x6a5fcc9b, + 0x6456c190, + 0x4e69e2a1, + 0x4060efaa, + 0x527bf8b7, + 0x5c72f5bc, + 0x0605bed5, + 0x080cb3de, + 0x1a17a4c3, + 0x141ea9c8, + 0x3e218af9, + 0x302887f2, + 0x223390ef, + 0x2c3a9de4, + 0x96dd063d, + 0x98d40b36, + 0x8acf1c2b, + 0x84c61120, + 0xaef93211, + 0xa0f03f1a, + 0xb2eb2807, + 0xbce2250c, + 0xe6956e65, + 0xe89c636e, + 0xfa877473, + 0xf48e7978, + 0xdeb15a49, + 0xd0b85742, + 0xc2a3405f, + 0xccaa4d54, + 0x41ecdaf7, + 0x4fe5d7fc, + 0x5dfec0e1, + 0x53f7cdea, + 0x79c8eedb, + 0x77c1e3d0, + 0x65daf4cd, + 0x6bd3f9c6, + 0x31a4b2af, + 0x3fadbfa4, + 0x2db6a8b9, + 0x23bfa5b2, + 0x09808683, + 0x07898b88, + 0x15929c95, + 0x1b9b919e, + 0xa17c0a47, + 0xaf75074c, + 0xbd6e1051, + 0xb3671d5a, + 0x99583e6b, + 0x97513360, + 0x854a247d, + 0x8b432976, + 0xd134621f, + 0xdf3d6f14, + 0xcd267809, + 0xc32f7502, + 0xe9105633, + 0xe7195b38, + 0xf5024c25, + 0xfb0b412e, + 0x9ad7618c, + 0x94de6c87, + 0x86c57b9a, + 0x88cc7691, + 0xa2f355a0, + 0xacfa58ab, + 0xbee14fb6, + 0xb0e842bd, + 0xea9f09d4, + 0xe49604df, + 0xf68d13c2, + 0xf8841ec9, + 0xd2bb3df8, + 0xdcb230f3, + 0xcea927ee, + 0xc0a02ae5, + 0x7a47b13c, + 0x744ebc37, + 0x6655ab2a, + 0x685ca621, + 0x42638510, + 0x4c6a881b, + 0x5e719f06, + 0x5078920d, + 0x0a0fd964, + 0x0406d46f, + 0x161dc372, + 0x1814ce79, + 0x322bed48, + 0x3c22e043, + 0x2e39f75e, + 0x2030fa55, + 0xec9ab701, + 0xe293ba0a, + 0xf088ad17, + 0xfe81a01c, + 0xd4be832d, + 0xdab78e26, + 0xc8ac993b, + 0xc6a59430, + 0x9cd2df59, + 0x92dbd252, + 0x80c0c54f, + 0x8ec9c844, + 0xa4f6eb75, + 0xaaffe67e, + 0xb8e4f163, + 0xb6edfc68, + 0x0c0a67b1, + 0x02036aba, + 0x10187da7, + 0x1e1170ac, + 0x342e539d, + 0x3a275e96, + 0x283c498b, + 0x26354480, + 0x7c420fe9, + 0x724b02e2, + 0x605015ff, + 0x6e5918f4, + 0x44663bc5, + 0x4a6f36ce, + 0x587421d3, + 0x567d2cd8, + 0x37a10c7a, + 0x39a80171, + 0x2bb3166c, + 0x25ba1b67, + 0x0f853856, + 0x018c355d, + 0x13972240, + 0x1d9e2f4b, + 0x47e96422, + 0x49e06929, + 0x5bfb7e34, + 0x55f2733f, + 0x7fcd500e, + 0x71c45d05, + 0x63df4a18, + 0x6dd64713, + 0xd731dcca, + 0xd938d1c1, + 0xcb23c6dc, + 0xc52acbd7, + 0xef15e8e6, + 0xe11ce5ed, + 0xf307f2f0, + 0xfd0efffb, + 0xa779b492, + 0xa970b999, + 0xbb6bae84, + 0xb562a38f, + 0x9f5d80be, + 0x91548db5, + 0x834f9aa8, + 0x8d4697a3 + ]); + function expandKey128(cipherKey) { + var b = 176, result = new Uint8Array(b); + result.set(cipherKey); + for (var j = 16, i = 1; j < b; ++i) { + var t1 = result[j - 3], t2 = result[j - 2], t3 = result[j - 1], t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 = t1 ^ rcon[i]; + for (var n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 16]; + j++; + result[j] = t2 ^= result[j - 16]; + j++; + result[j] = t3 ^= result[j - 16]; + j++; + result[j] = t4 ^= result[j - 16]; + j++; + } + } + return result; + } + function decrypt128(input, key) { + var state = new Uint8Array(16); + state.set(input); + var i, j, k; + var t, u, v; + for (j = 0, k = 160; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (i = 9; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (j = 0; j < 16; ++j) { + state[j] = inv_s[state[j]]; + } + for (j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (j = 0; j < 16; j += 4) { + var s0 = mix[state[j]], s1 = mix[state[j + 1]], s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xFF; + state[j + 1] = t >> 16 & 0xFF; + state[j + 2] = t >> 8 & 0xFF; + state[j + 3] = t & 0xFF; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (j = 0; j < 16; ++j) { + state[j] = inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + function encrypt128(input, key) { + var t, u, v, k; + var state = new Uint8Array(16); + state.set(input); + for (j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (i = 1; i < 10; i++) { + for (j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (var j = 0; j < 16; j += 4) { + var s0 = state[j + 0], s1 = state[j + 1]; + var s2 = state[j + 2], s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j + 0] ^= t ^ mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ mixCol[s3 ^ s0]; + } + for (j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (j = 0, k = 160; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + function AES128Cipher(key) { + this.key = expandKey128(key); + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + function decryptBlock2(data, finalize) { + var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = [], iv = this.iv; + for (i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + var plain = decrypt128(buffer, this.key); + for (j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array([]); + } + var outputLength = 16 * result.length; + if (finalize) { + var lastBlock = result[result.length - 1]; + var psLen = lastBlock[15]; + if (psLen <= 16) { + for (i = 15, ii = 16 - psLen; i >= ii; --i) { + if (lastBlock[i] !== psLen) { + psLen = 0; + break; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + var output = new Uint8Array(outputLength); + for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + AES128Cipher.prototype = { + decryptBlock: function AES128Cipher_decryptBlock(data, finalize) { + var i, sourceLength = data.length; + var buffer = this.buffer, bufferLength = this.bufferPosition; + for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array([]); + } + this.iv = buffer; + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = decryptBlock2; + return this.decryptBlock(data.subarray(16), finalize); + }, + encrypt: function AES128Cipher_encrypt(data, iv) { + var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = []; + if (!iv) { + iv = new Uint8Array(16); + } + for (i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + var cipher = encrypt128(buffer, this.key); + iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array([]); + } + var outputLength = 16 * result.length; + var output = new Uint8Array(outputLength); + for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + }; + return AES128Cipher; + }(); + var AES256Cipher = function AES256CipherClosure() { + var rcon = new Uint8Array([ + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d, + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80, + 0x1b, + 0x36, + 0x6c, + 0xd8, + 0xab, + 0x4d, + 0x9a, + 0x2f, + 0x5e, + 0xbc, + 0x63, + 0xc6, + 0x97, + 0x35, + 0x6a, + 0xd4, + 0xb3, + 0x7d, + 0xfa, + 0xef, + 0xc5, + 0x91, + 0x39, + 0x72, + 0xe4, + 0xd3, + 0xbd, + 0x61, + 0xc2, + 0x9f, + 0x25, + 0x4a, + 0x94, + 0x33, + 0x66, + 0xcc, + 0x83, + 0x1d, + 0x3a, + 0x74, + 0xe8, + 0xcb, + 0x8d + ]); + var s = new Uint8Array([ + 0x63, + 0x7c, + 0x77, + 0x7b, + 0xf2, + 0x6b, + 0x6f, + 0xc5, + 0x30, + 0x01, + 0x67, + 0x2b, + 0xfe, + 0xd7, + 0xab, + 0x76, + 0xca, + 0x82, + 0xc9, + 0x7d, + 0xfa, + 0x59, + 0x47, + 0xf0, + 0xad, + 0xd4, + 0xa2, + 0xaf, + 0x9c, + 0xa4, + 0x72, + 0xc0, + 0xb7, + 0xfd, + 0x93, + 0x26, + 0x36, + 0x3f, + 0xf7, + 0xcc, + 0x34, + 0xa5, + 0xe5, + 0xf1, + 0x71, + 0xd8, + 0x31, + 0x15, + 0x04, + 0xc7, + 0x23, + 0xc3, + 0x18, + 0x96, + 0x05, + 0x9a, + 0x07, + 0x12, + 0x80, + 0xe2, + 0xeb, + 0x27, + 0xb2, + 0x75, + 0x09, + 0x83, + 0x2c, + 0x1a, + 0x1b, + 0x6e, + 0x5a, + 0xa0, + 0x52, + 0x3b, + 0xd6, + 0xb3, + 0x29, + 0xe3, + 0x2f, + 0x84, + 0x53, + 0xd1, + 0x00, + 0xed, + 0x20, + 0xfc, + 0xb1, + 0x5b, + 0x6a, + 0xcb, + 0xbe, + 0x39, + 0x4a, + 0x4c, + 0x58, + 0xcf, + 0xd0, + 0xef, + 0xaa, + 0xfb, + 0x43, + 0x4d, + 0x33, + 0x85, + 0x45, + 0xf9, + 0x02, + 0x7f, + 0x50, + 0x3c, + 0x9f, + 0xa8, + 0x51, + 0xa3, + 0x40, + 0x8f, + 0x92, + 0x9d, + 0x38, + 0xf5, + 0xbc, + 0xb6, + 0xda, + 0x21, + 0x10, + 0xff, + 0xf3, + 0xd2, + 0xcd, + 0x0c, + 0x13, + 0xec, + 0x5f, + 0x97, + 0x44, + 0x17, + 0xc4, + 0xa7, + 0x7e, + 0x3d, + 0x64, + 0x5d, + 0x19, + 0x73, + 0x60, + 0x81, + 0x4f, + 0xdc, + 0x22, + 0x2a, + 0x90, + 0x88, + 0x46, + 0xee, + 0xb8, + 0x14, + 0xde, + 0x5e, + 0x0b, + 0xdb, + 0xe0, + 0x32, + 0x3a, + 0x0a, + 0x49, + 0x06, + 0x24, + 0x5c, + 0xc2, + 0xd3, + 0xac, + 0x62, + 0x91, + 0x95, + 0xe4, + 0x79, + 0xe7, + 0xc8, + 0x37, + 0x6d, + 0x8d, + 0xd5, + 0x4e, + 0xa9, + 0x6c, + 0x56, + 0xf4, + 0xea, + 0x65, + 0x7a, + 0xae, + 0x08, + 0xba, + 0x78, + 0x25, + 0x2e, + 0x1c, + 0xa6, + 0xb4, + 0xc6, + 0xe8, + 0xdd, + 0x74, + 0x1f, + 0x4b, + 0xbd, + 0x8b, + 0x8a, + 0x70, + 0x3e, + 0xb5, + 0x66, + 0x48, + 0x03, + 0xf6, + 0x0e, + 0x61, + 0x35, + 0x57, + 0xb9, + 0x86, + 0xc1, + 0x1d, + 0x9e, + 0xe1, + 0xf8, + 0x98, + 0x11, + 0x69, + 0xd9, + 0x8e, + 0x94, + 0x9b, + 0x1e, + 0x87, + 0xe9, + 0xce, + 0x55, + 0x28, + 0xdf, + 0x8c, + 0xa1, + 0x89, + 0x0d, + 0xbf, + 0xe6, + 0x42, + 0x68, + 0x41, + 0x99, + 0x2d, + 0x0f, + 0xb0, + 0x54, + 0xbb, + 0x16 + ]); + var inv_s = new Uint8Array([ + 0x52, + 0x09, + 0x6a, + 0xd5, + 0x30, + 0x36, + 0xa5, + 0x38, + 0xbf, + 0x40, + 0xa3, + 0x9e, + 0x81, + 0xf3, + 0xd7, + 0xfb, + 0x7c, + 0xe3, + 0x39, + 0x82, + 0x9b, + 0x2f, + 0xff, + 0x87, + 0x34, + 0x8e, + 0x43, + 0x44, + 0xc4, + 0xde, + 0xe9, + 0xcb, + 0x54, + 0x7b, + 0x94, + 0x32, + 0xa6, + 0xc2, + 0x23, + 0x3d, + 0xee, + 0x4c, + 0x95, + 0x0b, + 0x42, + 0xfa, + 0xc3, + 0x4e, + 0x08, + 0x2e, + 0xa1, + 0x66, + 0x28, + 0xd9, + 0x24, + 0xb2, + 0x76, + 0x5b, + 0xa2, + 0x49, + 0x6d, + 0x8b, + 0xd1, + 0x25, + 0x72, + 0xf8, + 0xf6, + 0x64, + 0x86, + 0x68, + 0x98, + 0x16, + 0xd4, + 0xa4, + 0x5c, + 0xcc, + 0x5d, + 0x65, + 0xb6, + 0x92, + 0x6c, + 0x70, + 0x48, + 0x50, + 0xfd, + 0xed, + 0xb9, + 0xda, + 0x5e, + 0x15, + 0x46, + 0x57, + 0xa7, + 0x8d, + 0x9d, + 0x84, + 0x90, + 0xd8, + 0xab, + 0x00, + 0x8c, + 0xbc, + 0xd3, + 0x0a, + 0xf7, + 0xe4, + 0x58, + 0x05, + 0xb8, + 0xb3, + 0x45, + 0x06, + 0xd0, + 0x2c, + 0x1e, + 0x8f, + 0xca, + 0x3f, + 0x0f, + 0x02, + 0xc1, + 0xaf, + 0xbd, + 0x03, + 0x01, + 0x13, + 0x8a, + 0x6b, + 0x3a, + 0x91, + 0x11, + 0x41, + 0x4f, + 0x67, + 0xdc, + 0xea, + 0x97, + 0xf2, + 0xcf, + 0xce, + 0xf0, + 0xb4, + 0xe6, + 0x73, + 0x96, + 0xac, + 0x74, + 0x22, + 0xe7, + 0xad, + 0x35, + 0x85, + 0xe2, + 0xf9, + 0x37, + 0xe8, + 0x1c, + 0x75, + 0xdf, + 0x6e, + 0x47, + 0xf1, + 0x1a, + 0x71, + 0x1d, + 0x29, + 0xc5, + 0x89, + 0x6f, + 0xb7, + 0x62, + 0x0e, + 0xaa, + 0x18, + 0xbe, + 0x1b, + 0xfc, + 0x56, + 0x3e, + 0x4b, + 0xc6, + 0xd2, + 0x79, + 0x20, + 0x9a, + 0xdb, + 0xc0, + 0xfe, + 0x78, + 0xcd, + 0x5a, + 0xf4, + 0x1f, + 0xdd, + 0xa8, + 0x33, + 0x88, + 0x07, + 0xc7, + 0x31, + 0xb1, + 0x12, + 0x10, + 0x59, + 0x27, + 0x80, + 0xec, + 0x5f, + 0x60, + 0x51, + 0x7f, + 0xa9, + 0x19, + 0xb5, + 0x4a, + 0x0d, + 0x2d, + 0xe5, + 0x7a, + 0x9f, + 0x93, + 0xc9, + 0x9c, + 0xef, + 0xa0, + 0xe0, + 0x3b, + 0x4d, + 0xae, + 0x2a, + 0xf5, + 0xb0, + 0xc8, + 0xeb, + 0xbb, + 0x3c, + 0x83, + 0x53, + 0x99, + 0x61, + 0x17, + 0x2b, + 0x04, + 0x7e, + 0xba, + 0x77, + 0xd6, + 0x26, + 0xe1, + 0x69, + 0x14, + 0x63, + 0x55, + 0x21, + 0x0c, + 0x7d + ]); + var mixCol = new Uint8Array(256); + for (var i = 0; i < 256; i++) { + if (i < 128) { + mixCol[i] = i << 1; + } else { + mixCol[i] = i << 1 ^ 0x1b; + } + } + var mix = new Uint32Array([ + 0x00000000, + 0x0e090d0b, + 0x1c121a16, + 0x121b171d, + 0x3824342c, + 0x362d3927, + 0x24362e3a, + 0x2a3f2331, + 0x70486858, + 0x7e416553, + 0x6c5a724e, + 0x62537f45, + 0x486c5c74, + 0x4665517f, + 0x547e4662, + 0x5a774b69, + 0xe090d0b0, + 0xee99ddbb, + 0xfc82caa6, + 0xf28bc7ad, + 0xd8b4e49c, + 0xd6bde997, + 0xc4a6fe8a, + 0xcaaff381, + 0x90d8b8e8, + 0x9ed1b5e3, + 0x8ccaa2fe, + 0x82c3aff5, + 0xa8fc8cc4, + 0xa6f581cf, + 0xb4ee96d2, + 0xbae79bd9, + 0xdb3bbb7b, + 0xd532b670, + 0xc729a16d, + 0xc920ac66, + 0xe31f8f57, + 0xed16825c, + 0xff0d9541, + 0xf104984a, + 0xab73d323, + 0xa57ade28, + 0xb761c935, + 0xb968c43e, + 0x9357e70f, + 0x9d5eea04, + 0x8f45fd19, + 0x814cf012, + 0x3bab6bcb, + 0x35a266c0, + 0x27b971dd, + 0x29b07cd6, + 0x038f5fe7, + 0x0d8652ec, + 0x1f9d45f1, + 0x119448fa, + 0x4be30393, + 0x45ea0e98, + 0x57f11985, + 0x59f8148e, + 0x73c737bf, + 0x7dce3ab4, + 0x6fd52da9, + 0x61dc20a2, + 0xad766df6, + 0xa37f60fd, + 0xb16477e0, + 0xbf6d7aeb, + 0x955259da, + 0x9b5b54d1, + 0x894043cc, + 0x87494ec7, + 0xdd3e05ae, + 0xd33708a5, + 0xc12c1fb8, + 0xcf2512b3, + 0xe51a3182, + 0xeb133c89, + 0xf9082b94, + 0xf701269f, + 0x4de6bd46, + 0x43efb04d, + 0x51f4a750, + 0x5ffdaa5b, + 0x75c2896a, + 0x7bcb8461, + 0x69d0937c, + 0x67d99e77, + 0x3daed51e, + 0x33a7d815, + 0x21bccf08, + 0x2fb5c203, + 0x058ae132, + 0x0b83ec39, + 0x1998fb24, + 0x1791f62f, + 0x764dd68d, + 0x7844db86, + 0x6a5fcc9b, + 0x6456c190, + 0x4e69e2a1, + 0x4060efaa, + 0x527bf8b7, + 0x5c72f5bc, + 0x0605bed5, + 0x080cb3de, + 0x1a17a4c3, + 0x141ea9c8, + 0x3e218af9, + 0x302887f2, + 0x223390ef, + 0x2c3a9de4, + 0x96dd063d, + 0x98d40b36, + 0x8acf1c2b, + 0x84c61120, + 0xaef93211, + 0xa0f03f1a, + 0xb2eb2807, + 0xbce2250c, + 0xe6956e65, + 0xe89c636e, + 0xfa877473, + 0xf48e7978, + 0xdeb15a49, + 0xd0b85742, + 0xc2a3405f, + 0xccaa4d54, + 0x41ecdaf7, + 0x4fe5d7fc, + 0x5dfec0e1, + 0x53f7cdea, + 0x79c8eedb, + 0x77c1e3d0, + 0x65daf4cd, + 0x6bd3f9c6, + 0x31a4b2af, + 0x3fadbfa4, + 0x2db6a8b9, + 0x23bfa5b2, + 0x09808683, + 0x07898b88, + 0x15929c95, + 0x1b9b919e, + 0xa17c0a47, + 0xaf75074c, + 0xbd6e1051, + 0xb3671d5a, + 0x99583e6b, + 0x97513360, + 0x854a247d, + 0x8b432976, + 0xd134621f, + 0xdf3d6f14, + 0xcd267809, + 0xc32f7502, + 0xe9105633, + 0xe7195b38, + 0xf5024c25, + 0xfb0b412e, + 0x9ad7618c, + 0x94de6c87, + 0x86c57b9a, + 0x88cc7691, + 0xa2f355a0, + 0xacfa58ab, + 0xbee14fb6, + 0xb0e842bd, + 0xea9f09d4, + 0xe49604df, + 0xf68d13c2, + 0xf8841ec9, + 0xd2bb3df8, + 0xdcb230f3, + 0xcea927ee, + 0xc0a02ae5, + 0x7a47b13c, + 0x744ebc37, + 0x6655ab2a, + 0x685ca621, + 0x42638510, + 0x4c6a881b, + 0x5e719f06, + 0x5078920d, + 0x0a0fd964, + 0x0406d46f, + 0x161dc372, + 0x1814ce79, + 0x322bed48, + 0x3c22e043, + 0x2e39f75e, + 0x2030fa55, + 0xec9ab701, + 0xe293ba0a, + 0xf088ad17, + 0xfe81a01c, + 0xd4be832d, + 0xdab78e26, + 0xc8ac993b, + 0xc6a59430, + 0x9cd2df59, + 0x92dbd252, + 0x80c0c54f, + 0x8ec9c844, + 0xa4f6eb75, + 0xaaffe67e, + 0xb8e4f163, + 0xb6edfc68, + 0x0c0a67b1, + 0x02036aba, + 0x10187da7, + 0x1e1170ac, + 0x342e539d, + 0x3a275e96, + 0x283c498b, + 0x26354480, + 0x7c420fe9, + 0x724b02e2, + 0x605015ff, + 0x6e5918f4, + 0x44663bc5, + 0x4a6f36ce, + 0x587421d3, + 0x567d2cd8, + 0x37a10c7a, + 0x39a80171, + 0x2bb3166c, + 0x25ba1b67, + 0x0f853856, + 0x018c355d, + 0x13972240, + 0x1d9e2f4b, + 0x47e96422, + 0x49e06929, + 0x5bfb7e34, + 0x55f2733f, + 0x7fcd500e, + 0x71c45d05, + 0x63df4a18, + 0x6dd64713, + 0xd731dcca, + 0xd938d1c1, + 0xcb23c6dc, + 0xc52acbd7, + 0xef15e8e6, + 0xe11ce5ed, + 0xf307f2f0, + 0xfd0efffb, + 0xa779b492, + 0xa970b999, + 0xbb6bae84, + 0xb562a38f, + 0x9f5d80be, + 0x91548db5, + 0x834f9aa8, + 0x8d4697a3 + ]); + function expandKey256(cipherKey) { + var b = 240, result = new Uint8Array(b); + var r = 1; + result.set(cipherKey); + for (var j = 32, i = 1; j < b; ++i) { + if (j % 32 === 16) { + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + } else if (j % 32 === 0) { + var t1 = result[j - 3], t2 = result[j - 2], t3 = result[j - 1], t4 = result[j - 4]; + t1 = s[t1]; + t2 = s[t2]; + t3 = s[t3]; + t4 = s[t4]; + t1 = t1 ^ r; + if ((r <<= 1) >= 256) { + r = (r ^ 0x1b) & 0xFF; + } + } + for (var n = 0; n < 4; ++n) { + result[j] = t1 ^= result[j - 32]; + j++; + result[j] = t2 ^= result[j - 32]; + j++; + result[j] = t3 ^= result[j - 32]; + j++; + result[j] = t4 ^= result[j - 32]; + j++; + } + } + return result; + } + function decrypt256(input, key) { + var state = new Uint8Array(16); + state.set(input); + var i, j, k; + var t, u, v; + for (j = 0, k = 224; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (i = 13; i >= 1; --i) { + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (j = 0; j < 16; ++j) { + state[j] = inv_s[state[j]]; + } + for (j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + for (j = 0; j < 16; j += 4) { + var s0 = mix[state[j]], s1 = mix[state[j + 1]], s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; + t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8; + state[j] = t >>> 24 & 0xFF; + state[j + 1] = t >> 16 & 0xFF; + state[j + 2] = t >> 8 & 0xFF; + state[j + 3] = t & 0xFF; + } + } + t = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = t; + t = state[14]; + u = state[10]; + state[14] = state[6]; + state[10] = state[2]; + state[6] = t; + state[2] = u; + t = state[15]; + u = state[11]; + v = state[7]; + state[15] = state[3]; + state[11] = t; + state[7] = u; + state[3] = v; + for (j = 0; j < 16; ++j) { + state[j] = inv_s[state[j]]; + state[j] ^= key[j]; + } + return state; + } + function encrypt256(input, key) { + var t, u, v, k; + var state = new Uint8Array(16); + state.set(input); + for (j = 0; j < 16; ++j) { + state[j] ^= key[j]; + } + for (i = 1; i < 14; i++) { + for (j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (var j = 0; j < 16; j += 4) { + var s0 = state[j + 0], s1 = state[j + 1]; + var s2 = state[j + 2], s3 = state[j + 3]; + t = s0 ^ s1 ^ s2 ^ s3; + state[j + 0] ^= t ^ mixCol[s0 ^ s1]; + state[j + 1] ^= t ^ mixCol[s1 ^ s2]; + state[j + 2] ^= t ^ mixCol[s2 ^ s3]; + state[j + 3] ^= t ^ mixCol[s3 ^ s0]; + } + for (j = 0, k = i * 16; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + } + for (j = 0; j < 16; ++j) { + state[j] = s[state[j]]; + } + v = state[1]; + state[1] = state[5]; + state[5] = state[9]; + state[9] = state[13]; + state[13] = v; + v = state[2]; + u = state[6]; + state[2] = state[10]; + state[6] = state[14]; + state[10] = v; + state[14] = u; + v = state[3]; + u = state[7]; + t = state[11]; + state[3] = state[15]; + state[7] = v; + state[11] = u; + state[15] = t; + for (j = 0, k = 224; j < 16; ++j, ++k) { + state[j] ^= key[k]; + } + return state; + } + function AES256Cipher(key) { + this.key = expandKey256(key); + this.buffer = new Uint8Array(16); + this.bufferPosition = 0; + } + function decryptBlock2(data, finalize) { + var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = [], iv = this.iv; + for (i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + var plain = decrypt256(buffer, this.key); + for (j = 0; j < 16; ++j) { + plain[j] ^= iv[j]; + } + iv = buffer; + result.push(plain); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array([]); + } + var outputLength = 16 * result.length; + if (finalize) { + var lastBlock = result[result.length - 1]; + var psLen = lastBlock[15]; + if (psLen <= 16) { + for (i = 15, ii = 16 - psLen; i >= ii; --i) { + if (lastBlock[i] !== psLen) { + psLen = 0; + break; + } + } + outputLength -= psLen; + result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); + } + } + var output = new Uint8Array(outputLength); + for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + AES256Cipher.prototype = { + decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) { + var i, sourceLength = data.length; + var buffer = this.buffer, bufferLength = this.bufferPosition; + if (iv) { + this.iv = iv; + } else { + for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { + buffer[bufferLength] = data[i]; + } + if (bufferLength < 16) { + this.bufferLength = bufferLength; + return new Uint8Array([]); + } + this.iv = buffer; + data = data.subarray(16); + } + this.buffer = new Uint8Array(16); + this.bufferLength = 0; + this.decryptBlock = decryptBlock2; + return this.decryptBlock(data, finalize); + }, + encrypt: function AES256Cipher_encrypt(data, iv) { + var i, j, ii, sourceLength = data.length, buffer = this.buffer, bufferLength = this.bufferPosition, result = []; + if (!iv) { + iv = new Uint8Array(16); + } + for (i = 0; i < sourceLength; ++i) { + buffer[bufferLength] = data[i]; + ++bufferLength; + if (bufferLength < 16) { + continue; + } + for (j = 0; j < 16; ++j) { + buffer[j] ^= iv[j]; + } + var cipher = encrypt256(buffer, this.key); + this.iv = cipher; + result.push(cipher); + buffer = new Uint8Array(16); + bufferLength = 0; + } + this.buffer = buffer; + this.bufferLength = bufferLength; + this.iv = iv; + if (result.length === 0) { + return new Uint8Array([]); + } + var outputLength = 16 * result.length; + var output = new Uint8Array(outputLength); + for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { + output.set(result[i], j); + } + return output; + } + }; + return AES256Cipher; + }(); + var PDF17 = function PDF17Closure() { + function compareByteArrays(array1, array2) { + if (array1.length !== array2.length) { + return false; + } + for (var i = 0; i < array1.length; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + } + function PDF17() { + } + PDF17.prototype = { + checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + var hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + var result = calculateSHA256(hashData, 0, hashData.length); + return compareByteArrays(result, ownerPassword); + }, + checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) { + var hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + var result = calculateSHA256(hashData, 0, hashData.length); + return compareByteArrays(result, userPassword); + }, + getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + var hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + var key = calculateSHA256(hashData, 0, hashData.length); + var cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + }, + getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) { + var hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + var key = calculateSHA256(hashData, 0, hashData.length); + var cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } + }; + return PDF17; + }(); + var PDF20 = function PDF20Closure() { + function concatArrays(array1, array2) { + var t = new Uint8Array(array1.length + array2.length); + t.set(array1, 0); + t.set(array2, array1.length); + return t; + } + function calculatePDF20Hash(password, input, userBytes) { + var k = calculateSHA256(input, 0, input.length).subarray(0, 32); + var e = [0]; + var i = 0; + while (i < 64 || e[e.length - 1] > i - 32) { + var arrayLength = password.length + k.length + userBytes.length; + var k1 = new Uint8Array(arrayLength * 64); + var array = concatArrays(password, k); + array = concatArrays(array, userBytes); + for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) { + k1.set(array, pos); + } + var cipher = new AES128Cipher(k.subarray(0, 16)); + e = cipher.encrypt(k1, k.subarray(16, 32)); + var remainder = 0; + for (var z = 0; z < 16; z++) { + remainder *= 256 % 3; + remainder %= 3; + remainder += (e[z] >>> 0) % 3; + remainder %= 3; + } + if (remainder === 0) { + k = calculateSHA256(e, 0, e.length); + } else if (remainder === 1) { + k = calculateSHA384(e, 0, e.length); + } else if (remainder === 2) { + k = calculateSHA512(e, 0, e.length); + } + i++; + } + return k.subarray(0, 32); + } + function PDF20() { + } + function compareByteArrays(array1, array2) { + if (array1.length !== array2.length) { + return false; + } + for (var i = 0; i < array1.length; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + } + PDF20.prototype = { + hash: function PDF20_hash(password, concatBytes, userBytes) { + return calculatePDF20Hash(password, concatBytes, userBytes); + }, + checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) { + var hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerValidationSalt, password.length); + hashData.set(userBytes, password.length + ownerValidationSalt.length); + var result = calculatePDF20Hash(password, hashData, userBytes); + return compareByteArrays(result, ownerPassword); + }, + checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) { + var hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userValidationSalt, password.length); + var result = calculatePDF20Hash(password, hashData, []); + return compareByteArrays(result, userPassword); + }, + getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) { + var hashData = new Uint8Array(password.length + 56); + hashData.set(password, 0); + hashData.set(ownerKeySalt, password.length); + hashData.set(userBytes, password.length + ownerKeySalt.length); + var key = calculatePDF20Hash(password, hashData, userBytes); + var cipher = new AES256Cipher(key); + return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16)); + }, + getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) { + var hashData = new Uint8Array(password.length + 8); + hashData.set(password, 0); + hashData.set(userKeySalt, password.length); + var key = calculatePDF20Hash(password, hashData, []); + var cipher = new AES256Cipher(key); + return cipher.decryptBlock(userEncryption, false, new Uint8Array(16)); + } + }; + return PDF20; + }(); + var CipherTransform = function CipherTransformClosure() { + function CipherTransform(stringCipherConstructor, streamCipherConstructor) { + this.StringCipherConstructor = stringCipherConstructor; + this.StreamCipherConstructor = streamCipherConstructor; + } + CipherTransform.prototype = { + createStream: function CipherTransform_createStream(stream, length) { + var cipher = new this.StreamCipherConstructor(); + return new DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) { + return cipher.decryptBlock(data, finalize); + }); + }, + decryptString: function CipherTransform_decryptString(s) { + var cipher = new this.StringCipherConstructor(); + var data = stringToBytes(s); + data = cipher.decryptBlock(data, true); + return bytesToString(data); + } + }; + return CipherTransform; + }(); + var CipherTransformFactory = function CipherTransformFactoryClosure() { + var defaultPasswordBytes = new Uint8Array([ + 0x28, + 0xBF, + 0x4E, + 0x5E, + 0x4E, + 0x75, + 0x8A, + 0x41, + 0x64, + 0x00, + 0x4E, + 0x56, + 0xFF, + 0xFA, + 0x01, + 0x08, + 0x2E, + 0x2E, + 0x00, + 0xB6, + 0xD0, + 0x68, + 0x3E, + 0x80, + 0x2F, + 0x0C, + 0xA9, + 0xFE, + 0x64, + 0x53, + 0x69, + 0x7A + ]); + function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) { + if (password) { + var passwordLength = Math.min(127, password.length); + password = password.subarray(0, passwordLength); + } else { + password = []; + } + var pdfAlgorithm; + if (revision === 6) { + pdfAlgorithm = new PDF20(); + } else { + pdfAlgorithm = new PDF17(); + } + if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) { + return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); + } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) { + return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption); + } + return null; + } + function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) { + var hashDataSize = 40 + ownerPassword.length + fileId.length; + var hashData = new Uint8Array(hashDataSize), i = 0, j, n; + if (password) { + n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + } + j = 0; + while (i < 32) { + hashData[i++] = defaultPasswordBytes[j++]; + } + for (j = 0, n = ownerPassword.length; j < n; ++j) { + hashData[i++] = ownerPassword[j]; + } + hashData[i++] = flags & 0xFF; + hashData[i++] = flags >> 8 & 0xFF; + hashData[i++] = flags >> 16 & 0xFF; + hashData[i++] = flags >>> 24 & 0xFF; + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + if (revision >= 4 && !encryptMetadata) { + hashData[i++] = 0xFF; + hashData[i++] = 0xFF; + hashData[i++] = 0xFF; + hashData[i++] = 0xFF; + } + var hash = calculateMD5(hashData, 0, i); + var keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, keyLengthInBytes); + } + } + var encryptionKey = hash.subarray(0, keyLengthInBytes); + var cipher, checkData; + if (revision >= 3) { + for (i = 0; i < 32; ++i) { + hashData[i] = defaultPasswordBytes[i]; + } + for (j = 0, n = fileId.length; j < n; ++j) { + hashData[i++] = fileId[j]; + } + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); + n = encryptionKey.length; + var derivedKey = new Uint8Array(n), k; + for (j = 1; j <= 19; ++j) { + for (k = 0; k < n; ++k) { + derivedKey[k] = encryptionKey[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + checkData = cipher.encryptBlock(checkData); + } + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } else { + cipher = new ARCFourCipher(encryptionKey); + checkData = cipher.encryptBlock(defaultPasswordBytes); + for (j = 0, n = checkData.length; j < n; ++j) { + if (userPassword[j] !== checkData[j]) { + return null; + } + } + } + return encryptionKey; + } + function decodeUserPassword(password, ownerPassword, revision, keyLength) { + var hashData = new Uint8Array(32), i = 0, j, n; + n = Math.min(32, password.length); + for (; i < n; ++i) { + hashData[i] = password[i]; + } + j = 0; + while (i < 32) { + hashData[i++] = defaultPasswordBytes[j++]; + } + var hash = calculateMD5(hashData, 0, i); + var keyLengthInBytes = keyLength >> 3; + if (revision >= 3) { + for (j = 0; j < 50; ++j) { + hash = calculateMD5(hash, 0, hash.length); + } + } + var cipher, userPassword; + if (revision >= 3) { + userPassword = ownerPassword; + var derivedKey = new Uint8Array(keyLengthInBytes), k; + for (j = 19; j >= 0; j--) { + for (k = 0; k < keyLengthInBytes; ++k) { + derivedKey[k] = hash[k] ^ j; + } + cipher = new ARCFourCipher(derivedKey); + userPassword = cipher.encryptBlock(userPassword); + } + } else { + cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); + userPassword = cipher.encryptBlock(ownerPassword); + } + return userPassword; + } + var identityName = Name.get('Identity'); + function CipherTransformFactory(dict, fileId, password) { + var filter = dict.get('Filter'); + if (!isName(filter, 'Standard')) { + error('unknown encryption method'); + } + this.dict = dict; + var algorithm = dict.get('V'); + if (!isInt(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) { + error('unsupported encryption algorithm'); + } + this.algorithm = algorithm; + var keyLength = dict.get('Length'); + if (!keyLength) { + if (algorithm <= 3) { + keyLength = 40; + } else { + var cfDict = dict.get('CF'); + var streamCryptoName = dict.get('StmF'); + if (isDict(cfDict) && isName(streamCryptoName)) { + cfDict.suppressEncryption = true; + var handlerDict = cfDict.get(streamCryptoName.name); + keyLength = handlerDict && handlerDict.get('Length') || 128; + if (keyLength < 40) { + keyLength <<= 3; + } + } + } + } + if (!isInt(keyLength) || keyLength < 40 || keyLength % 8 !== 0) { + error('invalid key length'); + } + var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32); + var userPassword = stringToBytes(dict.get('U')).subarray(0, 32); + var flags = dict.get('P'); + var revision = dict.get('R'); + var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false; + this.encryptMetadata = encryptMetadata; + var fileIdBytes = stringToBytes(fileId); + var passwordBytes; + if (password) { + if (revision === 6) { + try { + password = utf8StringToString(password); + } catch (ex) { + warn('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.'); + } + } + passwordBytes = stringToBytes(password); + } + var encryptionKey; + if (algorithm !== 5) { + encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } else { + var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40); + var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48); + var uBytes = stringToBytes(dict.get('U')).subarray(0, 48); + var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40); + var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48); + var ownerEncryption = stringToBytes(dict.get('OE')); + var userEncryption = stringToBytes(dict.get('UE')); + var perms = stringToBytes(dict.get('Perms')); + encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms); + } + if (!encryptionKey && !password) { + throw new PasswordException('No password given', PasswordResponses.NEED_PASSWORD); + } else if (!encryptionKey && password) { + var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength); + encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata); + } + if (!encryptionKey) { + throw new PasswordException('Incorrect Password', PasswordResponses.INCORRECT_PASSWORD); + } + this.encryptionKey = encryptionKey; + if (algorithm >= 4) { + var cf = dict.get('CF'); + if (isDict(cf)) { + cf.suppressEncryption = true; + } + this.cf = cf; + this.stmf = dict.get('StmF') || identityName; + this.strf = dict.get('StrF') || identityName; + this.eff = dict.get('EFF') || this.stmf; + } + } + function buildObjectKey(num, gen, encryptionKey, isAes) { + var key = new Uint8Array(encryptionKey.length + 9), i, n; + for (i = 0, n = encryptionKey.length; i < n; ++i) { + key[i] = encryptionKey[i]; + } + key[i++] = num & 0xFF; + key[i++] = num >> 8 & 0xFF; + key[i++] = num >> 16 & 0xFF; + key[i++] = gen & 0xFF; + key[i++] = gen >> 8 & 0xFF; + if (isAes) { + key[i++] = 0x73; + key[i++] = 0x41; + key[i++] = 0x6C; + key[i++] = 0x54; + } + var hash = calculateMD5(key, 0, i); + return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); + } + function buildCipherConstructor(cf, name, num, gen, key) { + assert(isName(name), 'Invalid crypt filter name.'); + var cryptFilter = cf.get(name.name); + var cfm; + if (cryptFilter !== null && cryptFilter !== undefined) { + cfm = cryptFilter.get('CFM'); + } + if (!cfm || cfm.name === 'None') { + return function cipherTransformFactoryBuildCipherConstructorNone() { + return new NullCipher(); + }; + } + if (cfm.name === 'V2') { + return function cipherTransformFactoryBuildCipherConstructorV2() { + return new ARCFourCipher(buildObjectKey(num, gen, key, false)); + }; + } + if (cfm.name === 'AESV2') { + return function cipherTransformFactoryBuildCipherConstructorAESV2() { + return new AES128Cipher(buildObjectKey(num, gen, key, true)); + }; + } + if (cfm.name === 'AESV3') { + return function cipherTransformFactoryBuildCipherConstructorAESV3() { + return new AES256Cipher(key); + }; + } + error('Unknown crypto method'); + } + CipherTransformFactory.prototype = { + createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) { + if (this.algorithm === 4 || this.algorithm === 5) { + return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey)); + } + var key = buildObjectKey(num, gen, this.encryptionKey, false); + var cipherConstructor = function buildCipherCipherConstructor() { + return new ARCFourCipher(key); + }; + return new CipherTransform(cipherConstructor, cipherConstructor); + } + }; + return CipherTransformFactory; + }(); + exports.AES128Cipher = AES128Cipher; + exports.AES256Cipher = AES256Cipher; + exports.ARCFourCipher = ARCFourCipher; + exports.CipherTransformFactory = CipherTransformFactory; + exports.PDF17 = PDF17; + exports.PDF20 = PDF20; + exports.calculateMD5 = calculateMD5; + exports.calculateSHA256 = calculateSHA256; + exports.calculateSHA384 = calculateSHA384; + exports.calculateSHA512 = calculateSHA512; + })); + (function (root, factory) { + factory(root.pdfjsCoreFontRenderer = {}, root.pdfjsSharedUtil, root.pdfjsCoreStream, root.pdfjsCoreGlyphList, root.pdfjsCoreEncodings, root.pdfjsCoreCFFParser); + }(this, function (exports, sharedUtil, coreStream, coreGlyphList, coreEncodings, coreCFFParser) { + var Util = sharedUtil.Util; + var bytesToString = sharedUtil.bytesToString; + var error = sharedUtil.error; + var Stream = coreStream.Stream; + var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; + var StandardEncoding = coreEncodings.StandardEncoding; + var CFFParser = coreCFFParser.CFFParser; + var FontRendererFactory = function FontRendererFactoryClosure() { + function getLong(data, offset) { + return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; + } + function getUshort(data, offset) { + return data[offset] << 8 | data[offset + 1]; + } + function parseCmap(data, start, end) { + var offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16); + var format = getUshort(data, start + offset); + var length, ranges, p, i; + if (format === 4) { + length = getUshort(data, start + offset + 2); + var segCount = getUshort(data, start + offset + 6) >> 1; + p = start + offset + 14; + ranges = []; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i] = { end: getUshort(data, p) }; + } + p += 2; + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].start = getUshort(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + ranges[i].idDelta = getUshort(data, p); + } + for (i = 0; i < segCount; i++, p += 2) { + var idOffset = getUshort(data, p); + if (idOffset === 0) { + continue; + } + ranges[i].ids = []; + for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { + ranges[i].ids[j] = getUshort(data, p + idOffset); + idOffset += 2; + } + } + return ranges; + } else if (format === 12) { + length = getLong(data, start + offset + 4); + var groups = getLong(data, start + offset + 12); + p = start + offset + 16; + ranges = []; + for (i = 0; i < groups; i++) { + ranges.push({ + start: getLong(data, p), + end: getLong(data, p + 4), + idDelta: getLong(data, p + 8) - getLong(data, p) + }); + p += 12; + } + return ranges; + } + error('not supported cmap: ' + format); + } + function parseCff(data, start, end, seacAnalysisEnabled) { + var properties = {}; + var parser = new CFFParser(new Stream(data, start, end - start), properties, seacAnalysisEnabled); + var cff = parser.parse(); + return { + glyphs: cff.charStrings.objects, + subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects, + gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects + }; + } + function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { + var itemSize, itemDecode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = function fontItemDecodeLong(data, offset) { + return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; + }; + } else { + itemSize = 2; + itemDecode = function fontItemDecode(data, offset) { + return data[offset] << 9 | data[offset + 1] << 1; + }; + } + var glyphs = []; + var startOffset = itemDecode(loca, 0); + for (var j = itemSize; j < loca.length; j += itemSize) { + var endOffset = itemDecode(loca, j); + glyphs.push(glyf.subarray(startOffset, endOffset)); + startOffset = endOffset; + } + return glyphs; + } + function lookupCmap(ranges, unicode) { + var code = unicode.charCodeAt(0), gid = 0; + var l = 0, r = ranges.length - 1; + while (l < r) { + var c = l + r + 1 >> 1; + if (code < ranges[c].start) { + r = c - 1; + } else { + l = c; + } + } + if (ranges[l].start <= code && code <= ranges[l].end) { + gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xFFFF; + } + return { + charCode: code, + glyphId: gid + }; + } + function compileGlyf(code, cmds, font) { + function moveTo(x, y) { + cmds.push({ + cmd: 'moveTo', + args: [ + x, + y + ] + }); + } + function lineTo(x, y) { + cmds.push({ + cmd: 'lineTo', + args: [ + x, + y + ] + }); + } + function quadraticCurveTo(xa, ya, x, y) { + cmds.push({ + cmd: 'quadraticCurveTo', + args: [ + xa, + ya, + x, + y + ] + }); + } + var i = 0; + var numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16; + var flags; + var x = 0, y = 0; + i += 10; + if (numberOfContours < 0) { + do { + flags = code[i] << 8 | code[i + 1]; + var glyphIndex = code[i + 2] << 8 | code[i + 3]; + i += 4; + var arg1, arg2; + if (flags & 0x01) { + arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16; + arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16; + i += 4; + } else { + arg1 = code[i++]; + arg2 = code[i++]; + } + if (flags & 0x02) { + x = arg1; + y = arg2; + } else { + x = 0; + y = 0; + } + var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0; + if (flags & 0x08) { + scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824; + i += 2; + } else if (flags & 0x40) { + scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824; + scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824; + i += 4; + } else if (flags & 0x80) { + scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824; + scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824; + scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824; + scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824; + i += 8; + } + var subglyph = font.glyphs[glyphIndex]; + if (subglyph) { + cmds.push({ cmd: 'save' }); + cmds.push({ + cmd: 'transform', + args: [ + scaleX, + scale01, + scale10, + scaleY, + x, + y + ] + }); + compileGlyf(subglyph, cmds, font); + cmds.push({ cmd: 'restore' }); + } + } while (flags & 0x20); + } else { + var endPtsOfContours = []; + var j, jj; + for (j = 0; j < numberOfContours; j++) { + endPtsOfContours.push(code[i] << 8 | code[i + 1]); + i += 2; + } + var instructionLength = code[i] << 8 | code[i + 1]; + i += 2 + instructionLength; + var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1; + var points = []; + while (points.length < numberOfPoints) { + flags = code[i++]; + var repeat = 1; + if (flags & 0x08) { + repeat += code[i++]; + } + while (repeat-- > 0) { + points.push({ flags: flags }); + } + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x12) { + case 0x00: + x += (code[i] << 24 | code[i + 1] << 16) >> 16; + i += 2; + break; + case 0x02: + x -= code[i++]; + break; + case 0x12: + x += code[i++]; + break; + } + points[j].x = x; + } + for (j = 0; j < numberOfPoints; j++) { + switch (points[j].flags & 0x24) { + case 0x00: + y += (code[i] << 24 | code[i + 1] << 16) >> 16; + i += 2; + break; + case 0x04: + y -= code[i++]; + break; + case 0x24: + y += code[i++]; + break; + } + points[j].y = y; + } + var startPoint = 0; + for (i = 0; i < numberOfContours; i++) { + var endPoint = endPtsOfContours[i]; + var contour = points.slice(startPoint, endPoint + 1); + if (contour[0].flags & 1) { + contour.push(contour[0]); + } else if (contour[contour.length - 1].flags & 1) { + contour.unshift(contour[contour.length - 1]); + } else { + var p = { + flags: 1, + x: (contour[0].x + contour[contour.length - 1].x) / 2, + y: (contour[0].y + contour[contour.length - 1].y) / 2 + }; + contour.unshift(p); + contour.push(p); + } + moveTo(contour[0].x, contour[0].y); + for (j = 1, jj = contour.length; j < jj; j++) { + if (contour[j].flags & 1) { + lineTo(contour[j].x, contour[j].y); + } else if (contour[j + 1].flags & 1) { + quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y); + j++; + } else { + quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2); + } + } + startPoint = endPoint + 1; + } + } + } + function compileCharString(code, cmds, font) { + var stack = []; + var x = 0, y = 0; + var stems = 0; + function moveTo(x, y) { + cmds.push({ + cmd: 'moveTo', + args: [ + x, + y + ] + }); + } + function lineTo(x, y) { + cmds.push({ + cmd: 'lineTo', + args: [ + x, + y + ] + }); + } + function bezierCurveTo(x1, y1, x2, y2, x, y) { + cmds.push({ + cmd: 'bezierCurveTo', + args: [ + x1, + y1, + x2, + y2, + x, + y + ] + }); + } + function parse(code) { + var i = 0; + while (i < code.length) { + var stackClean = false; + var v = code[i++]; + var xa, xb, ya, yb, y1, y2, y3, n, subrCode; + switch (v) { + case 1: + stems += stack.length >> 1; + stackClean = true; + break; + case 3: + stems += stack.length >> 1; + stackClean = true; + break; + case 4: + y += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 5: + while (stack.length > 0) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + break; + case 6: + while (stack.length > 0) { + x += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + y += stack.shift(); + lineTo(x, y); + } + break; + case 7: + while (stack.length > 0) { + y += stack.shift(); + lineTo(x, y); + if (stack.length === 0) { + break; + } + x += stack.shift(); + lineTo(x, y); + } + break; + case 8: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 10: + n = stack.pop() + font.subrsBias; + subrCode = font.subrs[n]; + if (subrCode) { + parse(subrCode); + } + break; + case 11: + return; + case 12: + v = code[i++]; + switch (v) { + case 34: + xa = x + stack.shift(); + xb = xa + stack.shift(); + y1 = y + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y, xb, y1, x, y1); + xa = x + stack.shift(); + xb = xa + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y, x, y); + break; + case 35: + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + stack.pop(); + break; + case 36: + xa = x + stack.shift(); + y1 = y + stack.shift(); + xb = xa + stack.shift(); + y2 = y1 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y1, xb, y2, x, y2); + xa = x + stack.shift(); + xb = xa + stack.shift(); + y3 = y2 + stack.shift(); + x = xb + stack.shift(); + bezierCurveTo(xa, y2, xb, y3, x, y); + break; + case 37: + var x0 = x, y0 = y; + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb; + if (Math.abs(x - x0) > Math.abs(y - y0)) { + x += stack.shift(); + } else { + y += stack.shift(); + } + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + default: + error('unknown operator: 12 ' + v); + } + break; + case 14: + if (stack.length >= 4) { + var achar = stack.pop(); + var bchar = stack.pop(); + y = stack.pop(); + x = stack.pop(); + cmds.push({ cmd: 'save' }); + cmds.push({ + cmd: 'translate', + args: [ + x, + y + ] + }); + var cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[achar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font); + cmds.push({ cmd: 'restore' }); + cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[StandardEncoding[bchar]])); + compileCharString(font.glyphs[cmap.glyphId], cmds, font); + } + return; + case 18: + stems += stack.length >> 1; + stackClean = true; + break; + case 19: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 20: + stems += stack.length >> 1; + i += stems + 7 >> 3; + stackClean = true; + break; + case 21: + y += stack.pop(); + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 22: + x += stack.pop(); + moveTo(x, y); + stackClean = true; + break; + case 23: + stems += stack.length >> 1; + stackClean = true; + break; + case 24: + while (stack.length > 2) { + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + break; + case 25: + while (stack.length > 6) { + x += stack.shift(); + y += stack.shift(); + lineTo(x, y); + } + xa = x + stack.shift(); + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + break; + case 26: + if (stack.length % 2) { + x += stack.shift(); + } + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb; + y = yb + stack.shift(); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 27: + if (stack.length % 2) { + y += stack.shift(); + } + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb; + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 28: + stack.push((code[i] << 24 | code[i + 1] << 16) >> 16); + i += 2; + break; + case 29: + n = stack.pop() + font.gsubrsBias; + subrCode = font.gsubrs[n]; + if (subrCode) { + parse(subrCode); + } + break; + case 30: + while (stack.length > 0) { + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + case 31: + while (stack.length > 0) { + xa = x + stack.shift(); + ya = y; + xb = xa + stack.shift(); + yb = ya + stack.shift(); + y = yb + stack.shift(); + x = xb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + if (stack.length === 0) { + break; + } + xa = x; + ya = y + stack.shift(); + xb = xa + stack.shift(); + yb = ya + stack.shift(); + x = xb + stack.shift(); + y = yb + (stack.length === 1 ? stack.shift() : 0); + bezierCurveTo(xa, ya, xb, yb, x, y); + } + break; + default: + if (v < 32) { + error('unknown operator: ' + v); + } + if (v < 247) { + stack.push(v - 139); + } else if (v < 251) { + stack.push((v - 247) * 256 + code[i++] + 108); + } else if (v < 255) { + stack.push(-(v - 251) * 256 - code[i++] - 108); + } else { + stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536); + i += 4; + } + break; + } + if (stackClean) { + stack.length = 0; + } + } + } + parse(code); + } + var noop = ''; + function CompiledFont(fontMatrix) { + this.compiledGlyphs = Object.create(null); + this.compiledCharCodeToGlyphId = Object.create(null); + this.fontMatrix = fontMatrix; + } + CompiledFont.prototype = { + getPathJs: function (unicode) { + var cmap = lookupCmap(this.cmap, unicode); + var fn = this.compiledGlyphs[cmap.glyphId]; + if (!fn) { + fn = this.compileGlyph(this.glyphs[cmap.glyphId]); + this.compiledGlyphs[cmap.glyphId] = fn; + } + if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) { + this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId; + } + return fn; + }, + compileGlyph: function (code) { + if (!code || code.length === 0 || code[0] === 14) { + return noop; + } + var cmds = []; + cmds.push({ cmd: 'save' }); + cmds.push({ + cmd: 'transform', + args: this.fontMatrix.slice() + }); + cmds.push({ + cmd: 'scale', + args: [ + 'size', + '-size' + ] + }); + this.compileGlyphImpl(code, cmds); + cmds.push({ cmd: 'restore' }); + return cmds; + }, + compileGlyphImpl: function () { + error('Children classes should implement this.'); + }, + hasBuiltPath: function (unicode) { + var cmap = lookupCmap(this.cmap, unicode); + return this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined; + } + }; + function TrueTypeCompiled(glyphs, cmap, fontMatrix) { + fontMatrix = fontMatrix || [ + 0.000488, + 0, + 0, + 0.000488, + 0, + 0 + ]; + CompiledFont.call(this, fontMatrix); + this.glyphs = glyphs; + this.cmap = cmap; + } + Util.inherit(TrueTypeCompiled, CompiledFont, { + compileGlyphImpl: function (code, cmds) { + compileGlyf(code, cmds, this); + } + }); + function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) { + fontMatrix = fontMatrix || [ + 0.001, + 0, + 0, + 0.001, + 0, + 0 + ]; + CompiledFont.call(this, fontMatrix); + this.glyphs = cffInfo.glyphs; + this.gsubrs = cffInfo.gsubrs || []; + this.subrs = cffInfo.subrs || []; + this.cmap = cmap; + this.glyphNameMap = glyphNameMap || getGlyphsUnicode(); + this.gsubrsBias = this.gsubrs.length < 1240 ? 107 : this.gsubrs.length < 33900 ? 1131 : 32768; + this.subrsBias = this.subrs.length < 1240 ? 107 : this.subrs.length < 33900 ? 1131 : 32768; + } + Util.inherit(Type2Compiled, CompiledFont, { + compileGlyphImpl: function (code, cmds) { + compileCharString(code, cmds, this); + } + }); + return { + create: function FontRendererFactory_create(font, seacAnalysisEnabled) { + var data = new Uint8Array(font.data); + var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; + var numTables = getUshort(data, 4); + for (var i = 0, p = 12; i < numTables; i++, p += 16) { + var tag = bytesToString(data.subarray(p, p + 4)); + var offset = getLong(data, p + 8); + var length = getLong(data, p + 12); + switch (tag) { + case 'cmap': + cmap = parseCmap(data, offset, offset + length); + break; + case 'glyf': + glyf = data.subarray(offset, offset + length); + break; + case 'loca': + loca = data.subarray(offset, offset + length); + break; + case 'head': + unitsPerEm = getUshort(data, offset + 18); + indexToLocFormat = getUshort(data, offset + 50); + break; + case 'CFF ': + cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); + break; + } + } + if (glyf) { + var fontMatrix = !unitsPerEm ? font.fontMatrix : [ + 1 / unitsPerEm, + 0, + 0, + 1 / unitsPerEm, + 0, + 0 + ]; + return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); + } + return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); + } + }; + }(); + exports.FontRendererFactory = FontRendererFactory; + })); + (function (root, factory) { + factory(root.pdfjsCoreParser = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream); + }(this, function (exports, sharedUtil, corePrimitives, coreStream) { + var MissingDataException = sharedUtil.MissingDataException; + var StreamType = sharedUtil.StreamType; + var assert = sharedUtil.assert; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isInt = sharedUtil.isInt; + var isNum = sharedUtil.isNum; + var isString = sharedUtil.isString; + var warn = sharedUtil.warn; + var Cmd = corePrimitives.Cmd; + var Dict = corePrimitives.Dict; + var Name = corePrimitives.Name; + var Ref = corePrimitives.Ref; + var isCmd = corePrimitives.isCmd; + var isDict = corePrimitives.isDict; + var isName = corePrimitives.isName; + var Ascii85Stream = coreStream.Ascii85Stream; + var AsciiHexStream = coreStream.AsciiHexStream; + var CCITTFaxStream = coreStream.CCITTFaxStream; + var FlateStream = coreStream.FlateStream; + var Jbig2Stream = coreStream.Jbig2Stream; + var JpegStream = coreStream.JpegStream; + var JpxStream = coreStream.JpxStream; + var LZWStream = coreStream.LZWStream; + var NullStream = coreStream.NullStream; + var PredictorStream = coreStream.PredictorStream; + var RunLengthStream = coreStream.RunLengthStream; + var EOF = {}; + function isEOF(v) { + return v === EOF; + } + var MAX_LENGTH_TO_CACHE = 1000; + var Parser = function ParserClosure() { + function Parser(lexer, allowStreams, xref, recoveryMode) { + this.lexer = lexer; + this.allowStreams = allowStreams; + this.xref = xref; + this.recoveryMode = recoveryMode || false; + this.imageCache = Object.create(null); + this.refill(); + } + Parser.prototype = { + refill: function Parser_refill() { + this.buf1 = this.lexer.getObj(); + this.buf2 = this.lexer.getObj(); + }, + shift: function Parser_shift() { + if (isCmd(this.buf2, 'ID')) { + this.buf1 = this.buf2; + this.buf2 = null; + } else { + this.buf1 = this.buf2; + this.buf2 = this.lexer.getObj(); + } + }, + tryShift: function Parser_tryShift() { + try { + this.shift(); + return true; + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + return false; + } + }, + getObj: function Parser_getObj(cipherTransform) { + var buf1 = this.buf1; + this.shift(); + if (buf1 instanceof Cmd) { + switch (buf1.cmd) { + case 'BI': + return this.makeInlineImage(cipherTransform); + case '[': + var array = []; + while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) { + array.push(this.getObj(cipherTransform)); + } + if (isEOF(this.buf1)) { + if (!this.recoveryMode) { + error('End of file inside array'); + } + return array; + } + this.shift(); + return array; + case '<<': + var dict = new Dict(this.xref); + while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { + if (!isName(this.buf1)) { + info('Malformed dictionary: key must be a name object'); + this.shift(); + continue; + } + var key = this.buf1.name; + this.shift(); + if (isEOF(this.buf1)) { + break; + } + dict.set(key, this.getObj(cipherTransform)); + } + if (isEOF(this.buf1)) { + if (!this.recoveryMode) { + error('End of file inside dictionary'); + } + return dict; + } + if (isCmd(this.buf2, 'stream')) { + return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict; + } + this.shift(); + return dict; + default: + return buf1; + } + } + if (isInt(buf1)) { + var num = buf1; + if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { + var ref = new Ref(num, this.buf1); + this.shift(); + this.shift(); + return ref; + } + return num; + } + if (isString(buf1)) { + var str = buf1; + if (cipherTransform) { + str = cipherTransform.decryptString(str); + } + return str; + } + return buf1; + }, + findDefaultInlineStreamEnd: function Parser_findDefaultInlineStreamEnd(stream) { + var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD; + var startPos = stream.pos, state = 0, ch, i, n, followingBytes; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else { + assert(state === 2); + if (ch === SPACE || ch === LF || ch === CR) { + n = 5; + followingBytes = stream.peekBytes(n); + for (i = 0; i < n; i++) { + ch = followingBytes[i]; + if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) { + state = 0; + break; + } + } + if (state === 2) { + break; + } + } else + { + state = 0; + } + } + } + return stream.pos - 4 - startPos; + }, + findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) { + var startPos = stream.pos, foundEOI = false, b, markerLength, length; + while ((b = stream.getByte()) !== -1) { + if (b !== 0xFF) { + continue; + } + switch (stream.getByte()) { + case 0x00: + break; + case 0xFF: + stream.skip(-1); + break; + case 0xD9: + foundEOI = true; + break; + case 0xC0: + case 0xC1: + case 0xC2: + case 0xC3: + case 0xC5: + case 0xC6: + case 0xC7: + case 0xC9: + case 0xCA: + case 0xCB: + case 0xCD: + case 0xCE: + case 0xCF: + case 0xC4: + case 0xCC: + case 0xDA: + case 0xDB: + case 0xDC: + case 0xDD: + case 0xDE: + case 0xDF: + case 0xE0: + case 0xE1: + case 0xE2: + case 0xE3: + case 0xE4: + case 0xE5: + case 0xE6: + case 0xE7: + case 0xE8: + case 0xE9: + case 0xEA: + case 0xEB: + case 0xEC: + case 0xED: + case 0xEE: + case 0xEF: + case 0xFE: + markerLength = stream.getUint16(); + if (markerLength > 2) { + stream.skip(markerLength - 2); + } else + { + stream.skip(-2); + } + break; + } + if (foundEOI) { + break; + } + } + length = stream.pos - startPos; + if (b === -1) { + warn('Inline DCTDecode image stream: ' + 'EOI marker not found, searching for /EI/ instead.'); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + }, + findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) { + var TILDE = 0x7E, GT = 0x3E; + var startPos = stream.pos, ch, length; + while ((ch = stream.getByte()) !== -1) { + if (ch === TILDE && stream.peekByte() === GT) { + stream.skip(); + break; + } + } + length = stream.pos - startPos; + if (ch === -1) { + warn('Inline ASCII85Decode image stream: ' + 'EOD marker not found, searching for /EI/ instead.'); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + }, + findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { + var GT = 0x3E; + var startPos = stream.pos, ch, length; + while ((ch = stream.getByte()) !== -1) { + if (ch === GT) { + break; + } + } + length = stream.pos - startPos; + if (ch === -1) { + warn('Inline ASCIIHexDecode image stream: ' + 'EOD marker not found, searching for /EI/ instead.'); + stream.skip(-length); + return this.findDefaultInlineStreamEnd(stream); + } + this.inlineStreamSkipEI(stream); + return length; + }, + inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { + var E = 0x45, I = 0x49; + var state = 0, ch; + while ((ch = stream.getByte()) !== -1) { + if (state === 0) { + state = ch === E ? 1 : 0; + } else if (state === 1) { + state = ch === I ? 2 : 0; + } else if (state === 2) { + break; + } + } + }, + makeInlineImage: function Parser_makeInlineImage(cipherTransform) { + var lexer = this.lexer; + var stream = lexer.stream; + var dict = new Dict(this.xref); + while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { + if (!isName(this.buf1)) { + error('Dictionary key must be a name object'); + } + var key = this.buf1.name; + this.shift(); + if (isEOF(this.buf1)) { + break; + } + dict.set(key, this.getObj(cipherTransform)); + } + var filter = dict.get('Filter', 'F'), filterName; + if (isName(filter)) { + filterName = filter.name; + } else if (isArray(filter)) { + var filterZero = this.xref.fetchIfRef(filter[0]); + if (isName(filterZero)) { + filterName = filterZero.name; + } + } + var startPos = stream.pos, length, i, ii; + if (filterName === 'DCTDecode' || filterName === 'DCT') { + length = this.findDCTDecodeInlineStreamEnd(stream); + } else if (filterName === 'ASCII85Decide' || filterName === 'A85') { + length = this.findASCII85DecodeInlineStreamEnd(stream); + } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') { + length = this.findASCIIHexDecodeInlineStreamEnd(stream); + } else { + length = this.findDefaultInlineStreamEnd(stream); + } + var imageStream = stream.makeSubStream(startPos, length, dict); + var adler32; + if (length < MAX_LENGTH_TO_CACHE) { + var imageBytes = imageStream.getBytes(); + imageStream.reset(); + var a = 1; + var b = 0; + for (i = 0, ii = imageBytes.length; i < ii; ++i) { + a += imageBytes[i] & 0xff; + b += a; + } + adler32 = b % 65521 << 16 | a % 65521; + if (this.imageCache.adler32 === adler32) { + this.buf2 = Cmd.get('EI'); + this.shift(); + this.imageCache[adler32].reset(); + return this.imageCache[adler32]; + } + } + if (cipherTransform) { + imageStream = cipherTransform.createStream(imageStream, length); + } + imageStream = this.filter(imageStream, dict, length); + imageStream.dict = dict; + if (adler32 !== undefined) { + imageStream.cacheKey = 'inline_' + length + '_' + adler32; + this.imageCache[adler32] = imageStream; + } + this.buf2 = Cmd.get('EI'); + this.shift(); + return imageStream; + }, + makeStream: function Parser_makeStream(dict, cipherTransform) { + var lexer = this.lexer; + var stream = lexer.stream; + lexer.skipToNextLine(); + var pos = stream.pos - 1; + var length = dict.get('Length'); + if (!isInt(length)) { + info('Bad ' + length + ' attribute in stream'); + length = 0; + } + stream.pos = pos + length; + lexer.nextChar(); + if (this.tryShift() && isCmd(this.buf2, 'endstream')) { + this.shift(); + } else + { + stream.pos = pos; + var SCAN_BLOCK_SIZE = 2048; + var ENDSTREAM_SIGNATURE_LENGTH = 9; + var ENDSTREAM_SIGNATURE = [ + 0x65, + 0x6E, + 0x64, + 0x73, + 0x74, + 0x72, + 0x65, + 0x61, + 0x6D + ]; + var skipped = 0, found = false, i, j; + while (stream.pos < stream.end) { + var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE); + var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH; + if (scanLength <= 0) { + break; + } + found = false; + i = 0; + while (i < scanLength) { + j = 0; + while (j < ENDSTREAM_SIGNATURE_LENGTH && scanBytes[i + j] === ENDSTREAM_SIGNATURE[j]) { + j++; + } + if (j >= ENDSTREAM_SIGNATURE_LENGTH) { + found = true; + break; + } + i++; + } + if (found) { + skipped += i; + stream.pos += i; + break; + } + skipped += scanLength; + stream.pos += scanLength; + } + if (!found) { + error('Missing endstream'); + } + length = skipped; + lexer.nextChar(); + this.shift(); + this.shift(); + } + this.shift(); + stream = stream.makeSubStream(pos, length, dict); + if (cipherTransform) { + stream = cipherTransform.createStream(stream, length); + } + stream = this.filter(stream, dict, length); + stream.dict = dict; + return stream; + }, + filter: function Parser_filter(stream, dict, length) { + var filter = dict.get('Filter', 'F'); + var params = dict.get('DecodeParms', 'DP'); + if (isName(filter)) { + if (isArray(params)) { + params = this.xref.fetchIfRef(params[0]); + } + return this.makeFilter(stream, filter.name, length, params); + } + var maybeLength = length; + if (isArray(filter)) { + var filterArray = filter; + var paramsArray = params; + for (var i = 0, ii = filterArray.length; i < ii; ++i) { + filter = this.xref.fetchIfRef(filterArray[i]); + if (!isName(filter)) { + error('Bad filter name: ' + filter); + } + params = null; + if (isArray(paramsArray) && i in paramsArray) { + params = this.xref.fetchIfRef(paramsArray[i]); + } + stream = this.makeFilter(stream, filter.name, maybeLength, params); + maybeLength = null; + } + } + return stream; + }, + makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { + if (maybeLength === 0) { + warn('Empty "' + name + '" stream.'); + return new NullStream(stream); + } + try { + var xrefStreamStats = this.xref.stats.streamTypes; + if (name === 'FlateDecode' || name === 'Fl') { + xrefStreamStats[StreamType.FLATE] = true; + if (params) { + return new PredictorStream(new FlateStream(stream, maybeLength), maybeLength, params); + } + return new FlateStream(stream, maybeLength); + } + if (name === 'LZWDecode' || name === 'LZW') { + xrefStreamStats[StreamType.LZW] = true; + var earlyChange = 1; + if (params) { + if (params.has('EarlyChange')) { + earlyChange = params.get('EarlyChange'); + } + return new PredictorStream(new LZWStream(stream, maybeLength, earlyChange), maybeLength, params); + } + return new LZWStream(stream, maybeLength, earlyChange); + } + if (name === 'DCTDecode' || name === 'DCT') { + xrefStreamStats[StreamType.DCT] = true; + return new JpegStream(stream, maybeLength, stream.dict, params); + } + if (name === 'JPXDecode' || name === 'JPX') { + xrefStreamStats[StreamType.JPX] = true; + return new JpxStream(stream, maybeLength, stream.dict, params); + } + if (name === 'ASCII85Decode' || name === 'A85') { + xrefStreamStats[StreamType.A85] = true; + return new Ascii85Stream(stream, maybeLength); + } + if (name === 'ASCIIHexDecode' || name === 'AHx') { + xrefStreamStats[StreamType.AHX] = true; + return new AsciiHexStream(stream, maybeLength); + } + if (name === 'CCITTFaxDecode' || name === 'CCF') { + xrefStreamStats[StreamType.CCF] = true; + return new CCITTFaxStream(stream, maybeLength, params); + } + if (name === 'RunLengthDecode' || name === 'RL') { + xrefStreamStats[StreamType.RL] = true; + return new RunLengthStream(stream, maybeLength); + } + if (name === 'JBIG2Decode') { + xrefStreamStats[StreamType.JBIG] = true; + return new Jbig2Stream(stream, maybeLength, stream.dict, params); + } + warn('filter "' + name + '" not supported yet'); + return stream; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn('Invalid stream: \"' + ex + '\"'); + return new NullStream(stream); + } + } + }; + return Parser; + }(); + var Lexer = function LexerClosure() { + function Lexer(stream, knownCommands) { + this.stream = stream; + this.nextChar(); + this.strBuf = []; + this.knownCommands = knownCommands; + } + var specialChars = [ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 2, + 2, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + function toHexDigit(ch) { + if (ch >= 0x30 && ch <= 0x39) { + return ch & 0x0F; + } + if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) { + return (ch & 0x0F) + 9; + } + return -1; + } + Lexer.prototype = { + nextChar: function Lexer_nextChar() { + return this.currentChar = this.stream.getByte(); + }, + peekChar: function Lexer_peekChar() { + return this.stream.peekByte(); + }, + getNumber: function Lexer_getNumber() { + var ch = this.currentChar; + var eNotation = false; + var divideBy = 0; + var sign = 1; + if (ch === 0x2D) { + sign = -1; + ch = this.nextChar(); + if (ch === 0x2D) { + ch = this.nextChar(); + } + } else if (ch === 0x2B) { + ch = this.nextChar(); + } + if (ch === 0x2E) { + divideBy = 10; + ch = this.nextChar(); + } + if (ch < 0x30 || ch > 0x39) { + error('Invalid number: ' + String.fromCharCode(ch)); + return 0; + } + var baseValue = ch - 0x30; + var powerValue = 0; + var powerValueSign = 1; + while ((ch = this.nextChar()) >= 0) { + if (0x30 <= ch && ch <= 0x39) { + var currentDigit = ch - 0x30; + if (eNotation) { + powerValue = powerValue * 10 + currentDigit; + } else { + if (divideBy !== 0) { + divideBy *= 10; + } + baseValue = baseValue * 10 + currentDigit; + } + } else if (ch === 0x2E) { + if (divideBy === 0) { + divideBy = 1; + } else { + break; + } + } else if (ch === 0x2D) { + warn('Badly formatted number'); + } else if (ch === 0x45 || ch === 0x65) { + ch = this.peekChar(); + if (ch === 0x2B || ch === 0x2D) { + powerValueSign = ch === 0x2D ? -1 : 1; + this.nextChar(); + } else if (ch < 0x30 || ch > 0x39) { + break; + } + eNotation = true; + } else { + break; + } + } + if (divideBy !== 0) { + baseValue /= divideBy; + } + if (eNotation) { + baseValue *= Math.pow(10, powerValueSign * powerValue); + } + return sign * baseValue; + }, + getString: function Lexer_getString() { + var numParen = 1; + var done = false; + var strBuf = this.strBuf; + strBuf.length = 0; + var ch = this.nextChar(); + while (true) { + var charBuffered = false; + switch (ch | 0) { + case -1: + warn('Unterminated string'); + done = true; + break; + case 0x28: + ++numParen; + strBuf.push('('); + break; + case 0x29: + if (--numParen === 0) { + this.nextChar(); + done = true; + } else { + strBuf.push(')'); + } + break; + case 0x5C: + ch = this.nextChar(); + switch (ch) { + case -1: + warn('Unterminated string'); + done = true; + break; + case 0x6E: + strBuf.push('\n'); + break; + case 0x72: + strBuf.push('\r'); + break; + case 0x74: + strBuf.push('\t'); + break; + case 0x62: + strBuf.push('\b'); + break; + case 0x66: + strBuf.push('\f'); + break; + case 0x5C: + case 0x28: + case 0x29: + strBuf.push(String.fromCharCode(ch)); + break; + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + var x = ch & 0x0F; + ch = this.nextChar(); + charBuffered = true; + if (ch >= 0x30 && ch <= 0x37) { + x = (x << 3) + (ch & 0x0F); + ch = this.nextChar(); + if (ch >= 0x30 && ch <= 0x37) { + charBuffered = false; + x = (x << 3) + (ch & 0x0F); + } + } + strBuf.push(String.fromCharCode(x)); + break; + case 0x0D: + if (this.peekChar() === 0x0A) { + this.nextChar(); + } + break; + case 0x0A: + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + break; + default: + strBuf.push(String.fromCharCode(ch)); + break; + } + if (done) { + break; + } + if (!charBuffered) { + ch = this.nextChar(); + } + } + return strBuf.join(''); + }, + getName: function Lexer_getName() { + var ch, previousCh; + var strBuf = this.strBuf; + strBuf.length = 0; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + if (ch === 0x23) { + ch = this.nextChar(); + if (specialChars[ch]) { + warn('Lexer_getName: ' + 'NUMBER SIGN (#) should be followed by a hexadecimal number.'); + strBuf.push('#'); + break; + } + var x = toHexDigit(ch); + if (x !== -1) { + previousCh = ch; + ch = this.nextChar(); + var x2 = toHexDigit(ch); + if (x2 === -1) { + warn('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) + ') in hexadecimal number.'); + strBuf.push('#', String.fromCharCode(previousCh)); + if (specialChars[ch]) { + break; + } + strBuf.push(String.fromCharCode(ch)); + continue; + } + strBuf.push(String.fromCharCode(x << 4 | x2)); + } else { + strBuf.push('#', String.fromCharCode(ch)); + } + } else { + strBuf.push(String.fromCharCode(ch)); + } + } + if (strBuf.length > 127) { + warn('name token is longer than allowed by the spec: ' + strBuf.length); + } + return Name.get(strBuf.join('')); + }, + getHexString: function Lexer_getHexString() { + var strBuf = this.strBuf; + strBuf.length = 0; + var ch = this.currentChar; + var isFirstHex = true; + var firstDigit; + var secondDigit; + while (true) { + if (ch < 0) { + warn('Unterminated hex string'); + break; + } else if (ch === 0x3E) { + this.nextChar(); + break; + } else if (specialChars[ch] === 1) { + ch = this.nextChar(); + continue; + } else { + if (isFirstHex) { + firstDigit = toHexDigit(ch); + if (firstDigit === -1) { + warn('Ignoring invalid character "' + ch + '" in hex string'); + ch = this.nextChar(); + continue; + } + } else { + secondDigit = toHexDigit(ch); + if (secondDigit === -1) { + warn('Ignoring invalid character "' + ch + '" in hex string'); + ch = this.nextChar(); + continue; + } + strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit)); + } + isFirstHex = !isFirstHex; + ch = this.nextChar(); + } + } + return strBuf.join(''); + }, + getObj: function Lexer_getObj() { + var comment = false; + var ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0A || ch === 0x0D) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (specialChars[ch] !== 1) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x2B: + case 0x2D: + case 0x2E: + return this.getNumber(); + case 0x28: + return this.getString(); + case 0x2F: + return this.getName(); + case 0x5B: + this.nextChar(); + return Cmd.get('['); + case 0x5D: + this.nextChar(); + return Cmd.get(']'); + case 0x3C: + ch = this.nextChar(); + if (ch === 0x3C) { + this.nextChar(); + return Cmd.get('<<'); + } + return this.getHexString(); + case 0x3E: + ch = this.nextChar(); + if (ch === 0x3E) { + this.nextChar(); + return Cmd.get('>>'); + } + return Cmd.get('>'); + case 0x7B: + this.nextChar(); + return Cmd.get('{'); + case 0x7D: + this.nextChar(); + return Cmd.get('}'); + case 0x29: + error('Illegal character: ' + ch); + break; + } + var str = String.fromCharCode(ch); + var knownCommands = this.knownCommands; + var knownCommandFound = knownCommands && knownCommands[str] !== undefined; + while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { + var possibleCommand = str + String.fromCharCode(ch); + if (knownCommandFound && knownCommands[possibleCommand] === undefined) { + break; + } + if (str.length === 128) { + error('Command token too long: ' + str.length); + } + str = possibleCommand; + knownCommandFound = knownCommands && knownCommands[str] !== undefined; + } + if (str === 'true') { + return true; + } + if (str === 'false') { + return false; + } + if (str === 'null') { + return null; + } + return Cmd.get(str); + }, + skipToNextLine: function Lexer_skipToNextLine() { + var ch = this.currentChar; + while (ch >= 0) { + if (ch === 0x0D) { + ch = this.nextChar(); + if (ch === 0x0A) { + this.nextChar(); + } + break; + } else if (ch === 0x0A) { + this.nextChar(); + break; + } + ch = this.nextChar(); + } + } + }; + return Lexer; + }(); + var Linearization = { + create: function LinearizationCreate(stream) { + function getInt(name, allowZeroValue) { + var obj = linDict.get(name); + if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { + return obj; + } + throw new Error('The "' + name + '" parameter in the linearization ' + 'dictionary is invalid.'); + } + function getHints() { + var hints = linDict.get('H'), hintsLength, item; + if (isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) { + for (var index = 0; index < hintsLength; index++) { + if (!(isInt(item = hints[index]) && item > 0)) { + throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.'); + } + } + return hints; + } + throw new Error('Hint array in the linearization dictionary is invalid.'); + } + var parser = new Parser(new Lexer(stream), false, null); + var obj1 = parser.getObj(); + var obj2 = parser.getObj(); + var obj3 = parser.getObj(); + var linDict = parser.getObj(); + var obj, length; + if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) && isNum(obj = linDict.get('Linearized')) && obj > 0)) { + return null; + } else if ((length = getInt('L')) !== stream.length) { + throw new Error('The "L" parameter in the linearization dictionary ' + 'does not equal the stream length.'); + } + return { + length: length, + hints: getHints(), + objectNumberFirst: getInt('O'), + endFirst: getInt('E'), + numPages: getInt('N'), + mainXRefEntriesOffset: getInt('T'), + pageFirst: linDict.has('P') ? getInt('P', true) : 0 + }; + } + }; + exports.EOF = EOF; + exports.Lexer = Lexer; + exports.Linearization = Linearization; + exports.Parser = Parser; + exports.isEOF = isEOF; + })); + (function (root, factory) { + factory(root.pdfjsCoreType1Parser = {}, root.pdfjsSharedUtil, root.pdfjsCoreStream, root.pdfjsCoreEncodings); + }(this, function (exports, sharedUtil, coreStream, coreEncodings) { + var warn = sharedUtil.warn; + var isSpace = sharedUtil.isSpace; + var Stream = coreStream.Stream; + var getEncoding = coreEncodings.getEncoding; + var HINTING_ENABLED = false; + var Type1CharString = function Type1CharStringClosure() { + var COMMAND_MAP = { + 'hstem': [1], + 'vstem': [3], + 'vmoveto': [4], + 'rlineto': [5], + 'hlineto': [6], + 'vlineto': [7], + 'rrcurveto': [8], + 'callsubr': [10], + 'flex': [ + 12, + 35 + ], + 'drop': [ + 12, + 18 + ], + 'endchar': [14], + 'rmoveto': [21], + 'hmoveto': [22], + 'vhcurveto': [30], + 'hvcurveto': [31] + }; + function Type1CharString() { + this.width = 0; + this.lsb = 0; + this.flexing = false; + this.output = []; + this.stack = []; + } + Type1CharString.prototype = { + convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) { + var count = encoded.length; + var error = false; + var wx, sbx, subrNumber; + for (var i = 0; i < count; i++) { + var value = encoded[i]; + if (value < 32) { + if (value === 12) { + value = (value << 8) + encoded[++i]; + } + switch (value) { + case 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case 3: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case 4: + if (this.flexing) { + if (this.stack.length < 1) { + error = true; + break; + } + var dy = this.stack.pop(); + this.stack.push(0, dy); + break; + } + error = this.executeCommand(1, COMMAND_MAP.vmoveto); + break; + case 5: + error = this.executeCommand(2, COMMAND_MAP.rlineto); + break; + case 6: + error = this.executeCommand(1, COMMAND_MAP.hlineto); + break; + case 7: + error = this.executeCommand(1, COMMAND_MAP.vlineto); + break; + case 8: + error = this.executeCommand(6, COMMAND_MAP.rrcurveto); + break; + case 9: + this.stack = []; + break; + case 10: + if (this.stack.length < 1) { + error = true; + break; + } + subrNumber = this.stack.pop(); + error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled); + break; + case 11: + return error; + case 13: + if (this.stack.length < 2) { + error = true; + break; + } + wx = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx); + error = this.executeCommand(2, COMMAND_MAP.hmoveto); + break; + case 14: + this.output.push(COMMAND_MAP.endchar[0]); + break; + case 21: + if (this.flexing) { + break; + } + error = this.executeCommand(2, COMMAND_MAP.rmoveto); + break; + case 22: + if (this.flexing) { + this.stack.push(0); + break; + } + error = this.executeCommand(1, COMMAND_MAP.hmoveto); + break; + case 30: + error = this.executeCommand(4, COMMAND_MAP.vhcurveto); + break; + case 31: + error = this.executeCommand(4, COMMAND_MAP.hvcurveto); + break; + case (12 << 8) + 0: + this.stack = []; + break; + case (12 << 8) + 1: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.vstem); + break; + case (12 << 8) + 2: + if (!HINTING_ENABLED) { + this.stack = []; + break; + } + error = this.executeCommand(2, COMMAND_MAP.hstem); + break; + case (12 << 8) + 6: + if (seacAnalysisEnabled) { + this.seac = this.stack.splice(-4, 4); + error = this.executeCommand(0, COMMAND_MAP.endchar); + } else { + error = this.executeCommand(4, COMMAND_MAP.endchar); + } + break; + case (12 << 8) + 7: + if (this.stack.length < 4) { + error = true; + break; + } + var wy = this.stack.pop(); + wx = this.stack.pop(); + var sby = this.stack.pop(); + sbx = this.stack.pop(); + this.lsb = sbx; + this.width = wx; + this.stack.push(wx, sbx, sby); + error = this.executeCommand(3, COMMAND_MAP.rmoveto); + break; + case (12 << 8) + 12: + if (this.stack.length < 2) { + error = true; + break; + } + var num2 = this.stack.pop(); + var num1 = this.stack.pop(); + this.stack.push(num1 / num2); + break; + case (12 << 8) + 16: + if (this.stack.length < 2) { + error = true; + break; + } + subrNumber = this.stack.pop(); + var numArgs = this.stack.pop(); + if (subrNumber === 0 && numArgs === 3) { + var flexArgs = this.stack.splice(this.stack.length - 17, 17); + this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]); + error = this.executeCommand(13, COMMAND_MAP.flex, true); + this.flexing = false; + this.stack.push(flexArgs[15], flexArgs[16]); + } else if (subrNumber === 1 && numArgs === 0) { + this.flexing = true; + } + break; + case (12 << 8) + 17: + break; + case (12 << 8) + 33: + this.stack = []; + break; + default: + warn('Unknown type 1 charstring command of "' + value + '"'); + break; + } + if (error) { + break; + } + continue; + } else if (value <= 246) { + value = value - 139; + } else if (value <= 250) { + value = (value - 247) * 256 + encoded[++i] + 108; + } else if (value <= 254) { + value = -((value - 251) * 256) - encoded[++i] - 108; + } else { + value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; + } + this.stack.push(value); + } + return error; + }, + executeCommand: function (howManyArgs, command, keepStack) { + var stackLength = this.stack.length; + if (howManyArgs > stackLength) { + return true; + } + var start = stackLength - howManyArgs; + for (var i = start; i < stackLength; i++) { + var value = this.stack[i]; + if (value === (value | 0)) { + this.output.push(28, value >> 8 & 0xff, value & 0xff); + } else { + value = 65536 * value | 0; + this.output.push(255, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF); + } + } + this.output.push.apply(this.output, command); + if (keepStack) { + this.stack.splice(start, howManyArgs); + } else { + this.stack.length = 0; + } + return false; + } + }; + return Type1CharString; + }(); + var Type1Parser = function Type1ParserClosure() { + var EEXEC_ENCRYPT_KEY = 55665; + var CHAR_STRS_ENCRYPT_KEY = 4330; + function isHexDigit(code) { + return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102; + } + function decrypt(data, key, discardNumber) { + if (discardNumber >= data.length) { + return new Uint8Array(0); + } + var r = key | 0, c1 = 52845, c2 = 22719, i, j; + for (i = 0; i < discardNumber; i++) { + r = (data[i] + r) * c1 + c2 & (1 << 16) - 1; + } + var count = data.length - discardNumber; + var decrypted = new Uint8Array(count); + for (i = discardNumber, j = 0; j < count; i++, j++) { + var value = data[i]; + decrypted[j] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + return decrypted; + } + function decryptAscii(data, key, discardNumber) { + var r = key | 0, c1 = 52845, c2 = 22719; + var count = data.length, maybeLength = count >>> 1; + var decrypted = new Uint8Array(maybeLength); + var i, j; + for (i = 0, j = 0; i < count; i++) { + var digit1 = data[i]; + if (!isHexDigit(digit1)) { + continue; + } + i++; + var digit2; + while (i < count && !isHexDigit(digit2 = data[i])) { + i++; + } + if (i < count) { + var value = parseInt(String.fromCharCode(digit1, digit2), 16); + decrypted[j++] = value ^ r >> 8; + r = (value + r) * c1 + c2 & (1 << 16) - 1; + } + } + return Array.prototype.slice.call(decrypted, discardNumber, j); + } + function isSpecial(c) { + return c === 0x2F || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D || c === 0x28 || c === 0x29; + } + function Type1Parser(stream, encrypted, seacAnalysisEnabled) { + if (encrypted) { + var data = stream.getBytes(); + var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3])); + stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); + } + this.seacAnalysisEnabled = !!seacAnalysisEnabled; + this.stream = stream; + this.nextChar(); + } + Type1Parser.prototype = { + readNumberArray: function Type1Parser_readNumberArray() { + this.getToken(); + var array = []; + while (true) { + var token = this.getToken(); + if (token === null || token === ']' || token === '}') { + break; + } + array.push(parseFloat(token || 0)); + } + return array; + }, + readNumber: function Type1Parser_readNumber() { + var token = this.getToken(); + return parseFloat(token || 0); + }, + readInt: function Type1Parser_readInt() { + var token = this.getToken(); + return parseInt(token || 0, 10) | 0; + }, + readBoolean: function Type1Parser_readBoolean() { + var token = this.getToken(); + return token === 'true' ? 1 : 0; + }, + nextChar: function Type1_nextChar() { + return this.currentChar = this.stream.getByte(); + }, + getToken: function Type1Parser_getToken() { + var comment = false; + var ch = this.currentChar; + while (true) { + if (ch === -1) { + return null; + } + if (comment) { + if (ch === 0x0A || ch === 0x0D) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isSpace(ch)) { + break; + } + ch = this.nextChar(); + } + if (isSpecial(ch)) { + this.nextChar(); + return String.fromCharCode(ch); + } + var token = ''; + do { + token += String.fromCharCode(ch); + ch = this.nextChar(); + } while (ch >= 0 && !isSpace(ch) && !isSpecial(ch)); + return token; + }, + extractFontProgram: function Type1Parser_extractFontProgram() { + var stream = this.stream; + var subrs = [], charstrings = []; + var privateData = Object.create(null); + privateData['lenIV'] = 4; + var program = { + subrs: [], + charstrings: [], + properties: { 'privateData': privateData } + }; + var token, length, data, lenIV, encoded; + while ((token = this.getToken()) !== null) { + if (token !== '/') { + continue; + } + token = this.getToken(); + switch (token) { + case 'CharStrings': + this.getToken(); + this.getToken(); + this.getToken(); + this.getToken(); + while (true) { + token = this.getToken(); + if (token === null || token === 'end') { + break; + } + if (token !== '/') { + continue; + } + var glyph = this.getToken(); + length = this.readInt(); + this.getToken(); + data = stream.makeSubStream(stream.pos, length); + lenIV = program.properties.privateData['lenIV']; + encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); + stream.skip(length); + this.nextChar(); + token = this.getToken(); + if (token === 'noaccess') { + this.getToken(); + } + charstrings.push({ + glyph: glyph, + encoded: encoded + }); + } + break; + case 'Subrs': + var num = this.readInt(); + this.getToken(); + while ((token = this.getToken()) === 'dup') { + var index = this.readInt(); + length = this.readInt(); + this.getToken(); + data = stream.makeSubStream(stream.pos, length); + lenIV = program.properties.privateData['lenIV']; + encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); + stream.skip(length); + this.nextChar(); + token = this.getToken(); + if (token === 'noaccess') { + this.getToken(); + } + subrs[index] = encoded; + } + break; + case 'BlueValues': + case 'OtherBlues': + case 'FamilyBlues': + case 'FamilyOtherBlues': + var blueArray = this.readNumberArray(); + if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) { + program.properties.privateData[token] = blueArray; + } + break; + case 'StemSnapH': + case 'StemSnapV': + program.properties.privateData[token] = this.readNumberArray(); + break; + case 'StdHW': + case 'StdVW': + program.properties.privateData[token] = this.readNumberArray()[0]; + break; + case 'BlueShift': + case 'lenIV': + case 'BlueFuzz': + case 'BlueScale': + case 'LanguageGroup': + case 'ExpansionFactor': + program.properties.privateData[token] = this.readNumber(); + break; + case 'ForceBold': + program.properties.privateData[token] = this.readBoolean(); + break; + } + } + for (var i = 0; i < charstrings.length; i++) { + glyph = charstrings[i].glyph; + encoded = charstrings[i].encoded; + var charString = new Type1CharString(); + var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled); + var output = charString.output; + if (error) { + output = [14]; + } + program.charstrings.push({ + glyphName: glyph, + charstring: output, + width: charString.width, + lsb: charString.lsb, + seac: charString.seac + }); + } + return program; + }, + extractFontHeader: function Type1Parser_extractFontHeader(properties) { + var token; + while ((token = this.getToken()) !== null) { + if (token !== '/') { + continue; + } + token = this.getToken(); + switch (token) { + case 'FontMatrix': + var matrix = this.readNumberArray(); + properties.fontMatrix = matrix; + break; + case 'Encoding': + var encodingArg = this.getToken(); + var encoding; + if (!/^\d+$/.test(encodingArg)) { + encoding = getEncoding(encodingArg); + } else { + encoding = []; + var size = parseInt(encodingArg, 10) | 0; + this.getToken(); + for (var j = 0; j < size; j++) { + token = this.getToken(); + while (token !== 'dup' && token !== 'def') { + token = this.getToken(); + if (token === null) { + return; + } + } + if (token === 'def') { + break; + } + var index = this.readInt(); + this.getToken(); + var glyph = this.getToken(); + encoding[index] = glyph; + this.getToken(); + } + } + properties.builtInEncoding = encoding; + break; + case 'FontBBox': + var fontBBox = this.readNumberArray(); + properties.ascent = fontBBox[3]; + properties.descent = fontBBox[1]; + properties.ascentScaled = true; + break; + } + } + } + }; + return Type1Parser; + }(); + exports.Type1Parser = Type1Parser; + })); + (function (root, factory) { + factory(root.pdfjsCoreCMap = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser); + }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser) { + var Util = sharedUtil.Util; + var assert = sharedUtil.assert; + var warn = sharedUtil.warn; + var error = sharedUtil.error; + var isInt = sharedUtil.isInt; + var isString = sharedUtil.isString; + var MissingDataException = sharedUtil.MissingDataException; + var isName = corePrimitives.isName; + var isCmd = corePrimitives.isCmd; + var isStream = corePrimitives.isStream; + var StringStream = coreStream.StringStream; + var Lexer = coreParser.Lexer; + var isEOF = coreParser.isEOF; + var BUILT_IN_CMAPS = [ + 'Adobe-GB1-UCS2', + 'Adobe-CNS1-UCS2', + 'Adobe-Japan1-UCS2', + 'Adobe-Korea1-UCS2', + '78-EUC-H', + '78-EUC-V', + '78-H', + '78-RKSJ-H', + '78-RKSJ-V', + '78-V', + '78ms-RKSJ-H', + '78ms-RKSJ-V', + '83pv-RKSJ-H', + '90ms-RKSJ-H', + '90ms-RKSJ-V', + '90msp-RKSJ-H', + '90msp-RKSJ-V', + '90pv-RKSJ-H', + '90pv-RKSJ-V', + 'Add-H', + 'Add-RKSJ-H', + 'Add-RKSJ-V', + 'Add-V', + 'Adobe-CNS1-0', + 'Adobe-CNS1-1', + 'Adobe-CNS1-2', + 'Adobe-CNS1-3', + 'Adobe-CNS1-4', + 'Adobe-CNS1-5', + 'Adobe-CNS1-6', + 'Adobe-GB1-0', + 'Adobe-GB1-1', + 'Adobe-GB1-2', + 'Adobe-GB1-3', + 'Adobe-GB1-4', + 'Adobe-GB1-5', + 'Adobe-Japan1-0', + 'Adobe-Japan1-1', + 'Adobe-Japan1-2', + 'Adobe-Japan1-3', + 'Adobe-Japan1-4', + 'Adobe-Japan1-5', + 'Adobe-Japan1-6', + 'Adobe-Korea1-0', + 'Adobe-Korea1-1', + 'Adobe-Korea1-2', + 'B5-H', + 'B5-V', + 'B5pc-H', + 'B5pc-V', + 'CNS-EUC-H', + 'CNS-EUC-V', + 'CNS1-H', + 'CNS1-V', + 'CNS2-H', + 'CNS2-V', + 'ETHK-B5-H', + 'ETHK-B5-V', + 'ETen-B5-H', + 'ETen-B5-V', + 'ETenms-B5-H', + 'ETenms-B5-V', + 'EUC-H', + 'EUC-V', + 'Ext-H', + 'Ext-RKSJ-H', + 'Ext-RKSJ-V', + 'Ext-V', + 'GB-EUC-H', + 'GB-EUC-V', + 'GB-H', + 'GB-V', + 'GBK-EUC-H', + 'GBK-EUC-V', + 'GBK2K-H', + 'GBK2K-V', + 'GBKp-EUC-H', + 'GBKp-EUC-V', + 'GBT-EUC-H', + 'GBT-EUC-V', + 'GBT-H', + 'GBT-V', + 'GBTpc-EUC-H', + 'GBTpc-EUC-V', + 'GBpc-EUC-H', + 'GBpc-EUC-V', + 'H', + 'HKdla-B5-H', + 'HKdla-B5-V', + 'HKdlb-B5-H', + 'HKdlb-B5-V', + 'HKgccs-B5-H', + 'HKgccs-B5-V', + 'HKm314-B5-H', + 'HKm314-B5-V', + 'HKm471-B5-H', + 'HKm471-B5-V', + 'HKscs-B5-H', + 'HKscs-B5-V', + 'Hankaku', + 'Hiragana', + 'KSC-EUC-H', + 'KSC-EUC-V', + 'KSC-H', + 'KSC-Johab-H', + 'KSC-Johab-V', + 'KSC-V', + 'KSCms-UHC-H', + 'KSCms-UHC-HW-H', + 'KSCms-UHC-HW-V', + 'KSCms-UHC-V', + 'KSCpc-EUC-H', + 'KSCpc-EUC-V', + 'Katakana', + 'NWP-H', + 'NWP-V', + 'RKSJ-H', + 'RKSJ-V', + 'Roman', + 'UniCNS-UCS2-H', + 'UniCNS-UCS2-V', + 'UniCNS-UTF16-H', + 'UniCNS-UTF16-V', + 'UniCNS-UTF32-H', + 'UniCNS-UTF32-V', + 'UniCNS-UTF8-H', + 'UniCNS-UTF8-V', + 'UniGB-UCS2-H', + 'UniGB-UCS2-V', + 'UniGB-UTF16-H', + 'UniGB-UTF16-V', + 'UniGB-UTF32-H', + 'UniGB-UTF32-V', + 'UniGB-UTF8-H', + 'UniGB-UTF8-V', + 'UniJIS-UCS2-H', + 'UniJIS-UCS2-HW-H', + 'UniJIS-UCS2-HW-V', + 'UniJIS-UCS2-V', + 'UniJIS-UTF16-H', + 'UniJIS-UTF16-V', + 'UniJIS-UTF32-H', + 'UniJIS-UTF32-V', + 'UniJIS-UTF8-H', + 'UniJIS-UTF8-V', + 'UniJIS2004-UTF16-H', + 'UniJIS2004-UTF16-V', + 'UniJIS2004-UTF32-H', + 'UniJIS2004-UTF32-V', + 'UniJIS2004-UTF8-H', + 'UniJIS2004-UTF8-V', + 'UniJISPro-UCS2-HW-V', + 'UniJISPro-UCS2-V', + 'UniJISPro-UTF8-V', + 'UniJISX0213-UTF32-H', + 'UniJISX0213-UTF32-V', + 'UniJISX02132004-UTF32-H', + 'UniJISX02132004-UTF32-V', + 'UniKS-UCS2-H', + 'UniKS-UCS2-V', + 'UniKS-UTF16-H', + 'UniKS-UTF16-V', + 'UniKS-UTF32-H', + 'UniKS-UTF32-V', + 'UniKS-UTF8-H', + 'UniKS-UTF8-V', + 'V', + 'WP-Symbol' + ]; + var CMap = function CMapClosure() { + function CMap(builtInCMap) { + this.codespaceRanges = [ + [], + [], + [], + [] + ]; + this.numCodespaceRanges = 0; + this._map = []; + this.name = ''; + this.vertical = false; + this.useCMap = null; + this.builtInCMap = builtInCMap; + } + CMap.prototype = { + addCodespaceRange: function (n, low, high) { + this.codespaceRanges[n - 1].push(low, high); + this.numCodespaceRanges++; + }, + mapCidRange: function (low, high, dstLow) { + while (low <= high) { + this._map[low++] = dstLow++; + } + }, + mapBfRange: function (low, high, dstLow) { + var lastByte = dstLow.length - 1; + while (low <= high) { + this._map[low++] = dstLow; + dstLow = dstLow.substr(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); + } + }, + mapBfRangeToArray: function (low, high, array) { + var i = 0, ii = array.length; + while (low <= high && i < ii) { + this._map[low] = array[i++]; + ++low; + } + }, + mapOne: function (src, dst) { + this._map[src] = dst; + }, + lookup: function (code) { + return this._map[code]; + }, + contains: function (code) { + return this._map[code] !== undefined; + }, + forEach: function (callback) { + var map = this._map; + var length = map.length; + var i; + if (length <= 0x10000) { + for (i = 0; i < length; i++) { + if (map[i] !== undefined) { + callback(i, map[i]); + } + } + } else { + for (i in this._map) { + callback(i, map[i]); + } + } + }, + charCodeOf: function (value) { + return this._map.indexOf(value); + }, + getMap: function () { + return this._map; + }, + readCharCode: function (str, offset, out) { + var c = 0; + var codespaceRanges = this.codespaceRanges; + var codespaceRangesLen = this.codespaceRanges.length; + for (var n = 0; n < codespaceRangesLen; n++) { + c = (c << 8 | str.charCodeAt(offset + n)) >>> 0; + var codespaceRange = codespaceRanges[n]; + for (var k = 0, kk = codespaceRange.length; k < kk;) { + var low = codespaceRange[k++]; + var high = codespaceRange[k++]; + if (c >= low && c <= high) { + out.charcode = c; + out.length = n + 1; + return; + } + } + } + out.charcode = 0; + out.length = 1; + }, + get length() { + return this._map.length; + }, + get isIdentityCMap() { + if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) { + return false; + } + if (this._map.length !== 0x10000) { + return false; + } + for (var i = 0; i < 0x10000; i++) { + if (this._map[i] !== i) { + return false; + } + } + return true; + } + }; + return CMap; + }(); + var IdentityCMap = function IdentityCMapClosure() { + function IdentityCMap(vertical, n) { + CMap.call(this); + this.vertical = vertical; + this.addCodespaceRange(n, 0, 0xffff); + } + Util.inherit(IdentityCMap, CMap, {}); + IdentityCMap.prototype = { + addCodespaceRange: CMap.prototype.addCodespaceRange, + mapCidRange: function (low, high, dstLow) { + error('should not call mapCidRange'); + }, + mapBfRange: function (low, high, dstLow) { + error('should not call mapBfRange'); + }, + mapBfRangeToArray: function (low, high, array) { + error('should not call mapBfRangeToArray'); + }, + mapOne: function (src, dst) { + error('should not call mapCidOne'); + }, + lookup: function (code) { + return isInt(code) && code <= 0xffff ? code : undefined; + }, + contains: function (code) { + return isInt(code) && code <= 0xffff; + }, + forEach: function (callback) { + for (var i = 0; i <= 0xffff; i++) { + callback(i, i); + } + }, + charCodeOf: function (value) { + return isInt(value) && value <= 0xffff ? value : -1; + }, + getMap: function () { + var map = new Array(0x10000); + for (var i = 0; i <= 0xffff; i++) { + map[i] = i; + } + return map; + }, + readCharCode: CMap.prototype.readCharCode, + get length() { + return 0x10000; + }, + get isIdentityCMap() { + error('should not access .isIdentityCMap'); + } + }; + return IdentityCMap; + }(); + var BinaryCMapReader = function BinaryCMapReaderClosure() { + function fetchBinaryData(url) { + return new Promise(function (resolve, reject) { + var request = new XMLHttpRequest(); + request.open('GET', url, true); + request.responseType = 'arraybuffer'; + request.onreadystatechange = function () { + if (request.readyState === XMLHttpRequest.DONE) { + if (!request.response || request.status !== 200 && request.status !== 0) { + reject(new Error('Unable to get binary cMap at: ' + url)); + } else { + resolve(new Uint8Array(request.response)); + } + } + }; + request.send(null); + }); + } + function hexToInt(a, size) { + var n = 0; + for (var i = 0; i <= size; i++) { + n = n << 8 | a[i]; + } + return n >>> 0; + } + function hexToStr(a, size) { + if (size === 1) { + return String.fromCharCode(a[0], a[1]); + } + if (size === 3) { + return String.fromCharCode(a[0], a[1], a[2], a[3]); + } + return String.fromCharCode.apply(null, a.subarray(0, size + 1)); + } + function addHex(a, b, size) { + var c = 0; + for (var i = size; i >= 0; i--) { + c += a[i] + b[i]; + a[i] = c & 255; + c >>= 8; + } + } + function incHex(a, size) { + var c = 1; + for (var i = size; i >= 0 && c > 0; i--) { + c += a[i]; + a[i] = c & 255; + c >>= 8; + } + } + var MAX_NUM_SIZE = 16; + var MAX_ENCODED_NUM_SIZE = 19; + function BinaryCMapStream(data) { + this.buffer = data; + this.pos = 0; + this.end = data.length; + this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); + } + BinaryCMapStream.prototype = { + readByte: function () { + if (this.pos >= this.end) { + return -1; + } + return this.buffer[this.pos++]; + }, + readNumber: function () { + var n = 0; + var last; + do { + var b = this.readByte(); + if (b < 0) { + error('unexpected EOF in bcmap'); + } + last = !(b & 0x80); + n = n << 7 | b & 0x7F; + } while (!last); + return n; + }, + readSigned: function () { + var n = this.readNumber(); + return n & 1 ? ~(n >>> 1) : n >>> 1; + }, + readHex: function (num, size) { + num.set(this.buffer.subarray(this.pos, this.pos + size + 1)); + this.pos += size + 1; + }, + readHexNumber: function (num, size) { + var last; + var stack = this.tmpBuf, sp = 0; + do { + var b = this.readByte(); + if (b < 0) { + error('unexpected EOF in bcmap'); + } + last = !(b & 0x80); + stack[sp++] = b & 0x7F; + } while (!last); + var i = size, buffer = 0, bufferSize = 0; + while (i >= 0) { + while (bufferSize < 8 && stack.length > 0) { + buffer = stack[--sp] << bufferSize | buffer; + bufferSize += 7; + } + num[i] = buffer & 255; + i--; + buffer >>= 8; + bufferSize -= 8; + } + }, + readHexSigned: function (num, size) { + this.readHexNumber(num, size); + var sign = num[size] & 1 ? 255 : 0; + var c = 0; + for (var i = 0; i <= size; i++) { + c = (c & 1) << 8 | num[i]; + num[i] = c >> 1 ^ sign; + } + }, + readString: function () { + var len = this.readNumber(); + var s = ''; + for (var i = 0; i < len; i++) { + s += String.fromCharCode(this.readNumber()); + } + return s; + } + }; + function processBinaryCMap(url, cMap, extend) { + return fetchBinaryData(url).then(function (data) { + var stream = new BinaryCMapStream(data); + var header = stream.readByte(); + cMap.vertical = !!(header & 1); + var useCMap = null; + var start = new Uint8Array(MAX_NUM_SIZE); + var end = new Uint8Array(MAX_NUM_SIZE); + var char = new Uint8Array(MAX_NUM_SIZE); + var charCode = new Uint8Array(MAX_NUM_SIZE); + var tmp = new Uint8Array(MAX_NUM_SIZE); + var code; + var b; + while ((b = stream.readByte()) >= 0) { + var type = b >> 5; + if (type === 7) { + switch (b & 0x1F) { + case 0: + stream.readString(); + break; + case 1: + useCMap = stream.readString(); + break; + } + continue; + } + var sequence = !!(b & 0x10); + var dataSize = b & 15; + assert(dataSize + 1 <= MAX_NUM_SIZE); + var ucs2DataSize = 1; + var subitemsCount = stream.readNumber(); + var i; + switch (type) { + case 0: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + for (i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize)); + } + break; + case 1: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + for (i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + } + break; + case 2: + stream.readHex(char, dataSize); + code = stream.readNumber(); + cMap.mapOne(hexToInt(char, dataSize), code); + for (i = 1; i < subitemsCount; i++) { + incHex(char, dataSize); + if (!sequence) { + stream.readHexNumber(tmp, dataSize); + addHex(char, tmp, dataSize); + } + code = stream.readSigned() + (code + 1); + cMap.mapOne(hexToInt(char, dataSize), code); + } + break; + case 3: + stream.readHex(start, dataSize); + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + for (i = 1; i < subitemsCount; i++) { + incHex(end, dataSize); + if (!sequence) { + stream.readHexNumber(start, dataSize); + addHex(start, end, dataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, dataSize); + addHex(end, start, dataSize); + code = stream.readNumber(); + cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code); + } + break; + case 4: + stream.readHex(char, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + for (i = 1; i < subitemsCount; i++) { + incHex(char, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(tmp, ucs2DataSize); + addHex(char, tmp, ucs2DataSize); + } + incHex(charCode, dataSize); + stream.readHexSigned(tmp, dataSize); + addHex(charCode, tmp, dataSize); + cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + case 5: + stream.readHex(start, ucs2DataSize); + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + for (i = 1; i < subitemsCount; i++) { + incHex(end, ucs2DataSize); + if (!sequence) { + stream.readHexNumber(start, ucs2DataSize); + addHex(start, end, ucs2DataSize); + } else { + start.set(end); + } + stream.readHexNumber(end, ucs2DataSize); + addHex(end, start, ucs2DataSize); + stream.readHex(charCode, dataSize); + cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize)); + } + break; + default: + error('Unknown type: ' + type); + break; + } + } + if (useCMap) { + return extend(useCMap); + } + return cMap; + }); + } + function BinaryCMapReader() { + } + BinaryCMapReader.prototype = { read: processBinaryCMap }; + return BinaryCMapReader; + }(); + var CMapFactory = function CMapFactoryClosure() { + function strToInt(str) { + var a = 0; + for (var i = 0; i < str.length; i++) { + a = a << 8 | str.charCodeAt(i); + } + return a >>> 0; + } + function expectString(obj) { + if (!isString(obj)) { + error('Malformed CMap: expected string.'); + } + } + function expectInt(obj) { + if (!isInt(obj)) { + error('Malformed CMap: expected int.'); + } + } + function parseBfChar(cMap, lexer) { + while (true) { + var obj = lexer.getObj(); + if (isEOF(obj)) { + break; + } + if (isCmd(obj, 'endbfchar')) { + return; + } + expectString(obj); + var src = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + var dst = obj; + cMap.mapOne(src, dst); + } + } + function parseBfRange(cMap, lexer) { + while (true) { + var obj = lexer.getObj(); + if (isEOF(obj)) { + break; + } + if (isCmd(obj, 'endbfrange')) { + return; + } + expectString(obj); + var low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + var high = strToInt(obj); + obj = lexer.getObj(); + if (isInt(obj) || isString(obj)) { + var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj; + cMap.mapBfRange(low, high, dstLow); + } else if (isCmd(obj, '[')) { + obj = lexer.getObj(); + var array = []; + while (!isCmd(obj, ']') && !isEOF(obj)) { + array.push(obj); + obj = lexer.getObj(); + } + cMap.mapBfRangeToArray(low, high, array); + } else { + break; + } + } + error('Invalid bf range.'); + } + function parseCidChar(cMap, lexer) { + while (true) { + var obj = lexer.getObj(); + if (isEOF(obj)) { + break; + } + if (isCmd(obj, 'endcidchar')) { + return; + } + expectString(obj); + var src = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + var dst = obj; + cMap.mapOne(src, dst); + } + } + function parseCidRange(cMap, lexer) { + while (true) { + var obj = lexer.getObj(); + if (isEOF(obj)) { + break; + } + if (isCmd(obj, 'endcidrange')) { + return; + } + expectString(obj); + var low = strToInt(obj); + obj = lexer.getObj(); + expectString(obj); + var high = strToInt(obj); + obj = lexer.getObj(); + expectInt(obj); + var dstLow = obj; + cMap.mapCidRange(low, high, dstLow); + } + } + function parseCodespaceRange(cMap, lexer) { + while (true) { + var obj = lexer.getObj(); + if (isEOF(obj)) { + break; + } + if (isCmd(obj, 'endcodespacerange')) { + return; + } + if (!isString(obj)) { + break; + } + var low = strToInt(obj); + obj = lexer.getObj(); + if (!isString(obj)) { + break; + } + var high = strToInt(obj); + cMap.addCodespaceRange(obj.length, low, high); + } + error('Invalid codespace range.'); + } + function parseWMode(cMap, lexer) { + var obj = lexer.getObj(); + if (isInt(obj)) { + cMap.vertical = !!obj; + } + } + function parseCMapName(cMap, lexer) { + var obj = lexer.getObj(); + if (isName(obj) && isString(obj.name)) { + cMap.name = obj.name; + } + } + function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { + var previous; + var embededUseCMap; + objLoop: + while (true) { + try { + var obj = lexer.getObj(); + if (isEOF(obj)) { + break; + } else if (isName(obj)) { + if (obj.name === 'WMode') { + parseWMode(cMap, lexer); + } else if (obj.name === 'CMapName') { + parseCMapName(cMap, lexer); + } + previous = obj; + } else if (isCmd(obj)) { + switch (obj.cmd) { + case 'endcmap': + break objLoop; + case 'usecmap': + if (isName(previous)) { + embededUseCMap = previous.name; + } + break; + case 'begincodespacerange': + parseCodespaceRange(cMap, lexer); + break; + case 'beginbfchar': + parseBfChar(cMap, lexer); + break; + case 'begincidchar': + parseCidChar(cMap, lexer); + break; + case 'beginbfrange': + parseBfRange(cMap, lexer); + break; + case 'begincidrange': + parseCidRange(cMap, lexer); + break; + } + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn('Invalid cMap data: ' + ex); + continue; + } + } + if (!useCMap && embededUseCMap) { + useCMap = embededUseCMap; + } + if (useCMap) { + return extendCMap(cMap, builtInCMapParams, useCMap); + } + return Promise.resolve(cMap); + } + function extendCMap(cMap, builtInCMapParams, useCMap) { + return createBuiltInCMap(useCMap, builtInCMapParams).then(function (newCMap) { + cMap.useCMap = newCMap; + if (cMap.numCodespaceRanges === 0) { + var useCodespaceRanges = cMap.useCMap.codespaceRanges; + for (var i = 0; i < useCodespaceRanges.length; i++) { + cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); + } + cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; + } + cMap.useCMap.forEach(function (key, value) { + if (!cMap.contains(key)) { + cMap.mapOne(key, cMap.useCMap.lookup(key)); + } + }); + return cMap; + }); + } + function parseBinaryCMap(name, builtInCMapParams) { + var url = builtInCMapParams.url + name + '.bcmap'; + var cMap = new CMap(true); + return new BinaryCMapReader().read(url, cMap, function (useCMap) { + return extendCMap(cMap, builtInCMapParams, useCMap); + }); + } + function createBuiltInCMap(name, builtInCMapParams) { + if (name === 'Identity-H') { + return Promise.resolve(new IdentityCMap(false, 2)); + } else if (name === 'Identity-V') { + return Promise.resolve(new IdentityCMap(true, 2)); + } + if (BUILT_IN_CMAPS.indexOf(name) === -1) { + return Promise.reject(new Error('Unknown cMap name: ' + name)); + } + assert(builtInCMapParams, 'built-in cMap parameters are not provided'); + if (builtInCMapParams.packed) { + return parseBinaryCMap(name, builtInCMapParams); + } + return new Promise(function (resolve, reject) { + var url = builtInCMapParams.url + name; + var request = new XMLHttpRequest(); + request.onreadystatechange = function () { + if (request.readyState === XMLHttpRequest.DONE) { + if (request.status === 200 || request.status === 0) { + var cMap = new CMap(true); + var lexer = new Lexer(new StringStream(request.responseText)); + parseCMap(cMap, lexer, builtInCMapParams, null).then(function (parsedCMap) { + resolve(parsedCMap); + }); + } else { + reject(new Error('Unable to get cMap at: ' + url)); + } + } + }; + request.open('GET', url, true); + request.send(null); + }); + } + return { + create: function (encoding, builtInCMapParams, useCMap) { + if (isName(encoding)) { + return createBuiltInCMap(encoding.name, builtInCMapParams); + } else if (isStream(encoding)) { + var cMap = new CMap(); + var lexer = new Lexer(encoding); + return parseCMap(cMap, lexer, builtInCMapParams, useCMap).then(function (parsedCMap) { + if (parsedCMap.isIdentityCMap) { + return createBuiltInCMap(parsedCMap.name, builtInCMapParams); + } + return parsedCMap; + }); + } + return Promise.reject(new Error('Encoding required.')); + } + }; + }(); + exports.CMap = CMap; + exports.CMapFactory = CMapFactory; + exports.IdentityCMap = IdentityCMap; + })); + (function (root, factory) { + factory(root.pdfjsCoreFonts = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreGlyphList, root.pdfjsCoreFontRenderer, root.pdfjsCoreEncodings, root.pdfjsCoreStandardFonts, root.pdfjsCoreUnicode, root.pdfjsCoreType1Parser, root.pdfjsCoreCFFParser); + }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreGlyphList, coreFontRenderer, coreEncodings, coreStandardFonts, coreUnicode, coreType1Parser, coreCFFParser) { + var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; + var FontType = sharedUtil.FontType; + var assert = sharedUtil.assert; + var bytesToString = sharedUtil.bytesToString; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isInt = sharedUtil.isInt; + var isNum = sharedUtil.isNum; + var readUint32 = sharedUtil.readUint32; + var shadow = sharedUtil.shadow; + var string32 = sharedUtil.string32; + var warn = sharedUtil.warn; + var MissingDataException = sharedUtil.MissingDataException; + var isSpace = sharedUtil.isSpace; + var Stream = coreStream.Stream; + var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; + var getDingbatsGlyphsUnicode = coreGlyphList.getDingbatsGlyphsUnicode; + var FontRendererFactory = coreFontRenderer.FontRendererFactory; + var StandardEncoding = coreEncodings.StandardEncoding; + var MacRomanEncoding = coreEncodings.MacRomanEncoding; + var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; + var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; + var getEncoding = coreEncodings.getEncoding; + var getStdFontMap = coreStandardFonts.getStdFontMap; + var getNonStdFontMap = coreStandardFonts.getNonStdFontMap; + var getGlyphMapForStandardFonts = coreStandardFonts.getGlyphMapForStandardFonts; + var getSupplementalGlyphMapForArialBlack = coreStandardFonts.getSupplementalGlyphMapForArialBlack; + var getUnicodeRangeFor = coreUnicode.getUnicodeRangeFor; + var mapSpecialUnicodeValues = coreUnicode.mapSpecialUnicodeValues; + var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; + var Type1Parser = coreType1Parser.Type1Parser; + var CFFStandardStrings = coreCFFParser.CFFStandardStrings; + var CFFParser = coreCFFParser.CFFParser; + var CFFCompiler = coreCFFParser.CFFCompiler; + var CFF = coreCFFParser.CFF; + var CFFHeader = coreCFFParser.CFFHeader; + var CFFTopDict = coreCFFParser.CFFTopDict; + var CFFPrivateDict = coreCFFParser.CFFPrivateDict; + var CFFStrings = coreCFFParser.CFFStrings; + var CFFIndex = coreCFFParser.CFFIndex; + var CFFCharset = coreCFFParser.CFFCharset; + var PRIVATE_USE_OFFSET_START = 0xE000; + var PRIVATE_USE_OFFSET_END = 0xF8FF; + var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false; + var PDF_GLYPH_SPACE_UNITS = 1000; + var SEAC_ANALYSIS_ENABLED = false; + var FontFlags = { + FixedPitch: 1, + Serif: 2, + Symbolic: 4, + Script: 8, + Nonsymbolic: 32, + Italic: 64, + AllCap: 65536, + SmallCap: 131072, + ForceBold: 262144 + }; + var MacStandardGlyphOrdering = [ + '.notdef', + '.null', + 'nonmarkingreturn', + 'space', + 'exclam', + 'quotedbl', + 'numbersign', + 'dollar', + 'percent', + 'ampersand', + 'quotesingle', + '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', + 'grave', + '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', + 'Adieresis', + 'Aring', + 'Ccedilla', + 'Eacute', + 'Ntilde', + 'Odieresis', + 'Udieresis', + 'aacute', + 'agrave', + 'acircumflex', + 'adieresis', + 'atilde', + 'aring', + 'ccedilla', + 'eacute', + 'egrave', + 'ecircumflex', + 'edieresis', + 'iacute', + 'igrave', + 'icircumflex', + 'idieresis', + 'ntilde', + 'oacute', + 'ograve', + 'ocircumflex', + 'odieresis', + 'otilde', + 'uacute', + 'ugrave', + 'ucircumflex', + 'udieresis', + 'dagger', + 'degree', + 'cent', + 'sterling', + 'section', + 'bullet', + 'paragraph', + 'germandbls', + 'registered', + 'copyright', + 'trademark', + 'acute', + 'dieresis', + 'notequal', + 'AE', + 'Oslash', + 'infinity', + 'plusminus', + 'lessequal', + 'greaterequal', + 'yen', + 'mu', + 'partialdiff', + 'summation', + 'product', + 'pi', + 'integral', + 'ordfeminine', + 'ordmasculine', + 'Omega', + 'ae', + 'oslash', + 'questiondown', + 'exclamdown', + 'logicalnot', + 'radical', + 'florin', + 'approxequal', + 'Delta', + 'guillemotleft', + 'guillemotright', + 'ellipsis', + 'nonbreakingspace', + 'Agrave', + 'Atilde', + 'Otilde', + 'OE', + 'oe', + 'endash', + 'emdash', + 'quotedblleft', + 'quotedblright', + 'quoteleft', + 'quoteright', + 'divide', + 'lozenge', + 'ydieresis', + 'Ydieresis', + 'fraction', + 'currency', + 'guilsinglleft', + 'guilsinglright', + 'fi', + 'fl', + 'daggerdbl', + 'periodcentered', + 'quotesinglbase', + 'quotedblbase', + 'perthousand', + 'Acircumflex', + 'Ecircumflex', + 'Aacute', + 'Edieresis', + 'Egrave', + 'Iacute', + 'Icircumflex', + 'Idieresis', + 'Igrave', + 'Oacute', + 'Ocircumflex', + 'apple', + 'Ograve', + 'Uacute', + 'Ucircumflex', + 'Ugrave', + 'dotlessi', + 'circumflex', + 'tilde', + 'macron', + 'breve', + 'dotaccent', + 'ring', + 'cedilla', + 'hungarumlaut', + 'ogonek', + 'caron', + 'Lslash', + 'lslash', + 'Scaron', + 'scaron', + 'Zcaron', + 'zcaron', + 'brokenbar', + 'Eth', + 'eth', + 'Yacute', + 'yacute', + 'Thorn', + 'thorn', + 'minus', + 'multiply', + 'onesuperior', + 'twosuperior', + 'threesuperior', + 'onehalf', + 'onequarter', + 'threequarters', + 'franc', + 'Gbreve', + 'gbreve', + 'Idotaccent', + 'Scedilla', + 'scedilla', + 'Cacute', + 'cacute', + 'Ccaron', + 'ccaron', + 'dcroat' + ]; + function adjustWidths(properties) { + if (!properties.fontMatrix) { + return; + } + if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { + return; + } + var scale = 0.001 / properties.fontMatrix[0]; + var glyphsWidths = properties.widths; + for (var glyph in glyphsWidths) { + glyphsWidths[glyph] *= scale; + } + properties.defaultWidth *= scale; + } + function adjustToUnicode(properties, builtInEncoding) { + if (properties.hasIncludedToUnicodeMap) { + return; + } + if (properties.hasEncoding) { + return; + } + if (builtInEncoding === properties.defaultEncoding) { + return; + } + if (properties.toUnicode instanceof IdentityToUnicodeMap) { + return; + } + var toUnicode = [], glyphsUnicodeMap = getGlyphsUnicode(); + for (var charCode in builtInEncoding) { + var glyphName = builtInEncoding[charCode]; + var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + toUnicode[charCode] = String.fromCharCode(unicode); + } + } + properties.toUnicode.amend(toUnicode); + } + function getFontType(type, subtype) { + switch (type) { + case 'Type1': + return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1; + case 'CIDFontType0': + return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C : FontType.CIDFONTTYPE0; + case 'OpenType': + return FontType.OPENTYPE; + case 'TrueType': + return FontType.TRUETYPE; + case 'CIDFontType2': + return FontType.CIDFONTTYPE2; + case 'MMType1': + return FontType.MMTYPE1; + case 'Type0': + return FontType.TYPE0; + default: + return FontType.UNKNOWN; + } + } + function recoverGlyphName(name, glyphsUnicodeMap) { + if (glyphsUnicodeMap[name] !== undefined) { + return name; + } + var unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); + if (unicode !== -1) { + for (var key in glyphsUnicodeMap) { + if (glyphsUnicodeMap[key] === unicode) { + return key; + } + } + } + info('Unable to recover a standard glyph name for: ' + name); + return name; + } + var Glyph = function GlyphClosure() { + function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { + this.fontChar = fontChar; + this.unicode = unicode; + this.accent = accent; + this.width = width; + this.vmetric = vmetric; + this.operatorListId = operatorListId; + this.isSpace = isSpace; + this.isInFont = isInFont; + } + Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) { + return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont; + }; + return Glyph; + }(); + var ToUnicodeMap = function ToUnicodeMapClosure() { + function ToUnicodeMap(cmap) { + this._map = cmap; + } + ToUnicodeMap.prototype = { + get length() { + return this._map.length; + }, + forEach: function (callback) { + for (var charCode in this._map) { + callback(charCode, this._map[charCode].charCodeAt(0)); + } + }, + has: function (i) { + return this._map[i] !== undefined; + }, + get: function (i) { + return this._map[i]; + }, + charCodeOf: function (v) { + return this._map.indexOf(v); + }, + amend: function (map) { + for (var charCode in map) { + this._map[charCode] = map[charCode]; + } + } + }; + return ToUnicodeMap; + }(); + var IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() { + function IdentityToUnicodeMap(firstChar, lastChar) { + this.firstChar = firstChar; + this.lastChar = lastChar; + } + IdentityToUnicodeMap.prototype = { + get length() { + return this.lastChar + 1 - this.firstChar; + }, + forEach: function (callback) { + for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { + callback(i, i); + } + }, + has: function (i) { + return this.firstChar <= i && i <= this.lastChar; + }, + get: function (i) { + if (this.firstChar <= i && i <= this.lastChar) { + return String.fromCharCode(i); + } + return undefined; + }, + charCodeOf: function (v) { + return isInt(v) && v >= this.firstChar && v <= this.lastChar ? v : -1; + }, + amend: function (map) { + error('Should not call amend()'); + } + }; + return IdentityToUnicodeMap; + }(); + var OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() { + function writeInt16(dest, offset, num) { + dest[offset] = num >> 8 & 0xFF; + dest[offset + 1] = num & 0xFF; + } + function writeInt32(dest, offset, num) { + dest[offset] = num >> 24 & 0xFF; + dest[offset + 1] = num >> 16 & 0xFF; + dest[offset + 2] = num >> 8 & 0xFF; + dest[offset + 3] = num & 0xFF; + } + function writeData(dest, offset, data) { + var i, ii; + if (data instanceof Uint8Array) { + dest.set(data, offset); + } else if (typeof data === 'string') { + for (i = 0, ii = data.length; i < ii; i++) { + dest[offset++] = data.charCodeAt(i) & 0xFF; + } + } else { + for (i = 0, ii = data.length; i < ii; i++) { + dest[offset++] = data[i] & 0xFF; + } + } + } + function OpenTypeFileBuilder(sfnt) { + this.sfnt = sfnt; + this.tables = Object.create(null); + } + OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) { + var maxPower2 = 1, log2 = 0; + while ((maxPower2 ^ entriesCount) > maxPower2) { + maxPower2 <<= 1; + log2++; + } + var searchRange = maxPower2 * entrySize; + return { + range: searchRange, + entry: log2, + rangeShift: entrySize * entriesCount - searchRange + }; + }; + var OTF_HEADER_SIZE = 12; + var OTF_TABLE_ENTRY_SIZE = 16; + OpenTypeFileBuilder.prototype = { + toArray: function OpenTypeFileBuilder_toArray() { + var sfnt = this.sfnt; + var tables = this.tables; + var tablesNames = Object.keys(tables); + tablesNames.sort(); + var numTables = tablesNames.length; + var i, j, jj, table, tableName; + var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; + var tableOffsets = [offset]; + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + var paddedLength = (table.length + 3 & ~3) >>> 0; + offset += paddedLength; + tableOffsets.push(offset); + } + var file = new Uint8Array(offset); + for (i = 0; i < numTables; i++) { + table = tables[tablesNames[i]]; + writeData(file, tableOffsets[i], table); + } + if (sfnt === 'true') { + sfnt = string32(0x00010000); + } + file[0] = sfnt.charCodeAt(0) & 0xFF; + file[1] = sfnt.charCodeAt(1) & 0xFF; + file[2] = sfnt.charCodeAt(2) & 0xFF; + file[3] = sfnt.charCodeAt(3) & 0xFF; + writeInt16(file, 4, numTables); + var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); + writeInt16(file, 6, searchParams.range); + writeInt16(file, 8, searchParams.entry); + writeInt16(file, 10, searchParams.rangeShift); + offset = OTF_HEADER_SIZE; + for (i = 0; i < numTables; i++) { + tableName = tablesNames[i]; + file[offset] = tableName.charCodeAt(0) & 0xFF; + file[offset + 1] = tableName.charCodeAt(1) & 0xFF; + file[offset + 2] = tableName.charCodeAt(2) & 0xFF; + file[offset + 3] = tableName.charCodeAt(3) & 0xFF; + var checksum = 0; + for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { + var quad = readUint32(file, j); + checksum = checksum + quad >>> 0; + } + writeInt32(file, offset + 4, checksum); + writeInt32(file, offset + 8, tableOffsets[i]); + writeInt32(file, offset + 12, tables[tableName].length); + offset += OTF_TABLE_ENTRY_SIZE; + } + return file; + }, + addTable: function OpenTypeFileBuilder_addTable(tag, data) { + if (tag in this.tables) { + throw new Error('Table ' + tag + ' already exists'); + } + this.tables[tag] = data; + } + }; + return OpenTypeFileBuilder; + }(); + var ProblematicCharRanges = new Int32Array([ + 0x0000, + 0x0020, + 0x007F, + 0x00A1, + 0x00AD, + 0x00AE, + 0x0600, + 0x0780, + 0x08A0, + 0x10A0, + 0x1780, + 0x1800, + 0x1C00, + 0x1C50, + 0x2000, + 0x2010, + 0x2011, + 0x2012, + 0x2028, + 0x2030, + 0x205F, + 0x2070, + 0x25CC, + 0x25CD, + 0x3000, + 0x3001, + 0xAA60, + 0xAA80, + 0xFFF0, + 0x10000 + ]); + var Font = function FontClosure() { + function Font(name, file, properties) { + var charCode, glyphName, unicode; + this.name = name; + this.loadedName = properties.loadedName; + this.isType3Font = properties.isType3Font; + this.sizes = []; + this.missingFile = false; + this.glyphCache = Object.create(null); + var names = name.split('+'); + names = names.length > 1 ? names[1] : names[0]; + names = names.split(/[-,_]/g)[0]; + this.isSerifFont = !!(properties.flags & FontFlags.Serif); + this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); + var type = properties.type; + var subtype = properties.subtype; + this.type = type; + this.fallbackName = this.isMonospace ? 'monospace' : this.isSerifFont ? 'serif' : 'sans-serif'; + this.differences = properties.differences; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.composite = properties.composite; + this.wideChars = properties.wideChars; + this.cMap = properties.cMap; + this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; + this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; + this.fontMatrix = properties.fontMatrix; + this.bbox = properties.bbox; + this.toUnicode = properties.toUnicode; + this.toFontChar = []; + if (properties.type === 'Type3') { + for (charCode = 0; charCode < 256; charCode++) { + this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode]; + } + this.fontType = FontType.TYPE3; + return; + } + this.cidEncoding = properties.cidEncoding; + this.vertical = properties.vertical; + if (this.vertical) { + this.vmetrics = properties.vmetrics; + this.defaultVMetrics = properties.defaultVMetrics; + } + var glyphsUnicodeMap; + if (!file || file.isEmpty) { + if (file) { + warn('Font file is empty in "' + name + '" (' + this.loadedName + ')'); + } + this.missingFile = true; + var fontName = name.replace(/[,_]/g, '-'); + var stdFontMap = getStdFontMap(), nonStdFontMap = getNonStdFontMap(); + var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); + fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; + this.bold = fontName.search(/bold/gi) !== -1; + this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1; + this.black = name.search(/Black/g) !== -1; + this.remeasure = Object.keys(this.widths).length > 0; + if (isStandardFont && type === 'CIDFontType2' && properties.cidEncoding.indexOf('Identity-') === 0) { + var GlyphMapForStandardFonts = getGlyphMapForStandardFonts(); + var map = []; + for (charCode in GlyphMapForStandardFonts) { + map[+charCode] = GlyphMapForStandardFonts[charCode]; + } + if (/Arial-?Black/i.test(name)) { + var SupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack(); + for (charCode in SupplementalGlyphMapForArialBlack) { + map[+charCode] = SupplementalGlyphMapForArialBlack[charCode]; + } + } + var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap; + if (!isIdentityUnicode) { + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + map[+charCode] = unicodeCharCode; + }); + } + this.toFontChar = map; + this.toUnicode = new ToUnicodeMap(map); + } else if (/Symbol/i.test(fontName)) { + this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), properties.differences); + } else if (/Dingbats/i.test(fontName)) { + if (/Wingdings/i.test(name)) { + warn('Non-embedded Wingdings font, falling back to ZapfDingbats.'); + } + this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, getDingbatsGlyphsUnicode(), properties.differences); + } else if (isStandardFont) { + this.toFontChar = buildToFontChar(properties.defaultEncoding, getGlyphsUnicode(), properties.differences); + } else { + glyphsUnicodeMap = getGlyphsUnicode(); + this.toUnicode.forEach(function (charCode, unicodeCharCode) { + if (!this.composite) { + glyphName = properties.differences[charCode] || properties.defaultEncoding[charCode]; + unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + unicodeCharCode = unicode; + } + } + this.toFontChar[charCode] = unicodeCharCode; + }.bind(this)); + } + this.loadedName = fontName.split('-')[0]; + this.loading = false; + this.fontType = getFontType(type, subtype); + return; + } + if (subtype === 'Type1C') { + if (type !== 'Type1' && type !== 'MMType1') { + if (isTrueTypeFile(file)) { + subtype = 'TrueType'; + } else { + type = 'Type1'; + } + } else if (isOpenTypeFile(file)) { + type = subtype = 'OpenType'; + } + } + if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') { + type = 'CIDFontType0'; + } + if (subtype === 'OpenType') { + type = 'OpenType'; + } + if (type === 'CIDFontType0') { + if (isType1File(file)) { + subtype = 'CIDFontType0'; + } else if (isOpenTypeFile(file)) { + type = subtype = 'OpenType'; + } else { + subtype = 'CIDFontType0C'; + } + } + var data; + switch (type) { + case 'MMType1': + info('MMType1 font (' + name + '), falling back to Type1.'); + case 'Type1': + case 'CIDFontType0': + this.mimetype = 'font/opentype'; + var cff = subtype === 'Type1C' || subtype === 'CIDFontType0C' ? new CFFFont(file, properties) : new Type1Font(name, file, properties); + adjustWidths(properties); + data = this.convert(name, cff, properties); + break; + case 'OpenType': + case 'TrueType': + case 'CIDFontType2': + this.mimetype = 'font/opentype'; + data = this.checkAndRepair(name, file, properties); + if (this.isOpenType) { + adjustWidths(properties); + type = 'OpenType'; + } + break; + default: + error('Font ' + type + ' is not supported'); + break; + } + this.data = data; + this.fontType = getFontType(type, subtype); + this.fontMatrix = properties.fontMatrix; + this.widths = properties.widths; + this.defaultWidth = properties.defaultWidth; + this.toUnicode = properties.toUnicode; + this.encoding = properties.baseEncoding; + this.seacMap = properties.seacMap; + this.loading = true; + } + Font.getFontID = function () { + var ID = 1; + return function Font_getFontID() { + return String(ID++); + }; + }(); + function int16(b0, b1) { + return (b0 << 8) + b1; + } + function signedInt16(b0, b1) { + var value = (b0 << 8) + b1; + return value & 1 << 15 ? value - 0x10000 : value; + } + function int32(b0, b1, b2, b3) { + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; + } + function string16(value) { + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); + } + function safeString16(value) { + value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value; + return String.fromCharCode(value >> 8 & 0xff, value & 0xff); + } + function isTrueTypeFile(file) { + var header = file.peekBytes(4); + return readUint32(header, 0) === 0x00010000; + } + function isOpenTypeFile(file) { + var header = file.peekBytes(4); + return bytesToString(header) === 'OTTO'; + } + function isType1File(file) { + var header = file.peekBytes(2); + if (header[0] === 0x25 && header[1] === 0x21) { + return true; + } + if (header[0] === 0x80 && header[1] === 0x01) { + return true; + } + return false; + } + function buildToFontChar(encoding, glyphsUnicodeMap, differences) { + var toFontChar = [], unicode; + for (var i = 0, ii = encoding.length; i < ii; i++) { + unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[i] = unicode; + } + } + for (var charCode in differences) { + unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); + if (unicode !== -1) { + toFontChar[+charCode] = unicode; + } + } + return toFontChar; + } + function isProblematicUnicodeLocation(code) { + var i = 0, j = ProblematicCharRanges.length - 1; + while (i < j) { + var c = i + j + 1 >> 1; + if (code < ProblematicCharRanges[c]) { + j = c - 1; + } else { + i = c; + } + } + return !(i & 1); + } + function adjustMapping(charCodeToGlyphId, properties) { + var toUnicode = properties.toUnicode; + var isSymbolic = !!(properties.flags & FontFlags.Symbolic); + var isIdentityUnicode = properties.toUnicode instanceof IdentityToUnicodeMap; + var newMap = Object.create(null); + var toFontChar = []; + var usedFontCharCodes = []; + var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START; + for (var originalCharCode in charCodeToGlyphId) { + originalCharCode |= 0; + var glyphId = charCodeToGlyphId[originalCharCode]; + var fontCharCode = originalCharCode; + var hasUnicodeValue = false; + if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { + hasUnicodeValue = true; + var unicode = toUnicode.get(fontCharCode); + if (unicode.length === 1) { + fontCharCode = unicode.charCodeAt(0); + } + } + if ((usedFontCharCodes[fontCharCode] !== undefined || isProblematicUnicodeLocation(fontCharCode) || isSymbolic && !hasUnicodeValue) && nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { + do { + fontCharCode = nextAvailableFontCharCode++; + if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) { + fontCharCode = 0xF020; + nextAvailableFontCharCode = fontCharCode + 1; + } + } while (usedFontCharCodes[fontCharCode] !== undefined && nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END); + } + newMap[fontCharCode] = glyphId; + toFontChar[originalCharCode] = fontCharCode; + usedFontCharCodes[fontCharCode] = true; + } + return { + toFontChar: toFontChar, + charCodeToGlyphId: newMap, + nextAvailableFontCharCode: nextAvailableFontCharCode + }; + } + function getRanges(glyphs, numGlyphs) { + var codes = []; + for (var charCode in glyphs) { + if (glyphs[charCode] >= numGlyphs) { + continue; + } + codes.push({ + fontCharCode: charCode | 0, + glyphId: glyphs[charCode] + }); + } + codes.sort(function fontGetRangesSort(a, b) { + return a.fontCharCode - b.fontCharCode; + }); + var ranges = []; + var length = codes.length; + for (var n = 0; n < length;) { + var start = codes[n].fontCharCode; + var codeIndices = [codes[n].glyphId]; + ++n; + var end = start; + while (n < length && end + 1 === codes[n].fontCharCode) { + codeIndices.push(codes[n].glyphId); + ++end; + ++n; + if (end === 0xFFFF) { + break; + } + } + ranges.push([ + start, + end, + codeIndices + ]); + } + return ranges; + } + function createCmapTable(glyphs, numGlyphs) { + var ranges = getRanges(glyphs, numGlyphs); + var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; + var cmap = '\x00\x00' + string16(numTables) + '\x00\x03' + '\x00\x01' + string32(4 + numTables * 8); + var i, ii, j, jj; + for (i = ranges.length - 1; i >= 0; --i) { + if (ranges[i][0] <= 0xFFFF) { + break; + } + } + var bmpLength = i + 1; + if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) { + ranges[i][1] = 0xFFFE; + } + var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0; + var segCount = bmpLength + trailingRangesCount; + var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); + var startCount = ''; + var endCount = ''; + var idDeltas = ''; + var idRangeOffsets = ''; + var glyphsIds = ''; + var bias = 0; + var range, start, end, codes; + for (i = 0, ii = bmpLength; i < ii; i++) { + range = ranges[i]; + start = range[0]; + end = range[1]; + startCount += string16(start); + endCount += string16(end); + codes = range[2]; + var contiguous = true; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + contiguous = false; + break; + } + } + if (!contiguous) { + var offset = (segCount - i) * 2 + bias * 2; + bias += end - start + 1; + idDeltas += string16(0); + idRangeOffsets += string16(offset); + for (j = 0, jj = codes.length; j < jj; ++j) { + glyphsIds += string16(codes[j]); + } + } else { + var startCode = codes[0]; + idDeltas += string16(startCode - start & 0xFFFF); + idRangeOffsets += string16(0); + } + } + if (trailingRangesCount > 0) { + endCount += '\xFF\xFF'; + startCount += '\xFF\xFF'; + idDeltas += '\x00\x01'; + idRangeOffsets += '\x00\x00'; + } + var format314 = '\x00\x00' + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + '\x00\x00' + startCount + idDeltas + idRangeOffsets + glyphsIds; + var format31012 = ''; + var header31012 = ''; + if (numTables > 1) { + cmap += '\x00\x03' + '\x00\x0A' + string32(4 + numTables * 8 + 4 + format314.length); + format31012 = ''; + for (i = 0, ii = ranges.length; i < ii; i++) { + range = ranges[i]; + start = range[0]; + codes = range[2]; + var code = codes[0]; + for (j = 1, jj = codes.length; j < jj; ++j) { + if (codes[j] !== codes[j - 1] + 1) { + end = range[0] + j - 1; + format31012 += string32(start) + string32(end) + string32(code); + start = end + 1; + code = codes[j]; + } + } + format31012 += string32(start) + string32(range[1]) + string32(code); + } + header31012 = '\x00\x0C' + '\x00\x00' + string32(format31012.length + 16) + '\x00\x00\x00\x00' + string32(format31012.length / 12); + } + return cmap + '\x00\x04' + string16(format314.length + 4) + format314 + header31012 + format31012; + } + function validateOS2Table(os2) { + var stream = new Stream(os2.data); + var version = stream.getUint16(); + stream.getBytes(60); + var selection = stream.getUint16(); + if (version < 4 && selection & 0x0300) { + return false; + } + var firstChar = stream.getUint16(); + var lastChar = stream.getUint16(); + if (firstChar > lastChar) { + return false; + } + stream.getBytes(6); + var usWinAscent = stream.getUint16(); + if (usWinAscent === 0) { + return false; + } + os2.data[8] = os2.data[9] = 0; + return true; + } + function createOS2Table(properties, charstrings, override) { + override = override || { + unitsPerEm: 0, + yMax: 0, + yMin: 0, + ascent: 0, + descent: 0 + }; + var ulUnicodeRange1 = 0; + var ulUnicodeRange2 = 0; + var ulUnicodeRange3 = 0; + var ulUnicodeRange4 = 0; + var firstCharIndex = null; + var lastCharIndex = 0; + if (charstrings) { + for (var code in charstrings) { + code |= 0; + if (firstCharIndex > code || !firstCharIndex) { + firstCharIndex = code; + } + if (lastCharIndex < code) { + lastCharIndex = code; + } + var position = getUnicodeRangeFor(code); + if (position < 32) { + ulUnicodeRange1 |= 1 << position; + } else if (position < 64) { + ulUnicodeRange2 |= 1 << position - 32; + } else if (position < 96) { + ulUnicodeRange3 |= 1 << position - 64; + } else if (position < 123) { + ulUnicodeRange4 |= 1 << position - 96; + } else { + error('Unicode ranges Bits > 123 are reserved for internal usage'); + } + } + } else { + firstCharIndex = 0; + lastCharIndex = 255; + } + var bbox = properties.bbox || [ + 0, + 0, + 0, + 0 + ]; + var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; + var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS; + var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3])); + var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1])); + if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { + typoDescent = -typoDescent; + } + var winAscent = override.yMax || typoAscent; + var winDescent = -override.yMin || -typoDescent; + return '\x00\x03' + '\x02\x24' + '\x01\xF4' + '\x00\x05' + '\x00\x00' + '\x02\x8A' + '\x02\xBB' + '\x00\x00' + '\x00\x8C' + '\x02\x8A' + '\x02\xBB' + '\x00\x00' + '\x01\xDF' + '\x00\x31' + '\x01\x02' + '\x00\x00' + '\x00\x00\x06' + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + '\x00\x00\x00\x00\x00\x00' + string32(ulUnicodeRange1) + string32(ulUnicodeRange2) + string32(ulUnicodeRange3) + string32(ulUnicodeRange4) + '\x2A\x32\x31\x2A' + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + '\x00\x64' + string16(winAscent) + string16(winDescent) + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + '\x00\x03'; + } + function createPostTable(properties) { + var angle = Math.floor(properties.italicAngle * Math.pow(2, 16)); + return '\x00\x03\x00\x00' + string32(angle) + '\x00\x00' + '\x00\x00' + string32(properties.fixedPitch) + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + '\x00\x00\x00\x00'; + } + function createNameTable(name, proto) { + if (!proto) { + proto = [ + [], + [] + ]; + } + var strings = [ + proto[0][0] || 'Original licence', + proto[0][1] || name, + proto[0][2] || 'Unknown', + proto[0][3] || 'uniqueID', + proto[0][4] || name, + proto[0][5] || 'Version 0.11', + proto[0][6] || '', + proto[0][7] || 'Unknown', + proto[0][8] || 'Unknown', + proto[0][9] || 'Unknown' + ]; + var stringsUnicode = []; + var i, ii, j, jj, str; + for (i = 0, ii = strings.length; i < ii; i++) { + str = proto[1][i] || strings[i]; + var strBufUnicode = []; + for (j = 0, jj = str.length; j < jj; j++) { + strBufUnicode.push(string16(str.charCodeAt(j))); + } + stringsUnicode.push(strBufUnicode.join('')); + } + var names = [ + strings, + stringsUnicode + ]; + var platforms = [ + '\x00\x01', + '\x00\x03' + ]; + var encodings = [ + '\x00\x00', + '\x00\x01' + ]; + var languages = [ + '\x00\x00', + '\x04\x09' + ]; + var namesRecordCount = strings.length * platforms.length; + var nameTable = '\x00\x00' + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6); + var strOffset = 0; + for (i = 0, ii = platforms.length; i < ii; i++) { + var strs = names[i]; + for (j = 0, jj = strs.length; j < jj; j++) { + str = strs[j]; + var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset); + nameTable += nameRecord; + strOffset += str.length; + } + } + nameTable += strings.join('') + stringsUnicode.join(''); + return nameTable; + } + Font.prototype = { + name: null, + font: null, + mimetype: null, + encoding: null, + get renderer() { + var renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); + return shadow(this, 'renderer', renderer); + }, + exportData: function Font_exportData() { + var data = {}; + for (var i in this) { + if (this.hasOwnProperty(i)) { + data[i] = this[i]; + } + } + return data; + }, + checkAndRepair: function Font_checkAndRepair(name, font, properties) { + function readTableEntry(file) { + var tag = bytesToString(file.getBytes(4)); + var checksum = file.getInt32() >>> 0; + var offset = file.getInt32() >>> 0; + var length = file.getInt32() >>> 0; + var previousPosition = file.pos; + file.pos = file.start ? file.start : 0; + file.skip(offset); + var data = file.getBytes(length); + file.pos = previousPosition; + if (tag === 'head') { + data[8] = data[9] = data[10] = data[11] = 0; + data[17] |= 0x20; + } + return { + tag: tag, + checksum: checksum, + length: length, + offset: offset, + data: data + }; + } + function readOpenTypeHeader(ttf) { + return { + version: bytesToString(ttf.getBytes(4)), + numTables: ttf.getUint16(), + searchRange: ttf.getUint16(), + entrySelector: ttf.getUint16(), + rangeShift: ttf.getUint16() + }; + } + function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) { + if (!cmap) { + warn('No cmap table available.'); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + var segment; + var start = (font.start ? font.start : 0) + cmap.offset; + font.pos = start; + var version = font.getUint16(); + var numTables = font.getUint16(); + var potentialTable; + var canBreak = false; + for (var i = 0; i < numTables; i++) { + var platformId = font.getUint16(); + var encodingId = font.getUint16(); + var offset = font.getInt32() >>> 0; + var useTable = false; + if (platformId === 0 && encodingId === 0) { + useTable = true; + } else if (platformId === 1 && encodingId === 0) { + useTable = true; + } else if (platformId === 3 && encodingId === 1 && (!isSymbolicFont && hasEncoding || !potentialTable)) { + useTable = true; + if (!isSymbolicFont) { + canBreak = true; + } + } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { + useTable = true; + canBreak = true; + } + if (useTable) { + potentialTable = { + platformId: platformId, + encodingId: encodingId, + offset: offset + }; + } + if (canBreak) { + break; + } + } + if (potentialTable) { + font.pos = start + potentialTable.offset; + } + if (!potentialTable || font.peekByte() === -1) { + warn('Could not find a preferred cmap table.'); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + var format = font.getUint16(); + var length = font.getUint16(); + var language = font.getUint16(); + var hasShortCmap = false; + var mappings = []; + var j, glyphId; + if (format === 0) { + for (j = 0; j < 256; j++) { + var index = font.getByte(); + if (!index) { + continue; + } + mappings.push({ + charCode: j, + glyphId: index + }); + } + hasShortCmap = true; + } else if (format === 4) { + var segCount = font.getUint16() >> 1; + font.getBytes(6); + var segIndex, segments = []; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments.push({ end: font.getUint16() }); + } + font.getUint16(); + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].start = font.getUint16(); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segments[segIndex].delta = font.getUint16(); + } + var offsetsCount = 0; + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + var rangeOffset = font.getUint16(); + if (!rangeOffset) { + segment.offsetIndex = -1; + continue; + } + var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); + segment.offsetIndex = offsetIndex; + offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1); + } + var offsets = []; + for (j = 0; j < offsetsCount; j++) { + offsets.push(font.getUint16()); + } + for (segIndex = 0; segIndex < segCount; segIndex++) { + segment = segments[segIndex]; + start = segment.start; + var end = segment.end; + var delta = segment.delta; + offsetIndex = segment.offsetIndex; + for (j = start; j <= end; j++) { + if (j === 0xFFFF) { + continue; + } + glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start]; + glyphId = glyphId + delta & 0xFFFF; + if (glyphId === 0) { + continue; + } + mappings.push({ + charCode: j, + glyphId: glyphId + }); + } + } + } else if (format === 6) { + var firstCode = font.getUint16(); + var entryCount = font.getUint16(); + for (j = 0; j < entryCount; j++) { + glyphId = font.getUint16(); + var charCode = firstCode + j; + mappings.push({ + charCode: charCode, + glyphId: glyphId + }); + } + } else { + warn('cmap table has unsupported format: ' + format); + return { + platformId: -1, + encodingId: -1, + mappings: [], + hasShortCmap: false + }; + } + mappings.sort(function (a, b) { + return a.charCode - b.charCode; + }); + for (i = 1; i < mappings.length; i++) { + if (mappings[i - 1].charCode === mappings[i].charCode) { + mappings.splice(i, 1); + i--; + } + } + return { + platformId: potentialTable.platformId, + encodingId: potentialTable.encodingId, + mappings: mappings, + hasShortCmap: hasShortCmap + }; + } + function sanitizeMetrics(font, header, metrics, numGlyphs) { + if (!header) { + if (metrics) { + metrics.data = null; + } + return; + } + font.pos = (font.start ? font.start : 0) + header.offset; + font.pos += header.length - 2; + var numOfMetrics = font.getUint16(); + if (numOfMetrics > numGlyphs) { + info('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')'); + numOfMetrics = numGlyphs; + header.data[34] = (numOfMetrics & 0xff00) >> 8; + header.data[35] = numOfMetrics & 0x00ff; + } + var numOfSidebearings = numGlyphs - numOfMetrics; + var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1); + if (numMissing > 0) { + var entries = new Uint8Array(metrics.length + numMissing * 2); + entries.set(metrics.data); + metrics.data = entries; + } + } + function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) { + if (sourceEnd - sourceStart <= 12) { + return 0; + } + var glyf = source.subarray(sourceStart, sourceEnd); + var contoursCount = glyf[0] << 8 | glyf[1]; + if (contoursCount & 0x8000) { + dest.set(glyf, destStart); + return glyf.length; + } + var i, j = 10, flagsCount = 0; + for (i = 0; i < contoursCount; i++) { + var endPoint = glyf[j] << 8 | glyf[j + 1]; + flagsCount = endPoint + 1; + j += 2; + } + var instructionsStart = j; + var instructionsLength = glyf[j] << 8 | glyf[j + 1]; + j += 2 + instructionsLength; + var instructionsEnd = j; + var coordinatesLength = 0; + for (i = 0; i < flagsCount; i++) { + var flag = glyf[j++]; + if (flag & 0xC0) { + glyf[j - 1] = flag & 0x3F; + } + var xyLength = (flag & 2 ? 1 : flag & 16 ? 0 : 2) + (flag & 4 ? 1 : flag & 32 ? 0 : 2); + coordinatesLength += xyLength; + if (flag & 8) { + var repeat = glyf[j++]; + i += repeat; + coordinatesLength += repeat * xyLength; + } + } + if (coordinatesLength === 0) { + return 0; + } + var glyphDataLength = j + coordinatesLength; + if (glyphDataLength > glyf.length) { + return 0; + } + if (!hintsValid && instructionsLength > 0) { + dest.set(glyf.subarray(0, instructionsStart), destStart); + dest.set([ + 0, + 0 + ], destStart + instructionsStart); + dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2); + glyphDataLength -= instructionsLength; + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + } + return glyphDataLength; + } + if (glyf.length - glyphDataLength > 3) { + glyphDataLength = glyphDataLength + 3 & ~3; + dest.set(glyf.subarray(0, glyphDataLength), destStart); + return glyphDataLength; + } + dest.set(glyf, destStart); + return glyf.length; + } + function sanitizeHead(head, numGlyphs, locaLength) { + var data = head.data; + var version = int32(data[0], data[1], data[2], data[3]); + if (version >> 16 !== 1) { + info('Attempting to fix invalid version in head table: ' + version); + data[0] = 0; + data[1] = 1; + data[2] = 0; + data[3] = 0; + } + var indexToLocFormat = int16(data[50], data[51]); + if (indexToLocFormat < 0 || indexToLocFormat > 1) { + info('Attempting to fix invalid indexToLocFormat in head table: ' + indexToLocFormat); + var numGlyphsPlusOne = numGlyphs + 1; + if (locaLength === numGlyphsPlusOne << 1) { + data[50] = 0; + data[51] = 0; + } else if (locaLength === numGlyphsPlusOne << 2) { + data[50] = 0; + data[51] = 1; + } else { + warn('Could not fix indexToLocFormat: ' + indexToLocFormat); + } + } + } + function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry) { + var itemSize, itemDecode, itemEncode; + if (isGlyphLocationsLong) { + itemSize = 4; + itemDecode = function fontItemDecodeLong(data, offset) { + return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]; + }; + itemEncode = function fontItemEncodeLong(data, offset, value) { + data[offset] = value >>> 24 & 0xFF; + data[offset + 1] = value >> 16 & 0xFF; + data[offset + 2] = value >> 8 & 0xFF; + data[offset + 3] = value & 0xFF; + }; + } else { + itemSize = 2; + itemDecode = function fontItemDecode(data, offset) { + return data[offset] << 9 | data[offset + 1] << 1; + }; + itemEncode = function fontItemEncode(data, offset, value) { + data[offset] = value >> 9 & 0xFF; + data[offset + 1] = value >> 1 & 0xFF; + }; + } + var locaData = loca.data; + var locaDataSize = itemSize * (1 + numGlyphs); + if (locaData.length !== locaDataSize) { + locaData = new Uint8Array(locaDataSize); + locaData.set(loca.data.subarray(0, locaDataSize)); + loca.data = locaData; + } + var oldGlyfData = glyf.data; + var oldGlyfDataLength = oldGlyfData.length; + var newGlyfData = new Uint8Array(oldGlyfDataLength); + var startOffset = itemDecode(locaData, 0); + var writeOffset = 0; + var missingGlyphData = Object.create(null); + itemEncode(locaData, 0, writeOffset); + var i, j; + for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { + var endOffset = itemDecode(locaData, j); + if (endOffset > oldGlyfDataLength && (oldGlyfDataLength + 3 & ~3) === endOffset) { + endOffset = oldGlyfDataLength; + } + if (endOffset > oldGlyfDataLength) { + itemEncode(locaData, j, writeOffset); + startOffset = endOffset; + continue; + } + if (startOffset === endOffset) { + missingGlyphData[i] = true; + } + var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid); + writeOffset += newLength; + itemEncode(locaData, j, writeOffset); + startOffset = endOffset; + } + if (writeOffset === 0) { + var simpleGlyph = new Uint8Array([ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 49, + 0 + ]); + for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { + itemEncode(locaData, j, simpleGlyph.length); + } + glyf.data = simpleGlyph; + return missingGlyphData; + } + if (dupFirstEntry) { + var firstEntryLength = itemDecode(locaData, itemSize); + if (newGlyfData.length > firstEntryLength + writeOffset) { + glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); + } else { + glyf.data = new Uint8Array(firstEntryLength + writeOffset); + glyf.data.set(newGlyfData.subarray(0, writeOffset)); + } + glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); + itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength); + } else { + glyf.data = newGlyfData.subarray(0, writeOffset); + } + return missingGlyphData; + } + function readPostScriptTable(post, properties, maxpNumGlyphs) { + var start = (font.start ? font.start : 0) + post.offset; + font.pos = start; + var length = post.length, end = start + length; + var version = font.getInt32(); + font.getBytes(28); + var glyphNames; + var valid = true; + var i; + switch (version) { + case 0x00010000: + glyphNames = MacStandardGlyphOrdering; + break; + case 0x00020000: + var numGlyphs = font.getUint16(); + if (numGlyphs !== maxpNumGlyphs) { + valid = false; + break; + } + var glyphNameIndexes = []; + for (i = 0; i < numGlyphs; ++i) { + var index = font.getUint16(); + if (index >= 32768) { + valid = false; + break; + } + glyphNameIndexes.push(index); + } + if (!valid) { + break; + } + var customNames = []; + var strBuf = []; + while (font.pos < end) { + var stringLength = font.getByte(); + strBuf.length = stringLength; + for (i = 0; i < stringLength; ++i) { + strBuf[i] = String.fromCharCode(font.getByte()); + } + customNames.push(strBuf.join('')); + } + glyphNames = []; + for (i = 0; i < numGlyphs; ++i) { + var j = glyphNameIndexes[i]; + if (j < 258) { + glyphNames.push(MacStandardGlyphOrdering[j]); + continue; + } + glyphNames.push(customNames[j - 258]); + } + break; + case 0x00030000: + break; + default: + warn('Unknown/unsupported post table version ' + version); + valid = false; + if (properties.defaultEncoding) { + glyphNames = properties.defaultEncoding; + } + break; + } + properties.glyphNames = glyphNames; + return valid; + } + function readNameTable(nameTable) { + var start = (font.start ? font.start : 0) + nameTable.offset; + font.pos = start; + var names = [ + [], + [] + ]; + var length = nameTable.length, end = start + length; + var format = font.getUint16(); + var FORMAT_0_HEADER_LENGTH = 6; + if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { + return names; + } + var numRecords = font.getUint16(); + var stringsStart = font.getUint16(); + var records = []; + var NAME_RECORD_LENGTH = 12; + var i, ii; + for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) { + var r = { + platform: font.getUint16(), + encoding: font.getUint16(), + language: font.getUint16(), + name: font.getUint16(), + length: font.getUint16(), + offset: font.getUint16() + }; + if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) { + records.push(r); + } + } + for (i = 0, ii = records.length; i < ii; i++) { + var record = records[i]; + if (record.length <= 0) { + continue; + } + var pos = start + stringsStart + record.offset; + if (pos + record.length > end) { + continue; + } + font.pos = pos; + var nameIndex = record.name; + if (record.encoding) { + var str = ''; + for (var j = 0, jj = record.length; j < jj; j += 2) { + str += String.fromCharCode(font.getUint16()); + } + names[1][nameIndex] = str; + } else { + names[0][nameIndex] = bytesToString(font.getBytes(record.length)); + } + } + return names; + } + var TTOpsStackDeltas = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -2, + -2, + -2, + -2, + 0, + 0, + -2, + -5, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 0, + -1, + 0, + -1, + -1, + -1, + -1, + 1, + -1, + -999, + 0, + 1, + 0, + -1, + -2, + 0, + -1, + -2, + -1, + -1, + 0, + -1, + -1, + 0, + 0, + -999, + -999, + -1, + -1, + -1, + -1, + -2, + -999, + -2, + -2, + -999, + 0, + -2, + -2, + 0, + 0, + -2, + 0, + -2, + 0, + 0, + 0, + -2, + -1, + -1, + 1, + 1, + 0, + 0, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 0, + -1, + 0, + -1, + -1, + 0, + -999, + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -2, + -999, + -999, + -999, + -999, + -999, + -1, + -1, + -2, + -2, + 0, + 0, + 0, + 0, + -1, + -1, + -999, + -2, + -2, + 0, + 0, + -1, + -2, + -2, + 0, + 0, + 0, + -1, + -1, + -1, + -2 + ]; + function sanitizeTTProgram(table, ttContext) { + var data = table.data; + var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0; + var stack = []; + var callstack = []; + var functionsCalled = []; + var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions; + var inFDEF = false, ifLevel = 0, inELSE = 0; + for (var ii = data.length; i < ii;) { + var op = data[i++]; + if (op === 0x40) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if (op === 0x41) { + n = data[i++]; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(b << 8 | data[i++]); + } + } + } else if ((op & 0xF8) === 0xB0) { + n = op - 0xB0 + 1; + if (inFDEF || inELSE) { + i += n; + } else { + for (j = 0; j < n; j++) { + stack.push(data[i++]); + } + } + } else if ((op & 0xF8) === 0xB8) { + n = op - 0xB8 + 1; + if (inFDEF || inELSE) { + i += n * 2; + } else { + for (j = 0; j < n; j++) { + b = data[i++]; + stack.push(b << 8 | data[i++]); + } + } + } else if (op === 0x2B && !tooComplexToFollowFunctions) { + if (!inFDEF && !inELSE) { + funcId = stack[stack.length - 1]; + ttContext.functionsUsed[funcId] = true; + if (funcId in ttContext.functionsStackDeltas) { + stack.length += ttContext.functionsStackDeltas[funcId]; + } else if (funcId in ttContext.functionsDefined && functionsCalled.indexOf(funcId) < 0) { + callstack.push({ + data: data, + i: i, + stackTop: stack.length - 1 + }); + functionsCalled.push(funcId); + pc = ttContext.functionsDefined[funcId]; + if (!pc) { + warn('TT: CALL non-existent function'); + ttContext.hintsValid = false; + return; + } + data = pc.data; + i = pc.i; + } + } + } else if (op === 0x2C && !tooComplexToFollowFunctions) { + if (inFDEF || inELSE) { + warn('TT: nested FDEFs not allowed'); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + funcId = stack.pop(); + ttContext.functionsDefined[funcId] = { + data: data, + i: i + }; + } else if (op === 0x2D) { + if (inFDEF) { + inFDEF = false; + lastEndf = i; + } else { + pc = callstack.pop(); + if (!pc) { + warn('TT: ENDF bad stack'); + ttContext.hintsValid = false; + return; + } + funcId = functionsCalled.pop(); + data = pc.data; + i = pc.i; + ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop; + } + } else if (op === 0x89) { + if (inFDEF || inELSE) { + warn('TT: nested IDEFs not allowed'); + tooComplexToFollowFunctions = true; + } + inFDEF = true; + lastDeff = i; + } else if (op === 0x58) { + ++ifLevel; + } else if (op === 0x1B) { + inELSE = ifLevel; + } else if (op === 0x59) { + if (inELSE === ifLevel) { + inELSE = 0; + } + --ifLevel; + } else if (op === 0x1C) { + if (!inFDEF && !inELSE) { + var offset = stack[stack.length - 1]; + if (offset > 0) { + i += offset - 1; + } + } + } + if (!inFDEF && !inELSE) { + var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0; + if (op >= 0x71 && op <= 0x75) { + n = stack.pop(); + if (!isNaN(n)) { + stackDelta = -n * 2; + } + } + while (stackDelta < 0 && stack.length > 0) { + stack.pop(); + stackDelta++; + } + while (stackDelta > 0) { + stack.push(NaN); + stackDelta--; + } + } + } + ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; + var content = [data]; + if (i > data.length) { + content.push(new Uint8Array(i - data.length)); + } + if (lastDeff > lastEndf) { + warn('TT: complementing a missing function tail'); + content.push(new Uint8Array([ + 0x22, + 0x2D + ])); + } + foldTTTable(table, content); + } + function checkInvalidFunctions(ttContext, maxFunctionDefs) { + if (ttContext.tooComplexToFollowFunctions) { + return; + } + if (ttContext.functionsDefined.length > maxFunctionDefs) { + warn('TT: more functions defined than expected'); + ttContext.hintsValid = false; + return; + } + for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { + if (j > maxFunctionDefs) { + warn('TT: invalid function id: ' + j); + ttContext.hintsValid = false; + return; + } + if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { + warn('TT: undefined function: ' + j); + ttContext.hintsValid = false; + return; + } + } + } + function foldTTTable(table, content) { + if (content.length > 1) { + var newLength = 0; + var j, jj; + for (j = 0, jj = content.length; j < jj; j++) { + newLength += content[j].length; + } + newLength = newLength + 3 & ~3; + var result = new Uint8Array(newLength); + var pos = 0; + for (j = 0, jj = content.length; j < jj; j++) { + result.set(content[j], pos); + pos += content[j].length; + } + table.data = result; + table.length = newLength; + } + } + function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { + var ttContext = { + functionsDefined: [], + functionsUsed: [], + functionsStackDeltas: [], + tooComplexToFollowFunctions: false, + hintsValid: true + }; + if (fpgm) { + sanitizeTTProgram(fpgm, ttContext); + } + if (prep) { + sanitizeTTProgram(prep, ttContext); + } + if (fpgm) { + checkInvalidFunctions(ttContext, maxFunctionDefs); + } + if (cvt && cvt.length & 1) { + var cvtData = new Uint8Array(cvt.length + 1); + cvtData.set(cvt.data); + cvt.data = cvtData; + } + return ttContext.hintsValid; + } + font = new Stream(new Uint8Array(font.getBytes())); + var VALID_TABLES = [ + 'OS/2', + 'cmap', + 'head', + 'hhea', + 'hmtx', + 'maxp', + 'name', + 'post', + 'loca', + 'glyf', + 'fpgm', + 'prep', + 'cvt ', + 'CFF ' + ]; + var header = readOpenTypeHeader(font); + var numTables = header.numTables; + var cff, cffFile; + var tables = Object.create(null); + tables['OS/2'] = null; + tables['cmap'] = null; + tables['head'] = null; + tables['hhea'] = null; + tables['hmtx'] = null; + tables['maxp'] = null; + tables['name'] = null; + tables['post'] = null; + var table; + for (var i = 0; i < numTables; i++) { + table = readTableEntry(font); + if (VALID_TABLES.indexOf(table.tag) < 0) { + continue; + } + if (table.length === 0) { + continue; + } + tables[table.tag] = table; + } + var isTrueType = !tables['CFF ']; + if (!isTrueType) { + if (header.version === 'OTTO' && !properties.composite || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) { + cffFile = new Stream(tables['CFF '].data); + cff = new CFFFont(cffFile, properties); + adjustWidths(properties); + return this.convert(name, cff, properties); + } + delete tables['glyf']; + delete tables['loca']; + delete tables['fpgm']; + delete tables['prep']; + delete tables['cvt ']; + this.isOpenType = true; + } else { + if (!tables['loca']) { + error('Required "loca" table is not found'); + } + if (!tables['glyf']) { + warn('Required "glyf" table is not found -- trying to recover.'); + tables['glyf'] = { + tag: 'glyf', + data: new Uint8Array(0) + }; + } + this.isOpenType = false; + } + if (!tables['maxp']) { + error('Required "maxp" table is not found'); + } + font.pos = (font.start || 0) + tables['maxp'].offset; + var version = font.getInt32(); + var numGlyphs = font.getUint16(); + var maxFunctionDefs = 0; + if (version >= 0x00010000 && tables['maxp'].length >= 22) { + font.pos += 8; + var maxZones = font.getUint16(); + if (maxZones > 2) { + tables['maxp'].data[14] = 0; + tables['maxp'].data[15] = 2; + } + font.pos += 4; + maxFunctionDefs = font.getUint16(); + } + var dupFirstEntry = false; + if (properties.type === 'CIDFontType2' && properties.toUnicode && properties.toUnicode.get(0) > '\u0000') { + dupFirstEntry = true; + numGlyphs++; + tables['maxp'].data[4] = numGlyphs >> 8; + tables['maxp'].data[5] = numGlyphs & 255; + } + var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], tables['cvt '], maxFunctionDefs); + if (!hintsValid) { + delete tables['fpgm']; + delete tables['prep']; + delete tables['cvt ']; + } + sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphs); + if (!tables['head']) { + error('Required "head" table is not found'); + } + sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0); + var missingGlyphs = Object.create(null); + if (isTrueType) { + var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]); + missingGlyphs = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry); + } + if (!tables['hhea']) { + error('Required "hhea" table is not found'); + } + if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) { + tables['hhea'].data[10] = 0xFF; + tables['hhea'].data[11] = 0xFF; + } + var metricsOverride = { + unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]), + yMax: int16(tables['head'].data[42], tables['head'].data[43]), + yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]), + ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]), + descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7]) + }; + this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; + this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; + if (tables['post']) { + var valid = readPostScriptTable(tables['post'], properties, numGlyphs); + if (!valid) { + tables['post'] = null; + } + } + var charCodeToGlyphId = [], charCode; + var toUnicode = properties.toUnicode, widths = properties.widths; + var skipToUnicode = toUnicode instanceof IdentityToUnicodeMap || toUnicode.length === 0x10000; + function hasGlyph(glyphId, charCode, widthCode) { + if (!missingGlyphs[glyphId]) { + return true; + } + if (!skipToUnicode && charCode >= 0 && toUnicode.has(charCode)) { + return true; + } + if (widths && widthCode >= 0 && isNum(widths[widthCode])) { + return true; + } + return false; + } + if (properties.composite) { + var cidToGidMap = properties.cidToGidMap || []; + var isCidToGidMapEmpty = cidToGidMap.length === 0; + properties.cMap.forEach(function (charCode, cid) { + assert(cid <= 0xffff, 'Max size of CID is 65,535'); + var glyphId = -1; + if (isCidToGidMapEmpty) { + glyphId = cid; + } else if (cidToGidMap[cid] !== undefined) { + glyphId = cidToGidMap[cid]; + } + if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId, charCode, cid)) { + charCodeToGlyphId[charCode] = glyphId; + } + }); + if (dupFirstEntry && (isCidToGidMapEmpty || !charCodeToGlyphId[0])) { + charCodeToGlyphId[0] = numGlyphs - 1; + } + } else { + var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, properties.hasEncoding); + var cmapPlatformId = cmapTable.platformId; + var cmapEncodingId = cmapTable.encodingId; + var cmapMappings = cmapTable.mappings; + var cmapMappingsLength = cmapMappings.length; + if (properties.hasEncoding && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0) || cmapPlatformId === -1 && cmapEncodingId === -1 && !!getEncoding(properties.baseEncodingName)) { + var baseEncoding = []; + if (properties.baseEncodingName === 'MacRomanEncoding' || properties.baseEncodingName === 'WinAnsiEncoding') { + baseEncoding = getEncoding(properties.baseEncodingName); + } + var glyphsUnicodeMap = getGlyphsUnicode(); + for (charCode = 0; charCode < 256; charCode++) { + var glyphName, standardGlyphName; + if (this.differences && charCode in this.differences) { + glyphName = this.differences[charCode]; + } else if (charCode in baseEncoding && baseEncoding[charCode] !== '') { + glyphName = baseEncoding[charCode]; + } else { + glyphName = StandardEncoding[charCode]; + } + if (!glyphName) { + continue; + } + standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + var unicodeOrCharCode, isUnicode = false; + if (cmapPlatformId === 3 && cmapEncodingId === 1) { + unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; + isUnicode = true; + } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { + unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); + } + var found = false; + for (i = 0; i < cmapMappingsLength; ++i) { + if (cmapMappings[i].charCode !== unicodeOrCharCode) { + continue; + } + var code = isUnicode ? charCode : unicodeOrCharCode; + if (hasGlyph(cmapMappings[i].glyphId, code, -1)) { + charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; + found = true; + break; + } + } + if (!found && properties.glyphNames) { + var glyphId = properties.glyphNames.indexOf(glyphName); + if (glyphId === -1 && standardGlyphName !== glyphName) { + glyphId = properties.glyphNames.indexOf(standardGlyphName); + } + if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) { + charCodeToGlyphId[charCode] = glyphId; + found = true; + } + } + if (!found) { + charCodeToGlyphId[charCode] = 0; + } + } + } else if (cmapPlatformId === 0 && cmapEncodingId === 0) { + for (i = 0; i < cmapMappingsLength; ++i) { + charCodeToGlyphId[cmapMappings[i].charCode] = cmapMappings[i].glyphId; + } + } else { + for (i = 0; i < cmapMappingsLength; ++i) { + charCode = cmapMappings[i].charCode & 0xFF; + charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; + } + } + } + if (charCodeToGlyphId.length === 0) { + charCodeToGlyphId[0] = 0; + } + var newMapping = adjustMapping(charCodeToGlyphId, properties); + this.toFontChar = newMapping.toFontChar; + tables['cmap'] = { + tag: 'cmap', + data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs) + }; + if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { + tables['OS/2'] = { + tag: 'OS/2', + data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride) + }; + } + if (!tables['post']) { + tables['post'] = { + tag: 'post', + data: createPostTable(properties) + }; + } + if (!isTrueType) { + try { + cffFile = new Stream(tables['CFF '].data); + var parser = new CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED); + cff = parser.parse(); + var compiler = new CFFCompiler(cff); + tables['CFF '].data = compiler.compile(); + } catch (e) { + warn('Failed to compile font ' + properties.loadedName); + } + } + if (!tables['name']) { + tables['name'] = { + tag: 'name', + data: createNameTable(this.name) + }; + } else { + var namePrototype = readNameTable(tables['name']); + tables['name'].data = createNameTable(name, namePrototype); + } + var builder = new OpenTypeFileBuilder(header.version); + for (var tableTag in tables) { + builder.addTable(tableTag, tables[tableTag].data); + } + return builder.toArray(); + }, + convert: function Font_convert(fontName, font, properties) { + properties.fixedPitch = false; + if (properties.builtInEncoding) { + adjustToUnicode(properties, properties.builtInEncoding); + } + var mapping = font.getGlyphMapping(properties); + var newMapping = adjustMapping(mapping, properties); + this.toFontChar = newMapping.toFontChar; + var numGlyphs = font.numGlyphs; + function getCharCodes(charCodeToGlyphId, glyphId) { + var charCodes = null; + for (var charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + if (!charCodes) { + charCodes = []; + } + charCodes.push(charCode | 0); + } + } + return charCodes; + } + function createCharCode(charCodeToGlyphId, glyphId) { + for (var charCode in charCodeToGlyphId) { + if (glyphId === charCodeToGlyphId[charCode]) { + return charCode | 0; + } + } + newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId; + return newMapping.nextAvailableFontCharCode++; + } + var seacs = font.seacs; + if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { + var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; + var charset = font.getCharset(); + var seacMap = Object.create(null); + for (var glyphId in seacs) { + glyphId |= 0; + var seac = seacs[glyphId]; + var baseGlyphName = StandardEncoding[seac[2]]; + var accentGlyphName = StandardEncoding[seac[3]]; + var baseGlyphId = charset.indexOf(baseGlyphName); + var accentGlyphId = charset.indexOf(accentGlyphName); + if (baseGlyphId < 0 || accentGlyphId < 0) { + continue; + } + var accentOffset = { + x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], + y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] + }; + var charCodes = getCharCodes(mapping, glyphId); + if (!charCodes) { + continue; + } + for (var i = 0, ii = charCodes.length; i < ii; i++) { + var charCode = charCodes[i]; + var charCodeToGlyphId = newMapping.charCodeToGlyphId; + var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId); + var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId); + seacMap[charCode] = { + baseFontCharCode: baseFontCharCode, + accentFontCharCode: accentFontCharCode, + accentOffset: accentOffset + }; + } + } + properties.seacMap = seacMap; + } + var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; + var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F'); + builder.addTable('CFF ', font.data); + builder.addTable('OS/2', createOS2Table(properties, newMapping.charCodeToGlyphId)); + builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, numGlyphs)); + builder.addTable('head', '\x00\x01\x00\x00' + '\x00\x00\x10\x00' + '\x00\x00\x00\x00' + '\x5F\x0F\x3C\xF5' + '\x00\x00' + safeString16(unitsPerEm) + '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + '\x00\x00' + safeString16(properties.descent) + '\x0F\xFF' + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + '\x00\x11' + '\x00\x00' + '\x00\x00' + '\x00\x00'); + builder.addTable('hhea', '\x00\x01\x00\x00' + safeString16(properties.ascent) + safeString16(properties.descent) + '\x00\x00' + '\xFF\xFF' + '\x00\x00' + '\x00\x00' + '\x00\x00' + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + string16(numGlyphs)); + builder.addTable('hmtx', function fontFieldsHmtx() { + var charstrings = font.charstrings; + var cffWidths = font.cff ? font.cff.widths : null; + var hmtx = '\x00\x00\x00\x00'; + for (var i = 1, ii = numGlyphs; i < ii; i++) { + var width = 0; + if (charstrings) { + var charstring = charstrings[i - 1]; + width = 'width' in charstring ? charstring.width : 0; + } else if (cffWidths) { + width = Math.ceil(cffWidths[i] || 0); + } + hmtx += string16(width) + string16(0); + } + return hmtx; + }()); + builder.addTable('maxp', '\x00\x00\x50\x00' + string16(numGlyphs)); + builder.addTable('name', createNameTable(fontName)); + builder.addTable('post', createPostTable(properties)); + return builder.toArray(); + }, + get spaceWidth() { + if ('_shadowWidth' in this) { + return this._shadowWidth; + } + var possibleSpaceReplacements = [ + 'space', + 'minus', + 'one', + 'i', + 'I' + ]; + var width; + for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { + var glyphName = possibleSpaceReplacements[i]; + if (glyphName in this.widths) { + width = this.widths[glyphName]; + break; + } + var glyphsUnicodeMap = getGlyphsUnicode(); + var glyphUnicode = glyphsUnicodeMap[glyphName]; + var charcode = 0; + if (this.composite) { + if (this.cMap.contains(glyphUnicode)) { + charcode = this.cMap.lookup(glyphUnicode); + } + } + if (!charcode && this.toUnicode) { + charcode = this.toUnicode.charCodeOf(glyphUnicode); + } + if (charcode <= 0) { + charcode = glyphUnicode; + } + width = this.widths[charcode]; + if (width) { + break; + } + } + width = width || this.defaultWidth; + this._shadowWidth = width; + return width; + }, + charToGlyph: function Font_charToGlyph(charcode, isSpace) { + var fontCharCode, width, operatorListId; + var widthCode = charcode; + if (this.cMap && this.cMap.contains(charcode)) { + widthCode = this.cMap.lookup(charcode); + } + width = this.widths[widthCode]; + width = isNum(width) ? width : this.defaultWidth; + var vmetric = this.vmetrics && this.vmetrics[widthCode]; + var unicode = this.toUnicode.get(charcode) || charcode; + if (typeof unicode === 'number') { + unicode = String.fromCharCode(unicode); + } + var isInFont = charcode in this.toFontChar; + fontCharCode = this.toFontChar[charcode] || charcode; + if (this.missingFile) { + fontCharCode = mapSpecialUnicodeValues(fontCharCode); + } + if (this.isType3Font) { + operatorListId = fontCharCode; + } + var accent = null; + if (this.seacMap && this.seacMap[charcode]) { + isInFont = true; + var seac = this.seacMap[charcode]; + fontCharCode = seac.baseFontCharCode; + accent = { + fontChar: String.fromCharCode(seac.accentFontCharCode), + offset: seac.accentOffset + }; + } + var fontChar = String.fromCharCode(fontCharCode); + var glyph = this.glyphCache[charcode]; + if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) { + glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont); + this.glyphCache[charcode] = glyph; + } + return glyph; + }, + charsToGlyphs: function Font_charsToGlyphs(chars) { + var charsCache = this.charsCache; + var glyphs, glyph, charcode; + if (charsCache) { + glyphs = charsCache[chars]; + if (glyphs) { + return glyphs; + } + } + if (!charsCache) { + charsCache = this.charsCache = Object.create(null); + } + glyphs = []; + var charsCacheKey = chars; + var i = 0, ii; + if (this.cMap) { + var c = Object.create(null); + while (i < chars.length) { + this.cMap.readCharCode(chars, i, c); + charcode = c.charcode; + var length = c.length; + i += length; + var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; + glyph = this.charToGlyph(charcode, isSpace); + glyphs.push(glyph); + } + } else { + for (i = 0, ii = chars.length; i < ii; ++i) { + charcode = chars.charCodeAt(i); + glyph = this.charToGlyph(charcode, charcode === 0x20); + glyphs.push(glyph); + } + } + return charsCache[charsCacheKey] = glyphs; + } + }; + return Font; + }(); + var ErrorFont = function ErrorFontClosure() { + function ErrorFont(error) { + this.error = error; + this.loadedName = 'g_font_error'; + this.loading = false; + } + ErrorFont.prototype = { + charsToGlyphs: function ErrorFont_charsToGlyphs() { + return []; + }, + exportData: function ErrorFont_exportData() { + return { error: this.error }; + } + }; + return ErrorFont; + }(); + function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { + var charCodeToGlyphId = Object.create(null); + var glyphId, charCode, baseEncoding; + var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + if (properties.baseEncodingName) { + baseEncoding = getEncoding(properties.baseEncodingName); + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } else if (isSymbolicFont) { + for (charCode in builtInEncoding) { + charCodeToGlyphId[charCode] = builtInEncoding[charCode]; + } + } else { + baseEncoding = StandardEncoding; + for (charCode = 0; charCode < baseEncoding.length; charCode++) { + glyphId = glyphNames.indexOf(baseEncoding[charCode]); + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } + var differences = properties.differences, glyphsUnicodeMap; + if (differences) { + for (charCode in differences) { + var glyphName = differences[charCode]; + glyphId = glyphNames.indexOf(glyphName); + if (glyphId === -1) { + if (!glyphsUnicodeMap) { + glyphsUnicodeMap = getGlyphsUnicode(); + } + var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); + if (standardGlyphName !== glyphName) { + glyphId = glyphNames.indexOf(standardGlyphName); + } + } + if (glyphId >= 0) { + charCodeToGlyphId[charCode] = glyphId; + } else { + charCodeToGlyphId[charCode] = 0; + } + } + } + return charCodeToGlyphId; + } + var Type1Font = function Type1FontClosure() { + function findBlock(streamBytes, signature, startIndex) { + var streamBytesLength = streamBytes.length; + var signatureLength = signature.length; + var scanLength = streamBytesLength - signatureLength; + var i = startIndex, j, found = false; + while (i < scanLength) { + j = 0; + while (j < signatureLength && streamBytes[i + j] === signature[j]) { + j++; + } + if (j >= signatureLength) { + i += j; + while (i < streamBytesLength && isSpace(streamBytes[i])) { + i++; + } + found = true; + break; + } + i++; + } + return { + found: found, + length: i + }; + } + function getHeaderBlock(stream, suggestedLength) { + var EEXEC_SIGNATURE = [ + 0x65, + 0x65, + 0x78, + 0x65, + 0x63 + ]; + var streamStartPos = stream.pos; + var headerBytes, headerBytesLength, block; + try { + headerBytes = stream.getBytes(suggestedLength); + headerBytesLength = headerBytes.length; + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + } + if (headerBytesLength === suggestedLength) { + block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length); + if (block.found && block.length === suggestedLength) { + return { + stream: new Stream(headerBytes), + length: suggestedLength + }; + } + } + warn('Invalid "Length1" property in Type1 font -- trying to recover.'); + stream.pos = streamStartPos; + var SCAN_BLOCK_LENGTH = 2048; + var actualLength; + while (true) { + var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); + block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); + if (block.length === 0) { + break; + } + stream.pos += block.length; + if (block.found) { + actualLength = stream.pos - streamStartPos; + break; + } + } + stream.pos = streamStartPos; + if (actualLength) { + return { + stream: new Stream(stream.getBytes(actualLength)), + length: actualLength + }; + } + warn('Unable to recover "Length1" property in Type1 font -- using as is.'); + return { + stream: new Stream(stream.getBytes(suggestedLength)), + length: suggestedLength + }; + } + function getEexecBlock(stream, suggestedLength) { + var eexecBytes = stream.getBytes(); + return { + stream: new Stream(eexecBytes), + length: eexecBytes.length + }; + } + function Type1Font(name, file, properties) { + var PFB_HEADER_SIZE = 6; + var headerBlockLength = properties.length1; + var eexecBlockLength = properties.length2; + var pfbHeader = file.peekBytes(PFB_HEADER_SIZE); + var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; + if (pfbHeaderPresent) { + file.skip(PFB_HEADER_SIZE); + headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + var headerBlock = getHeaderBlock(file, headerBlockLength); + headerBlockLength = headerBlock.length; + var headerBlockParser = new Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED); + headerBlockParser.extractFontHeader(properties); + if (pfbHeaderPresent) { + pfbHeader = file.getBytes(PFB_HEADER_SIZE); + eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2]; + } + var eexecBlock = getEexecBlock(file, eexecBlockLength); + eexecBlockLength = eexecBlock.length; + var eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); + var data = eexecBlockParser.extractFontProgram(); + for (var info in data.properties) { + properties[info] = data.properties[info]; + } + var charstrings = data.charstrings; + var type2Charstrings = this.getType2Charstrings(charstrings); + var subrs = this.getType2Subrs(data.subrs); + this.charstrings = charstrings; + this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties); + this.seacs = this.getSeacs(data.charstrings); + } + Type1Font.prototype = { + get numGlyphs() { + return this.charstrings.length + 1; + }, + getCharset: function Type1Font_getCharset() { + var charset = ['.notdef']; + var charstrings = this.charstrings; + for (var glyphId = 0; glyphId < charstrings.length; glyphId++) { + charset.push(charstrings[glyphId].glyphName); + } + return charset; + }, + getGlyphMapping: function Type1Font_getGlyphMapping(properties) { + var charstrings = this.charstrings; + var glyphNames = ['.notdef'], glyphId; + for (glyphId = 0; glyphId < charstrings.length; glyphId++) { + glyphNames.push(charstrings[glyphId].glyphName); + } + var encoding = properties.builtInEncoding; + if (encoding) { + var builtInEncoding = Object.create(null); + for (var charCode in encoding) { + glyphId = glyphNames.indexOf(encoding[charCode]); + if (glyphId >= 0) { + builtInEncoding[charCode] = glyphId; + } + } + } + return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); + }, + getSeacs: function Type1Font_getSeacs(charstrings) { + var i, ii; + var seacMap = []; + for (i = 0, ii = charstrings.length; i < ii; i++) { + var charstring = charstrings[i]; + if (charstring.seac) { + seacMap[i + 1] = charstring.seac; + } + } + return seacMap; + }, + getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) { + var type2Charstrings = []; + for (var i = 0, ii = type1Charstrings.length; i < ii; i++) { + type2Charstrings.push(type1Charstrings[i].charstring); + } + return type2Charstrings; + }, + getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { + var bias = 0; + var count = type1Subrs.length; + if (count < 1133) { + bias = 107; + } else if (count < 33769) { + bias = 1131; + } else { + bias = 32768; + } + var type2Subrs = []; + var i; + for (i = 0; i < bias; i++) { + type2Subrs.push([0x0B]); + } + for (i = 0; i < count; i++) { + type2Subrs.push(type1Subrs[i]); + } + return type2Subrs; + }, + wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) { + var cff = new CFF(); + cff.header = new CFFHeader(1, 0, 4, 4); + cff.names = [name]; + var topDict = new CFFTopDict(); + topDict.setByName('version', 391); + topDict.setByName('Notice', 392); + topDict.setByName('FullName', 393); + topDict.setByName('FamilyName', 394); + topDict.setByName('Weight', 395); + topDict.setByName('Encoding', null); + topDict.setByName('FontMatrix', properties.fontMatrix); + topDict.setByName('FontBBox', properties.bbox); + topDict.setByName('charset', null); + topDict.setByName('CharStrings', null); + topDict.setByName('Private', null); + cff.topDict = topDict; + var strings = new CFFStrings(); + strings.add('Version 0.11'); + strings.add('See original notice'); + strings.add(name); + strings.add(name); + strings.add('Medium'); + cff.strings = strings; + cff.globalSubrIndex = new CFFIndex(); + var count = glyphs.length; + var charsetArray = [0]; + var i, ii; + for (i = 0; i < count; i++) { + var index = CFFStandardStrings.indexOf(charstrings[i].glyphName); + if (index === -1) { + index = 0; + } + charsetArray.push(index >> 8 & 0xff, index & 0xff); + } + cff.charset = new CFFCharset(false, 0, [], charsetArray); + var charStringsIndex = new CFFIndex(); + charStringsIndex.add([ + 0x8B, + 0x0E + ]); + for (i = 0; i < count; i++) { + var glyph = glyphs[i]; + if (glyph.length === 0) { + charStringsIndex.add([ + 0x8B, + 0x0E + ]); + continue; + } + charStringsIndex.add(glyph); + } + cff.charStrings = charStringsIndex; + var privateDict = new CFFPrivateDict(); + privateDict.setByName('Subrs', null); + var fields = [ + 'BlueValues', + 'OtherBlues', + 'FamilyBlues', + 'FamilyOtherBlues', + 'StemSnapH', + 'StemSnapV', + 'BlueShift', + 'BlueFuzz', + 'BlueScale', + 'LanguageGroup', + 'ExpansionFactor', + 'ForceBold', + 'StdHW', + 'StdVW' + ]; + for (i = 0, ii = fields.length; i < ii; i++) { + var field = fields[i]; + if (!(field in properties.privateData)) { + continue; + } + var value = properties.privateData[field]; + if (isArray(value)) { + for (var j = value.length - 1; j > 0; j--) { + value[j] -= value[j - 1]; + } + } + privateDict.setByName(field, value); + } + cff.topDict.privateDict = privateDict; + var subrIndex = new CFFIndex(); + for (i = 0, ii = subrs.length; i < ii; i++) { + subrIndex.add(subrs[i]); + } + privateDict.subrsIndex = subrIndex; + var compiler = new CFFCompiler(cff); + return compiler.compile(); + } + }; + return Type1Font; + }(); + var CFFFont = function CFFFontClosure() { + function CFFFont(file, properties) { + this.properties = properties; + var parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); + this.cff = parser.parse(); + var compiler = new CFFCompiler(this.cff); + this.seacs = this.cff.seacs; + try { + this.data = compiler.compile(); + } catch (e) { + warn('Failed to compile font ' + properties.loadedName); + this.data = file; + } + } + CFFFont.prototype = { + get numGlyphs() { + return this.cff.charStrings.count; + }, + getCharset: function CFFFont_getCharset() { + return this.cff.charset.charset; + }, + getGlyphMapping: function CFFFont_getGlyphMapping() { + var cff = this.cff; + var properties = this.properties; + var charsets = cff.charset.charset; + var charCodeToGlyphId; + var glyphId; + if (properties.composite) { + charCodeToGlyphId = Object.create(null); + if (cff.isCIDFont) { + for (glyphId = 0; glyphId < charsets.length; glyphId++) { + var cid = charsets[glyphId]; + var charCode = properties.cMap.charCodeOf(cid); + charCodeToGlyphId[charCode] = glyphId; + } + } else { + for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { + charCodeToGlyphId[glyphId] = glyphId; + } + } + return charCodeToGlyphId; + } + var encoding = cff.encoding ? cff.encoding.encoding : null; + charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); + return charCodeToGlyphId; + } + }; + return CFFFont; + }(); + (function checkSeacSupport() { + if (typeof navigator !== 'undefined' && /Windows/.test(navigator.userAgent)) { + SEAC_ANALYSIS_ENABLED = true; + } + }()); + (function checkChromeWindows() { + if (typeof navigator !== 'undefined' && /Windows.*Chrome/.test(navigator.userAgent)) { + SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true; + } + }()); + exports.ErrorFont = ErrorFont; + exports.Font = Font; + exports.FontFlags = FontFlags; + exports.IdentityToUnicodeMap = IdentityToUnicodeMap; + exports.ToUnicodeMap = ToUnicodeMap; + exports.getFontType = getFontType; + })); + (function (root, factory) { + factory(root.pdfjsCorePsParser = {}, root.pdfjsSharedUtil, root.pdfjsCoreParser); + }(this, function (exports, sharedUtil, coreParser) { + var error = sharedUtil.error; + var isSpace = sharedUtil.isSpace; + var EOF = coreParser.EOF; + 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() { + var conditionLocation = this.operators.length; + this.operators.push(null, null); + this.parseBlock(); + this.expect(PostScriptTokenTypes.RBRACE); + if (this.accept(PostScriptTokenTypes.IF)) { + 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); + 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 = Object.create(null); + 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(); + this.strBuf = []; + } + PostScriptLexer.prototype = { + nextChar: function PostScriptLexer_nextChar() { + return this.currentChar = this.stream.getByte(); + }, + getToken: function PostScriptLexer_getToken() { + var comment = false; + var ch = this.currentChar; + while (true) { + if (ch < 0) { + return EOF; + } + if (comment) { + if (ch === 0x0A || ch === 0x0D) { + comment = false; + } + } else if (ch === 0x25) { + comment = true; + } else if (!isSpace(ch)) { + break; + } + ch = this.nextChar(); + } + switch (ch | 0) { + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + 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; + } + var strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) { + strBuf.push(String.fromCharCode(ch)); + } + var str = strBuf.join(''); + 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 strBuf = this.strBuf; + strBuf.length = 0; + strBuf[0] = String.fromCharCode(ch); + while ((ch = this.nextChar()) >= 0) { + if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) { + strBuf.push(String.fromCharCode(ch)); + } else { + break; + } + } + var value = parseFloat(strBuf.join('')); + if (isNaN(value)) { + error('Invalid floating point number: ' + value); + } + return value; + } + }; + return PostScriptLexer; + }(); + exports.PostScriptLexer = PostScriptLexer; + exports.PostScriptParser = PostScriptParser; + })); + (function (root, factory) { + factory(root.pdfjsCoreFunction = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCorePsParser); + }(this, function (exports, sharedUtil, corePrimitives, corePsParser) { + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isBool = sharedUtil.isBool; + var isDict = corePrimitives.isDict; + var isStream = corePrimitives.isStream; + var PostScriptLexer = corePsParser.PostScriptLexer; + var PostScriptParser = corePsParser.PostScriptParser; + 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 i, ii; + var length = 1; + for (i = 0, ii = size.length; i < ii; i++) { + length *= size[i]; + } + length *= outputSize; + var array = new Array(length); + var codeSize = 0; + var codeBuf = 0; + var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1); + var strBytes = str.getBytes((length * bps + 7) / 8); + var strIdx = 0; + for (i = 0; i < length; i++) { + while (codeSize < bps) { + codeBuf <<= 8; + codeBuf |= strBytes[strIdx++]; + codeSize += 8; + } + codeSize -= bps; + array[i] = (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); + default: + return this.constructPostScriptFromIR(IR); + } + }, + parse: function PDFFunction_parse(xref, fn) { + var IR = this.getIR(xref, fn); + return this.fromIR(IR); + }, + parseArray: function PDFFunction_parseArray(xref, fnObj) { + if (!isArray(fnObj)) { + return this.parse(xref, fnObj); + } + var fnArray = []; + for (var j = 0, jj = fnObj.length; j < jj; j++) { + var obj = xref.fetchIfRef(fnObj[j]); + fnArray.push(PDFFunction.parse(xref, obj)); + } + return function (src, srcOffset, dest, destOffset) { + for (var i = 0, ii = fnArray.length; i < ii; i++) { + fnArray[i](src, srcOffset, dest, destOffset + i); + } + }; + }, + constructSampled: function PDFFunction_constructSampled(str, dict) { + function toMultiArray(arr) { + var inputLength = arr.length; + 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.getArray('Domain'); + var range = dict.getArray('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) { + info('No support for cubic spline interpolation: ' + order); + } + var encode = dict.getArray('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.getArray('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) { + function interpolate(x, xmin, xmax, ymin, ymax) { + return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin)); + } + return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) { + 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 range = IR[9]; + var cubeVertices = 1 << m; + var cubeN = new Float64Array(cubeVertices); + var cubeVertex = new Uint32Array(cubeVertices); + var i, j; + for (j = 0; j < cubeVertices; j++) { + cubeN[j] = 1; + } + var k = n, pos = 1; + for (i = 0; i < m; ++i) { + var domain_2i = domain[i][0]; + var domain_2i_1 = domain[i][1]; + var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1); + var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]); + var size_i = size[i]; + e = Math.min(Math.max(e, 0), size_i - 1); + var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; + var n0 = e0 + 1 - e; + var n1 = e - e0; + var offset0 = e0 * k; + var offset1 = offset0 + k; + for (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; + } + for (j = 0; j < n; ++j) { + var rj = 0; + for (i = 0; i < cubeVertices; i++) { + rj += samples[cubeVertex[i] + j] * cubeN[i]; + } + rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); + dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); + } + }; + }, + constructInterpolated: function PDFFunction_constructInterpolated(str, dict) { + var c0 = dict.getArray('C0') || [0]; + var c1 = dict.getArray('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(src, srcOffset, dest, destOffset) { + var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n); + for (var j = 0; j < length; ++j) { + dest[destOffset + j] = c0[j] + x * diff[j]; + } + }; + }, + constructStiched: function PDFFunction_constructStiched(fn, dict, xref) { + var domain = dict.getArray('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.getArray('Bounds'); + var encode = dict.getArray('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 = []; + var tmpBuf = new Float32Array(1); + for (var i = 0, ii = fnsIR.length; i < ii; i++) { + fns.push(PDFFunction.fromIR(fnsIR[i])); + } + return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) { + var clip = function constructStichedFromIRClip(v, min, max) { + if (v > max) { + v = max; + } else if (v < min) { + v = min; + } + return v; + }; + var v = clip(src[srcOffset], domain[0], domain[1]); + for (var i = 0, ii = bounds.length; i < ii; ++i) { + if (v < bounds[i]) { + break; + } + } + 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]; + tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); + fns[i](tmpBuf, 0, dest, destOffset); + }; + }, + constructPostScript: function PDFFunction_constructPostScript(fn, dict, xref) { + var domain = dict.getArray('Domain'); + var range = dict.getArray('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 compiled = new PostScriptCompiler().compile(code, domain, range); + if (compiled) { + return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); + } + info('Unable to compile PS function'); + var numOutputs = range.length >> 1; + var numInputs = domain.length >> 1; + var evaluator = new PostScriptEvaluator(code); + var cache = Object.create(null); + var MAX_CACHE_SIZE = 2048 * 4; + var cache_available = MAX_CACHE_SIZE; + var tmpBuf = new Float32Array(numInputs); + return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) { + var i, value; + var key = ''; + var input = tmpBuf; + for (i = 0; i < numInputs; i++) { + value = src[srcOffset + i]; + input[i] = value; + key += value + '_'; + } + var cachedValue = cache[key]; + if (cachedValue !== undefined) { + dest.set(cachedValue, destOffset); + return; + } + var output = new Float32Array(numOutputs); + var stack = evaluator.execute(input); + var stackIndex = stack.length - numOutputs; + for (i = 0; i < numOutputs; i++) { + value = stack[stackIndex + i]; + var bound = range[i * 2]; + if (value < bound) { + value = bound; + } else { + bound = range[i * 2 + 1]; + if (value > bound) { + value = bound; + } + } + output[i] = value; + } + if (cache_available > 0) { + cache_available--; + cache[key] = output; + } + dest.set(output, destOffset); + }; + } + }; + }(); + function isPDFFunction(v) { + var fnDict; + if (typeof v !== 'object') { + return false; + } else if (isDict(v)) { + fnDict = v; + } else if (isStream(v)) { + fnDict = v.dict; + } else { + return false; + } + return fnDict.has('FunctionType'); + } + var PostScriptStack = function PostScriptStackClosure() { + var MAX_STACK_SIZE = 100; + function PostScriptStack(initialStack) { + this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0); + } + 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]); + }, + 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) { + this.operators = operators; + } + 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') { + stack.push(operator); + continue; + } + switch (operator) { + case 'jz': + b = stack.pop(); + a = stack.pop(); + if (!a) { + counter = b; + } + break; + case 'j': + a = stack.pop(); + counter = a; + break; + 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': + 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(-a); + break; + case 'not': + a = stack.pop(); + if (isBool(a)) { + stack.push(!a); + } else { + stack.push(~a); + } + 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 PostScriptCompiler = function PostScriptCompilerClosure() { + function AstNode(type) { + this.type = type; + } + AstNode.prototype.visit = function (visitor) { + throw new Error('abstract method'); + }; + function AstArgument(index, min, max) { + AstNode.call(this, 'args'); + this.index = index; + this.min = min; + this.max = max; + } + AstArgument.prototype = Object.create(AstNode.prototype); + AstArgument.prototype.visit = function (visitor) { + visitor.visitArgument(this); + }; + function AstLiteral(number) { + AstNode.call(this, 'literal'); + this.number = number; + this.min = number; + this.max = number; + } + AstLiteral.prototype = Object.create(AstNode.prototype); + AstLiteral.prototype.visit = function (visitor) { + visitor.visitLiteral(this); + }; + function AstBinaryOperation(op, arg1, arg2, min, max) { + AstNode.call(this, 'binary'); + this.op = op; + this.arg1 = arg1; + this.arg2 = arg2; + this.min = min; + this.max = max; + } + AstBinaryOperation.prototype = Object.create(AstNode.prototype); + AstBinaryOperation.prototype.visit = function (visitor) { + visitor.visitBinaryOperation(this); + }; + function AstMin(arg, max) { + AstNode.call(this, 'max'); + this.arg = arg; + this.min = arg.min; + this.max = max; + } + AstMin.prototype = Object.create(AstNode.prototype); + AstMin.prototype.visit = function (visitor) { + visitor.visitMin(this); + }; + function AstVariable(index, min, max) { + AstNode.call(this, 'var'); + this.index = index; + this.min = min; + this.max = max; + } + AstVariable.prototype = Object.create(AstNode.prototype); + AstVariable.prototype.visit = function (visitor) { + visitor.visitVariable(this); + }; + function AstVariableDefinition(variable, arg) { + AstNode.call(this, 'definition'); + this.variable = variable; + this.arg = arg; + } + AstVariableDefinition.prototype = Object.create(AstNode.prototype); + AstVariableDefinition.prototype.visit = function (visitor) { + visitor.visitVariableDefinition(this); + }; + function ExpressionBuilderVisitor() { + this.parts = []; + } + ExpressionBuilderVisitor.prototype = { + visitArgument: function (arg) { + this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))'); + }, + visitVariable: function (variable) { + this.parts.push('v', variable.index); + }, + visitLiteral: function (literal) { + this.parts.push(literal.number); + }, + visitBinaryOperation: function (operation) { + this.parts.push('('); + operation.arg1.visit(this); + this.parts.push(' ', operation.op, ' '); + operation.arg2.visit(this); + this.parts.push(')'); + }, + visitVariableDefinition: function (definition) { + this.parts.push('var '); + definition.variable.visit(this); + this.parts.push(' = '); + definition.arg.visit(this); + this.parts.push(';'); + }, + visitMin: function (max) { + this.parts.push('Math.min('); + max.arg.visit(this); + this.parts.push(', ', max.max, ')'); + }, + toString: function () { + return this.parts.join(''); + } + }; + function buildAddOperation(num1, num2) { + if (num2.type === 'literal' && num2.number === 0) { + return num1; + } + if (num1.type === 'literal' && num1.number === 0) { + return num2; + } + if (num2.type === 'literal' && num1.type === 'literal') { + return new AstLiteral(num1.number + num2.number); + } + return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max); + } + function buildMulOperation(num1, num2) { + if (num2.type === 'literal') { + if (num2.number === 0) { + return new AstLiteral(0); + } else if (num2.number === 1) { + return num1; + } else if (num1.type === 'literal') { + return new AstLiteral(num1.number * num2.number); + } + } + if (num1.type === 'literal') { + if (num1.number === 0) { + return new AstLiteral(0); + } else if (num1.number === 1) { + return num2; + } + } + var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max); + return new AstBinaryOperation('*', num1, num2, min, max); + } + function buildSubOperation(num1, num2) { + if (num2.type === 'literal') { + if (num2.number === 0) { + return num1; + } else if (num1.type === 'literal') { + return new AstLiteral(num1.number - num2.number); + } + } + if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) { + return num2.arg2; + } + return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min); + } + function buildMinOperation(num1, max) { + if (num1.min >= max) { + return new AstLiteral(max); + } else if (num1.max <= max) { + return num1; + } + return new AstMin(num1, max); + } + function PostScriptCompiler() { + } + PostScriptCompiler.prototype = { + compile: function PostScriptCompiler_compile(code, domain, range) { + var stack = []; + var i, ii; + var instructions = []; + var inputSize = domain.length >> 1, outputSize = range.length >> 1; + var lastRegister = 0; + var n, j; + var num1, num2, ast1, ast2, tmpVar, item; + for (i = 0; i < inputSize; i++) { + stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); + } + for (i = 0, ii = code.length; i < ii; i++) { + item = code[i]; + if (typeof item === 'number') { + stack.push(new AstLiteral(item)); + continue; + } + switch (item) { + case 'add': + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildAddOperation(num1, num2)); + break; + case 'cvr': + if (stack.length < 1) { + return null; + } + break; + case 'mul': + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildMulOperation(num1, num2)); + break; + case 'sub': + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + stack.push(buildSubOperation(num1, num2)); + break; + case 'exch': + if (stack.length < 2) { + return null; + } + ast1 = stack.pop(); + ast2 = stack.pop(); + stack.push(ast1, ast2); + break; + case 'pop': + if (stack.length < 1) { + return null; + } + stack.pop(); + break; + case 'index': + if (stack.length < 1) { + return null; + } + num1 = stack.pop(); + if (num1.type !== 'literal') { + return null; + } + n = num1.number; + if (n < 0 || (n | 0) !== n || stack.length < n) { + return null; + } + ast1 = stack[stack.length - n - 1]; + if (ast1.type === 'literal' || ast1.type === 'var') { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - n - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case 'dup': + if (stack.length < 1) { + return null; + } + if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) { + num1 = stack.pop(); + stack.push(buildMinOperation(num1, code[i + 1])); + i += 6; + break; + } + ast1 = stack[stack.length - 1]; + if (ast1.type === 'literal' || ast1.type === 'var') { + stack.push(ast1); + break; + } + tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); + stack[stack.length - 1] = tmpVar; + stack.push(tmpVar); + instructions.push(new AstVariableDefinition(tmpVar, ast1)); + break; + case 'roll': + if (stack.length < 2) { + return null; + } + num2 = stack.pop(); + num1 = stack.pop(); + if (num2.type !== 'literal' || num1.type !== 'literal') { + return null; + } + j = num2.number; + n = num1.number; + if (n <= 0 || (n | 0) !== n || (j | 0) !== j || stack.length < n) { + return null; + } + j = (j % n + n) % n; + if (j === 0) { + break; + } + Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j)); + break; + default: + return null; + } + } + if (stack.length !== outputSize) { + return null; + } + var result = []; + instructions.forEach(function (instruction) { + var statementBuilder = new ExpressionBuilderVisitor(); + instruction.visit(statementBuilder); + result.push(statementBuilder.toString()); + }); + stack.forEach(function (expr, i) { + var statementBuilder = new ExpressionBuilderVisitor(); + expr.visit(statementBuilder); + var min = range[i * 2], max = range[i * 2 + 1]; + var out = [statementBuilder.toString()]; + if (min > expr.min) { + out.unshift('Math.max(', min, ', '); + out.push(')'); + } + if (max < expr.max) { + out.unshift('Math.min(', max, ', '); + out.push(')'); + } + out.unshift('dest[destOffset + ', i, '] = '); + out.push(';'); + result.push(out.join('')); + }); + return result.join('\n'); + } + }; + return PostScriptCompiler; + }(); + exports.isPDFFunction = isPDFFunction; + exports.PDFFunction = PDFFunction; + exports.PostScriptEvaluator = PostScriptEvaluator; + exports.PostScriptCompiler = PostScriptCompiler; + })); + (function (root, factory) { + factory(root.pdfjsCoreColorSpace = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreFunction); + }(this, function (exports, sharedUtil, corePrimitives, coreFunction) { + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isString = sharedUtil.isString; + var shadow = sharedUtil.shadow; + var warn = sharedUtil.warn; + var isDict = corePrimitives.isDict; + var isName = corePrimitives.isName; + var isStream = corePrimitives.isStream; + var PDFFunction = coreFunction.PDFFunction; + var ColorSpace = function ColorSpaceClosure() { + function resizeRgbImage(src, bpc, w1, h1, w2, h2, alpha01, dest) { + var COMPONENTS = 3; + alpha01 = alpha01 !== 1 ? 0 : alpha01; + var xRatio = w1 / w2; + var yRatio = h1 / h2; + var i, j, py, newIndex = 0, oldIndex; + var xScaled = new Uint16Array(w2); + var w1Scanline = w1 * COMPONENTS; + for (i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; + } + for (i = 0; i < h2; i++) { + py = Math.floor(i * yRatio) * w1Scanline; + for (j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + dest[newIndex++] = src[oldIndex++]; + newIndex += alpha01; + } + } + } + function ColorSpace() { + error('should not call ColorSpace constructor'); + } + ColorSpace.prototype = { + getRgb: function ColorSpace_getRgb(src, srcOffset) { + var rgb = new Uint8Array(3); + this.getRgbItem(src, srcOffset, rgb, 0); + return rgb; + }, + getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, dest, destOffset) { + error('Should not call ColorSpace.getRgbItem'); + }, + getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + error('Should not call ColorSpace.getRgbBuffer'); + }, + getOutputLength: function ColorSpace_getOutputLength(inputLength, alpha01) { + error('Should not call ColorSpace.getOutputLength'); + }, + isPassthrough: function ColorSpace_isPassthrough(bits) { + return false; + }, + fillRgb: function ColorSpace_fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) { + var count = originalWidth * originalHeight; + var rgbBuf = null; + var numComponentColors = 1 << bpc; + var needsResizing = originalHeight !== height || originalWidth !== width; + var i, ii; + if (this.isPassthrough(bpc)) { + rgbBuf = comps; + } else if (this.numComps === 1 && count > numComponentColors && this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') { + var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors); + var key; + for (i = 0; i < numComponentColors; i++) { + allColors[i] = i; + } + var colorMap = new Uint8Array(numComponentColors * 3); + this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0); + var destPos, rgbPos; + if (!needsResizing) { + destPos = 0; + for (i = 0; i < count; ++i) { + key = comps[i] * 3; + dest[destPos++] = colorMap[key]; + dest[destPos++] = colorMap[key + 1]; + dest[destPos++] = colorMap[key + 2]; + destPos += alpha01; + } + } else { + rgbBuf = new Uint8Array(count * 3); + rgbPos = 0; + for (i = 0; i < count; ++i) { + key = comps[i] * 3; + rgbBuf[rgbPos++] = colorMap[key]; + rgbBuf[rgbPos++] = colorMap[key + 1]; + rgbBuf[rgbPos++] = colorMap[key + 2]; + } + } + } else { + if (!needsResizing) { + this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01); + } else { + rgbBuf = new Uint8Array(count * 3); + this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0); + } + } + if (rgbBuf) { + if (needsResizing) { + resizeRgbImage(rgbBuf, bpc, originalWidth, originalHeight, width, height, alpha01, dest); + } else { + rgbPos = 0; + destPos = 0; + for (i = 0, ii = width * actualHeight; i < ii; i++) { + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + dest[destPos++] = rgbBuf[rgbPos++]; + destPos += alpha01; + } + } + } + }, + usesZeroToOneRange: true + }; + ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { + var IR = ColorSpace.parseToIR(cs, xref, res); + if (IR instanceof AlternateCS) { + return IR; + } + return ColorSpace.fromIR(IR); + }; + ColorSpace.fromIR = function ColorSpace_fromIR(IR) { + var name = isArray(IR) ? IR[0] : IR; + var whitePoint, blackPoint, gamma; + switch (name) { + case 'DeviceGrayCS': + return this.singletons.gray; + case 'DeviceRgbCS': + return this.singletons.rgb; + case 'DeviceCmykCS': + return this.singletons.cmyk; + case 'CalGrayCS': + whitePoint = IR[1]; + blackPoint = IR[2]; + gamma = IR[3]; + return new CalGrayCS(whitePoint, blackPoint, gamma); + case 'CalRGBCS': + whitePoint = IR[1]; + blackPoint = IR[2]; + gamma = IR[3]; + var matrix = IR[4]; + return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); + case 'PatternCS': + var basePatternCS = IR[1]; + if (basePatternCS) { + basePatternCS = ColorSpace.fromIR(basePatternCS); + } + return new PatternCS(basePatternCS); + case 'IndexedCS': + var baseIndexedCS = IR[1]; + var hiVal = IR[2]; + var lookup = IR[3]; + return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); + case 'AlternateCS': + var numComps = IR[1]; + var alt = IR[2]; + var tintFnIR = IR[3]; + return new AlternateCS(numComps, ColorSpace.fromIR(alt), PDFFunction.fromIR(tintFnIR)); + case 'LabCS': + whitePoint = IR[1]; + blackPoint = IR[2]; + var range = IR[3]; + return new LabCS(whitePoint, blackPoint, range); + default: + error('Unknown name ' + name); + } + return null; + }; + ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { + if (isName(cs)) { + var colorSpaces = res.get('ColorSpace'); + if (isDict(colorSpaces)) { + var refcs = colorSpaces.get(cs.name); + if (refcs) { + cs = refcs; + } + } + } + cs = xref.fetchIfRef(cs); + if (isName(cs)) { + switch (cs.name) { + case 'DeviceGray': + case 'G': + return 'DeviceGrayCS'; + case 'DeviceRGB': + case 'RGB': + return 'DeviceRgbCS'; + case 'DeviceCMYK': + case 'CMYK': + return 'DeviceCmykCS'; + case 'Pattern': + return [ + 'PatternCS', + null + ]; + default: + error('unrecognized colorspace ' + cs.name); + } + } else if (isArray(cs)) { + var mode = xref.fetchIfRef(cs[0]).name; + var numComps, params, alt, whitePoint, blackPoint, gamma; + switch (mode) { + case 'DeviceGray': + case 'G': + return 'DeviceGrayCS'; + case 'DeviceRGB': + case 'RGB': + return 'DeviceRgbCS'; + case 'DeviceCMYK': + case 'CMYK': + return 'DeviceCmykCS'; + case 'CalGray': + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray('WhitePoint'); + blackPoint = params.getArray('BlackPoint'); + gamma = params.get('Gamma'); + return [ + 'CalGrayCS', + whitePoint, + blackPoint, + gamma + ]; + case 'CalRGB': + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray('WhitePoint'); + blackPoint = params.getArray('BlackPoint'); + gamma = params.getArray('Gamma'); + var matrix = params.getArray('Matrix'); + return [ + 'CalRGBCS', + whitePoint, + blackPoint, + gamma, + matrix + ]; + case 'ICCBased': + var stream = xref.fetchIfRef(cs[1]); + var dict = stream.dict; + numComps = dict.get('N'); + alt = dict.get('Alternate'); + if (alt) { + var altIR = ColorSpace.parseToIR(alt, xref, res); + var altCS = ColorSpace.fromIR(altIR); + if (altCS.numComps === numComps) { + return altIR; + } + warn('ICCBased color space: Ignoring incorrect /Alternate entry.'); + } + if (numComps === 1) { + return 'DeviceGrayCS'; + } else if (numComps === 3) { + return 'DeviceRgbCS'; + } else if (numComps === 4) { + return 'DeviceCmykCS'; + } + break; + case 'Pattern': + var basePatternCS = cs[1] || null; + if (basePatternCS) { + basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); + } + return [ + 'PatternCS', + basePatternCS + ]; + case 'Indexed': + case 'I': + var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); + var hiVal = xref.fetchIfRef(cs[2]) + 1; + var lookup = xref.fetchIfRef(cs[3]); + if (isStream(lookup)) { + lookup = lookup.getBytes(); + } + return [ + 'IndexedCS', + baseIndexedCS, + hiVal, + lookup + ]; + case 'Separation': + case 'DeviceN': + var name = xref.fetchIfRef(cs[1]); + numComps = isArray(name) ? name.length : 1; + alt = ColorSpace.parseToIR(cs[2], xref, res); + var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); + return [ + 'AlternateCS', + numComps, + alt, + tintFnIR + ]; + case 'Lab': + params = xref.fetchIfRef(cs[1]); + whitePoint = params.getArray('WhitePoint'); + blackPoint = params.getArray('BlackPoint'); + var range = params.getArray('Range'); + return [ + 'LabCS', + whitePoint, + blackPoint, + range + ]; + default: + error('unimplemented color space object "' + mode + '"'); + } + } else { + error('unrecognized color space object: "' + cs + '"'); + } + return null; + }; + ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { + if (!isArray(decode)) { + return true; + } + if (n * 2 !== decode.length) { + warn('The decode map is not the correct length'); + return true; + } + for (var i = 0, ii = decode.length; i < ii; i += 2) { + if (decode[i] !== 0 || decode[i + 1] !== 1) { + return false; + } + } + return true; + }; + ColorSpace.singletons = { + get gray() { + return shadow(this, 'gray', new DeviceGrayCS()); + }, + get rgb() { + return shadow(this, 'rgb', new DeviceRgbCS()); + }, + get cmyk() { + return shadow(this, 'cmyk', new DeviceCmykCS()); + } + }; + return ColorSpace; + }(); + var AlternateCS = function AlternateCSClosure() { + function AlternateCS(numComps, base, tintFn) { + this.name = 'Alternate'; + this.numComps = numComps; + this.defaultColor = new Float32Array(numComps); + for (var i = 0; i < numComps; ++i) { + this.defaultColor[i] = 1; + } + this.base = base; + this.tintFn = tintFn; + this.tmpBuf = new Float32Array(base.numComps); + } + AlternateCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, dest, destOffset) { + var tmpBuf = this.tmpBuf; + this.tintFn(src, srcOffset, tmpBuf, 0); + this.base.getRgbItem(tmpBuf, 0, dest, destOffset); + }, + getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var tintFn = this.tintFn; + var base = this.base; + var scale = 1 / ((1 << bits) - 1); + var baseNumComps = base.numComps; + var usesZeroToOneRange = base.usesZeroToOneRange; + var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0; + var pos = isPassthrough ? destOffset : 0; + var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count); + var numComps = this.numComps; + var scaled = new Float32Array(numComps); + var tinted = new Float32Array(baseNumComps); + var i, j; + for (i = 0; i < count; i++) { + for (j = 0; j < numComps; j++) { + scaled[j] = src[srcOffset++] * scale; + } + tintFn(scaled, 0, tinted, 0); + if (usesZeroToOneRange) { + for (j = 0; j < baseNumComps; j++) { + baseBuf[pos++] = tinted[j] * 255; + } + } else { + base.getRgbItem(tinted, 0, baseBuf, pos); + pos += baseNumComps; + } + } + if (!isPassthrough) { + base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); + } + }, + getOutputLength: function AlternateCS_getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01); + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + }, + usesZeroToOneRange: true + }; + return AlternateCS; + }(); + var PatternCS = function PatternCSClosure() { + function PatternCS(baseCS) { + this.name = 'Pattern'; + this.base = baseCS; + } + PatternCS.prototype = {}; + return PatternCS; + }(); + var IndexedCS = function IndexedCSClosure() { + function IndexedCS(base, highVal, lookup) { + this.name = 'Indexed'; + this.numComps = 1; + this.defaultColor = new Uint8Array(this.numComps); + this.base = base; + this.highVal = highVal; + var baseNumComps = base.numComps; + var length = baseNumComps * highVal; + if (isStream(lookup)) { + this.lookup = new Uint8Array(length); + var bytes = lookup.getBytes(length); + this.lookup.set(bytes); + } else if (isString(lookup)) { + this.lookup = new Uint8Array(length); + for (var i = 0; i < length; ++i) { + this.lookup[i] = lookup.charCodeAt(i); + } + } else if (lookup instanceof Uint8Array || lookup instanceof Array) { + this.lookup = lookup; + } else { + error('Unrecognized lookup table: ' + lookup); + } + } + IndexedCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, dest, destOffset) { + var numComps = this.base.numComps; + var start = src[srcOffset] * numComps; + this.base.getRgbItem(this.lookup, start, dest, destOffset); + }, + getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var base = this.base; + var numComps = base.numComps; + var outputDelta = base.getOutputLength(numComps, alpha01); + var lookup = this.lookup; + for (var i = 0; i < count; ++i) { + var lookupPos = src[srcOffset++] * numComps; + base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); + destOffset += outputDelta; + } + }, + getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) { + return this.base.getOutputLength(inputLength * this.base.numComps, alpha01); + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { + return true; + }, + usesZeroToOneRange: true + }; + return IndexedCS; + }(); + var DeviceGrayCS = function DeviceGrayCSClosure() { + function DeviceGrayCS() { + this.name = 'DeviceGray'; + this.numComps = 1; + this.defaultColor = new Float32Array(this.numComps); + } + DeviceGrayCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, dest, destOffset) { + var c = src[srcOffset] * 255 | 0; + c = c < 0 ? 0 : c > 255 ? 255 : c; + dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; + }, + getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var scale = 255 / ((1 << bits) - 1); + var j = srcOffset, q = destOffset; + for (var i = 0; i < count; ++i) { + var c = scale * src[j++] | 0; + dest[q++] = c; + dest[q++] = c; + dest[q++] = c; + q += alpha01; + } + }, + getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + }, + usesZeroToOneRange: true + }; + return DeviceGrayCS; + }(); + var DeviceRgbCS = function DeviceRgbCSClosure() { + function DeviceRgbCS() { + this.name = 'DeviceRGB'; + this.numComps = 3; + this.defaultColor = new Float32Array(this.numComps); + } + DeviceRgbCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, dest, destOffset) { + var r = src[srcOffset] * 255 | 0; + var g = src[srcOffset + 1] * 255 | 0; + var b = src[srcOffset + 2] * 255 | 0; + dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r; + dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g; + dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b; + }, + getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + if (bits === 8 && alpha01 === 0) { + dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); + return; + } + var scale = 255 / ((1 << bits) - 1); + var j = srcOffset, q = destOffset; + for (var i = 0; i < count; ++i) { + dest[q++] = scale * src[j++] | 0; + dest[q++] = scale * src[j++] | 0; + dest[q++] = scale * src[j++] | 0; + q += alpha01; + } + }, + getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + }, + isPassthrough: function DeviceRgbCS_isPassthrough(bits) { + return bits === 8; + }, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + }, + usesZeroToOneRange: true + }; + return DeviceRgbCS; + }(); + var DeviceCmykCS = function DeviceCmykCSClosure() { + function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { + var c = src[srcOffset + 0] * srcScale; + var m = src[srcOffset + 1] * srcScale; + var y = src[srcOffset + 2] * srcScale; + var k = src[srcOffset + 3] * srcScale; + var r = c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747) + 255 | 0; + var g = c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578) + 255 | 0; + var b = c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367) + 255 | 0; + dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r; + dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g; + dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b; + } + function DeviceCmykCS() { + this.name = 'DeviceCMYK'; + this.numComps = 4; + this.defaultColor = new Float32Array(this.numComps); + this.defaultColor[3] = 1; + } + DeviceCmykCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(src, srcOffset, 1, dest, destOffset); + }, + getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var scale = 1 / ((1 << bits) - 1); + for (var i = 0; i < count; i++) { + convertToRgb(src, srcOffset, scale, dest, destOffset); + srcOffset += 4; + destOffset += 3 + alpha01; + } + }, + getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, alpha01) { + return inputLength / 4 * (3 + alpha01) | 0; + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + }, + usesZeroToOneRange: true + }; + return DeviceCmykCS; + }(); + var CalGrayCS = function CalGrayCSClosure() { + function CalGrayCS(whitePoint, blackPoint, gamma) { + this.name = 'CalGray'; + this.numComps = 1; + this.defaultColor = new Float32Array(this.numComps); + if (!whitePoint) { + error('WhitePoint missing - required for color space CalGray'); + } + blackPoint = blackPoint || [ + 0, + 0, + 0 + ]; + gamma = gamma || 1; + this.XW = whitePoint[0]; + this.YW = whitePoint[1]; + this.ZW = whitePoint[2]; + this.XB = blackPoint[0]; + this.YB = blackPoint[1]; + this.ZB = blackPoint[2]; + this.G = gamma; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + error('Invalid WhitePoint components for ' + this.name + ', no fallback available'); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + info('Invalid BlackPoint for ' + this.name + ', falling back to default'); + this.XB = this.YB = this.ZB = 0; + } + if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { + warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + ', ZB: ' + this.ZB + ', only default values are supported.'); + } + if (this.G < 1) { + info('Invalid Gamma: ' + this.G + ' for ' + this.name + ', falling back to default'); + this.G = 1; + } + } + function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { + var A = src[srcOffset] * scale; + var AG = Math.pow(A, cs.G); + var L = cs.YW * AG; + var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; + dest[destOffset] = val; + dest[destOffset + 1] = val; + dest[destOffset + 2] = val; + } + CalGrayCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(this, src, srcOffset, dest, destOffset, 1); + }, + getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var scale = 1 / ((1 << bits) - 1); + for (var i = 0; i < count; ++i) { + convertToRgb(this, src, srcOffset, dest, destOffset, scale); + srcOffset += 1; + destOffset += 3 + alpha01; + } + }, + getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01); + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + }, + usesZeroToOneRange: true + }; + return CalGrayCS; + }(); + var CalRGBCS = function CalRGBCSClosure() { + var BRADFORD_SCALE_MATRIX = new Float32Array([ + 0.8951, + 0.2664, + -0.1614, + -0.7502, + 1.7135, + 0.0367, + 0.0389, + -0.0685, + 1.0296 + ]); + var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ + 0.9869929, + -0.1470543, + 0.1599627, + 0.4323053, + 0.5183603, + 0.0492912, + -0.0085287, + 0.0400428, + 0.9684867 + ]); + var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ + 3.2404542, + -1.5371385, + -0.4985314, + -0.9692660, + 1.8760108, + 0.0415560, + 0.0556434, + -0.2040259, + 1.0572252 + ]); + var FLAT_WHITEPOINT_MATRIX = new Float32Array([ + 1, + 1, + 1 + ]); + var tempNormalizeMatrix = new Float32Array(3); + var tempConvertMatrix1 = new Float32Array(3); + var tempConvertMatrix2 = new Float32Array(3); + var DECODE_L_CONSTANT = Math.pow((8 + 16) / 116, 3) / 8.0; + function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { + this.name = 'CalRGB'; + this.numComps = 3; + this.defaultColor = new Float32Array(this.numComps); + if (!whitePoint) { + error('WhitePoint missing - required for color space CalRGB'); + } + blackPoint = blackPoint || new Float32Array(3); + gamma = gamma || new Float32Array([ + 1, + 1, + 1 + ]); + matrix = matrix || new Float32Array([ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 + ]); + var XW = whitePoint[0]; + var YW = whitePoint[1]; + var ZW = whitePoint[2]; + this.whitePoint = whitePoint; + var XB = blackPoint[0]; + var YB = blackPoint[1]; + var ZB = blackPoint[2]; + this.blackPoint = blackPoint; + this.GR = gamma[0]; + this.GG = gamma[1]; + this.GB = gamma[2]; + this.MXA = matrix[0]; + this.MYA = matrix[1]; + this.MZA = matrix[2]; + this.MXB = matrix[3]; + this.MYB = matrix[4]; + this.MZB = matrix[5]; + this.MXC = matrix[6]; + this.MYC = matrix[7]; + this.MZC = matrix[8]; + if (XW < 0 || ZW < 0 || YW !== 1) { + error('Invalid WhitePoint components for ' + this.name + ', no fallback available'); + } + if (XB < 0 || YB < 0 || ZB < 0) { + info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + ', ' + ZB + '], falling back to default'); + this.blackPoint = new Float32Array(3); + } + if (this.GR < 0 || this.GG < 0 || this.GB < 0) { + info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + '] for ' + this.name + ', falling back to default'); + this.GR = this.GG = this.GB = 1; + } + if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { + info('Invalid Matrix for ' + this.name + ' [' + this.MXA + ', ' + this.MYA + ', ' + this.MZA + this.MXB + ', ' + this.MYB + ', ' + this.MZB + this.MXC + ', ' + this.MYC + ', ' + this.MZC + '], falling back to default'); + this.MXA = this.MYB = this.MZC = 1; + this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; + } + } + function matrixProduct(a, b, result) { + result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; + result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; + } + function convertToFlat(sourceWhitePoint, LMS, result) { + result[0] = LMS[0] * 1 / sourceWhitePoint[0]; + result[1] = LMS[1] * 1 / sourceWhitePoint[1]; + result[2] = LMS[2] * 1 / sourceWhitePoint[2]; + } + function convertToD65(sourceWhitePoint, LMS, result) { + var D65X = 0.95047; + var D65Y = 1; + var D65Z = 1.08883; + result[0] = LMS[0] * D65X / sourceWhitePoint[0]; + result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; + result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; + } + function sRGBTransferFunction(color) { + if (color <= 0.0031308) { + return adjustToRange(0, 1, 12.92 * color); + } + return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); + } + function adjustToRange(min, max, value) { + return Math.max(min, Math.min(max, value)); + } + function decodeL(L) { + if (L < 0) { + return -decodeL(-L); + } + if (L > 8.0) { + return Math.pow((L + 16) / 116, 3); + } + return L * DECODE_L_CONSTANT; + } + function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { + if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) { + result[0] = XYZ_Flat[0]; + result[1] = XYZ_Flat[1]; + result[2] = XYZ_Flat[2]; + return; + } + var zeroDecodeL = decodeL(0); + var X_DST = zeroDecodeL; + var X_SRC = decodeL(sourceBlackPoint[0]); + var Y_DST = zeroDecodeL; + var Y_SRC = decodeL(sourceBlackPoint[1]); + var Z_DST = zeroDecodeL; + var Z_SRC = decodeL(sourceBlackPoint[2]); + var X_Scale = (1 - X_DST) / (1 - X_SRC); + var X_Offset = 1 - X_Scale; + var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); + var Y_Offset = 1 - Y_Scale; + var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); + var Z_Offset = 1 - Z_Scale; + result[0] = XYZ_Flat[0] * X_Scale + X_Offset; + result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; + result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; + } + function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { + if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { + result[0] = XYZ_In[0]; + result[1] = XYZ_In[1]; + result[2] = XYZ_In[2]; + return; + } + var LMS = result; + matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + var LMS_Flat = tempNormalizeMatrix; + convertToFlat(sourceWhitePoint, LMS, LMS_Flat); + matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); + } + function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { + var LMS = result; + matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); + var LMS_D65 = tempNormalizeMatrix; + convertToD65(sourceWhitePoint, LMS, LMS_D65); + matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); + } + function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { + var A = adjustToRange(0, 1, src[srcOffset] * scale); + var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); + var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); + var AGR = Math.pow(A, cs.GR); + var BGG = Math.pow(B, cs.GG); + var CGB = Math.pow(C, cs.GB); + var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; + var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; + var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; + var XYZ = tempConvertMatrix1; + XYZ[0] = X; + XYZ[1] = Y; + XYZ[2] = Z; + var XYZ_Flat = tempConvertMatrix2; + normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); + var XYZ_Black = tempConvertMatrix1; + compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); + var XYZ_D65 = tempConvertMatrix2; + normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); + var SRGB = tempConvertMatrix1; + matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); + var sR = sRGBTransferFunction(SRGB[0]); + var sG = sRGBTransferFunction(SRGB[1]); + var sB = sRGBTransferFunction(SRGB[2]); + dest[destOffset] = Math.round(sR * 255); + dest[destOffset + 1] = Math.round(sG * 255); + dest[destOffset + 2] = Math.round(sB * 255); + } + CalRGBCS.prototype = { + getRgb: function CalRGBCS_getRgb(src, srcOffset) { + var rgb = new Uint8Array(3); + this.getRgbItem(src, srcOffset, rgb, 0); + return rgb; + }, + getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(this, src, srcOffset, dest, destOffset, 1); + }, + getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var scale = 1 / ((1 << bits) - 1); + for (var i = 0; i < count; ++i) { + convertToRgb(this, src, srcOffset, dest, destOffset, scale); + srcOffset += 3; + destOffset += 3 + alpha01; + } + }, + getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { + return ColorSpace.isDefaultDecode(decodeMap, this.numComps); + }, + usesZeroToOneRange: true + }; + return CalRGBCS; + }(); + var LabCS = function LabCSClosure() { + function LabCS(whitePoint, blackPoint, range) { + this.name = 'Lab'; + this.numComps = 3; + this.defaultColor = new Float32Array(this.numComps); + if (!whitePoint) { + error('WhitePoint missing - required for color space Lab'); + } + blackPoint = blackPoint || [ + 0, + 0, + 0 + ]; + range = range || [ + -100, + 100, + -100, + 100 + ]; + this.XW = whitePoint[0]; + this.YW = whitePoint[1]; + this.ZW = whitePoint[2]; + this.amin = range[0]; + this.amax = range[1]; + this.bmin = range[2]; + this.bmax = range[3]; + this.XB = blackPoint[0]; + this.YB = blackPoint[1]; + this.ZB = blackPoint[2]; + if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { + error('Invalid WhitePoint components, no fallback available'); + } + if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { + info('Invalid BlackPoint, falling back to default'); + this.XB = this.YB = this.ZB = 0; + } + if (this.amin > this.amax || this.bmin > this.bmax) { + info('Invalid Range, falling back to defaults'); + this.amin = -100; + this.amax = 100; + this.bmin = -100; + this.bmax = 100; + } + } + function fn_g(x) { + var result; + if (x >= 6 / 29) { + result = x * x * x; + } else { + result = 108 / 841 * (x - 4 / 29); + } + return result; + } + function decode(value, high1, low2, high2) { + return low2 + value * (high2 - low2) / high1; + } + function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { + var Ls = src[srcOffset]; + var as = src[srcOffset + 1]; + var bs = src[srcOffset + 2]; + if (maxVal !== false) { + Ls = decode(Ls, maxVal, 0, 100); + as = decode(as, maxVal, cs.amin, cs.amax); + bs = decode(bs, maxVal, cs.bmin, cs.bmax); + } + as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; + bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; + var M = (Ls + 16) / 116; + var L = M + as / 500; + var N = M - bs / 200; + var X = cs.XW * fn_g(L); + var Y = cs.YW * fn_g(M); + var Z = cs.ZW * fn_g(N); + var r, g, b; + if (cs.ZW < 1) { + r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; + g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; + b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; + } else { + r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; + g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; + b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; + } + dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; + dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; + dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; + } + LabCS.prototype = { + getRgb: ColorSpace.prototype.getRgb, + getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { + convertToRgb(this, src, srcOffset, false, dest, destOffset); + }, + getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) { + var maxVal = (1 << bits) - 1; + for (var i = 0; i < count; i++) { + convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); + srcOffset += 3; + destOffset += 3 + alpha01; + } + }, + getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { + return inputLength * (3 + alpha01) / 3 | 0; + }, + isPassthrough: ColorSpace.prototype.isPassthrough, + fillRgb: ColorSpace.prototype.fillRgb, + isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { + return true; + }, + usesZeroToOneRange: false + }; + return LabCS; + }(); + exports.ColorSpace = ColorSpace; + })); + (function (root, factory) { + factory(root.pdfjsCoreImage = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreColorSpace, root.pdfjsCoreStream, root.pdfjsCoreJpx); + }(this, function (exports, sharedUtil, corePrimitives, coreColorSpace, coreStream, coreJpx) { + var ImageKind = sharedUtil.ImageKind; + var assert = sharedUtil.assert; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var warn = sharedUtil.warn; + var Name = corePrimitives.Name; + var isStream = corePrimitives.isStream; + var ColorSpace = coreColorSpace.ColorSpace; + var DecodeStream = coreStream.DecodeStream; + var JpegStream = coreStream.JpegStream; + var JpxImage = coreJpx.JpxImage; + var PDFImage = function PDFImageClosure() { + function handleImageData(image, nativeDecoder) { + if (nativeDecoder && nativeDecoder.canDecode(image)) { + return nativeDecoder.decode(image); + } + return Promise.resolve(image); + } + function decodeAndClamp(value, addend, coefficient, max) { + value = addend + value * coefficient; + return value < 0 ? 0 : value > max ? max : value; + } + function resizeImageMask(src, bpc, w1, h1, w2, h2) { + var length = w2 * h2; + var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length); + var xRatio = w1 / w2; + var yRatio = h1 / h2; + var i, j, py, newIndex = 0, oldIndex; + var xScaled = new Uint16Array(w2); + var w1Scanline = w1; + for (i = 0; i < w2; i++) { + xScaled[i] = Math.floor(i * xRatio); + } + for (i = 0; i < h2; i++) { + py = Math.floor(i * yRatio) * w1Scanline; + for (j = 0; j < w2; j++) { + oldIndex = py + xScaled[j]; + dest[newIndex++] = src[oldIndex]; + } + } + return dest; + } + function PDFImage(xref, res, image, inline, smask, mask, isMask) { + this.image = image; + var dict = image.dict; + if (dict.has('Filter')) { + var filter = dict.get('Filter').name; + if (filter === 'JPXDecode') { + var jpxImage = new JpxImage(); + jpxImage.parseImageProperties(image.stream); + image.stream.reset(); + image.bitsPerComponent = jpxImage.bitsPerComponent; + image.numComps = jpxImage.componentsCount; + } else if (filter === 'JBIG2Decode') { + image.bitsPerComponent = 1; + image.numComps = 1; + } + } + this.width = dict.get('Width', 'W'); + this.height = dict.get('Height', 'H'); + if (this.width < 1 || this.height < 1) { + error('Invalid image width: ' + this.width + ' or height: ' + this.height); + } + this.interpolate = dict.get('Interpolate', 'I') || false; + this.imageMask = dict.get('ImageMask', 'IM') || false; + this.matte = dict.get('Matte') || false; + var bitsPerComponent = image.bitsPerComponent; + if (!bitsPerComponent) { + bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); + if (!bitsPerComponent) { + if (this.imageMask) { + bitsPerComponent = 1; + } else { + error('Bits per component missing in image: ' + this.imageMask); + } + } + } + this.bpc = bitsPerComponent; + if (!this.imageMask) { + var colorSpace = dict.get('ColorSpace', 'CS'); + if (!colorSpace) { + info('JPX images (which do not require color spaces)'); + switch (image.numComps) { + case 1: + colorSpace = Name.get('DeviceGray'); + break; + case 3: + colorSpace = Name.get('DeviceRGB'); + break; + case 4: + colorSpace = Name.get('DeviceCMYK'); + break; + default: + error('JPX images with ' + this.numComps + ' color components not supported.'); + } + } + this.colorSpace = ColorSpace.parse(colorSpace, xref, res); + this.numComps = this.colorSpace.numComps; + } + this.decode = dict.getArray('Decode', 'D'); + this.needsDecode = false; + if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode) || isMask && !ColorSpace.isDefaultDecode(this.decode, 1))) { + this.needsDecode = true; + var max = (1 << bitsPerComponent) - 1; + this.decodeCoefficients = []; + this.decodeAddends = []; + for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { + var dmin = this.decode[i]; + var dmax = this.decode[i + 1]; + this.decodeCoefficients[j] = dmax - dmin; + this.decodeAddends[j] = max * dmin; + } + } + if (smask) { + this.smask = new PDFImage(xref, res, smask, false); + } else if (mask) { + if (isStream(mask)) { + var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); + if (!imageMask) { + warn('Ignoring /Mask in image without /ImageMask.'); + } else { + this.mask = new PDFImage(xref, res, mask, false, null, null, true); + } + } else { + this.mask = mask; + } + } + } + PDFImage.buildImage = function PDFImage_buildImage(handler, xref, res, image, inline, nativeDecoder) { + var imagePromise = handleImageData(image, nativeDecoder); + var smaskPromise; + var maskPromise; + var smask = image.dict.get('SMask'); + var mask = image.dict.get('Mask'); + if (smask) { + smaskPromise = handleImageData(smask, nativeDecoder); + maskPromise = Promise.resolve(null); + } else { + smaskPromise = Promise.resolve(null); + if (mask) { + if (isStream(mask)) { + maskPromise = handleImageData(mask, nativeDecoder); + } else if (isArray(mask)) { + maskPromise = Promise.resolve(mask); + } else { + warn('Unsupported mask format.'); + maskPromise = Promise.resolve(null); + } + } else { + maskPromise = Promise.resolve(null); + } + } + return Promise.all([ + imagePromise, + smaskPromise, + maskPromise + ]).then(function (results) { + var imageData = results[0]; + var smaskData = results[1]; + var maskData = results[2]; + return new PDFImage(xref, res, imageData, inline, smaskData, maskData); + }); + }; + PDFImage.createMask = function PDFImage_createMask(imgArray, width, height, imageIsFromDecodeStream, inverseDecode) { + var computedLength = (width + 7 >> 3) * height; + var actualLength = imgArray.byteLength; + var haveFullData = computedLength === actualLength; + var data, i; + if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { + data = imgArray; + } else if (!inverseDecode) { + data = new Uint8Array(actualLength); + data.set(imgArray); + } else { + data = new Uint8Array(computedLength); + data.set(imgArray); + for (i = actualLength; i < computedLength; i++) { + data[i] = 0xff; + } + } + if (inverseDecode) { + for (i = 0; i < actualLength; i++) { + data[i] = ~data[i]; + } + } + return { + data: data, + width: width, + height: height + }; + }; + PDFImage.prototype = { + get drawWidth() { + return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0); + }, + get drawHeight() { + return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0); + }, + decodeBuffer: function PDFImage_decodeBuffer(buffer) { + var bpc = this.bpc; + var numComps = this.numComps; + var decodeAddends = this.decodeAddends; + var decodeCoefficients = this.decodeCoefficients; + var max = (1 << bpc) - 1; + var i, ii; + if (bpc === 1) { + for (i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] = +!buffer[i]; + } + return; + } + var index = 0; + for (i = 0, ii = this.width * this.height; i < ii; i++) { + for (var j = 0; j < numComps; j++) { + buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max); + index++; + } + } + }, + getComponents: function PDFImage_getComponents(buffer) { + var bpc = this.bpc; + if (bpc === 8) { + return buffer; + } + var width = this.width; + var height = this.height; + var numComps = this.numComps; + var length = width * height * numComps; + var bufferPos = 0; + var output = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length); + var rowComps = width * numComps; + var max = (1 << bpc) - 1; + var i = 0, ii, buf; + if (bpc === 1) { + var mask, loop1End, loop2End; + for (var j = 0; j < height; j++) { + loop1End = i + (rowComps & ~7); + loop2End = i + rowComps; + while (i < loop1End) { + buf = buffer[bufferPos++]; + output[i] = buf >> 7 & 1; + output[i + 1] = buf >> 6 & 1; + output[i + 2] = buf >> 5 & 1; + output[i + 3] = buf >> 4 & 1; + output[i + 4] = buf >> 3 & 1; + output[i + 5] = buf >> 2 & 1; + output[i + 6] = buf >> 1 & 1; + output[i + 7] = buf & 1; + i += 8; + } + if (i < loop2End) { + buf = buffer[bufferPos++]; + mask = 128; + while (i < loop2End) { + output[i++] = +!!(buf & mask); + mask >>= 1; + } + } + } + } else { + var bits = 0; + buf = 0; + for (i = 0, ii = length; i < ii; ++i) { + if (i % rowComps === 0) { + buf = 0; + bits = 0; + } + while (bits < bpc) { + buf = buf << 8 | buffer[bufferPos++]; + bits += 8; + } + var remainingBits = bits - bpc; + var value = buf >> remainingBits; + output[i] = value < 0 ? 0 : value > max ? max : value; + buf = buf & (1 << remainingBits) - 1; + bits = remainingBits; + } + } + return output; + }, + fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, actualHeight, image) { + var smask = this.smask; + var mask = this.mask; + var alphaBuf, sw, sh, i, ii, j; + if (smask) { + sw = smask.width; + sh = smask.height; + alphaBuf = new Uint8Array(sw * sh); + smask.fillGrayBuffer(alphaBuf); + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height); + } + } else if (mask) { + if (mask instanceof PDFImage) { + sw = mask.width; + sh = mask.height; + alphaBuf = new Uint8Array(sw * sh); + mask.numComps = 1; + mask.fillGrayBuffer(alphaBuf); + for (i = 0, ii = sw * sh; i < ii; ++i) { + alphaBuf[i] = 255 - alphaBuf[i]; + } + if (sw !== width || sh !== height) { + alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height); + } + } else if (isArray(mask)) { + alphaBuf = new Uint8Array(width * height); + var numComps = this.numComps; + for (i = 0, ii = width * height; i < ii; ++i) { + var opacity = 0; + var imageOffset = i * numComps; + for (j = 0; j < numComps; ++j) { + var color = image[imageOffset + j]; + var maskOffset = j * 2; + if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { + opacity = 255; + break; + } + } + alphaBuf[i] = opacity; + } + } else { + error('Unknown mask format.'); + } + } + if (alphaBuf) { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = alphaBuf[i]; + } + } else { + for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { + rgbaBuf[j] = 255; + } + } + }, + undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { + var matte = this.smask && this.smask.matte; + if (!matte) { + return; + } + var matteRgb = this.colorSpace.getRgb(matte, 0); + var matteR = matteRgb[0]; + var matteG = matteRgb[1]; + var matteB = matteRgb[2]; + var length = width * height * 4; + var r, g, b; + for (var i = 0; i < length; i += 4) { + var alpha = buffer[i + 3]; + if (alpha === 0) { + buffer[i] = 255; + buffer[i + 1] = 255; + buffer[i + 2] = 255; + continue; + } + var k = 255 / alpha; + r = (buffer[i] - matteR) * k + matteR; + g = (buffer[i + 1] - matteG) * k + matteG; + b = (buffer[i + 2] - matteB) * k + matteB; + buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; + buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; + buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; + } + }, + createImageData: function PDFImage_createImageData(forceRGBA) { + var drawWidth = this.drawWidth; + var drawHeight = this.drawHeight; + var imgData = { + width: drawWidth, + height: drawHeight + }; + var numComps = this.numComps; + var originalWidth = this.width; + var originalHeight = this.height; + var bpc = this.bpc; + var rowBytes = originalWidth * numComps * bpc + 7 >> 3; + var imgArray; + if (!forceRGBA) { + var kind; + if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { + kind = ImageKind.GRAYSCALE_1BPP; + } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) { + kind = ImageKind.RGB_24BPP; + } + if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) { + imgData.kind = kind; + imgArray = this.getImageBytes(originalHeight * rowBytes); + if (this.image instanceof DecodeStream) { + imgData.data = imgArray; + } else { + var newArray = new Uint8Array(imgArray.length); + newArray.set(imgArray); + imgData.data = newArray; + } + if (this.needsDecode) { + assert(kind === ImageKind.GRAYSCALE_1BPP); + var buffer = imgData.data; + for (var i = 0, ii = buffer.length; i < ii; i++) { + buffer[i] ^= 0xff; + } + } + return imgData; + } + if (this.image instanceof JpegStream && !this.smask && !this.mask && (this.colorSpace.name === 'DeviceGray' || this.colorSpace.name === 'DeviceRGB' || this.colorSpace.name === 'DeviceCMYK')) { + imgData.kind = ImageKind.RGB_24BPP; + imgData.data = this.getImageBytes(originalHeight * rowBytes, drawWidth, drawHeight, true); + return imgData; + } + } + imgArray = this.getImageBytes(originalHeight * rowBytes); + var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight; + var comps = this.getComponents(imgArray); + var alpha01, maybeUndoPreblend; + if (!forceRGBA && !this.smask && !this.mask) { + imgData.kind = ImageKind.RGB_24BPP; + imgData.data = new Uint8Array(drawWidth * drawHeight * 3); + alpha01 = 0; + maybeUndoPreblend = false; + } else { + imgData.kind = ImageKind.RGBA_32BPP; + imgData.data = new Uint8Array(drawWidth * drawHeight * 4); + alpha01 = 1; + maybeUndoPreblend = true; + this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps); + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01); + if (maybeUndoPreblend) { + this.undoPreblend(imgData.data, drawWidth, actualHeight); + } + return imgData; + }, + fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { + var numComps = this.numComps; + if (numComps !== 1) { + error('Reading gray scale from a color image: ' + numComps); + } + var width = this.width; + var height = this.height; + var bpc = this.bpc; + var rowBytes = width * numComps * bpc + 7 >> 3; + var imgArray = this.getImageBytes(height * rowBytes); + var comps = this.getComponents(imgArray); + var i, length; + if (bpc === 1) { + length = width * height; + if (this.needsDecode) { + for (i = 0; i < length; ++i) { + buffer[i] = comps[i] - 1 & 255; + } + } else { + for (i = 0; i < length; ++i) { + buffer[i] = -comps[i] & 255; + } + } + return; + } + if (this.needsDecode) { + this.decodeBuffer(comps); + } + length = width * height; + var scale = 255 / ((1 << bpc) - 1); + for (i = 0; i < length; ++i) { + buffer[i] = scale * comps[i] | 0; + } + }, + getImageBytes: function PDFImage_getImageBytes(length, drawWidth, drawHeight, forceRGB) { + this.image.reset(); + this.image.drawWidth = drawWidth || this.width; + this.image.drawHeight = drawHeight || this.height; + this.image.forceRGB = !!forceRGB; + return this.image.getBytes(length); + } + }; + return PDFImage; + }(); + exports.PDFImage = PDFImage; + })); + (function (root, factory) { + factory(root.pdfjsCoreObj = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreCrypto, root.pdfjsCoreParser, root.pdfjsCoreChunkedStream, root.pdfjsCoreColorSpace); + }(this, function (exports, sharedUtil, corePrimitives, coreCrypto, coreParser, coreChunkedStream, coreColorSpace) { + var InvalidPDFException = sharedUtil.InvalidPDFException; + var MissingDataException = sharedUtil.MissingDataException; + var XRefParseException = sharedUtil.XRefParseException; + var assert = sharedUtil.assert; + var bytesToString = sharedUtil.bytesToString; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isBool = sharedUtil.isBool; + var isInt = sharedUtil.isInt; + var isString = sharedUtil.isString; + var shadow = sharedUtil.shadow; + var stringToPDFString = sharedUtil.stringToPDFString; + var stringToUTF8String = sharedUtil.stringToUTF8String; + var warn = sharedUtil.warn; + var createValidAbsoluteUrl = sharedUtil.createValidAbsoluteUrl; + var Util = sharedUtil.Util; + var Ref = corePrimitives.Ref; + var RefSet = corePrimitives.RefSet; + var RefSetCache = corePrimitives.RefSetCache; + var isName = corePrimitives.isName; + var isCmd = corePrimitives.isCmd; + var isDict = corePrimitives.isDict; + var isRef = corePrimitives.isRef; + var isRefsEqual = corePrimitives.isRefsEqual; + var isStream = corePrimitives.isStream; + var CipherTransformFactory = coreCrypto.CipherTransformFactory; + var Lexer = coreParser.Lexer; + var Parser = coreParser.Parser; + var ChunkedStream = coreChunkedStream.ChunkedStream; + var ColorSpace = coreColorSpace.ColorSpace; + var Catalog = function CatalogClosure() { + function Catalog(pdfManager, xref, pageFactory) { + this.pdfManager = pdfManager; + this.xref = xref; + this.catDict = xref.getCatalogObj(); + this.fontCache = new RefSetCache(); + assert(isDict(this.catDict), 'catalog object is not a dictionary'); + this.pageFactory = pageFactory; + this.pagePromises = []; + } + 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, 'Metadata') && isName(subtype, 'XML')) { + 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'); + assert(isDict(pagesObj), 'invalid top-level pages dictionary'); + 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 obj = this.catDict.get('Outlines'); + if (!isDict(obj)) { + return null; + } + obj = obj.getRaw('First'); + if (!isRef(obj)) { + return null; + } + var root = { items: [] }; + var queue = [{ + obj: obj, + parent: root + }]; + var processed = new RefSet(); + processed.put(obj); + var xref = this.xref, blackColor = new Uint8Array(3); + while (queue.length > 0) { + var i = queue.shift(); + var outlineDict = xref.fetchIfRef(i.obj); + if (outlineDict === null) { + continue; + } + assert(outlineDict.has('Title'), 'Invalid outline item'); + var data = { + url: null, + dest: null + }; + Catalog.parseDestDictionary({ + destDict: outlineDict, + resultObj: data, + docBaseUrl: this.pdfManager.docBaseUrl + }); + var title = outlineDict.get('Title'); + var flags = outlineDict.get('F') || 0; + var color = outlineDict.getArray('C'), rgbColor = blackColor; + if (isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { + rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); + } + var outlineItem = { + dest: data.dest, + url: data.url, + unsafeUrl: data.unsafeUrl, + newWindow: data.newWindow, + title: stringToPDFString(title), + color: rgbColor, + count: outlineDict.get('Count'), + bold: !!(flags & 2), + italic: !!(flags & 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'); + assert(isInt(obj), 'page count in top level pages object is not an integer'); + 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 && obj.has('Dests')) { + nameTreeRef = obj.getRaw('Dests'); + } else if (this.catDict.has('Dests')) { + nameDictionaryRef = this.catDict.get('Dests'); + } + if (nameDictionaryRef) { + 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) { + dests[name] = fetchDestination(names[name]); + } + } + return shadow(this, 'destinations', dests); + }, + getDestination: function Catalog_getDestination(destinationId) { + function fetchDestination(dest) { + return isDict(dest) ? dest.get('D') : dest; + } + var xref = this.xref; + var dest = null, nameTreeRef, nameDictionaryRef; + var obj = this.catDict.get('Names'); + if (obj && obj.has('Dests')) { + nameTreeRef = obj.getRaw('Dests'); + } else if (this.catDict.has('Dests')) { + nameDictionaryRef = this.catDict.get('Dests'); + } + if (nameDictionaryRef) { + var value = nameDictionaryRef.get(destinationId); + if (value) { + dest = fetchDestination(value); + } + } + if (nameTreeRef) { + var nameTree = new NameTree(nameTreeRef, xref); + dest = fetchDestination(nameTree.get(destinationId)); + } + return dest; + }, + get pageLabels() { + var obj = null; + try { + obj = this.readPageLabels(); + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + warn('Unable to read page labels.'); + } + return shadow(this, 'pageLabels', obj); + }, + readPageLabels: function Catalog_readPageLabels() { + var obj = this.catDict.getRaw('PageLabels'); + if (!obj) { + return null; + } + var pageLabels = new Array(this.numPages); + var style = null; + var prefix = ''; + var numberTree = new NumberTree(obj, this.xref); + var nums = numberTree.getAll(); + var currentLabel = '', currentIndex = 1; + for (var i = 0, ii = this.numPages; i < ii; i++) { + if (i in nums) { + var labelDict = nums[i]; + assert(isDict(labelDict), 'The PageLabel is not a dictionary.'); + var type = labelDict.get('Type'); + assert(!type || isName(type, 'PageLabel'), 'Invalid type in PageLabel dictionary.'); + var s = labelDict.get('S'); + assert(!s || isName(s), 'Invalid style in PageLabel dictionary.'); + style = s ? s.name : null; + var p = labelDict.get('P'); + assert(!p || isString(p), 'Invalid prefix in PageLabel dictionary.'); + prefix = p ? stringToPDFString(p) : ''; + var st = labelDict.get('St'); + assert(!st || isInt(st) && st >= 1, 'Invalid start in PageLabel dictionary.'); + currentIndex = st || 1; + } + switch (style) { + case 'D': + currentLabel = currentIndex; + break; + case 'R': + case 'r': + currentLabel = Util.toRoman(currentIndex, style === 'r'); + break; + case 'A': + case 'a': + var LIMIT = 26; + var A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61; + var baseCharCode = style === 'a' ? A_LOWER_CASE : A_UPPER_CASE; + var letterIndex = currentIndex - 1; + var character = String.fromCharCode(baseCharCode + letterIndex % LIMIT); + var charBuf = []; + for (var j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) { + charBuf.push(character); + } + currentLabel = charBuf.join(''); + break; + default: + assert(!style, 'Invalid style "' + style + '" in PageLabel dictionary.'); + } + pageLabels[i] = prefix + currentLabel; + currentLabel = ''; + currentIndex++; + } + return pageLabels; + }, + get attachments() { + var xref = this.xref; + var attachments = null, nameTreeRef; + var obj = this.catDict.get('Names'); + if (obj) { + nameTreeRef = obj.getRaw('EmbeddedFiles'); + } + if (nameTreeRef) { + var nameTree = new NameTree(nameTreeRef, xref); + var names = nameTree.getAll(); + for (var name in names) { + var fs = new FileSpec(names[name], xref); + if (!attachments) { + attachments = Object.create(null); + } + attachments[stringToPDFString(name)] = fs.serializable; + } + } + return shadow(this, 'attachments', attachments); + }, + get javaScript() { + var xref = this.xref; + var obj = this.catDict.get('Names'); + var javaScript = []; + function appendIfJavaScriptDict(jsDict) { + var type = jsDict.get('S'); + if (!isName(type, 'JavaScript')) { + return; + } + var js = jsDict.get('JS'); + if (isStream(js)) { + js = bytesToString(js.getBytes()); + } else if (!isString(js)) { + return; + } + javaScript.push(stringToPDFString(js)); + } + if (obj && obj.has('JavaScript')) { + var nameTree = new NameTree(obj.getRaw('JavaScript'), xref); + var names = nameTree.getAll(); + for (var name in names) { + var jsDict = names[name]; + if (isDict(jsDict)) { + appendIfJavaScriptDict(jsDict); + } + } + } + var openactionDict = this.catDict.get('OpenAction'); + if (isDict(openactionDict, 'Action')) { + var actionType = openactionDict.get('S'); + if (isName(actionType, 'Named')) { + var action = openactionDict.get('N'); + if (isName(action, 'Print')) { + javaScript.push('print({});'); + } + } else { + appendIfJavaScriptDict(openactionDict); + } + } + return shadow(this, 'javaScript', javaScript); + }, + cleanup: function Catalog_cleanup() { + var promises = []; + this.fontCache.forEach(function (promise) { + promises.push(promise); + }); + return Promise.all(promises).then(function (translatedFonts) { + for (var i = 0, ii = translatedFonts.length; i < ii; i++) { + var font = translatedFonts[i].dict; + delete font.translated; + } + this.fontCache.clear(); + }.bind(this)); + }, + getPage: function Catalog_getPage(pageIndex) { + if (!(pageIndex in this.pagePromises)) { + this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(function (a) { + var dict = a[0]; + var ref = a[1]; + return this.pageFactory.createPage(pageIndex, dict, ref, this.fontCache); + }.bind(this)); + } + return this.pagePromises[pageIndex]; + }, + getPageDict: function Catalog_getPageDict(pageIndex) { + var capability = createPromiseCapability(); + var nodesToVisit = [this.catDict.getRaw('Pages')]; + var currentPageIndex = 0; + var xref = this.xref; + var checkAllKids = false; + function next() { + while (nodesToVisit.length) { + var currentNode = nodesToVisit.pop(); + if (isRef(currentNode)) { + xref.fetchAsync(currentNode).then(function (obj) { + if (isDict(obj, 'Page') || isDict(obj) && !obj.has('Kids')) { + if (pageIndex === currentPageIndex) { + capability.resolve([ + obj, + currentNode + ]); + } else { + currentPageIndex++; + next(); + } + return; + } + nodesToVisit.push(obj); + next(); + }, capability.reject); + return; + } + assert(isDict(currentNode), 'page dictionary kid reference points to wrong type of object'); + var count = currentNode.get('Count'); + if (count === 0) { + checkAllKids = true; + } + if (currentPageIndex + count <= pageIndex) { + currentPageIndex += count; + continue; + } + var kids = currentNode.get('Kids'); + assert(isArray(kids), 'page dictionary kids object is not an array'); + if (!checkAllKids && count === kids.length) { + nodesToVisit = [kids[pageIndex - currentPageIndex]]; + currentPageIndex = pageIndex; + continue; + } else { + for (var last = kids.length - 1; last >= 0; last--) { + nodesToVisit.push(kids[last]); + } + } + } + capability.reject('Page index ' + pageIndex + ' not found.'); + } + next(); + return capability.promise; + }, + getPageIndex: function Catalog_getPageIndex(pageRef) { + var xref = this.xref; + function pagesBeforeRef(kidRef) { + var total = 0; + var parentRef; + return xref.fetchAsync(kidRef).then(function (node) { + if (isRefsEqual(kidRef, pageRef) && !isDict(node, 'Page') && !(isDict(node) && !node.has('Type') && node.has('Contents'))) { + throw new Error('The reference does not point to a /Page Dict.'); + } + if (!node) { + return null; + } + assert(isDict(node), 'node must be a Dict.'); + parentRef = node.getRaw('Parent'); + return node.getAsync('Parent'); + }).then(function (parent) { + if (!parent) { + return null; + } + assert(isDict(parent), 'parent must be a Dict.'); + return parent.getAsync('Kids'); + }).then(function (kids) { + if (!kids) { + return null; + } + var kidPromises = []; + var found = false; + for (var i = 0; i < kids.length; i++) { + var kid = kids[i]; + assert(isRef(kid), 'kid must be a Ref.'); + if (kid.num === kidRef.num) { + found = true; + break; + } + kidPromises.push(xref.fetchAsync(kid).then(function (kid) { + if (kid.has('Count')) { + var count = kid.get('Count'); + total += count; + } else { + total++; + } + })); + } + if (!found) { + error('kid ref not found in parents kids'); + } + return Promise.all(kidPromises).then(function () { + return [ + total, + parentRef + ]; + }); + }); + } + var total = 0; + function next(ref) { + return pagesBeforeRef(ref).then(function (args) { + if (!args) { + return total; + } + var count = args[0]; + var parentRef = args[1]; + total += count; + return next(parentRef); + }); + } + return next(pageRef); + } + }; + Catalog.parseDestDictionary = function Catalog_parseDestDictionary(params) { + function addDefaultProtocolToUrl(url) { + if (url.indexOf('www.') === 0) { + return 'http://' + url; + } + return url; + } + function tryConvertUrlEncoding(url) { + try { + return stringToUTF8String(url); + } catch (e) { + return url; + } + } + var destDict = params.destDict; + if (!isDict(destDict)) { + warn('Catalog_parseDestDictionary: "destDict" must be a dictionary.'); + return; + } + var resultObj = params.resultObj; + if (typeof resultObj !== 'object') { + warn('Catalog_parseDestDictionary: "resultObj" must be an object.'); + return; + } + var docBaseUrl = params.docBaseUrl || null; + var action = destDict.get('A'), url, dest; + if (isDict(action)) { + var linkType = action.get('S').name; + switch (linkType) { + case 'URI': + url = action.get('URI'); + if (isName(url)) { + url = '/' + url.name; + } else if (isString(url)) { + url = addDefaultProtocolToUrl(url); + } + break; + case 'GoTo': + dest = action.get('D'); + break; + case 'Launch': + case 'GoToR': + var urlDict = action.get('F'); + if (isDict(urlDict)) { + url = urlDict.get('F') || null; + } else if (isString(urlDict)) { + url = urlDict; + } + var remoteDest = action.get('D'); + if (remoteDest) { + if (isName(remoteDest)) { + remoteDest = remoteDest.name; + } + if (isString(url)) { + var baseUrl = url.split('#')[0]; + if (isString(remoteDest)) { + url = baseUrl + '#' + (/^\d+$/.test(remoteDest) ? 'nameddest=' : '') + remoteDest; + } else if (isArray(remoteDest)) { + url = baseUrl + '#' + JSON.stringify(remoteDest); + } + } + } + var newWindow = action.get('NewWindow'); + if (isBool(newWindow)) { + resultObj.newWindow = newWindow; + } + break; + case 'Named': + var namedAction = action.get('N'); + if (isName(namedAction)) { + resultObj.action = namedAction.name; + } + break; + case 'JavaScript': + var jsAction = action.get('JS'), js; + if (isStream(jsAction)) { + js = bytesToString(jsAction.getBytes()); + } else if (isString(jsAction)) { + js = jsAction; + } + if (js) { + var URL_OPEN_METHODS = [ + 'app.launchURL', + 'window.open' + ]; + var regex = new RegExp('^(?:' + URL_OPEN_METHODS.join('|') + ')' + '\\((?:\'|\")(\\S+)(?:\'|\")(?:,|\\))'); + var jsUrl = regex.exec(stringToPDFString(js), 'i'); + if (jsUrl && jsUrl[1]) { + url = jsUrl[1]; + break; + } + } + default: + warn('Catalog_parseDestDictionary: Unrecognized link type "' + linkType + '".'); + break; + } + } else if (destDict.has('Dest')) { + dest = destDict.get('Dest'); + } + if (isString(url)) { + url = tryConvertUrlEncoding(url); + var absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl); + if (absoluteUrl) { + resultObj.url = absoluteUrl.href; + } + resultObj.unsafeUrl = url; + } + if (dest) { + if (isName(dest)) { + dest = dest.name; + } + if (isString(dest) || isArray(dest)) { + resultObj.dest = dest; + } + } + }; + return Catalog; + }(); + var XRef = function XRefClosure() { + function XRef(stream, pdfManager) { + this.stream = stream; + this.pdfManager = pdfManager; + this.entries = []; + this.xrefstms = Object.create(null); + this.cache = []; + this.stats = { + streamTypes: [], + fontTypes: [] + }; + } + XRef.prototype = { + setStartXRef: function XRef_setStartXRef(startXRef) { + 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 (isDict(encrypt)) { + var ids = trailerDict.get('ID'); + var fileId = ids && ids.length ? ids[0] : ''; + encrypt.suppressEncryption = true; + this.encrypt = new CipherTransformFactory(encrypt, fileId, this.pdfManager.password); + } + if (!(this.root = trailerDict.get('Root'))) { + error('Invalid root reference'); + } + }, + processXRefTable: function XRef_processXRefTable(parser) { + if (!('tableState' in this)) { + this.tableState = { + entryNum: 0, + streamPos: parser.lexer.stream.pos, + parserBuf1: parser.buf1, + parserBuf2: parser.buf2 + }; + } + var obj = this.readXRefTable(parser); + if (!isCmd(obj, 'trailer')) { + error('Invalid XRef table: could not find trailer dictionary'); + } + var dict = parser.getObj(); + if (!isDict(dict) && dict.dict) { + dict = dict.dict; + } + if (!isDict(dict)) { + error('Invalid XRef table: could not parse trailer dictionary'); + } + delete this.tableState; + return dict; + }, + readXRefTable: function XRef_readXRefTable(parser) { + var stream = parser.lexer.stream; + var tableState = this.tableState; + stream.pos = tableState.streamPos; + parser.buf1 = tableState.parserBuf1; + parser.buf2 = tableState.parserBuf2; + 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'); + } + 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; + } + if (!isInt(entry.offset) || !isInt(entry.gen) || !(entry.free || entry.uncompressed)) { + error('Invalid entry in XRef subsection: ' + first + ', ' + count); + } + if (i === 0 && entry.free && first === 1) { + first = 0; + } + 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; + } + 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)) { + 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 (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() { + var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; + var PERCENT = 0x25, LT = 0x3C; + function readToken(data, offset) { + var token = '', ch = data[offset]; + while (ch !== LF && ch !== CR && ch !== LT) { + 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; + while (offset < dataLength) { + var i = 0; + while (i < length && data[offset + i] === what[i]) { + ++i; + } + if (i >= length) { + break; + } + offset++; + skipped++; + } + return skipped; + } + var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; + 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 + ]); + this.entries.length = 0; + var stream = this.stream; + stream.pos = 0; + var buffer = stream.getBytes(); + var position = stream.start, length = buffer.length; + var trailers = [], xrefStms = []; + while (position < length) { + var ch = buffer[position]; + if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { + ++position; + continue; + } + if (ch === PERCENT) { + do { + ++position; + if (position >= length) { + break; + } + ch = buffer[position]; + } while (ch !== LF && ch !== CR); + continue; + } + var token = readToken(buffer, position); + var m; + if (token.indexOf('xref') === 0 && (token.length === 4 || /\s/.test(token[4]))) { + position += skipUntil(buffer, position, trailerBytes); + trailers.push(position); + position += skipUntil(buffer, position, startxrefBytes); + } else if (m = objRegExp.exec(token)) { + if (typeof this.entries[m[1]] === 'undefined') { + this.entries[m[1]] = { + offset: position - stream.start, + gen: m[2] | 0, + uncompressed: true + }; + } + var contentLength = skipUntil(buffer, position, endobjBytes) + 7; + var content = buffer.subarray(position, position + contentLength); + var xrefTagOffset = skipUntil(content, 0, xrefBytes); + if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) { + xrefStms.push(position - stream.start); + this.xrefstms[position - stream.start] = 1; + } + position += contentLength; + } else if (token.indexOf('trailer') === 0 && (token.length === 7 || /\s/.test(token[7]))) { + trailers.push(position); + position += skipUntil(buffer, position, startxrefBytes); + } else { + position += token.length + 1; + } + } + var i, ii; + for (i = 0, ii = xrefStms.length; i < ii; ++i) { + this.startXRefQueue.push(xrefStms[i]); + this.readXRef(true); + } + var dict; + for (i = 0, ii = trailers.length; i < ii; ++i) { + stream.pos = trailers[i]; + var parser = new Parser(new Lexer(stream), true, this, true); + var obj = parser.getObj(); + if (!isCmd(obj, 'trailer')) { + continue; + } + dict = parser.getObj(); + if (!isDict(dict)) { + continue; + } + if (dict.has('ID')) { + return dict; + } + } + if (dict) { + return dict; + } + 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 + stream.start; + var parser = new Parser(new Lexer(stream), true, this); + var obj = parser.getObj(); + var dict; + if (isCmd(obj, 'xref')) { + dict = this.processXRefTable(parser); + if (!this.topDict) { + this.topDict = dict; + } + obj = dict.get('XRefStm'); + if (isInt(obj)) { + var pos = obj; + if (!(pos in this.xrefstms)) { + this.xrefstms[pos] = 1; + this.startXRefQueue.push(pos); + } + } + } else if (isInt(obj)) { + 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'); + } + } else { + error('Invalid XRef stream header'); + } + obj = dict.get('Prev'); + if (isInt(obj)) { + this.startXRefQueue.push(obj); + } else if (isRef(obj)) { + this.startXRefQueue.push(obj.num); + } + this.startXRefQueue.shift(); + } + return this.topDict; + } catch (e) { + if (e instanceof MissingDataException) { + throw e; + } + info('(while reading XRef): ' + e); + } + if (recoveryMode) { + return; + } + throw new XRefParseException(); + }, + getEntry: function XRef_getEntry(i) { + var xrefEntry = this.entries[i]; + if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { + return xrefEntry; + } + return null; + }, + fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) { + if (!isRef(obj)) { + return obj; + } + return this.fetch(obj, suppressEncryption); + }, + fetch: function XRef_fetch(ref, suppressEncryption) { + assert(isRef(ref), 'ref object is not a reference'); + var num = ref.num; + if (num in this.cache) { + var cacheEntry = this.cache[num]; + return cacheEntry; + } + var xrefEntry = this.getEntry(num); + if (xrefEntry === null) { + return this.cache[num] = null; + } + if (xrefEntry.uncompressed) { + xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); + } else { + xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); + } + if (isDict(xrefEntry)) { + xrefEntry.objId = ref.toString(); + } else if (isStream(xrefEntry)) { + xrefEntry.dict.objId = ref.toString(); + } + return xrefEntry; + }, + fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, suppressEncryption) { + var gen = ref.gen; + var num = ref.num; + if (xrefEntry.gen !== gen) { + error('inconsistent generation in XRef'); + } + var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start); + var parser = new Parser(new Lexer(stream), true, this); + var obj1 = parser.getObj(); + var obj2 = parser.getObj(); + var obj3 = parser.getObj(); + if (!isInt(obj1) || parseInt(obj1, 10) !== num || !isInt(obj2) || parseInt(obj2, 10) !== gen || !isCmd(obj3)) { + error('bad XRef entry'); + } + if (!isCmd(obj3, 'obj')) { + 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) { + xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); + } else { + xrefEntry = parser.getObj(); + } + if (!isStream(xrefEntry)) { + this.cache[num] = xrefEntry; + } + return xrefEntry; + }, + fetchCompressed: function XRef_fetchCompressed(xrefEntry, suppressEncryption) { + var tableOffset = xrefEntry.offset; + var 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'); + } + var parser = new Parser(new Lexer(stream), false, this); + parser.allowStreams = true; + var i, entries = [], num, nums = []; + 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); + } + } + for (i = 0; i < n; ++i) { + entries.push(parser.getObj()); + if (isCmd(parser.buf1, 'endobj')) { + parser.shift(); + } + num = nums[i]; + var entry = this.entries[num]; + if (entry && entry.offset === tableOffset && entry.gen === i) { + this.cache[num] = entries[i]; + } + } + xrefEntry = entries[xrefEntry.gen]; + if (xrefEntry === undefined) { + error('bad XRef entry for compressed object'); + } + return xrefEntry; + }, + fetchIfRefAsync: function XRef_fetchIfRefAsync(obj, suppressEncryption) { + if (!isRef(obj)) { + return Promise.resolve(obj); + } + return this.fetchAsync(obj, suppressEncryption); + }, + fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { + var streamManager = this.stream.manager; + var xref = this; + return new Promise(function tryFetch(resolve, reject) { + try { + resolve(xref.fetch(ref, suppressEncryption)); + } catch (e) { + if (e instanceof MissingDataException) { + streamManager.requestRange(e.begin, e.end).then(function () { + tryFetch(resolve, reject); + }, reject); + return; + } + reject(e); + } + }); + }, + getCatalogObj: function XRef_getCatalogObj() { + return this.root; + } + }; + return XRef; + }(); + var NameOrNumberTree = function NameOrNumberTreeClosure() { + function NameOrNumberTree(root, xref) { + throw new Error('Cannot initialize NameOrNumberTree.'); + } + NameOrNumberTree.prototype = { + getAll: function NameOrNumberTree_getAll() { + var dict = Object.create(null); + if (!this.root) { + return dict; + } + var xref = this.xref; + 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]; + assert(!processed.has(kid), 'Duplicate entry in "' + this._type + '" tree.'); + queue.push(kid); + processed.put(kid); + } + continue; + } + var entries = obj.get(this._type); + if (isArray(entries)) { + for (i = 0, n = entries.length; i < n; i += 2) { + dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]); + } + } + } + return dict; + }, + get: function NameOrNumberTree_get(key) { + if (!this.root) { + return null; + } + var xref = this.xref; + var kidsOrEntries = xref.fetchIfRef(this.root); + var loopCount = 0; + var MAX_LEVELS = 10; + var l, r, m; + while (kidsOrEntries.has('Kids')) { + if (++loopCount > MAX_LEVELS) { + warn('Search depth limit reached for "' + this._type + '" tree.'); + return null; + } + var kids = kidsOrEntries.get('Kids'); + if (!isArray(kids)) { + return null; + } + l = 0; + r = kids.length - 1; + while (l <= r) { + m = l + r >> 1; + var kid = xref.fetchIfRef(kids[m]); + var limits = kid.get('Limits'); + if (key < xref.fetchIfRef(limits[0])) { + r = m - 1; + } else if (key > xref.fetchIfRef(limits[1])) { + l = m + 1; + } else { + kidsOrEntries = xref.fetchIfRef(kids[m]); + break; + } + } + if (l > r) { + return null; + } + } + var entries = kidsOrEntries.get(this._type); + if (isArray(entries)) { + l = 0; + r = entries.length - 2; + while (l <= r) { + m = l + r & ~1; + var currentKey = xref.fetchIfRef(entries[m]); + if (key < currentKey) { + r = m - 2; + } else if (key > currentKey) { + l = m + 2; + } else { + return xref.fetchIfRef(entries[m + 1]); + } + } + } + return null; + } + }; + return NameOrNumberTree; + }(); + var NameTree = function NameTreeClosure() { + function NameTree(root, xref) { + this.root = root; + this.xref = xref; + this._type = 'Names'; + } + Util.inherit(NameTree, NameOrNumberTree, {}); + return NameTree; + }(); + var NumberTree = function NumberTreeClosure() { + function NumberTree(root, xref) { + this.root = root; + this.xref = xref; + this._type = 'Nums'; + } + Util.inherit(NumberTree, NameOrNumberTree, {}); + return NumberTree; + }(); + var FileSpec = function FileSpecClosure() { + function FileSpec(root, xref) { + if (!root || !isDict(root)) { + return; + } + this.xref = xref; + this.root = root; + if (root.has('FS')) { + this.fs = root.get('FS'); + } + this.description = root.has('Desc') ? stringToPDFString(root.get('Desc')) : ''; + if (root.has('RF')) { + warn('Related file specifications are not supported'); + } + this.contentAvailable = true; + if (!root.has('EF')) { + this.contentAvailable = false; + warn('Non-embedded file specifications are not supported'); + } + } + function pickPlatformItem(dict) { + if (dict.has('UF')) { + return dict.get('UF'); + } else if (dict.has('F')) { + return dict.get('F'); + } else if (dict.has('Unix')) { + return dict.get('Unix'); + } else if (dict.has('Mac')) { + return dict.get('Mac'); + } else if (dict.has('DOS')) { + return dict.get('DOS'); + } + return null; + } + FileSpec.prototype = { + get filename() { + if (!this._filename && this.root) { + var filename = pickPlatformItem(this.root) || 'unnamed'; + this._filename = stringToPDFString(filename).replace(/\\\\/g, '\\').replace(/\\\//g, '/').replace(/\\/g, '/'); + } + return this._filename; + }, + get content() { + if (!this.contentAvailable) { + return null; + } + if (!this.contentRef && this.root) { + this.contentRef = pickPlatformItem(this.root.get('EF')); + } + var content = null; + if (this.contentRef) { + var xref = this.xref; + var fileObj = xref.fetchIfRef(this.contentRef); + if (fileObj && isStream(fileObj)) { + content = fileObj.getBytes(); + } else { + warn('Embedded file specification points to non-existing/invalid ' + 'content'); + } + } else { + warn('Embedded file specification does not have a content'); + } + return content; + }, + get serializable() { + return { + filename: this.filename, + content: this.content + }; + } + }; + return FileSpec; + }(); + var ObjectLoader = function () { + function mayHaveChildren(value) { + return isRef(value) || isDict(value) || isArray(value) || isStream(value); + } + function addChildren(node, nodesToVisit) { + var value; + if (isDict(node) || isStream(node)) { + var map; + if (isDict(node)) { + map = node.map; + } else { + map = node.dict.map; + } + for (var key in map) { + value = map[key]; + if (mayHaveChildren(value)) { + nodesToVisit.push(value); + } + } + } else if (isArray(node)) { + for (var i = 0, ii = node.length; i < ii; i++) { + 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; + this.capability = null; + } + ObjectLoader.prototype = { + load: function ObjectLoader_load() { + var keys = this.keys; + this.capability = createPromiseCapability(); + if (!(this.xref.stream instanceof ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) { + this.capability.resolve(); + return this.capability.promise; + } + this.refSet = new RefSet(); + var nodesToVisit = []; + for (var i = 0; i < keys.length; i++) { + nodesToVisit.push(this.obj[keys[i]]); + } + this._walk(nodesToVisit); + return this.capability.promise; + }, + _walk: function ObjectLoader_walk(nodesToVisit) { + var nodesToRevisit = []; + var pendingRequests = []; + while (nodesToVisit.length) { + var currentNode = nodesToVisit.pop(); + if (isRef(currentNode)) { + 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).then(function pendingRequestCallback() { + nodesToVisit = nodesToRevisit; + for (var i = 0; i < nodesToRevisit.length; i++) { + var node = nodesToRevisit[i]; + if (isRef(node)) { + this.refSet.remove(node); + } + } + this._walk(nodesToVisit); + }.bind(this), this.capability.reject); + return; + } + this.refSet = null; + this.capability.resolve(); + } + }; + return ObjectLoader; + }(); + exports.Catalog = Catalog; + exports.ObjectLoader = ObjectLoader; + exports.XRef = XRef; + exports.FileSpec = FileSpec; + })); + (function (root, factory) { + factory(root.pdfjsCorePattern = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreFunction, root.pdfjsCoreColorSpace); + }(this, function (exports, sharedUtil, corePrimitives, coreFunction, coreColorSpace) { + var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; + var MissingDataException = sharedUtil.MissingDataException; + var Util = sharedUtil.Util; + var assert = sharedUtil.assert; + var error = sharedUtil.error; + var info = sharedUtil.info; + var warn = sharedUtil.warn; + var isStream = corePrimitives.isStream; + var PDFFunction = coreFunction.PDFFunction; + var ColorSpace = coreColorSpace.ColorSpace; + var ShadingType = { + FUNCTION_BASED: 1, + AXIAL: 2, + RADIAL: 3, + FREE_FORM_MESH: 4, + LATTICE_FORM_MESH: 5, + COONS_PATCH_MESH: 6, + TENSOR_PATCH_MESH: 7 + }; + var Pattern = function PatternClosure() { + function Pattern() { + error('should not call Pattern constructor'); + } + Pattern.prototype = { + getPattern: function Pattern_getPattern(ctx) { + error('Should not call Pattern.getStyle: ' + ctx); + } + }; + Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, res, handler) { + var dict = isStream(shading) ? shading.dict : shading; + var type = dict.get('ShadingType'); + try { + switch (type) { + case ShadingType.AXIAL: + case ShadingType.RADIAL: + return new Shadings.RadialAxial(dict, matrix, xref, res); + case ShadingType.FREE_FORM_MESH: + case ShadingType.LATTICE_FORM_MESH: + case ShadingType.COONS_PATCH_MESH: + case ShadingType.TENSOR_PATCH_MESH: + return new Shadings.Mesh(shading, matrix, xref, res); + default: + throw new Error('Unsupported ShadingType: ' + type); + } + } catch (ex) { + if (ex instanceof MissingDataException) { + throw ex; + } + handler.send('UnsupportedFeature', { featureId: UNSUPPORTED_FEATURES.shadingPattern }); + warn(ex); + return new Shadings.Dummy(); + } + }; + return Pattern; + }(); + var Shadings = {}; + Shadings.SMALL_NUMBER = 1e-6; + Shadings.RadialAxial = function RadialAxialClosure() { + function RadialAxial(dict, matrix, xref, res) { + this.matrix = matrix; + this.coordsArr = dict.getArray('Coords'); + this.shadingType = dict.get('ShadingType'); + this.type = 'Pattern'; + var cs = dict.get('ColorSpace', 'CS'); + cs = ColorSpace.parse(cs, xref, res); + this.cs = cs; + var t0 = 0.0, t1 = 1.0; + if (dict.has('Domain')) { + var domainArr = dict.getArray('Domain'); + t0 = domainArr[0]; + t1 = domainArr[1]; + } + var extendStart = false, extendEnd = false; + if (dict.has('Extend')) { + var extendArr = dict.getArray('Extend'); + extendStart = extendArr[0]; + extendEnd = extendArr[1]; + } + if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) { + var x1 = this.coordsArr[0]; + var y1 = this.coordsArr[1]; + var r1 = this.coordsArr[2]; + var x2 = this.coordsArr[3]; + var y2 = this.coordsArr[4]; + var r2 = this.coordsArr[5]; + var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); + if (r1 <= r2 + distance && r2 <= r1 + distance) { + warn('Unsupported radial gradient.'); + } + } + this.extendStart = extendStart; + this.extendEnd = extendEnd; + var fnObj = dict.get('Function'); + var fn = PDFFunction.parseArray(xref, fnObj); + var diff = t1 - t0; + var step = diff / 10; + var colorStops = this.colorStops = []; + if (t0 >= t1 || step <= 0) { + info('Bad shading domain.'); + return; + } + var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); + var rgbColor; + for (var i = t0; i <= t1; i += step) { + ratio[0] = i; + fn(ratio, 0, color, 0); + rgbColor = cs.getRgb(color, 0); + var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); + colorStops.push([ + (i - t0) / diff, + cssColor + ]); + } + var background = 'transparent'; + if (dict.has('Background')) { + rgbColor = cs.getRgb(dict.get('Background'), 0); + background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); + } + if (!extendStart) { + colorStops.unshift([ + 0, + background + ]); + colorStops[1][0] += Shadings.SMALL_NUMBER; + } + if (!extendEnd) { + colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; + colorStops.push([ + 1, + background + ]); + } + this.colorStops = colorStops; + } + RadialAxial.prototype = { + getIR: function RadialAxial_getIR() { + var coordsArr = this.coordsArr; + var shadingType = this.shadingType; + var type, p0, p1, r0, r1; + if (shadingType === ShadingType.AXIAL) { + p0 = [ + coordsArr[0], + coordsArr[1] + ]; + p1 = [ + coordsArr[2], + coordsArr[3] + ]; + r0 = null; + r1 = null; + type = 'axial'; + } else if (shadingType === ShadingType.RADIAL) { + p0 = [ + coordsArr[0], + coordsArr[1] + ]; + p1 = [ + coordsArr[3], + coordsArr[4] + ]; + r0 = coordsArr[2]; + r1 = coordsArr[5]; + type = 'radial'; + } else { + error('getPattern type unknown: ' + shadingType); + } + var matrix = this.matrix; + if (matrix) { + p0 = Util.applyTransform(p0, matrix); + p1 = Util.applyTransform(p1, matrix); + if (shadingType === ShadingType.RADIAL) { + var scale = Util.singularValueDecompose2dScale(matrix); + r0 *= scale[0]; + r1 *= scale[1]; + } + } + return [ + 'RadialAxial', + type, + this.colorStops, + p0, + p1, + r0, + r1 + ]; + } + }; + return RadialAxial; + }(); + Shadings.Mesh = function MeshClosure() { + function MeshStreamReader(stream, context) { + this.stream = stream; + this.context = context; + this.buffer = 0; + this.bufferLength = 0; + var numComps = context.numComps; + this.tmpCompsBuf = new Float32Array(numComps); + var csNumComps = context.colorSpace.numComps; + this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf; + } + MeshStreamReader.prototype = { + get hasData() { + if (this.stream.end) { + return this.stream.pos < this.stream.end; + } + if (this.bufferLength > 0) { + return true; + } + var nextByte = this.stream.getByte(); + if (nextByte < 0) { + return false; + } + this.buffer = nextByte; + this.bufferLength = 8; + return true; + }, + readBits: function MeshStreamReader_readBits(n) { + var buffer = this.buffer; + var bufferLength = this.bufferLength; + if (n === 32) { + if (bufferLength === 0) { + return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0; + } + buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte(); + var nextByte = this.stream.getByte(); + this.buffer = nextByte & (1 << bufferLength) - 1; + return (buffer << 8 - bufferLength | (nextByte & 0xFF) >> bufferLength) >>> 0; + } + if (n === 8 && bufferLength === 0) { + return this.stream.getByte(); + } + while (bufferLength < n) { + buffer = buffer << 8 | this.stream.getByte(); + bufferLength += 8; + } + bufferLength -= n; + this.bufferLength = bufferLength; + this.buffer = buffer & (1 << bufferLength) - 1; + return buffer >> bufferLength; + }, + align: function MeshStreamReader_align() { + this.buffer = 0; + this.bufferLength = 0; + }, + readFlag: function MeshStreamReader_readFlag() { + return this.readBits(this.context.bitsPerFlag); + }, + readCoordinate: function MeshStreamReader_readCoordinate() { + var bitsPerCoordinate = this.context.bitsPerCoordinate; + var xi = this.readBits(bitsPerCoordinate); + var yi = this.readBits(bitsPerCoordinate); + var decode = this.context.decode; + var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10; + return [ + xi * scale * (decode[1] - decode[0]) + decode[0], + yi * scale * (decode[3] - decode[2]) + decode[2] + ]; + }, + readComponents: function MeshStreamReader_readComponents() { + var numComps = this.context.numComps; + var bitsPerComponent = this.context.bitsPerComponent; + var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10; + var decode = this.context.decode; + var components = this.tmpCompsBuf; + for (var i = 0, j = 4; i < numComps; i++, j += 2) { + var ci = this.readBits(bitsPerComponent); + components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; + } + var color = this.tmpCsCompsBuf; + if (this.context.colorFn) { + this.context.colorFn(components, 0, color, 0); + } + return this.context.colorSpace.getRgb(color, 0); + } + }; + function decodeType4Shading(mesh, reader) { + var coords = mesh.coords; + var colors = mesh.colors; + var operators = []; + var ps = []; + var verticesLeft = 0; + while (reader.hasData) { + var f = reader.readFlag(); + var coord = reader.readCoordinate(); + var color = reader.readComponents(); + if (verticesLeft === 0) { + assert(0 <= f && f <= 2, 'Unknown type4 flag'); + switch (f) { + case 0: + verticesLeft = 3; + break; + case 1: + ps.push(ps[ps.length - 2], ps[ps.length - 1]); + verticesLeft = 1; + break; + case 2: + ps.push(ps[ps.length - 3], ps[ps.length - 1]); + verticesLeft = 1; + break; + } + operators.push(f); + } + ps.push(coords.length); + coords.push(coord); + colors.push(color); + verticesLeft--; + reader.align(); + } + mesh.figures.push({ + type: 'triangles', + coords: new Int32Array(ps), + colors: new Int32Array(ps) + }); + } + function decodeType5Shading(mesh, reader, verticesPerRow) { + var coords = mesh.coords; + var colors = mesh.colors; + var ps = []; + while (reader.hasData) { + var coord = reader.readCoordinate(); + var color = reader.readComponents(); + ps.push(coords.length); + coords.push(coord); + colors.push(color); + } + mesh.figures.push({ + type: 'lattice', + coords: new Int32Array(ps), + colors: new Int32Array(ps), + verticesPerRow: verticesPerRow + }); + } + var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; + var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; + var TRIANGLE_DENSITY = 20; + var getB = function getBClosure() { + function buildB(count) { + var lut = []; + for (var i = 0; i <= count; i++) { + var t = i / count, t_ = 1 - t; + lut.push(new Float32Array([ + t_ * t_ * t_, + 3 * t * t_ * t_, + 3 * t * t * t_, + t * t * t + ])); + } + return lut; + } + var cache = []; + return function getB(count) { + if (!cache[count]) { + cache[count] = buildB(count); + } + return cache[count]; + }; + }(); + function buildFigureFromPatch(mesh, index) { + var figure = mesh.figures[index]; + assert(figure.type === 'patch', 'Unexpected patch mesh figure'); + var coords = mesh.coords, colors = mesh.colors; + var pi = figure.coords; + var ci = figure.colors; + var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]); + var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]); + var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0])); + splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); + var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1])); + splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); + var verticesPerRow = splitXBy + 1; + var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); + var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); + var k = 0; + var cl = new Uint8Array(3), cr = new Uint8Array(3); + var c0 = colors[ci[0]], c1 = colors[ci[1]], c2 = colors[ci[2]], c3 = colors[ci[3]]; + var bRow = getB(splitYBy), bCol = getB(splitXBy); + for (var row = 0; row <= splitYBy; row++) { + cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0; + cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0; + cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0; + cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0; + cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0; + cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0; + for (var col = 0; col <= splitXBy; col++, k++) { + if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) { + continue; + } + var x = 0, y = 0; + var q = 0; + for (var i = 0; i <= 3; i++) { + for (var j = 0; j <= 3; j++, q++) { + var m = bRow[row][i] * bCol[col][j]; + x += coords[pi[q]][0] * m; + y += coords[pi[q]][1] * m; + } + } + figureCoords[k] = coords.length; + coords.push([ + x, + y + ]); + figureColors[k] = colors.length; + var newColor = new Uint8Array(3); + newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0; + newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0; + newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0; + colors.push(newColor); + } + } + figureCoords[0] = pi[0]; + figureColors[0] = ci[0]; + figureCoords[splitXBy] = pi[3]; + figureColors[splitXBy] = ci[1]; + figureCoords[verticesPerRow * splitYBy] = pi[12]; + figureColors[verticesPerRow * splitYBy] = ci[2]; + figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; + figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; + mesh.figures[index] = { + type: 'lattice', + coords: figureCoords, + colors: figureColors, + verticesPerRow: verticesPerRow + }; + } + function decodeType6Shading(mesh, reader) { + var coords = mesh.coords; + var colors = mesh.colors; + var ps = new Int32Array(16); + var cs = new Int32Array(4); + while (reader.hasData) { + var f = reader.readFlag(); + assert(0 <= f && f <= 3, 'Unknown type6 flag'); + var i, ii; + var pi = coords.length; + for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + var ci = colors.length; + for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + var tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + ps[5] = coords.length; + coords.push([ + (-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, + (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 + ]); + ps[6] = coords.length; + coords.push([ + (-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, + (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 + ]); + ps[9] = coords.length; + coords.push([ + (-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, + (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 + ]); + ps[10] = coords.length; + coords.push([ + (-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, + (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 + ]); + mesh.figures.push({ + type: 'patch', + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + function decodeType7Shading(mesh, reader) { + var coords = mesh.coords; + var colors = mesh.colors; + var ps = new Int32Array(16); + var cs = new Int32Array(4); + while (reader.hasData) { + var f = reader.readFlag(); + assert(0 <= f && f <= 3, 'Unknown type7 flag'); + var i, ii; + var pi = coords.length; + for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) { + coords.push(reader.readCoordinate()); + } + var ci = colors.length; + for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) { + colors.push(reader.readComponents()); + } + var tmp1, tmp2, tmp3, tmp4; + switch (f) { + case 0: + ps[12] = pi + 3; + ps[13] = pi + 4; + ps[14] = pi + 5; + ps[15] = pi + 6; + ps[8] = pi + 2; + ps[9] = pi + 13; + ps[10] = pi + 14; + ps[11] = pi + 7; + ps[4] = pi + 1; + ps[5] = pi + 12; + ps[6] = pi + 15; + ps[7] = pi + 8; + ps[0] = pi; + ps[1] = pi + 11; + ps[2] = pi + 10; + ps[3] = pi + 9; + cs[2] = ci + 1; + cs[3] = ci + 2; + cs[0] = ci; + cs[1] = ci + 3; + break; + case 1: + tmp1 = ps[12]; + tmp2 = ps[13]; + tmp3 = ps[14]; + tmp4 = ps[15]; + ps[12] = tmp4; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = tmp3; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[2]; + tmp2 = cs[3]; + cs[2] = tmp2; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 2: + tmp1 = ps[15]; + tmp2 = ps[11]; + ps[12] = ps[3]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[7]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = tmp2; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = tmp1; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + tmp1 = cs[3]; + cs[2] = cs[1]; + cs[3] = ci; + cs[0] = tmp1; + cs[1] = ci + 1; + break; + case 3: + ps[12] = ps[0]; + ps[13] = pi + 0; + ps[14] = pi + 1; + ps[15] = pi + 2; + ps[8] = ps[1]; + ps[9] = pi + 9; + ps[10] = pi + 10; + ps[11] = pi + 3; + ps[4] = ps[2]; + ps[5] = pi + 8; + ps[6] = pi + 11; + ps[7] = pi + 4; + ps[0] = ps[3]; + ps[1] = pi + 7; + ps[2] = pi + 6; + ps[3] = pi + 5; + cs[2] = cs[0]; + cs[3] = ci; + cs[0] = cs[1]; + cs[1] = ci + 1; + break; + } + mesh.figures.push({ + type: 'patch', + coords: new Int32Array(ps), + colors: new Int32Array(cs) + }); + } + } + function updateBounds(mesh) { + var minX = mesh.coords[0][0], minY = mesh.coords[0][1], maxX = minX, maxY = minY; + for (var i = 1, ii = mesh.coords.length; i < ii; i++) { + var x = mesh.coords[i][0], y = mesh.coords[i][1]; + minX = minX > x ? x : minX; + minY = minY > y ? y : minY; + maxX = maxX < x ? x : maxX; + maxY = maxY < y ? y : maxY; + } + mesh.bounds = [ + minX, + minY, + maxX, + maxY + ]; + } + function packData(mesh) { + var i, ii, j, jj; + var coords = mesh.coords; + var coordsPacked = new Float32Array(coords.length * 2); + for (i = 0, j = 0, ii = coords.length; i < ii; i++) { + var xy = coords[i]; + coordsPacked[j++] = xy[0]; + coordsPacked[j++] = xy[1]; + } + mesh.coords = coordsPacked; + var colors = mesh.colors; + var colorsPacked = new Uint8Array(colors.length * 3); + for (i = 0, j = 0, ii = colors.length; i < ii; i++) { + var c = colors[i]; + colorsPacked[j++] = c[0]; + colorsPacked[j++] = c[1]; + colorsPacked[j++] = c[2]; + } + mesh.colors = colorsPacked; + var figures = mesh.figures; + for (i = 0, ii = figures.length; i < ii; i++) { + var figure = figures[i], ps = figure.coords, cs = figure.colors; + for (j = 0, jj = ps.length; j < jj; j++) { + ps[j] *= 2; + cs[j] *= 3; + } + } + } + function Mesh(stream, matrix, xref, res) { + assert(isStream(stream), 'Mesh data is not a stream'); + var dict = stream.dict; + this.matrix = matrix; + this.shadingType = dict.get('ShadingType'); + this.type = 'Pattern'; + this.bbox = dict.getArray('BBox'); + var cs = dict.get('ColorSpace', 'CS'); + cs = ColorSpace.parse(cs, xref, res); + this.cs = cs; + this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null; + var fnObj = dict.get('Function'); + var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; + this.coords = []; + this.colors = []; + this.figures = []; + var decodeContext = { + bitsPerCoordinate: dict.get('BitsPerCoordinate'), + bitsPerComponent: dict.get('BitsPerComponent'), + bitsPerFlag: dict.get('BitsPerFlag'), + decode: dict.getArray('Decode'), + colorFn: fn, + colorSpace: cs, + numComps: fn ? 1 : cs.numComps + }; + var reader = new MeshStreamReader(stream, decodeContext); + var patchMesh = false; + switch (this.shadingType) { + case ShadingType.FREE_FORM_MESH: + decodeType4Shading(this, reader); + break; + case ShadingType.LATTICE_FORM_MESH: + var verticesPerRow = dict.get('VerticesPerRow') | 0; + assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); + decodeType5Shading(this, reader, verticesPerRow); + break; + case ShadingType.COONS_PATCH_MESH: + decodeType6Shading(this, reader); + patchMesh = true; + break; + case ShadingType.TENSOR_PATCH_MESH: + decodeType7Shading(this, reader); + patchMesh = true; + break; + default: + error('Unsupported mesh type.'); + break; + } + if (patchMesh) { + updateBounds(this); + for (var i = 0, ii = this.figures.length; i < ii; i++) { + buildFigureFromPatch(this, i); + } + } + updateBounds(this); + packData(this); + } + Mesh.prototype = { + getIR: function Mesh_getIR() { + return [ + 'Mesh', + this.shadingType, + this.coords, + this.colors, + this.figures, + this.bounds, + this.matrix, + this.bbox, + this.background + ]; + } + }; + return Mesh; + }(); + Shadings.Dummy = function DummyClosure() { + function Dummy() { + this.type = 'Pattern'; + } + Dummy.prototype = { + getIR: function Dummy_getIR() { + return ['Dummy']; + } + }; + return Dummy; + }(); + function getTilingPatternIR(operatorList, dict, args) { + var matrix = dict.getArray('Matrix'); + var bbox = dict.getArray('BBox'); + var xstep = dict.get('XStep'); + var ystep = dict.get('YStep'); + var paintType = dict.get('PaintType'); + var tilingType = dict.get('TilingType'); + return [ + 'TilingPattern', + args, + operatorList, + matrix, + bbox, + xstep, + ystep, + paintType, + tilingType + ]; + } + exports.Pattern = Pattern; + exports.getTilingPatternIR = getTilingPatternIR; + })); + (function (root, factory) { + factory(root.pdfjsCoreEvaluator = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, root.pdfjsCoreImage, root.pdfjsCoreColorSpace, root.pdfjsCoreMurmurHash3, root.pdfjsCoreFonts, root.pdfjsCoreFunction, root.pdfjsCorePattern, root.pdfjsCoreCMap, root.pdfjsCoreMetrics, root.pdfjsCoreBidi, root.pdfjsCoreEncodings, root.pdfjsCoreStandardFonts, root.pdfjsCoreUnicode, root.pdfjsCoreGlyphList); + }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, coreImage, coreColorSpace, coreMurmurHash3, coreFonts, coreFunction, corePattern, coreCMap, coreMetrics, coreBidi, coreEncodings, coreStandardFonts, coreUnicode, coreGlyphList) { + var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; + var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; + var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; + var ImageKind = sharedUtil.ImageKind; + var OPS = sharedUtil.OPS; + var TextRenderingMode = sharedUtil.TextRenderingMode; + var Util = sharedUtil.Util; + var assert = sharedUtil.assert; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isNum = sharedUtil.isNum; + var isString = sharedUtil.isString; + var getLookupTableFactory = sharedUtil.getLookupTableFactory; + var warn = sharedUtil.warn; + var Dict = corePrimitives.Dict; + var Name = corePrimitives.Name; + var isCmd = corePrimitives.isCmd; + var isDict = corePrimitives.isDict; + var isName = corePrimitives.isName; + var isRef = corePrimitives.isRef; + var isStream = corePrimitives.isStream; + var DecodeStream = coreStream.DecodeStream; + var JpegStream = coreStream.JpegStream; + var Stream = coreStream.Stream; + var Lexer = coreParser.Lexer; + var Parser = coreParser.Parser; + var isEOF = coreParser.isEOF; + var PDFImage = coreImage.PDFImage; + var ColorSpace = coreColorSpace.ColorSpace; + var MurmurHash3_64 = coreMurmurHash3.MurmurHash3_64; + var ErrorFont = coreFonts.ErrorFont; + var FontFlags = coreFonts.FontFlags; + var Font = coreFonts.Font; + var IdentityToUnicodeMap = coreFonts.IdentityToUnicodeMap; + var ToUnicodeMap = coreFonts.ToUnicodeMap; + var getFontType = coreFonts.getFontType; + var isPDFFunction = coreFunction.isPDFFunction; + var PDFFunction = coreFunction.PDFFunction; + var Pattern = corePattern.Pattern; + var getTilingPatternIR = corePattern.getTilingPatternIR; + var CMapFactory = coreCMap.CMapFactory; + var IdentityCMap = coreCMap.IdentityCMap; + var getMetrics = coreMetrics.getMetrics; + var bidi = coreBidi.bidi; + var WinAnsiEncoding = coreEncodings.WinAnsiEncoding; + var StandardEncoding = coreEncodings.StandardEncoding; + var MacRomanEncoding = coreEncodings.MacRomanEncoding; + var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; + var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; + var getEncoding = coreEncodings.getEncoding; + var getStdFontMap = coreStandardFonts.getStdFontMap; + var getSerifFonts = coreStandardFonts.getSerifFonts; + var getSymbolsFonts = coreStandardFonts.getSymbolsFonts; + var getNormalizedUnicodes = coreUnicode.getNormalizedUnicodes; + var reverseIfRtl = coreUnicode.reverseIfRtl; + var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; + var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; + var PartialEvaluator = function PartialEvaluatorClosure() { + var DefaultPartialEvaluatorOptions = { + forceDataSchema: false, + maxImageSize: -1, + disableFontFace: false, + cMapOptions: { + url: null, + packed: false + } + }; + function NativeImageDecoder(xref, resources, handler, forceDataSchema) { + this.xref = xref; + this.resources = resources; + this.handler = handler; + this.forceDataSchema = forceDataSchema; + } + NativeImageDecoder.prototype = { + canDecode: function (image) { + return image instanceof JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources); + }, + decode: function (image) { + var dict = image.dict; + var colorSpace = dict.get('ColorSpace', 'CS'); + colorSpace = ColorSpace.parse(colorSpace, this.xref, this.resources); + var numComps = colorSpace.numComps; + var decodePromise = this.handler.sendWithPromise('JpegDecode', [ + image.getIR(this.forceDataSchema), + numComps + ]); + return decodePromise.then(function (message) { + var data = message.data; + return new Stream(data, 0, data.length, image.dict); + }); + } + }; + NativeImageDecoder.isSupported = function NativeImageDecoder_isSupported(image, xref, res) { + var dict = image.dict; + if (dict.has('DecodeParms') || dict.has('DP')) { + return false; + } + var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); + return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D')); + }; + NativeImageDecoder.isDecodable = function NativeImageDecoder_isDecodable(image, xref, res) { + var dict = image.dict; + if (dict.has('DecodeParms') || dict.has('DP')) { + return false; + } + var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); + return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D')); + }; + function PartialEvaluator(pdfManager, xref, handler, pageIndex, idFactory, fontCache, options) { + this.pdfManager = pdfManager; + this.xref = xref; + this.handler = handler; + this.pageIndex = pageIndex; + this.idFactory = idFactory; + this.fontCache = fontCache; + this.options = options || DefaultPartialEvaluatorOptions; + } + var TIME_SLOT_DURATION_MS = 20; + var CHECK_TIME_EVERY = 100; + function TimeSlotManager() { + this.reset(); + } + TimeSlotManager.prototype = { + check: function TimeSlotManager_check() { + if (++this.checked < CHECK_TIME_EVERY) { + return false; + } + this.checked = 0; + return this.endTime <= Date.now(); + }, + reset: function TimeSlotManager_reset() { + this.endTime = Date.now() + TIME_SLOT_DURATION_MS; + this.checked = 0; + } + }; + var deferred = Promise.resolve(); + var TILING_PATTERN = 1, SHADING_PATTERN = 2; + PartialEvaluator.prototype = { + hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { + if (!isDict(resources)) { + return false; + } + var processed = Object.create(null); + if (resources.objId) { + processed[resources.objId] = true; + } + var nodes = [resources], xref = this.xref; + while (nodes.length) { + var key, i, ii; + var node = nodes.shift(); + var graphicStates = node.get('ExtGState'); + if (isDict(graphicStates)) { + var graphicStatesKeys = graphicStates.getKeys(); + for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) { + key = graphicStatesKeys[i]; + var graphicState = graphicStates.get(key); + var bm = graphicState.get('BM'); + if (isName(bm) && bm.name !== 'Normal') { + return true; + } + } + } + var xObjects = node.get('XObject'); + if (!isDict(xObjects)) { + continue; + } + var xObjectsKeys = xObjects.getKeys(); + for (i = 0, ii = xObjectsKeys.length; i < ii; i++) { + key = xObjectsKeys[i]; + var xObject = xObjects.getRaw(key); + if (isRef(xObject)) { + if (processed[xObject.toString()]) { + continue; + } + xObject = xref.fetch(xObject); + } + if (!isStream(xObject)) { + continue; + } + if (xObject.dict.objId) { + if (processed[xObject.dict.objId]) { + continue; + } + processed[xObject.dict.objId] = true; + } + var xResources = xObject.dict.get('Resources'); + if (isDict(xResources) && (!xResources.objId || !processed[xResources.objId])) { + nodes.push(xResources); + if (xResources.objId) { + processed[xResources.objId] = true; + } + } + } + } + return false; + }, + buildFormXObject: function PartialEvaluator_buildFormXObject(resources, xobj, smask, operatorList, task, initialState) { + var matrix = xobj.dict.getArray('Matrix'); + var bbox = xobj.dict.getArray('BBox'); + var group = xobj.dict.get('Group'); + if (group) { + var groupOptions = { + matrix: matrix, + bbox: bbox, + smask: smask, + isolated: false, + knockout: false + }; + var groupSubtype = group.get('S'); + var colorSpace; + if (isName(groupSubtype, 'Transparency')) { + groupOptions.isolated = group.get('I') || false; + groupOptions.knockout = group.get('K') || false; + colorSpace = group.has('CS') ? ColorSpace.parse(group.get('CS'), this.xref, resources) : null; + } + if (smask && smask.backdrop) { + colorSpace = colorSpace || ColorSpace.singletons.rgb; + smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); + } + operatorList.addOp(OPS.beginGroup, [groupOptions]); + } + operatorList.addOp(OPS.paintFormXObjectBegin, [ + matrix, + bbox + ]); + return this.getOperatorList(xobj, task, xobj.dict.get('Resources') || resources, operatorList, initialState).then(function () { + operatorList.addOp(OPS.paintFormXObjectEnd, []); + if (group) { + operatorList.addOp(OPS.endGroup, [groupOptions]); + } + }); + }, + buildPaintImageXObject: function PartialEvaluator_buildPaintImageXObject(resources, image, inline, operatorList, cacheKey, imageCache) { + var self = this; + var dict = image.dict; + var w = dict.get('Width', 'W'); + var h = dict.get('Height', 'H'); + if (!(w && isNum(w)) || !(h && isNum(h))) { + warn('Image dimensions are missing, or not numbers.'); + return; + } + var maxImageSize = this.options.maxImageSize; + if (maxImageSize !== -1 && w * h > maxImageSize) { + warn('Image exceeded maximum allowed size and was removed.'); + return; + } + var imageMask = dict.get('ImageMask', 'IM') || false; + var imgData, args; + if (imageMask) { + var width = dict.get('Width', 'W'); + var height = dict.get('Height', 'H'); + var bitStrideLength = width + 7 >> 3; + var imgArray = image.getBytes(bitStrideLength * height); + var decode = dict.getArray('Decode', 'D'); + var inverseDecode = !!decode && decode[0] > 0; + imgData = PDFImage.createMask(imgArray, width, height, image instanceof DecodeStream, inverseDecode); + imgData.cached = true; + args = [imgData]; + operatorList.addOp(OPS.paintImageMaskXObject, args); + if (cacheKey) { + imageCache[cacheKey] = { + fn: OPS.paintImageMaskXObject, + args: args + }; + } + return; + } + var softMask = dict.get('SMask', 'SM') || false; + var mask = dict.get('Mask') || false; + var SMALL_IMAGE_DIMENSIONS = 200; + if (inline && !softMask && !mask && !(image instanceof JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) { + var imageObj = new PDFImage(this.xref, resources, image, inline, null, null); + imgData = imageObj.createImageData(true); + operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); + return; + } + var objId = 'img_' + this.idFactory.createObjId(); + operatorList.addDependency(objId); + args = [ + objId, + w, + h + ]; + if (!softMask && !mask && image instanceof JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources)) { + operatorList.addOp(OPS.paintJpegXObject, args); + this.handler.send('obj', [ + objId, + this.pageIndex, + 'JpegStream', + image.getIR(this.options.forceDataSchema) + ]); + return; + } + var nativeImageDecoder = null; + if (image instanceof JpegStream || mask instanceof JpegStream || softMask instanceof JpegStream) { + nativeImageDecoder = new NativeImageDecoder(self.xref, resources, self.handler, self.options.forceDataSchema); + } + PDFImage.buildImage(self.handler, self.xref, resources, image, inline, nativeImageDecoder).then(function (imageObj) { + var imgData = imageObj.createImageData(false); + self.handler.send('obj', [ + objId, + self.pageIndex, + 'Image', + imgData + ], [imgData.data.buffer]); + }).then(undefined, function (reason) { + warn('Unable to decode image: ' + reason); + self.handler.send('obj', [ + objId, + self.pageIndex, + 'Image', + null + ]); + }); + operatorList.addOp(OPS.paintImageXObject, args); + if (cacheKey) { + imageCache[cacheKey] = { + fn: OPS.paintImageXObject, + args: args + }; + } + }, + handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) { + var smaskContent = smask.get('G'); + var smaskOptions = { + subtype: smask.get('S').name, + backdrop: smask.get('BC') + }; + var transferObj = smask.get('TR'); + if (isPDFFunction(transferObj)) { + var transferFn = PDFFunction.parse(this.xref, transferObj); + var transferMap = new Uint8Array(256); + var tmp = new Float32Array(1); + for (var i = 0; i < 256; i++) { + tmp[0] = i / 255; + transferFn(tmp, 0, tmp, 0); + transferMap[i] = tmp[0] * 255 | 0; + } + smaskOptions.transferMap = transferMap; + } + return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone()); + }, + handleTilingType: function PartialEvaluator_handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) { + var tilingOpList = new OperatorList(); + var resourcesArray = [ + patternDict.get('Resources'), + resources + ]; + var patternResources = Dict.merge(this.xref, resourcesArray); + return this.getOperatorList(pattern, task, patternResources, tilingOpList).then(function () { + operatorList.addDependencies(tilingOpList.dependencies); + operatorList.addOp(fn, getTilingPatternIR({ + fnArray: tilingOpList.fnArray, + argsArray: tilingOpList.argsArray + }, patternDict, args)); + }); + }, + handleSetFont: function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) { + var fontName; + if (fontArgs) { + fontArgs = fontArgs.slice(); + fontName = fontArgs[0].name; + } + var self = this; + return this.loadFont(fontName, fontRef, this.xref, resources).then(function (translated) { + if (!translated.font.isType3Font) { + return translated; + } + return translated.loadType3Data(self, resources, operatorList, task).then(function () { + return translated; + }, function (reason) { + self.handler.send('UnsupportedFeature', { featureId: UNSUPPORTED_FEATURES.font }); + return new TranslatedFont('g_font_error', new ErrorFont('Type3 font load error: ' + reason), translated.font); + }); + }).then(function (translated) { + state.font = translated.font; + translated.send(self.handler); + return translated.loadedName; + }); + }, + handleText: function PartialEvaluator_handleText(chars, state) { + var font = state.font; + var glyphs = font.charsToGlyphs(chars); + var isAddToPathSet = !!(state.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + if (font.data && (isAddToPathSet || this.options.disableFontFace)) { + var buildPath = function (fontChar) { + if (!font.renderer.hasBuiltPath(fontChar)) { + var path = font.renderer.getPathJs(fontChar); + this.handler.send('commonobj', [ + font.loadedName + '_path_' + fontChar, + 'FontPath', + path + ]); + } + }.bind(this); + for (var i = 0, ii = glyphs.length; i < ii; i++) { + var glyph = glyphs[i]; + buildPath(glyph.fontChar); + var accent = glyph.accent; + if (accent && accent.fontChar) { + buildPath(accent.fontChar); + } + } + } + return glyphs; + }, + setGState: function PartialEvaluator_setGState(resources, gState, operatorList, task, xref, stateManager) { + var gStateObj = []; + var gStateKeys = gState.getKeys(); + var self = this; + var promise = Promise.resolve(); + for (var i = 0, ii = gStateKeys.length; i < ii; i++) { + var key = gStateKeys[i]; + var value = gState.get(key); + switch (key) { + case 'Type': + break; + case 'LW': + case 'LC': + case 'LJ': + case 'ML': + case 'D': + case 'RI': + case 'FL': + case 'CA': + case 'ca': + gStateObj.push([ + key, + value + ]); + break; + case 'Font': + promise = promise.then(function () { + return self.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) { + operatorList.addDependency(loadedName); + gStateObj.push([ + key, + [ + loadedName, + value[1] + ] + ]); + }); + }); + break; + case 'BM': + gStateObj.push([ + key, + value + ]); + break; + case 'SMask': + if (isName(value, 'None')) { + gStateObj.push([ + key, + false + ]); + break; + } + if (isDict(value)) { + promise = promise.then(function (dict) { + return self.handleSMask(dict, resources, operatorList, task, stateManager); + }.bind(this, value)); + gStateObj.push([ + key, + true + ]); + } else { + warn('Unsupported SMask type'); + } + break; + case 'OP': + case 'op': + case 'OPM': + case 'BG': + case 'BG2': + case 'UCR': + case 'UCR2': + case 'TR': + case 'TR2': + case 'HT': + case 'SM': + case 'SA': + case 'AIS': + case 'TK': + info('graphic state operator ' + key); + break; + default: + info('Unknown graphic state operator ' + key); + break; + } + } + return promise.then(function () { + if (gStateObj.length > 0) { + operatorList.addOp(OPS.setGState, [gStateObj]); + } + }); + }, + loadFont: function PartialEvaluator_loadFont(fontName, font, xref, resources) { + function errorFont() { + return Promise.resolve(new TranslatedFont('g_font_error', new ErrorFont('Font ' + fontName + ' is not available'), font)); + } + var fontRef; + if (font) { + assert(isRef(font)); + fontRef = font; + } else { + var fontRes = resources.get('Font'); + if (fontRes) { + fontRef = fontRes.getRaw(fontName); + } else { + warn('fontRes not available'); + return errorFont(); + } + } + if (!fontRef) { + warn('fontRef not available'); + return errorFont(); + } + if (this.fontCache.has(fontRef)) { + return this.fontCache.get(fontRef); + } + font = xref.fetchIfRef(fontRef); + if (!isDict(font)) { + return errorFont(); + } + if (font.translated) { + return font.translated; + } + var fontCapability = createPromiseCapability(); + var preEvaluatedFont = this.preEvaluateFont(font, xref); + var descriptor = preEvaluatedFont.descriptor; + var fontRefIsRef = isRef(fontRef), fontID; + if (fontRefIsRef) { + fontID = fontRef.toString(); + } + if (isDict(descriptor)) { + if (!descriptor.fontAliases) { + descriptor.fontAliases = Object.create(null); + } + var fontAliases = descriptor.fontAliases; + var hash = preEvaluatedFont.hash; + if (fontAliases[hash]) { + var aliasFontRef = fontAliases[hash].aliasRef; + if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) { + this.fontCache.putAlias(fontRef, aliasFontRef); + return this.fontCache.get(fontRef); + } + } else { + fontAliases[hash] = { fontID: Font.getFontID() }; + } + if (fontRefIsRef) { + fontAliases[hash].aliasRef = fontRef; + } + fontID = fontAliases[hash].fontID; + } + if (fontRefIsRef) { + this.fontCache.put(fontRef, fontCapability.promise); + } else { + if (!fontID) { + fontID = this.idFactory.createObjId(); + } + this.fontCache.put('id_' + fontID, fontCapability.promise); + } + assert(fontID, 'The "fontID" must be defined.'); + font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID; + font.translated = fontCapability.promise; + var translatedPromise; + try { + translatedPromise = this.translateFont(preEvaluatedFont, xref); + } catch (e) { + translatedPromise = Promise.reject(e); + } + var self = this; + translatedPromise.then(function (translatedFont) { + if (translatedFont.fontType !== undefined) { + var xrefFontStats = xref.stats.fontTypes; + xrefFontStats[translatedFont.fontType] = true; + } + fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font)); + }, function (reason) { + self.handler.send('UnsupportedFeature', { featureId: UNSUPPORTED_FEATURES.font }); + try { + var descriptor = preEvaluatedFont.descriptor; + var fontFile3 = descriptor && descriptor.get('FontFile3'); + var subtype = fontFile3 && fontFile3.get('Subtype'); + var fontType = getFontType(preEvaluatedFont.type, subtype && subtype.name); + var xrefFontStats = xref.stats.fontTypes; + xrefFontStats[fontType] = true; + } catch (ex) { + } + fontCapability.resolve(new TranslatedFont(font.loadedName, new ErrorFont(reason instanceof Error ? reason.message : reason), font)); + }); + return fontCapability.promise; + }, + buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { + var lastIndex = operatorList.length - 1; + if (!args) { + args = []; + } + if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== OPS.constructPath) { + operatorList.addOp(OPS.constructPath, [ + [fn], + args + ]); + } else { + var opArgs = operatorList.argsArray[lastIndex]; + opArgs[0].push(fn); + Array.prototype.push.apply(opArgs[1], args); + } + }, + handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task, xref) { + var patternName = args[args.length - 1]; + var pattern; + if (isName(patternName) && (pattern = patterns.get(patternName.name))) { + var dict = isStream(pattern) ? pattern.dict : pattern; + var typeNum = dict.get('PatternType'); + if (typeNum === TILING_PATTERN) { + var color = cs.base ? cs.base.getRgb(args, 0) : null; + return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task); + } else if (typeNum === SHADING_PATTERN) { + var shading = dict.get('Shading'); + var matrix = dict.getArray('Matrix'); + pattern = Pattern.parseShading(shading, matrix, xref, resources, this.handler); + operatorList.addOp(fn, pattern.getIR()); + return Promise.resolve(); + } + return Promise.reject('Unknown PatternType: ' + typeNum); + } + operatorList.addOp(fn, args); + return Promise.resolve(); + }, + getOperatorList: function PartialEvaluator_getOperatorList(stream, task, resources, operatorList, initialState) { + var self = this; + var xref = this.xref; + var imageCache = Object.create(null); + assert(operatorList); + resources = resources || Dict.empty; + var xobjs = resources.get('XObject') || Dict.empty; + var patterns = resources.get('Pattern') || Dict.empty; + var stateManager = new StateManager(initialState || new EvalState()); + var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + var timeSlotManager = new TimeSlotManager(); + return new Promise(function promiseBody(resolve, reject) { + var next = function (promise) { + promise.then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + var stop, operation = {}, i, ii, cs; + while (!(stop = timeSlotManager.check())) { + operation.args = null; + if (!preprocessor.read(operation)) { + break; + } + var args = operation.args; + var fn = operation.fn; + switch (fn | 0) { + case OPS.paintXObject: + if (args[0].code) { + break; + } + var name = args[0].name; + if (!name) { + warn('XObject must be referred to by name.'); + continue; + } + if (imageCache[name] !== undefined) { + operatorList.addOp(imageCache[name].fn, imageCache[name].args); + args = null; + continue; + } + var xobj = xobjs.get(name); + if (xobj) { + assert(isStream(xobj), 'XObject should be a stream'); + var type = xobj.dict.get('Subtype'); + assert(isName(type), 'XObject should have a Name subtype'); + if (type.name === 'Form') { + stateManager.save(); + next(self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone()).then(function () { + stateManager.restore(); + })); + return; + } else if (type.name === 'Image') { + self.buildPaintImageXObject(resources, xobj, false, operatorList, name, imageCache); + args = null; + continue; + } else if (type.name === 'PS') { + info('Ignored XObject subtype PS'); + continue; + } else { + error('Unhandled XObject subtype ' + type.name); + } + } + break; + case OPS.setFont: + var fontSize = args[1]; + next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state).then(function (loadedName) { + operatorList.addDependency(loadedName); + operatorList.addOp(OPS.setFont, [ + loadedName, + fontSize + ]); + })); + return; + case OPS.endInlineImage: + var cacheKey = args[0].cacheKey; + if (cacheKey) { + var cacheEntry = imageCache[cacheKey]; + if (cacheEntry !== undefined) { + operatorList.addOp(cacheEntry.fn, cacheEntry.args); + args = null; + continue; + } + } + self.buildPaintImageXObject(resources, args[0], true, operatorList, cacheKey, imageCache); + args = null; + continue; + case OPS.showText: + args[0] = self.handleText(args[0], stateManager.state); + break; + case OPS.showSpacedText: + var arr = args[0]; + var combinedGlyphs = []; + var arrLength = arr.length; + var state = stateManager.state; + for (i = 0; i < arrLength; ++i) { + var arrItem = arr[i]; + if (isString(arrItem)) { + Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state)); + } else if (isNum(arrItem)) { + combinedGlyphs.push(arrItem); + } + } + args[0] = combinedGlyphs; + fn = OPS.showText; + break; + case OPS.nextLineShowText: + operatorList.addOp(OPS.nextLine); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.nextLineSetSpacingShowText: + operatorList.addOp(OPS.nextLine); + operatorList.addOp(OPS.setWordSpacing, [args.shift()]); + operatorList.addOp(OPS.setCharSpacing, [args.shift()]); + args[0] = self.handleText(args[0], stateManager.state); + fn = OPS.showText; + break; + case OPS.setTextRenderingMode: + stateManager.state.textRenderingMode = args[0]; + break; + case OPS.setFillColorSpace: + stateManager.state.fillColorSpace = ColorSpace.parse(args[0], xref, resources); + continue; + case OPS.setStrokeColorSpace: + stateManager.state.strokeColorSpace = ColorSpace.parse(args[0], xref, resources); + continue; + case OPS.setFillColor: + cs = stateManager.state.fillColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColor: + cs = stateManager.state.strokeColorSpace; + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillGray: + stateManager.state.fillColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeGray: + stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; + args = ColorSpace.singletons.gray.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillCMYKColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeCMYKColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; + args = ColorSpace.singletons.cmyk.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.setFillRGBColor: + stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setStrokeRGBColor: + stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; + args = ColorSpace.singletons.rgb.getRgb(args, 0); + break; + case OPS.setFillColorN: + cs = stateManager.state.fillColorSpace; + if (cs.name === 'Pattern') { + next(self.handleColorN(operatorList, OPS.setFillColorN, args, cs, patterns, resources, task, xref)); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setFillRGBColor; + break; + case OPS.setStrokeColorN: + cs = stateManager.state.strokeColorSpace; + if (cs.name === 'Pattern') { + next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, cs, patterns, resources, task, xref)); + return; + } + args = cs.getRgb(args, 0); + fn = OPS.setStrokeRGBColor; + break; + case OPS.shadingFill: + var shadingRes = resources.get('Shading'); + if (!shadingRes) { + error('No shading resource found'); + } + var shading = shadingRes.get(args[0].name); + if (!shading) { + error('No shading object found'); + } + var shadingFill = Pattern.parseShading(shading, null, xref, resources, self.handler); + var patternIR = shadingFill.getIR(); + args = [patternIR]; + fn = OPS.shadingFill; + break; + case OPS.setGState: + var dictName = args[0]; + var extGState = resources.get('ExtGState'); + if (!isDict(extGState) || !extGState.has(dictName.name)) { + break; + } + var gState = extGState.get(dictName.name); + next(self.setGState(resources, gState, operatorList, task, xref, stateManager)); + return; + case OPS.moveTo: + case OPS.lineTo: + case OPS.curveTo: + case OPS.curveTo2: + case OPS.curveTo3: + case OPS.closePath: + self.buildPath(operatorList, fn, args); + continue; + case OPS.rectangle: + self.buildPath(operatorList, fn, args); + continue; + case OPS.markPoint: + case OPS.markPointProps: + case OPS.beginMarkedContent: + case OPS.beginMarkedContentProps: + case OPS.endMarkedContent: + case OPS.beginCompat: + case OPS.endCompat: + continue; + default: + if (args !== null) { + for (i = 0, ii = args.length; i < ii; i++) { + if (args[i] instanceof Dict) { + break; + } + } + if (i < ii) { + warn('getOperatorList - ignoring operator: ' + fn); + continue; + } + } + } + operatorList.addOp(fn, args); + } + if (stop) { + next(deferred); + return; + } + for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { + operatorList.addOp(OPS.restore, []); + } + resolve(); + }); + }, + getTextContent: function PartialEvaluator_getTextContent(stream, task, resources, stateManager, normalizeWhitespace, combineTextItems) { + stateManager = stateManager || new StateManager(new TextState()); + var WhitespaceRegexp = /\s/g; + var textContent = { + items: [], + styles: Object.create(null) + }; + var textContentItem = { + initialized: false, + str: [], + width: 0, + height: 0, + vertical: false, + lastAdvanceWidth: 0, + lastAdvanceHeight: 0, + textAdvanceScale: 0, + spaceWidth: 0, + fakeSpaceMin: Infinity, + fakeMultiSpaceMin: Infinity, + fakeMultiSpaceMax: -0, + textRunBreakAllowed: false, + transform: null, + fontName: null + }; + var SPACE_FACTOR = 0.3; + var MULTI_SPACE_FACTOR = 1.5; + var MULTI_SPACE_FACTOR_MAX = 4; + var self = this; + var xref = this.xref; + resources = xref.fetchIfRef(resources) || Dict.empty; + var xobjs = null; + var xobjsCache = Object.create(null); + var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); + var textState; + function ensureTextContentItem() { + if (textContentItem.initialized) { + return textContentItem; + } + var font = textState.font; + if (!(font.loadedName in textContent.styles)) { + textContent.styles[font.loadedName] = { + fontFamily: font.fallbackName, + ascent: font.ascent, + descent: font.descent, + vertical: font.vertical + }; + } + textContentItem.fontName = font.loadedName; + var tsm = [ + textState.fontSize * textState.textHScale, + 0, + 0, + textState.fontSize, + 0, + textState.textRise + ]; + if (font.isType3Font && textState.fontMatrix !== FONT_IDENTITY_MATRIX && textState.fontSize === 1) { + var glyphHeight = font.bbox[3] - font.bbox[1]; + if (glyphHeight > 0) { + glyphHeight = glyphHeight * textState.fontMatrix[3]; + tsm[3] *= glyphHeight; + } + } + var trm = Util.transform(textState.ctm, Util.transform(textState.textMatrix, tsm)); + textContentItem.transform = trm; + if (!font.vertical) { + textContentItem.width = 0; + textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); + textContentItem.vertical = false; + } else { + textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); + textContentItem.height = 0; + textContentItem.vertical = true; + } + var a = textState.textLineMatrix[0]; + var b = textState.textLineMatrix[1]; + var scaleLineX = Math.sqrt(a * a + b * b); + a = textState.ctm[0]; + b = textState.ctm[1]; + var scaleCtmX = Math.sqrt(a * a + b * b); + textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; + textContentItem.lastAdvanceWidth = 0; + textContentItem.lastAdvanceHeight = 0; + var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; + if (spaceWidth) { + textContentItem.spaceWidth = spaceWidth; + textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; + textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; + textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX; + textContentItem.textRunBreakAllowed = !font.isMonospace; + } else { + textContentItem.spaceWidth = 0; + textContentItem.fakeSpaceMin = Infinity; + textContentItem.fakeMultiSpaceMin = Infinity; + textContentItem.fakeMultiSpaceMax = 0; + textContentItem.textRunBreakAllowed = false; + } + textContentItem.initialized = true; + return textContentItem; + } + function replaceWhitespace(str) { + var i = 0, ii = str.length, code; + while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { + i++; + } + return i < ii ? str.replace(WhitespaceRegexp, ' ') : str; + } + function runBidiTransform(textChunk) { + var str = textChunk.str.join(''); + var bidiResult = bidi(str, -1, textChunk.vertical); + return { + str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str, + dir: bidiResult.dir, + width: textChunk.width, + height: textChunk.height, + transform: textChunk.transform, + fontName: textChunk.fontName + }; + } + function handleSetFont(fontName, fontRef) { + return self.loadFont(fontName, fontRef, xref, resources).then(function (translated) { + textState.font = translated.font; + textState.fontMatrix = translated.font.fontMatrix || FONT_IDENTITY_MATRIX; + }); + } + function buildTextContentItem(chars) { + var font = textState.font; + var textChunk = ensureTextContentItem(); + var width = 0; + var height = 0; + var glyphs = font.charsToGlyphs(chars); + var defaultVMetrics = font.defaultVMetrics; + for (var i = 0; i < glyphs.length; i++) { + var glyph = glyphs[i]; + var vMetricX = null; + var vMetricY = null; + var glyphWidth = null; + if (font.vertical) { + if (glyph.vmetric) { + glyphWidth = glyph.vmetric[0]; + vMetricX = glyph.vmetric[1]; + vMetricY = glyph.vmetric[2]; + } else { + glyphWidth = glyph.width; + vMetricX = glyph.width * 0.5; + vMetricY = defaultVMetrics[2]; + } + } else { + glyphWidth = glyph.width; + } + var glyphUnicode = glyph.unicode; + var NormalizedUnicodes = getNormalizedUnicodes(); + if (NormalizedUnicodes[glyphUnicode] !== undefined) { + glyphUnicode = NormalizedUnicodes[glyphUnicode]; + } + glyphUnicode = reverseIfRtl(glyphUnicode); + var charSpacing = textState.charSpacing; + if (glyph.isSpace) { + var wordSpacing = textState.wordSpacing; + charSpacing += wordSpacing; + if (wordSpacing > 0) { + addFakeSpaces(wordSpacing, textChunk.str); + } + } + var tx = 0; + var ty = 0; + if (!font.vertical) { + var w0 = glyphWidth * textState.fontMatrix[0]; + tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale; + width += tx; + } else { + var w1 = glyphWidth * textState.fontMatrix[0]; + ty = w1 * textState.fontSize + charSpacing; + height += ty; + } + textState.translateTextMatrix(tx, ty); + textChunk.str.push(glyphUnicode); + } + if (!font.vertical) { + textChunk.lastAdvanceWidth = width; + textChunk.width += width; + } else { + textChunk.lastAdvanceHeight = height; + textChunk.height += Math.abs(height); + } + return textChunk; + } + function addFakeSpaces(width, strBuf) { + if (width < textContentItem.fakeSpaceMin) { + return; + } + if (width < textContentItem.fakeMultiSpaceMin) { + strBuf.push(' '); + return; + } + var fakeSpaces = Math.round(width / textContentItem.spaceWidth); + while (fakeSpaces-- > 0) { + strBuf.push(' '); + } + } + function flushTextContentItem() { + if (!textContentItem.initialized) { + return; + } + textContentItem.width *= textContentItem.textAdvanceScale; + textContentItem.height *= textContentItem.textAdvanceScale; + textContent.items.push(runBidiTransform(textContentItem)); + textContentItem.initialized = false; + textContentItem.str.length = 0; + } + var timeSlotManager = new TimeSlotManager(); + return new Promise(function promiseBody(resolve, reject) { + var next = function (promise) { + promise.then(function () { + try { + promiseBody(resolve, reject); + } catch (ex) { + reject(ex); + } + }, reject); + }; + task.ensureNotTerminated(); + timeSlotManager.reset(); + var stop, operation = {}, args = []; + while (!(stop = timeSlotManager.check())) { + args.length = 0; + operation.args = args; + if (!preprocessor.read(operation)) { + break; + } + textState = stateManager.state; + var fn = operation.fn; + args = operation.args; + var advance, diff; + switch (fn | 0) { + case OPS.setFont: + var fontNameArg = args[0].name, fontSizeArg = args[1]; + if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) { + break; + } + flushTextContentItem(); + textState.fontName = fontNameArg; + textState.fontSize = fontSizeArg; + next(handleSetFont(fontNameArg, null)); + return; + case OPS.setTextRise: + flushTextContentItem(); + textState.textRise = args[0]; + break; + case OPS.setHScale: + flushTextContentItem(); + textState.textHScale = args[0] / 100; + break; + case OPS.setLeading: + flushTextContentItem(); + textState.leading = args[0]; + break; + case OPS.moveText: + var isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 0; + advance = args[0] - args[1]; + if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) { + textState.translateTextLineMatrix(args[0], args[1]); + textContentItem.width += args[0] - textContentItem.lastAdvanceWidth; + textContentItem.height += args[1] - textContentItem.lastAdvanceHeight; + diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - textContentItem.lastAdvanceHeight); + addFakeSpaces(diff, textContentItem.str); + break; + } + flushTextContentItem(); + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.setLeadingMoveText: + flushTextContentItem(); + textState.leading = -args[1]; + textState.translateTextLineMatrix(args[0], args[1]); + textState.textMatrix = textState.textLineMatrix.slice(); + break; + case OPS.nextLine: + flushTextContentItem(); + textState.carriageReturn(); + break; + case OPS.setTextMatrix: + advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], args[5]); + if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && advance.value <= textContentItem.fakeMultiSpaceMax) { + textState.translateTextLineMatrix(advance.width, advance.height); + textContentItem.width += advance.width - textContentItem.lastAdvanceWidth; + textContentItem.height += advance.height - textContentItem.lastAdvanceHeight; + diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - textContentItem.lastAdvanceHeight); + addFakeSpaces(diff, textContentItem.str); + break; + } + flushTextContentItem(); + textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); + break; + case OPS.setCharSpacing: + textState.charSpacing = args[0]; + break; + case OPS.setWordSpacing: + textState.wordSpacing = args[0]; + break; + case OPS.beginText: + flushTextContentItem(); + textState.textMatrix = IDENTITY_MATRIX.slice(); + textState.textLineMatrix = IDENTITY_MATRIX.slice(); + break; + case OPS.showSpacedText: + var items = args[0]; + var offset; + for (var j = 0, jj = items.length; j < jj; j++) { + if (typeof items[j] === 'string') { + buildTextContentItem(items[j]); + } else if (isNum(items[j])) { + ensureTextContentItem(); + advance = items[j] * textState.fontSize / 1000; + var breakTextRun = false; + if (textState.font.vertical) { + offset = advance; + textState.translateTextMatrix(0, offset); + breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax; + if (!breakTextRun) { + textContentItem.height += offset; + } + } else { + advance = -advance; + offset = advance * textState.textHScale; + textState.translateTextMatrix(offset, 0); + breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax; + if (!breakTextRun) { + textContentItem.width += offset; + } + } + if (breakTextRun) { + flushTextContentItem(); + } else if (advance > 0) { + addFakeSpaces(advance, textContentItem.str); + } + } + } + break; + case OPS.showText: + buildTextContentItem(args[0]); + break; + case OPS.nextLineShowText: + flushTextContentItem(); + textState.carriageReturn(); + buildTextContentItem(args[0]); + break; + case OPS.nextLineSetSpacingShowText: + flushTextContentItem(); + textState.wordSpacing = args[0]; + textState.charSpacing = args[1]; + textState.carriageReturn(); + buildTextContentItem(args[2]); + break; + case OPS.paintXObject: + flushTextContentItem(); + if (args[0].code) { + break; + } + if (!xobjs) { + xobjs = resources.get('XObject') || Dict.empty; + } + var name = args[0].name; + if (xobjsCache.key === name) { + if (xobjsCache.texts) { + Util.appendToArray(textContent.items, xobjsCache.texts.items); + Util.extendObj(textContent.styles, xobjsCache.texts.styles); + } + break; + } + var xobj = xobjs.get(name); + if (!xobj) { + break; + } + assert(isStream(xobj), 'XObject should be a stream'); + var type = xobj.dict.get('Subtype'); + assert(isName(type), 'XObject should have a Name subtype'); + if ('Form' !== type.name) { + xobjsCache.key = name; + xobjsCache.texts = null; + break; + } + stateManager.save(); + var matrix = xobj.dict.getArray('Matrix'); + if (isArray(matrix) && matrix.length === 6) { + stateManager.transform(matrix); + } + next(self.getTextContent(xobj, task, xobj.dict.get('Resources') || resources, stateManager, normalizeWhitespace, combineTextItems).then(function (formTextContent) { + Util.appendToArray(textContent.items, formTextContent.items); + Util.extendObj(textContent.styles, formTextContent.styles); + stateManager.restore(); + xobjsCache.key = name; + xobjsCache.texts = formTextContent; + })); + return; + case OPS.setGState: + flushTextContentItem(); + var dictName = args[0]; + var extGState = resources.get('ExtGState'); + if (!isDict(extGState) || !isName(dictName)) { + break; + } + var gState = extGState.get(dictName.name); + if (!isDict(gState)) { + break; + } + var gStateFont = gState.get('Font'); + if (gStateFont) { + textState.fontName = null; + textState.fontSize = gStateFont[1]; + next(handleSetFont(null, gStateFont[0])); + return; + } + break; + } + } + if (stop) { + next(deferred); + return; + } + flushTextContentItem(); + resolve(textContent); + }); + }, + extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, xref, properties) { + var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); + var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined); + if (properties.composite) { + var cidSystemInfo = dict.get('CIDSystemInfo'); + if (isDict(cidSystemInfo)) { + properties.cidSystemInfo = { + registry: cidSystemInfo.get('Registry'), + ordering: cidSystemInfo.get('Ordering'), + supplement: cidSystemInfo.get('Supplement') + }; + } + var cidToGidMap = dict.get('CIDToGIDMap'); + if (isStream(cidToGidMap)) { + properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); + } + } + var differences = []; + var baseEncodingName = null; + var encoding; + if (dict.has('Encoding')) { + encoding = dict.get('Encoding'); + if (isDict(encoding)) { + baseEncodingName = encoding.get('BaseEncoding'); + baseEncodingName = isName(baseEncodingName) ? baseEncodingName.name : null; + if (encoding.has('Differences')) { + var diffEncoding = encoding.get('Differences'); + var index = 0; + for (var j = 0, jj = diffEncoding.length; j < jj; j++) { + var data = xref.fetchIfRef(diffEncoding[j]); + if (isNum(data)) { + index = data; + } else if (isName(data)) { + differences[index++] = data.name; + } else { + error('Invalid entry in \'Differences\' array: ' + data); + } + } + } + } else if (isName(encoding)) { + baseEncodingName = encoding.name; + } else { + error('Encoding is not a Name nor a Dict'); + } + if (baseEncodingName !== 'MacRomanEncoding' && baseEncodingName !== 'MacExpertEncoding' && baseEncodingName !== 'WinAnsiEncoding') { + baseEncodingName = null; + } + } + if (baseEncodingName) { + properties.defaultEncoding = getEncoding(baseEncodingName).slice(); + } else { + var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); + var isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic); + encoding = StandardEncoding; + if (properties.type === 'TrueType' && !isNonsymbolicFont) { + encoding = WinAnsiEncoding; + } + if (isSymbolicFont) { + encoding = MacRomanEncoding; + if (!properties.file) { + if (/Symbol/i.test(properties.name)) { + encoding = SymbolSetEncoding; + } else if (/Dingbats/i.test(properties.name)) { + encoding = ZapfDingbatsEncoding; + } + } + } + properties.defaultEncoding = encoding; + } + properties.differences = differences; + properties.baseEncodingName = baseEncodingName; + properties.hasEncoding = !!baseEncodingName || differences.length > 0; + properties.dict = dict; + return toUnicodePromise.then(function (toUnicode) { + properties.toUnicode = toUnicode; + return this.buildToUnicode(properties); + }.bind(this)).then(function (toUnicode) { + properties.toUnicode = toUnicode; + return properties; + }); + }, + buildToUnicode: function PartialEvaluator_buildToUnicode(properties) { + properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0; + if (properties.hasIncludedToUnicodeMap) { + return Promise.resolve(properties.toUnicode); + } + var toUnicode, charcode, glyphName; + if (!properties.composite) + { + toUnicode = []; + var encoding = properties.defaultEncoding.slice(); + var baseEncodingName = properties.baseEncodingName; + var differences = properties.differences; + for (charcode in differences) { + glyphName = differences[charcode]; + if (glyphName === '.notdef') { + continue; + } + encoding[charcode] = glyphName; + } + var glyphsUnicodeMap = getGlyphsUnicode(); + for (charcode in encoding) { + glyphName = encoding[charcode]; + if (glyphName === '') { + continue; + } else if (glyphsUnicodeMap[glyphName] === undefined) { + var code = 0; + switch (glyphName[0]) { + case 'G': + if (glyphName.length === 3) { + code = parseInt(glyphName.substr(1), 16); + } + break; + case 'g': + if (glyphName.length === 5) { + code = parseInt(glyphName.substr(1), 16); + } + break; + case 'C': + case 'c': + if (glyphName.length >= 3) { + code = +glyphName.substr(1); + } + break; + default: + var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); + if (unicode !== -1) { + code = unicode; + } + } + if (code) { + if (baseEncodingName && code === +charcode) { + var baseEncoding = getEncoding(baseEncodingName); + if (baseEncoding && (glyphName = baseEncoding[charcode])) { + toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); + continue; + } + } + toUnicode[charcode] = String.fromCharCode(code); + } + continue; + } + toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]); + } + return Promise.resolve(new ToUnicodeMap(toUnicode)); + } + if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof IdentityCMap) || properties.cidSystemInfo.registry === 'Adobe' && (properties.cidSystemInfo.ordering === 'GB1' || properties.cidSystemInfo.ordering === 'CNS1' || properties.cidSystemInfo.ordering === 'Japan1' || properties.cidSystemInfo.ordering === 'Korea1'))) { + var registry = properties.cidSystemInfo.registry; + var ordering = properties.cidSystemInfo.ordering; + var ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2'); + return CMapFactory.create(ucs2CMapName, this.options.cMapOptions, null).then(function (ucs2CMap) { + var cMap = properties.cMap; + toUnicode = []; + cMap.forEach(function (charcode, cid) { + assert(cid <= 0xffff, 'Max size of CID is 65,535'); + var ucs2 = ucs2CMap.lookup(cid); + if (ucs2) { + toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1)); + } + }); + return new ToUnicodeMap(toUnicode); + }); + } + return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar, properties.lastChar)); + }, + readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { + var cmapObj = toUnicode; + if (isName(cmapObj)) { + return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then(function (cmap) { + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xFFFF); + } + return new ToUnicodeMap(cmap.getMap()); + }); + } else if (isStream(cmapObj)) { + return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then(function (cmap) { + if (cmap instanceof IdentityCMap) { + return new IdentityToUnicodeMap(0, 0xFFFF); + } + var map = new Array(cmap.length); + cmap.forEach(function (charCode, token) { + var str = []; + for (var k = 0; k < token.length; k += 2) { + var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + if ((w1 & 0xF800) !== 0xD800) { + str.push(w1); + continue; + } + k += 2; + var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1); + str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); + } + map[charCode] = String.fromCharCode.apply(String, str); + }); + return new ToUnicodeMap(map); + }); + } + return Promise.resolve(null); + }, + readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { + var glyphsData = cidToGidStream.getBytes(); + var result = []; + for (var j = 0, jj = glyphsData.length; j < jj; j++) { + var glyphID = glyphsData[j++] << 8 | glyphsData[j]; + if (glyphID === 0) { + continue; + } + var code = j >> 1; + result[code] = glyphID; + } + return result; + }, + extractWidths: function PartialEvaluator_extractWidths(dict, xref, descriptor, properties) { + var glyphsWidths = []; + var defaultWidth = 0; + var glyphsVMetrics = []; + var defaultVMetrics; + var i, ii, j, jj, start, code, widths; + if (properties.composite) { + defaultWidth = dict.get('DW') || 1000; + widths = dict.get('W'); + if (widths) { + for (i = 0, ii = widths.length; i < ii; i++) { + start = xref.fetchIfRef(widths[i++]); + code = xref.fetchIfRef(widths[i]); + if (isArray(code)) { + for (j = 0, jj = code.length; j < jj; j++) { + glyphsWidths[start++] = xref.fetchIfRef(code[j]); + } + } else { + var width = xref.fetchIfRef(widths[++i]); + for (j = start; j <= code; j++) { + glyphsWidths[j] = width; + } + } + } + } + if (properties.vertical) { + var vmetrics = dict.getArray('DW2') || [ + 880, + -1000 + ]; + defaultVMetrics = [ + vmetrics[1], + defaultWidth * 0.5, + vmetrics[0] + ]; + vmetrics = dict.get('W2'); + if (vmetrics) { + for (i = 0, ii = vmetrics.length; i < ii; i++) { + start = xref.fetchIfRef(vmetrics[i++]); + code = xref.fetchIfRef(vmetrics[i]); + if (isArray(code)) { + for (j = 0, jj = code.length; j < jj; j++) { + glyphsVMetrics[start++] = [ + xref.fetchIfRef(code[j++]), + xref.fetchIfRef(code[j++]), + xref.fetchIfRef(code[j]) + ]; + } + } else { + var vmetric = [ + xref.fetchIfRef(vmetrics[++i]), + xref.fetchIfRef(vmetrics[++i]), + xref.fetchIfRef(vmetrics[++i]) + ]; + for (j = start; j <= code; j++) { + glyphsVMetrics[j] = vmetric; + } + } + } + } + } + } else { + var firstChar = properties.firstChar; + widths = dict.get('Widths'); + if (widths) { + j = firstChar; + for (i = 0, ii = widths.length; i < ii; i++) { + glyphsWidths[j++] = xref.fetchIfRef(widths[i]); + } + defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0; + } else { + var baseFontName = dict.get('BaseFont'); + if (isName(baseFontName)) { + var metrics = this.getBaseFontMetrics(baseFontName.name); + glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties); + defaultWidth = metrics.defaultWidth; + } + } + } + var isMonospace = true; + var firstWidth = defaultWidth; + for (var glyph in glyphsWidths) { + var glyphWidth = glyphsWidths[glyph]; + if (!glyphWidth) { + continue; + } + if (!firstWidth) { + firstWidth = glyphWidth; + continue; + } + if (firstWidth !== glyphWidth) { + isMonospace = false; + break; + } + } + if (isMonospace) { + properties.flags |= FontFlags.FixedPitch; + } + properties.defaultWidth = defaultWidth; + properties.widths = glyphsWidths; + properties.defaultVMetrics = defaultVMetrics; + properties.vmetrics = glyphsVMetrics; + }, + isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { + var fontNameWoStyle = baseFontName.split('-')[0]; + return fontNameWoStyle in getSerifFonts() || fontNameWoStyle.search(/serif/gi) !== -1; + }, + getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { + var defaultWidth = 0; + var widths = []; + var monospace = false; + var stdFontMap = getStdFontMap(); + var lookupName = stdFontMap[name] || name; + var Metrics = getMetrics(); + if (!(lookupName in Metrics)) { + if (this.isSerifFont(name)) { + lookupName = 'Times-Roman'; + } else { + lookupName = 'Helvetica'; + } + } + var glyphWidths = Metrics[lookupName]; + if (isNum(glyphWidths)) { + defaultWidth = glyphWidths; + monospace = true; + } else { + widths = glyphWidths(); + } + return { + defaultWidth: defaultWidth, + monospace: monospace, + widths: widths + }; + }, + buildCharCodeToWidth: function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, properties) { + var widths = Object.create(null); + var differences = properties.differences; + var encoding = properties.defaultEncoding; + for (var charCode = 0; charCode < 256; charCode++) { + if (charCode in differences && widthsByGlyphName[differences[charCode]]) { + widths[charCode] = widthsByGlyphName[differences[charCode]]; + continue; + } + if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { + widths[charCode] = widthsByGlyphName[encoding[charCode]]; + continue; + } + } + return widths; + }, + preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { + var baseDict = dict; + var type = dict.get('Subtype'); + assert(isName(type), 'invalid font Subtype'); + var composite = false; + var uint8array; + if (type.name === 'Type0') { + var df = dict.get('DescendantFonts'); + if (!df) { + error('Descendant fonts are not specified'); + } + dict = isArray(df) ? xref.fetchIfRef(df[0]) : df; + type = dict.get('Subtype'); + assert(isName(type), 'invalid font Subtype'); + composite = true; + } + var descriptor = dict.get('FontDescriptor'); + if (descriptor) { + var hash = new MurmurHash3_64(); + var encoding = baseDict.getRaw('Encoding'); + if (isName(encoding)) { + hash.update(encoding.name); + } else if (isRef(encoding)) { + hash.update(encoding.toString()); + } else if (isDict(encoding)) { + var keys = encoding.getKeys(); + for (var i = 0, ii = keys.length; i < ii; i++) { + var entry = encoding.getRaw(keys[i]); + if (isName(entry)) { + hash.update(entry.name); + } else if (isRef(entry)) { + hash.update(entry.toString()); + } else if (isArray(entry)) { + var diffLength = entry.length, diffBuf = new Array(diffLength); + for (var j = 0; j < diffLength; j++) { + var diffEntry = entry[j]; + if (isName(diffEntry)) { + diffBuf[j] = diffEntry.name; + } else if (isNum(diffEntry) || isRef(diffEntry)) { + diffBuf[j] = diffEntry.toString(); + } + } + hash.update(diffBuf.join()); + } + } + } + var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); + if (isStream(toUnicode)) { + var stream = toUnicode.str || toUnicode; + uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start); + hash.update(uint8array); + } else if (isName(toUnicode)) { + hash.update(toUnicode.name); + } + var widths = dict.get('Widths') || baseDict.get('Widths'); + if (widths) { + uint8array = new Uint8Array(new Uint32Array(widths).buffer); + hash.update(uint8array); + } + } + return { + descriptor: descriptor, + dict: dict, + baseDict: baseDict, + composite: composite, + type: type.name, + hash: hash ? hash.hexdigest() : '' + }; + }, + translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, xref) { + var baseDict = preEvaluatedFont.baseDict; + var dict = preEvaluatedFont.dict; + var composite = preEvaluatedFont.composite; + var descriptor = preEvaluatedFont.descriptor; + var type = preEvaluatedFont.type; + var maxCharIndex = composite ? 0xFFFF : 0xFF; + var cMapOptions = this.options.cMapOptions; + var properties; + if (!descriptor) { + if (type === 'Type3') { + descriptor = new Dict(null); + descriptor.set('FontName', Name.get(type)); + descriptor.set('FontBBox', dict.getArray('FontBBox')); + } else { + var baseFontName = dict.get('BaseFont'); + if (!isName(baseFontName)) { + error('Base font is not specified'); + } + baseFontName = baseFontName.name.replace(/[,_]/g, '-'); + var metrics = this.getBaseFontMetrics(baseFontName); + var fontNameWoStyle = baseFontName.split('-')[0]; + var flags = (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | (metrics.monospace ? FontFlags.FixedPitch : 0) | (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : FontFlags.Nonsymbolic); + properties = { + type: type, + name: baseFontName, + widths: metrics.widths, + defaultWidth: metrics.defaultWidth, + flags: flags, + firstChar: 0, + lastChar: maxCharIndex + }; + return this.extractDataStructures(dict, dict, xref, properties).then(function (properties) { + properties.widths = this.buildCharCodeToWidth(metrics.widths, properties); + return new Font(baseFontName, null, properties); + }.bind(this)); + } + } + var firstChar = dict.get('FirstChar') || 0; + var lastChar = dict.get('LastChar') || maxCharIndex; + var fontName = descriptor.get('FontName'); + var baseFont = dict.get('BaseFont'); + if (isString(fontName)) { + fontName = Name.get(fontName); + } + if (isString(baseFont)) { + baseFont = Name.get(baseFont); + } + if (type !== 'Type3') { + var fontNameStr = fontName && fontName.name; + var baseFontStr = baseFont && baseFont.name; + if (fontNameStr !== baseFontStr) { + info('The FontDescriptor\'s FontName is "' + fontNameStr + '" but should be the same as the Font\'s BaseFont "' + baseFontStr + '"'); + if (fontNameStr && baseFontStr && baseFontStr.indexOf(fontNameStr) === 0) { + fontName = baseFont; + } + } + } + fontName = fontName || baseFont; + assert(isName(fontName), 'invalid font name'); + var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); + if (fontFile) { + if (fontFile.dict) { + var subtype = fontFile.dict.get('Subtype'); + if (subtype) { + subtype = subtype.name; + } + var length1 = fontFile.dict.get('Length1'); + var length2 = fontFile.dict.get('Length2'); + var length3 = fontFile.dict.get('Length3'); + } + } + properties = { + type: type, + name: fontName.name, + subtype: subtype, + file: fontFile, + length1: length1, + length2: length2, + length3: length3, + loadedName: baseDict.loadedName, + composite: composite, + wideChars: composite, + fixedPitch: false, + fontMatrix: dict.getArray('FontMatrix') || FONT_IDENTITY_MATRIX, + firstChar: firstChar || 0, + lastChar: lastChar || maxCharIndex, + bbox: descriptor.getArray('FontBBox'), + ascent: descriptor.get('Ascent'), + descent: descriptor.get('Descent'), + xHeight: descriptor.get('XHeight'), + capHeight: descriptor.get('CapHeight'), + flags: descriptor.get('Flags'), + italicAngle: descriptor.get('ItalicAngle'), + coded: false + }; + var cMapPromise; + if (composite) { + var cidEncoding = baseDict.get('Encoding'); + if (isName(cidEncoding)) { + properties.cidEncoding = cidEncoding.name; + } + cMapPromise = CMapFactory.create(cidEncoding, cMapOptions, null).then(function (cMap) { + properties.cMap = cMap; + properties.vertical = properties.cMap.vertical; + }); + } else { + cMapPromise = Promise.resolve(undefined); + } + return cMapPromise.then(function () { + return this.extractDataStructures(dict, baseDict, xref, properties); + }.bind(this)).then(function (properties) { + this.extractWidths(dict, xref, descriptor, properties); + if (type === 'Type3') { + properties.isType3Font = true; + } + return new Font(fontName.name, fontFile, properties); + }.bind(this)); + } + }; + return PartialEvaluator; + }(); + var TranslatedFont = function TranslatedFontClosure() { + function TranslatedFont(loadedName, font, dict) { + this.loadedName = loadedName; + this.font = font; + this.dict = dict; + this.type3Loaded = null; + this.sent = false; + } + TranslatedFont.prototype = { + send: function (handler) { + if (this.sent) { + return; + } + var fontData = this.font.exportData(); + handler.send('commonobj', [ + this.loadedName, + 'Font', + fontData + ]); + this.sent = true; + }, + loadType3Data: function (evaluator, resources, parentOperatorList, task) { + assert(this.font.isType3Font); + if (this.type3Loaded) { + return this.type3Loaded; + } + var translatedFont = this.font; + var loadCharProcsPromise = Promise.resolve(); + var charProcs = this.dict.get('CharProcs'); + var fontResources = this.dict.get('Resources') || resources; + var charProcKeys = charProcs.getKeys(); + var charProcOperatorList = Object.create(null); + for (var i = 0, n = charProcKeys.length; i < n; ++i) { + loadCharProcsPromise = loadCharProcsPromise.then(function (key) { + var glyphStream = charProcs.get(key); + var operatorList = new OperatorList(); + return evaluator.getOperatorList(glyphStream, task, fontResources, operatorList).then(function () { + charProcOperatorList[key] = operatorList.getIR(); + parentOperatorList.addDependencies(operatorList.dependencies); + }, function (reason) { + warn('Type3 font resource \"' + key + '\" is not available'); + var operatorList = new OperatorList(); + charProcOperatorList[key] = operatorList.getIR(); + }); + }.bind(this, charProcKeys[i])); + } + this.type3Loaded = loadCharProcsPromise.then(function () { + translatedFont.charProcOperatorList = charProcOperatorList; + }); + return this.type3Loaded; + } + }; + return TranslatedFont; + }(); + var OperatorList = function OperatorListClosure() { + var CHUNK_SIZE = 1000; + var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; + function getTransfers(queue) { + var transfers = []; + var fnArray = queue.fnArray, argsArray = queue.argsArray; + for (var i = 0, ii = queue.length; i < ii; i++) { + switch (fnArray[i]) { + case OPS.paintInlineImageXObject: + case OPS.paintInlineImageXObjectGroup: + case OPS.paintImageMaskXObject: + var arg = argsArray[i][0]; + if (!arg.cached) { + transfers.push(arg.data.buffer); + } + break; + } + } + return transfers; + } + function OperatorList(intent, messageHandler, pageIndex) { + this.messageHandler = messageHandler; + this.fnArray = []; + this.argsArray = []; + this.dependencies = Object.create(null); + this._totalLength = 0; + this.pageIndex = pageIndex; + this.intent = intent; + } + OperatorList.prototype = { + get length() { + return this.argsArray.length; + }, + get totalLength() { + return this._totalLength + this.length; + }, + addOp: function (fn, args) { + this.fnArray.push(fn); + this.argsArray.push(args); + if (this.messageHandler) { + if (this.fnArray.length >= CHUNK_SIZE) { + this.flush(); + } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && (fn === OPS.restore || fn === OPS.endText)) { + this.flush(); + } + } + }, + addDependency: function (dependency) { + if (dependency in this.dependencies) { + return; + } + this.dependencies[dependency] = true; + this.addOp(OPS.dependency, [dependency]); + }, + addDependencies: function (dependencies) { + for (var key in dependencies) { + this.addDependency(key); + } + }, + addOpList: function (opList) { + Util.extendObj(this.dependencies, opList.dependencies); + for (var i = 0, ii = opList.length; i < ii; i++) { + this.addOp(opList.fnArray[i], opList.argsArray[i]); + } + }, + getIR: function () { + return { + fnArray: this.fnArray, + argsArray: this.argsArray, + length: this.length + }; + }, + flush: function (lastChunk) { + if (this.intent !== 'oplist') { + new QueueOptimizer().optimize(this); + } + var transfers = getTransfers(this); + var length = this.length; + this._totalLength += length; + this.messageHandler.send('RenderPageChunk', { + operatorList: { + fnArray: this.fnArray, + argsArray: this.argsArray, + lastChunk: lastChunk, + length: length + }, + pageIndex: this.pageIndex, + intent: this.intent + }, transfers); + this.dependencies = Object.create(null); + this.fnArray.length = 0; + this.argsArray.length = 0; + } + }; + return OperatorList; + }(); + var StateManager = function StateManagerClosure() { + function StateManager(initialState) { + this.state = initialState; + this.stateStack = []; + } + StateManager.prototype = { + save: function () { + var old = this.state; + this.stateStack.push(this.state); + this.state = old.clone(); + }, + restore: function () { + var prev = this.stateStack.pop(); + if (prev) { + this.state = prev; + } + }, + transform: function (args) { + this.state.ctm = Util.transform(this.state.ctm, args); + } + }; + return StateManager; + }(); + var TextState = function TextStateClosure() { + function TextState() { + this.ctm = new Float32Array(IDENTITY_MATRIX); + this.fontName = null; + this.fontSize = 0; + this.font = null; + this.fontMatrix = FONT_IDENTITY_MATRIX; + this.textMatrix = IDENTITY_MATRIX.slice(); + this.textLineMatrix = IDENTITY_MATRIX.slice(); + this.charSpacing = 0; + this.wordSpacing = 0; + this.leading = 0; + this.textHScale = 1; + this.textRise = 0; + } + TextState.prototype = { + setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { + var m = this.textMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + }, + setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { + var m = this.textLineMatrix; + m[0] = a; + m[1] = b; + m[2] = c; + m[3] = d; + m[4] = e; + m[5] = f; + }, + translateTextMatrix: function TextState_translateTextMatrix(x, y) { + var m = this.textMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + }, + translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { + var m = this.textLineMatrix; + m[4] = m[0] * x + m[2] * y + m[4]; + m[5] = m[1] * x + m[3] * y + m[5]; + }, + calcTextLineMatrixAdvance: function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) { + var font = this.font; + if (!font) { + return null; + } + var m = this.textLineMatrix; + if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) { + return null; + } + var txDiff = e - m[4], tyDiff = f - m[5]; + if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) { + return null; + } + var tx, ty, denominator = a * d - b * c; + if (font.vertical) { + tx = -tyDiff * c / denominator; + ty = tyDiff * a / denominator; + } else { + tx = txDiff * d / denominator; + ty = -txDiff * b / denominator; + } + return { + width: tx, + height: ty, + value: font.vertical ? ty : tx + }; + }, + calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { + var tsm = [ + this.fontSize * this.textHScale, + 0, + 0, + this.fontSize, + 0, + this.textRise + ]; + return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); + }, + carriageReturn: function TextState_carriageReturn() { + this.translateTextLineMatrix(0, -this.leading); + this.textMatrix = this.textLineMatrix.slice(); + }, + clone: function TextState_clone() { + var clone = Object.create(this); + clone.textMatrix = this.textMatrix.slice(); + clone.textLineMatrix = this.textLineMatrix.slice(); + clone.fontMatrix = this.fontMatrix.slice(); + return clone; + } + }; + return TextState; + }(); + var EvalState = function EvalStateClosure() { + function EvalState() { + this.ctm = new Float32Array(IDENTITY_MATRIX); + this.font = null; + this.textRenderingMode = TextRenderingMode.FILL; + this.fillColorSpace = ColorSpace.singletons.gray; + this.strokeColorSpace = ColorSpace.singletons.gray; + } + EvalState.prototype = { + clone: function CanvasExtraState_clone() { + return Object.create(this); + } + }; + return EvalState; + }(); + var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() { + var getOPMap = getLookupTableFactory(function (t) { + t['w'] = { + id: OPS.setLineWidth, + numArgs: 1, + variableArgs: false + }; + t['J'] = { + id: OPS.setLineCap, + numArgs: 1, + variableArgs: false + }; + t['j'] = { + id: OPS.setLineJoin, + numArgs: 1, + variableArgs: false + }; + t['M'] = { + id: OPS.setMiterLimit, + numArgs: 1, + variableArgs: false + }; + t['d'] = { + id: OPS.setDash, + numArgs: 2, + variableArgs: false + }; + t['ri'] = { + id: OPS.setRenderingIntent, + numArgs: 1, + variableArgs: false + }; + t['i'] = { + id: OPS.setFlatness, + numArgs: 1, + variableArgs: false + }; + t['gs'] = { + id: OPS.setGState, + numArgs: 1, + variableArgs: false + }; + t['q'] = { + id: OPS.save, + numArgs: 0, + variableArgs: false + }; + t['Q'] = { + id: OPS.restore, + numArgs: 0, + variableArgs: false + }; + t['cm'] = { + id: OPS.transform, + numArgs: 6, + variableArgs: false + }; + t['m'] = { + id: OPS.moveTo, + numArgs: 2, + variableArgs: false + }; + t['l'] = { + id: OPS.lineTo, + numArgs: 2, + variableArgs: false + }; + t['c'] = { + id: OPS.curveTo, + numArgs: 6, + variableArgs: false + }; + t['v'] = { + id: OPS.curveTo2, + numArgs: 4, + variableArgs: false + }; + t['y'] = { + id: OPS.curveTo3, + numArgs: 4, + variableArgs: false + }; + t['h'] = { + id: OPS.closePath, + numArgs: 0, + variableArgs: false + }; + t['re'] = { + id: OPS.rectangle, + numArgs: 4, + variableArgs: false + }; + t['S'] = { + id: OPS.stroke, + numArgs: 0, + variableArgs: false + }; + t['s'] = { + id: OPS.closeStroke, + numArgs: 0, + variableArgs: false + }; + t['f'] = { + id: OPS.fill, + numArgs: 0, + variableArgs: false + }; + t['F'] = { + id: OPS.fill, + numArgs: 0, + variableArgs: false + }; + t['f*'] = { + id: OPS.eoFill, + numArgs: 0, + variableArgs: false + }; + t['B'] = { + id: OPS.fillStroke, + numArgs: 0, + variableArgs: false + }; + t['B*'] = { + id: OPS.eoFillStroke, + numArgs: 0, + variableArgs: false + }; + t['b'] = { + id: OPS.closeFillStroke, + numArgs: 0, + variableArgs: false + }; + t['b*'] = { + id: OPS.closeEOFillStroke, + numArgs: 0, + variableArgs: false + }; + t['n'] = { + id: OPS.endPath, + numArgs: 0, + variableArgs: false + }; + t['W'] = { + id: OPS.clip, + numArgs: 0, + variableArgs: false + }; + t['W*'] = { + id: OPS.eoClip, + numArgs: 0, + variableArgs: false + }; + t['BT'] = { + id: OPS.beginText, + numArgs: 0, + variableArgs: false + }; + t['ET'] = { + id: OPS.endText, + numArgs: 0, + variableArgs: false + }; + t['Tc'] = { + id: OPS.setCharSpacing, + numArgs: 1, + variableArgs: false + }; + t['Tw'] = { + id: OPS.setWordSpacing, + numArgs: 1, + variableArgs: false + }; + t['Tz'] = { + id: OPS.setHScale, + numArgs: 1, + variableArgs: false + }; + t['TL'] = { + id: OPS.setLeading, + numArgs: 1, + variableArgs: false + }; + t['Tf'] = { + id: OPS.setFont, + numArgs: 2, + variableArgs: false + }; + t['Tr'] = { + id: OPS.setTextRenderingMode, + numArgs: 1, + variableArgs: false + }; + t['Ts'] = { + id: OPS.setTextRise, + numArgs: 1, + variableArgs: false + }; + t['Td'] = { + id: OPS.moveText, + numArgs: 2, + variableArgs: false + }; + t['TD'] = { + id: OPS.setLeadingMoveText, + numArgs: 2, + variableArgs: false + }; + t['Tm'] = { + id: OPS.setTextMatrix, + numArgs: 6, + variableArgs: false + }; + t['T*'] = { + id: OPS.nextLine, + numArgs: 0, + variableArgs: false + }; + t['Tj'] = { + id: OPS.showText, + numArgs: 1, + variableArgs: false + }; + t['TJ'] = { + id: OPS.showSpacedText, + numArgs: 1, + variableArgs: false + }; + t['\''] = { + id: OPS.nextLineShowText, + numArgs: 1, + variableArgs: false + }; + t['"'] = { + id: OPS.nextLineSetSpacingShowText, + numArgs: 3, + variableArgs: false + }; + t['d0'] = { + id: OPS.setCharWidth, + numArgs: 2, + variableArgs: false + }; + t['d1'] = { + id: OPS.setCharWidthAndBounds, + numArgs: 6, + variableArgs: false + }; + t['CS'] = { + id: OPS.setStrokeColorSpace, + numArgs: 1, + variableArgs: false + }; + t['cs'] = { + id: OPS.setFillColorSpace, + numArgs: 1, + variableArgs: false + }; + t['SC'] = { + id: OPS.setStrokeColor, + numArgs: 4, + variableArgs: true + }; + t['SCN'] = { + id: OPS.setStrokeColorN, + numArgs: 33, + variableArgs: true + }; + t['sc'] = { + id: OPS.setFillColor, + numArgs: 4, + variableArgs: true + }; + t['scn'] = { + id: OPS.setFillColorN, + numArgs: 33, + variableArgs: true + }; + t['G'] = { + id: OPS.setStrokeGray, + numArgs: 1, + variableArgs: false + }; + t['g'] = { + id: OPS.setFillGray, + numArgs: 1, + variableArgs: false + }; + t['RG'] = { + id: OPS.setStrokeRGBColor, + numArgs: 3, + variableArgs: false + }; + t['rg'] = { + id: OPS.setFillRGBColor, + numArgs: 3, + variableArgs: false + }; + t['K'] = { + id: OPS.setStrokeCMYKColor, + numArgs: 4, + variableArgs: false + }; + t['k'] = { + id: OPS.setFillCMYKColor, + numArgs: 4, + variableArgs: false + }; + t['sh'] = { + id: OPS.shadingFill, + numArgs: 1, + variableArgs: false + }; + t['BI'] = { + id: OPS.beginInlineImage, + numArgs: 0, + variableArgs: false + }; + t['ID'] = { + id: OPS.beginImageData, + numArgs: 0, + variableArgs: false + }; + t['EI'] = { + id: OPS.endInlineImage, + numArgs: 1, + variableArgs: false + }; + t['Do'] = { + id: OPS.paintXObject, + numArgs: 1, + variableArgs: false + }; + t['MP'] = { + id: OPS.markPoint, + numArgs: 1, + variableArgs: false + }; + t['DP'] = { + id: OPS.markPointProps, + numArgs: 2, + variableArgs: false + }; + t['BMC'] = { + id: OPS.beginMarkedContent, + numArgs: 1, + variableArgs: false + }; + t['BDC'] = { + id: OPS.beginMarkedContentProps, + numArgs: 2, + variableArgs: false + }; + t['EMC'] = { + id: OPS.endMarkedContent, + numArgs: 0, + variableArgs: false + }; + t['BX'] = { + id: OPS.beginCompat, + numArgs: 0, + variableArgs: false + }; + t['EX'] = { + id: OPS.endCompat, + numArgs: 0, + variableArgs: false + }; + t['BM'] = null; + t['BD'] = null; + t['true'] = null; + t['fa'] = null; + t['fal'] = null; + t['fals'] = null; + t['false'] = null; + t['nu'] = null; + t['nul'] = null; + t['null'] = null; + }); + function EvaluatorPreprocessor(stream, xref, stateManager) { + this.opMap = getOPMap(); + this.parser = new Parser(new Lexer(stream, this.opMap), false, xref); + this.stateManager = stateManager; + this.nonProcessedArgs = []; + } + EvaluatorPreprocessor.prototype = { + get savedStatesDepth() { + return this.stateManager.stateStack.length; + }, + read: function EvaluatorPreprocessor_read(operation) { + var args = operation.args; + while (true) { + var obj = this.parser.getObj(); + if (isCmd(obj)) { + var cmd = obj.cmd; + var opSpec = this.opMap[cmd]; + if (!opSpec) { + warn('Unknown command "' + cmd + '"'); + continue; + } + var fn = opSpec.id; + var numArgs = opSpec.numArgs; + var argsLength = args !== null ? args.length : 0; + if (!opSpec.variableArgs) { + if (argsLength !== numArgs) { + var nonProcessedArgs = this.nonProcessedArgs; + while (argsLength > numArgs) { + nonProcessedArgs.push(args.shift()); + argsLength--; + } + while (argsLength < numArgs && nonProcessedArgs.length !== 0) { + if (args === null) { + args = []; + } + args.unshift(nonProcessedArgs.pop()); + argsLength++; + } + } + if (argsLength < numArgs) { + warn('Skipping command ' + fn + ': expected ' + numArgs + ' args, but received ' + argsLength + ' args.'); + if (args !== null) { + args.length = 0; + } + continue; + } + } else if (argsLength > numArgs) { + info('Command ' + fn + ': expected [0,' + numArgs + '] args, but received ' + argsLength + ' args.'); + } + this.preprocessCommand(fn, args); + operation.fn = fn; + operation.args = args; + return true; + } + if (isEOF(obj)) { + return false; + } + if (obj !== null) { + if (args === null) { + args = []; + } + args.push(obj); + assert(args.length <= 33, 'Too many arguments'); + } + } + }, + preprocessCommand: function EvaluatorPreprocessor_preprocessCommand(fn, args) { + switch (fn | 0) { + case OPS.save: + this.stateManager.save(); + break; + case OPS.restore: + this.stateManager.restore(); + break; + case OPS.transform: + this.stateManager.transform(args); + break; + } + } + }; + return EvaluatorPreprocessor; + }(); + var QueueOptimizer = function QueueOptimizerClosure() { + function addState(parentState, pattern, fn) { + var state = parentState; + for (var i = 0, ii = pattern.length - 1; i < ii; i++) { + var item = pattern[i]; + state = state[item] || (state[item] = []); + } + state[pattern[pattern.length - 1]] = fn; + } + function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) { + var iFirstPIMXO = iFirstSave + 2; + for (var i = 0; i < count; i++) { + var arg = argsArray[iFirstPIMXO + 4 * i]; + var imageMask = arg.length === 1 && arg[0]; + if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || imageMask.data.length === 1 && imageMask.data[0] === 0)) { + fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; + continue; + } + break; + } + return count - i; + } + var InitialState = []; + addState(InitialState, [ + OPS.save, + OPS.transform, + OPS.paintInlineImageXObject, + OPS.restore + ], function foundInlineImageGroup(context) { + var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; + var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; + var MAX_WIDTH = 1000; + var IMAGE_PADDING = 1; + var fnArray = context.fnArray, argsArray = context.argsArray; + var curr = context.iCurr; + var iFirstSave = curr - 3; + var iFirstTransform = curr - 2; + var iFirstPIIXO = curr - 1; + var i = iFirstSave + 4; + var ii = fnArray.length; + while (i + 3 < ii) { + if (fnArray[i] !== OPS.save || fnArray[i + 1] !== OPS.transform || fnArray[i + 2] !== OPS.paintInlineImageXObject || fnArray[i + 3] !== OPS.restore) { + break; + } + i += 4; + } + var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); + if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { + return i; + } + var maxX = 0; + var map = [], maxLineHeight = 0; + var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; + var q; + for (q = 0; q < count; q++) { + var transform = argsArray[iFirstTransform + (q << 2)]; + var img = argsArray[iFirstPIIXO + (q << 2)][0]; + if (currentX + img.width > MAX_WIDTH) { + maxX = Math.max(maxX, currentX); + currentY += maxLineHeight + 2 * IMAGE_PADDING; + currentX = 0; + maxLineHeight = 0; + } + map.push({ + transform: transform, + x: currentX, + y: currentY, + w: img.width, + h: img.height + }); + currentX += img.width + 2 * IMAGE_PADDING; + maxLineHeight = Math.max(maxLineHeight, img.height); + } + var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; + var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; + var imgData = new Uint8Array(imgWidth * imgHeight * 4); + var imgRowSize = imgWidth << 2; + for (q = 0; q < count; q++) { + var data = argsArray[iFirstPIIXO + (q << 2)][0].data; + var rowSize = map[q].w << 2; + var dataOffset = 0; + var offset = map[q].x + map[q].y * imgWidth << 2; + imgData.set(data.subarray(0, rowSize), offset - imgRowSize); + for (var k = 0, kk = map[q].h; k < kk; k++) { + imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); + dataOffset += rowSize; + offset += imgRowSize; + } + imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); + while (offset >= 0) { + data[offset - 4] = data[offset]; + data[offset - 3] = data[offset + 1]; + data[offset - 2] = data[offset + 2]; + data[offset - 1] = data[offset + 3]; + data[offset + rowSize] = data[offset + rowSize - 4]; + data[offset + rowSize + 1] = data[offset + rowSize - 3]; + data[offset + rowSize + 2] = data[offset + rowSize - 2]; + data[offset + rowSize + 3] = data[offset + rowSize - 1]; + offset -= imgRowSize; + } + } + fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [ + { + width: imgWidth, + height: imgHeight, + kind: ImageKind.RGBA_32BPP, + data: imgData + }, + map + ]); + return iFirstSave + 1; + }); + addState(InitialState, [ + OPS.save, + OPS.transform, + OPS.paintImageMaskXObject, + OPS.restore + ], function foundImageMaskGroup(context) { + var MIN_IMAGES_IN_MASKS_BLOCK = 10; + var MAX_IMAGES_IN_MASKS_BLOCK = 100; + var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; + var fnArray = context.fnArray, argsArray = context.argsArray; + var curr = context.iCurr; + var iFirstSave = curr - 3; + var iFirstTransform = curr - 2; + var iFirstPIMXO = curr - 1; + var i = iFirstSave + 4; + var ii = fnArray.length; + while (i + 3 < ii) { + if (fnArray[i] !== OPS.save || fnArray[i + 1] !== OPS.transform || fnArray[i + 2] !== OPS.paintImageMaskXObject || fnArray[i + 3] !== OPS.restore) { + break; + } + i += 4; + } + var count = (i - iFirstSave) / 4; + count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray); + if (count < MIN_IMAGES_IN_MASKS_BLOCK) { + return i; + } + var q; + var isSameImage = false; + var iTransform, transformArgs; + var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; + if (argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0) { + isSameImage = true; + var firstTransformArg0 = argsArray[iFirstTransform][0]; + var firstTransformArg3 = argsArray[iFirstTransform][3]; + iTransform = iFirstTransform + 4; + var iPIMXO = iFirstPIMXO + 4; + for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { + transformArgs = argsArray[iTransform]; + if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== 0 || transformArgs[2] !== 0 || transformArgs[3] !== firstTransformArg3) { + if (q < MIN_IMAGES_IN_MASKS_BLOCK) { + isSameImage = false; + } else { + count = q; + } + break; + } + } + } + if (isSameImage) { + count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); + var positions = new Float32Array(count * 2); + iTransform = iFirstTransform; + for (q = 0; q < count; q++, iTransform += 4) { + transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, [ + firstPIMXOArg0, + firstTransformArg0, + firstTransformArg3, + positions + ]); + } else { + count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); + var images = []; + for (q = 0; q < count; q++) { + transformArgs = argsArray[iFirstTransform + (q << 2)]; + var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; + images.push({ + data: maskParams.data, + width: maskParams.width, + height: maskParams.height, + transform: transformArgs + }); + } + fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); + argsArray.splice(iFirstSave, count * 4, [images]); + } + return iFirstSave + 1; + }); + addState(InitialState, [ + OPS.save, + OPS.transform, + OPS.paintImageXObject, + OPS.restore + ], function (context) { + var MIN_IMAGES_IN_BLOCK = 3; + var MAX_IMAGES_IN_BLOCK = 1000; + var fnArray = context.fnArray, argsArray = context.argsArray; + var curr = context.iCurr; + var iFirstSave = curr - 3; + var iFirstTransform = curr - 2; + var iFirstPIXO = curr - 1; + var iFirstRestore = curr; + if (argsArray[iFirstTransform][1] !== 0 || argsArray[iFirstTransform][2] !== 0) { + return iFirstRestore + 1; + } + var firstPIXOArg0 = argsArray[iFirstPIXO][0]; + var firstTransformArg0 = argsArray[iFirstTransform][0]; + var firstTransformArg3 = argsArray[iFirstTransform][3]; + var i = iFirstSave + 4; + var ii = fnArray.length; + while (i + 3 < ii) { + if (fnArray[i] !== OPS.save || fnArray[i + 1] !== OPS.transform || fnArray[i + 2] !== OPS.paintImageXObject || fnArray[i + 3] !== OPS.restore) { + break; + } + if (argsArray[i + 1][0] !== firstTransformArg0 || argsArray[i + 1][1] !== 0 || argsArray[i + 1][2] !== 0 || argsArray[i + 1][3] !== firstTransformArg3) { + break; + } + if (argsArray[i + 2][0] !== firstPIXOArg0) { + break; + } + i += 4; + } + var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); + if (count < MIN_IMAGES_IN_BLOCK) { + return i; + } + var positions = new Float32Array(count * 2); + var iTransform = iFirstTransform; + for (var q = 0; q < count; q++, iTransform += 4) { + var transformArgs = argsArray[iTransform]; + positions[q << 1] = transformArgs[4]; + positions[(q << 1) + 1] = transformArgs[5]; + } + var args = [ + firstPIXOArg0, + firstTransformArg0, + firstTransformArg3, + positions + ]; + fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); + argsArray.splice(iFirstSave, count * 4, args); + return iFirstSave + 1; + }); + addState(InitialState, [ + OPS.beginText, + OPS.setFont, + OPS.setTextMatrix, + OPS.showText, + OPS.endText + ], function (context) { + var MIN_CHARS_IN_BLOCK = 3; + var MAX_CHARS_IN_BLOCK = 1000; + var fnArray = context.fnArray, argsArray = context.argsArray; + var curr = context.iCurr; + var iFirstBeginText = curr - 4; + var iFirstSetFont = curr - 3; + var iFirstSetTextMatrix = curr - 2; + var iFirstShowText = curr - 1; + var iFirstEndText = curr; + var firstSetFontArg0 = argsArray[iFirstSetFont][0]; + var firstSetFontArg1 = argsArray[iFirstSetFont][1]; + var i = iFirstBeginText + 5; + var ii = fnArray.length; + while (i + 4 < ii) { + if (fnArray[i] !== OPS.beginText || fnArray[i + 1] !== OPS.setFont || fnArray[i + 2] !== OPS.setTextMatrix || fnArray[i + 3] !== OPS.showText || fnArray[i + 4] !== OPS.endText) { + break; + } + if (argsArray[i + 1][0] !== firstSetFontArg0 || argsArray[i + 1][1] !== firstSetFontArg1) { + break; + } + i += 5; + } + var count = Math.min((i - iFirstBeginText) / 5, MAX_CHARS_IN_BLOCK); + if (count < MIN_CHARS_IN_BLOCK) { + return i; + } + var iFirst = iFirstBeginText; + if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { + count++; + iFirst -= 5; + } + var iEndText = iFirst + 4; + for (var q = 1; q < count; q++) { + fnArray.splice(iEndText, 3); + argsArray.splice(iEndText, 3); + iEndText += 2; + } + return iEndText + 1; + }); + function QueueOptimizer() { + } + QueueOptimizer.prototype = { + optimize: function QueueOptimizer_optimize(queue) { + var fnArray = queue.fnArray, argsArray = queue.argsArray; + var context = { + iCurr: 0, + fnArray: fnArray, + argsArray: argsArray + }; + var state; + var i = 0, ii = fnArray.length; + while (i < ii) { + state = (state || InitialState)[fnArray[i]]; + if (typeof state === 'function') { + context.iCurr = i; + i = state(context); + state = undefined; + ii = context.fnArray.length; + } else { + i++; + } + } + } + }; + return QueueOptimizer; + }(); + exports.OperatorList = OperatorList; + exports.PartialEvaluator = PartialEvaluator; + })); + (function (root, factory) { + factory(root.pdfjsCoreAnnotation = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreColorSpace, root.pdfjsCoreObj, root.pdfjsCoreEvaluator); + }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreColorSpace, coreObj, coreEvaluator) { + var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; + var AnnotationFieldFlag = sharedUtil.AnnotationFieldFlag; + var AnnotationFlag = sharedUtil.AnnotationFlag; + var AnnotationType = sharedUtil.AnnotationType; + var OPS = sharedUtil.OPS; + var Util = sharedUtil.Util; + var isString = sharedUtil.isString; + var isArray = sharedUtil.isArray; + var isInt = sharedUtil.isInt; + var stringToBytes = sharedUtil.stringToBytes; + var stringToPDFString = sharedUtil.stringToPDFString; + var warn = sharedUtil.warn; + var Dict = corePrimitives.Dict; + var isDict = corePrimitives.isDict; + var isName = corePrimitives.isName; + var isRef = corePrimitives.isRef; + var Stream = coreStream.Stream; + var ColorSpace = coreColorSpace.ColorSpace; + var Catalog = coreObj.Catalog; + var ObjectLoader = coreObj.ObjectLoader; + var FileSpec = coreObj.FileSpec; + var OperatorList = coreEvaluator.OperatorList; + function AnnotationFactory() { + } + AnnotationFactory.prototype = { + create: function AnnotationFactory_create(xref, ref, pdfManager, idFactory) { + var dict = xref.fetchIfRef(ref); + if (!isDict(dict)) { + return; + } + var id = isRef(ref) ? ref.toString() : 'annot_' + idFactory.createObjId(); + var subtype = dict.get('Subtype'); + subtype = isName(subtype) ? subtype.name : null; + var parameters = { + xref: xref, + dict: dict, + ref: isRef(ref) ? ref : null, + subtype: subtype, + id: id, + pdfManager: pdfManager + }; + switch (subtype) { + case 'Link': + return new LinkAnnotation(parameters); + case 'Text': + return new TextAnnotation(parameters); + case 'Widget': + var fieldType = Util.getInheritableProperty(dict, 'FT'); + fieldType = isName(fieldType) ? fieldType.name : null; + switch (fieldType) { + case 'Tx': + return new TextWidgetAnnotation(parameters); + case 'Btn': + return new ButtonWidgetAnnotation(parameters); + case 'Ch': + return new ChoiceWidgetAnnotation(parameters); + } + warn('Unimplemented widget field type "' + fieldType + '", ' + 'falling back to base field type.'); + return new WidgetAnnotation(parameters); + case 'Popup': + return new PopupAnnotation(parameters); + case 'Highlight': + return new HighlightAnnotation(parameters); + case 'Underline': + return new UnderlineAnnotation(parameters); + case 'Squiggly': + return new SquigglyAnnotation(parameters); + case 'StrikeOut': + return new StrikeOutAnnotation(parameters); + case 'FileAttachment': + return new FileAttachmentAnnotation(parameters); + default: + if (!subtype) { + warn('Annotation is missing the required /Subtype.'); + } else { + warn('Unimplemented annotation type "' + subtype + '", ' + 'falling back to base annotation.'); + } + return new Annotation(parameters); + } + } + }; + var Annotation = function AnnotationClosure() { + 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) { + 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); + } + } else { + appearance = appearances; + } + return appearance; + } + function Annotation(params) { + var dict = params.dict; + this.setFlags(dict.get('F')); + this.setRectangle(dict.getArray('Rect')); + this.setColor(dict.getArray('C')); + this.setBorderStyle(dict); + this.appearance = getDefaultAppearance(dict); + this.data = {}; + this.data.id = params.id; + this.data.subtype = params.subtype; + this.data.annotationFlags = this.flags; + this.data.rect = this.rectangle; + this.data.color = this.color; + this.data.borderStyle = this.borderStyle; + this.data.hasAppearance = !!this.appearance; + } + Annotation.prototype = { + _hasFlag: function Annotation_hasFlag(flags, flag) { + return !!(flags & flag); + }, + _isViewable: function Annotation_isViewable(flags) { + return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.HIDDEN) && !this._hasFlag(flags, AnnotationFlag.NOVIEW); + }, + _isPrintable: function AnnotationFlag_isPrintable(flags) { + return this._hasFlag(flags, AnnotationFlag.PRINT) && !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, AnnotationFlag.HIDDEN); + }, + get viewable() { + if (this.flags === 0) { + return true; + } + return this._isViewable(this.flags); + }, + get printable() { + if (this.flags === 0) { + return false; + } + return this._isPrintable(this.flags); + }, + setFlags: function Annotation_setFlags(flags) { + this.flags = isInt(flags) && flags > 0 ? flags : 0; + }, + hasFlag: function Annotation_hasFlag(flag) { + return this._hasFlag(this.flags, flag); + }, + setRectangle: function Annotation_setRectangle(rectangle) { + if (isArray(rectangle) && rectangle.length === 4) { + this.rectangle = Util.normalizeRect(rectangle); + } else { + this.rectangle = [ + 0, + 0, + 0, + 0 + ]; + } + }, + setColor: function Annotation_setColor(color) { + var rgbColor = new Uint8Array(3); + if (!isArray(color)) { + this.color = rgbColor; + return; + } + switch (color.length) { + case 0: + this.color = null; + break; + case 1: + ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); + this.color = rgbColor; + break; + case 3: + ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); + this.color = rgbColor; + break; + case 4: + ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); + this.color = rgbColor; + break; + default: + this.color = rgbColor; + break; + } + }, + setBorderStyle: function Annotation_setBorderStyle(borderStyle) { + this.borderStyle = new AnnotationBorderStyle(); + if (!isDict(borderStyle)) { + return; + } + if (borderStyle.has('BS')) { + var dict = borderStyle.get('BS'); + var dictType = dict.get('Type'); + if (!dictType || isName(dictType, 'Border')) { + this.borderStyle.setWidth(dict.get('W')); + this.borderStyle.setStyle(dict.get('S')); + this.borderStyle.setDashArray(dict.getArray('D')); + } + } else if (borderStyle.has('Border')) { + var array = borderStyle.getArray('Border'); + if (isArray(array) && array.length >= 3) { + this.borderStyle.setHorizontalCornerRadius(array[0]); + this.borderStyle.setVerticalCornerRadius(array[1]); + this.borderStyle.setWidth(array[2]); + if (array.length === 4) { + this.borderStyle.setDashArray(array[3]); + } + } + } else { + this.borderStyle.setWidth(0); + } + }, + _preparePopup: function Annotation_preparePopup(dict) { + if (!dict.has('C')) { + this.data.color = null; + } + this.data.hasPopup = dict.has('Popup'); + this.data.title = stringToPDFString(dict.get('T') || ''); + this.data.contents = stringToPDFString(dict.get('Contents') || ''); + }, + loadResources: function Annotation_loadResources(keys) { + return new Promise(function (resolve, reject) { + this.appearance.dict.getAsync('Resources').then(function (resources) { + if (!resources) { + resolve(); + return; + } + var objectLoader = new ObjectLoader(resources.map, keys, resources.xref); + objectLoader.load().then(function () { + resolve(resources); + }, reject); + }, reject); + }.bind(this)); + }, + getOperatorList: function Annotation_getOperatorList(evaluator, task, renderForms) { + if (!this.appearance) { + return Promise.resolve(new OperatorList()); + } + var data = this.data; + var appearanceDict = this.appearance.dict; + var resourcesPromise = this.loadResources([ + 'ExtGState', + 'ColorSpace', + 'Pattern', + 'Shading', + 'XObject', + 'Font' + ]); + var bbox = appearanceDict.getArray('BBox') || [ + 0, + 0, + 1, + 1 + ]; + var matrix = appearanceDict.getArray('Matrix') || [ + 1, + 0, + 0, + 1, + 0, + 0 + ]; + var transform = getTransformMatrix(data.rect, bbox, matrix); + var self = this; + return resourcesPromise.then(function (resources) { + var opList = new OperatorList(); + opList.addOp(OPS.beginAnnotation, [ + data.rect, + transform, + matrix + ]); + return evaluator.getOperatorList(self.appearance, task, resources, opList).then(function () { + opList.addOp(OPS.endAnnotation, []); + self.appearance.reset(); + return opList; + }); + }); + } + }; + Annotation.appendToOperatorList = function Annotation_appendToOperatorList(annotations, opList, partialEvaluator, task, intent, renderForms) { + var annotationPromises = []; + for (var i = 0, n = annotations.length; i < n; ++i) { + if (intent === 'display' && annotations[i].viewable || intent === 'print' && annotations[i].printable) { + annotationPromises.push(annotations[i].getOperatorList(partialEvaluator, task, renderForms)); + } + } + return Promise.all(annotationPromises).then(function (operatorLists) { + opList.addOp(OPS.beginAnnotations, []); + for (var i = 0, n = operatorLists.length; i < n; ++i) { + opList.addOpList(operatorLists[i]); + } + opList.addOp(OPS.endAnnotations, []); + }); + }; + return Annotation; + }(); + var AnnotationBorderStyle = function AnnotationBorderStyleClosure() { + function AnnotationBorderStyle() { + this.width = 1; + this.style = AnnotationBorderStyleType.SOLID; + this.dashArray = [3]; + this.horizontalCornerRadius = 0; + this.verticalCornerRadius = 0; + } + AnnotationBorderStyle.prototype = { + setWidth: function AnnotationBorderStyle_setWidth(width) { + if (width === (width | 0)) { + this.width = width; + } + }, + setStyle: function AnnotationBorderStyle_setStyle(style) { + if (!style) { + return; + } + switch (style.name) { + case 'S': + this.style = AnnotationBorderStyleType.SOLID; + break; + case 'D': + this.style = AnnotationBorderStyleType.DASHED; + break; + case 'B': + this.style = AnnotationBorderStyleType.BEVELED; + break; + case 'I': + this.style = AnnotationBorderStyleType.INSET; + break; + case 'U': + this.style = AnnotationBorderStyleType.UNDERLINE; + break; + default: + break; + } + }, + setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { + if (isArray(dashArray) && dashArray.length > 0) { + var isValid = true; + var allZeros = true; + for (var i = 0, len = dashArray.length; i < len; i++) { + var element = dashArray[i]; + var validNumber = +element >= 0; + if (!validNumber) { + isValid = false; + break; + } else if (element > 0) { + allZeros = false; + } + } + if (isValid && !allZeros) { + this.dashArray = dashArray; + } else { + this.width = 0; + } + } else if (dashArray) { + this.width = 0; + } + }, + setHorizontalCornerRadius: function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { + if (radius === (radius | 0)) { + this.horizontalCornerRadius = radius; + } + }, + setVerticalCornerRadius: function AnnotationBorderStyle_setVerticalCornerRadius(radius) { + if (radius === (radius | 0)) { + this.verticalCornerRadius = radius; + } + } + }; + return AnnotationBorderStyle; + }(); + var WidgetAnnotation = function WidgetAnnotationClosure() { + function WidgetAnnotation(params) { + Annotation.call(this, params); + var dict = params.dict; + var data = this.data; + data.annotationType = AnnotationType.WIDGET; + data.fieldName = this._constructFieldName(dict); + data.fieldValue = Util.getInheritableProperty(dict, 'V', true); + data.alternativeText = stringToPDFString(dict.get('TU') || ''); + data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || ''; + var fieldType = Util.getInheritableProperty(dict, 'FT'); + data.fieldType = isName(fieldType) ? fieldType.name : null; + this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; + data.fieldFlags = Util.getInheritableProperty(dict, 'Ff'); + if (!isInt(data.fieldFlags) || data.fieldFlags < 0) { + data.fieldFlags = 0; + } + data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); + if (data.fieldType === 'Sig') { + this.setFlags(AnnotationFlag.HIDDEN); + } + } + Util.inherit(WidgetAnnotation, Annotation, { + _constructFieldName: function WidgetAnnotation_constructFieldName(dict) { + if (!dict.has('T') && !dict.has('Parent')) { + warn('Unknown field name, falling back to empty field name.'); + return ''; + } + if (!dict.has('Parent')) { + return stringToPDFString(dict.get('T')); + } + var fieldName = []; + if (dict.has('T')) { + fieldName.unshift(stringToPDFString(dict.get('T'))); + } + var loopDict = dict; + while (loopDict.has('Parent')) { + loopDict = loopDict.get('Parent'); + if (loopDict.has('T')) { + fieldName.unshift(stringToPDFString(loopDict.get('T'))); + } + } + return fieldName.join('.'); + }, + hasFieldFlag: function WidgetAnnotation_hasFieldFlag(flag) { + return !!(this.data.fieldFlags & flag); + } + }); + return WidgetAnnotation; + }(); + var TextWidgetAnnotation = function TextWidgetAnnotationClosure() { + function TextWidgetAnnotation(params) { + WidgetAnnotation.call(this, params); + this.data.fieldValue = stringToPDFString(this.data.fieldValue || ''); + var alignment = Util.getInheritableProperty(params.dict, 'Q'); + if (!isInt(alignment) || alignment < 0 || alignment > 2) { + alignment = null; + } + this.data.textAlignment = alignment; + var maximumLength = Util.getInheritableProperty(params.dict, 'MaxLen'); + if (!isInt(maximumLength) || maximumLength < 0) { + maximumLength = null; + } + this.data.maxLen = maximumLength; + this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); + this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && this.data.maxLen !== null; + } + Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { + getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, task, renderForms) { + var operatorList = new OperatorList(); + if (renderForms) { + return Promise.resolve(operatorList); + } + if (this.appearance) { + return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms); + } + if (!this.data.defaultAppearance) { + return Promise.resolve(operatorList); + } + var stream = new Stream(stringToBytes(this.data.defaultAppearance)); + return evaluator.getOperatorList(stream, task, this.fieldResources, operatorList).then(function () { + return operatorList; + }); + } + }); + return TextWidgetAnnotation; + }(); + var ButtonWidgetAnnotation = function ButtonWidgetAnnotationClosure() { + function ButtonWidgetAnnotation(params) { + WidgetAnnotation.call(this, params); + this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + if (this.data.checkBox) { + if (!isName(this.data.fieldValue)) { + return; + } + this.data.fieldValue = this.data.fieldValue.name; + } + this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + if (this.data.radioButton) { + this.data.fieldValue = this.data.buttonValue = null; + var fieldParent = params.dict.get('Parent'); + if (!isDict(fieldParent) || !fieldParent.has('V')) { + return; + } + var fieldParentValue = fieldParent.get('V'); + if (!isName(fieldParentValue)) { + return; + } + this.data.fieldValue = fieldParentValue.name; + var appearanceStates = params.dict.get('AP'); + if (!isDict(appearanceStates)) { + return; + } + var normalAppearanceState = appearanceStates.get('N'); + if (!isDict(normalAppearanceState)) { + return; + } + var keys = normalAppearanceState.getKeys(); + for (var i = 0, ii = keys.length; i < ii; i++) { + if (keys[i] !== 'Off') { + this.data.buttonValue = keys[i]; + break; + } + } + } + } + Util.inherit(ButtonWidgetAnnotation, WidgetAnnotation, { + getOperatorList: function ButtonWidgetAnnotation_getOperatorList(evaluator, task, renderForms) { + var operatorList = new OperatorList(); + if (renderForms) { + return Promise.resolve(operatorList); + } + if (this.appearance) { + return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms); + } + return Promise.resolve(operatorList); + } + }); + return ButtonWidgetAnnotation; + }(); + var ChoiceWidgetAnnotation = function ChoiceWidgetAnnotationClosure() { + function ChoiceWidgetAnnotation(params) { + WidgetAnnotation.call(this, params); + this.data.options = []; + var options = params.dict.get('Opt'); + if (isArray(options)) { + var xref = params.xref; + for (var i = 0, ii = options.length; i < ii; i++) { + var option = xref.fetchIfRef(options[i]); + var isOptionArray = isArray(option); + this.data.options[i] = { + exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option, + displayValue: isOptionArray ? xref.fetchIfRef(option[1]) : option + }; + } + } + if (!isArray(this.data.fieldValue)) { + this.data.fieldValue = [this.data.fieldValue]; + } + this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO); + this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT); + } + Util.inherit(ChoiceWidgetAnnotation, WidgetAnnotation, { + getOperatorList: function ChoiceWidgetAnnotation_getOperatorList(evaluator, task, renderForms) { + var operatorList = new OperatorList(); + if (renderForms) { + return Promise.resolve(operatorList); + } + return Annotation.prototype.getOperatorList.call(this, evaluator, task, renderForms); + } + }); + return ChoiceWidgetAnnotation; + }(); + var TextAnnotation = function TextAnnotationClosure() { + var DEFAULT_ICON_SIZE = 22; + function TextAnnotation(parameters) { + Annotation.call(this, parameters); + this.data.annotationType = AnnotationType.TEXT; + if (this.data.hasAppearance) { + this.data.name = 'NoIcon'; + } else { + this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; + this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; + this.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note'; + } + this._preparePopup(parameters.dict); + } + Util.inherit(TextAnnotation, Annotation, {}); + return TextAnnotation; + }(); + var LinkAnnotation = function LinkAnnotationClosure() { + function LinkAnnotation(params) { + Annotation.call(this, params); + var data = this.data; + data.annotationType = AnnotationType.LINK; + Catalog.parseDestDictionary({ + destDict: params.dict, + resultObj: data, + docBaseUrl: params.pdfManager.docBaseUrl + }); + } + Util.inherit(LinkAnnotation, Annotation, {}); + return LinkAnnotation; + }(); + var PopupAnnotation = function PopupAnnotationClosure() { + function PopupAnnotation(parameters) { + Annotation.call(this, parameters); + this.data.annotationType = AnnotationType.POPUP; + var dict = parameters.dict; + var parentItem = dict.get('Parent'); + if (!parentItem) { + warn('Popup annotation has a missing or invalid parent annotation.'); + return; + } + this.data.parentId = dict.getRaw('Parent').toString(); + this.data.title = stringToPDFString(parentItem.get('T') || ''); + this.data.contents = stringToPDFString(parentItem.get('Contents') || ''); + if (!parentItem.has('C')) { + this.data.color = null; + } else { + this.setColor(parentItem.getArray('C')); + this.data.color = this.color; + } + if (!this.viewable) { + var parentFlags = parentItem.get('F'); + if (this._isViewable(parentFlags)) { + this.setFlags(parentFlags); + } + } + } + Util.inherit(PopupAnnotation, Annotation, {}); + return PopupAnnotation; + }(); + var HighlightAnnotation = function HighlightAnnotationClosure() { + function HighlightAnnotation(parameters) { + Annotation.call(this, parameters); + this.data.annotationType = AnnotationType.HIGHLIGHT; + this._preparePopup(parameters.dict); + this.data.borderStyle.setWidth(0); + } + Util.inherit(HighlightAnnotation, Annotation, {}); + return HighlightAnnotation; + }(); + var UnderlineAnnotation = function UnderlineAnnotationClosure() { + function UnderlineAnnotation(parameters) { + Annotation.call(this, parameters); + this.data.annotationType = AnnotationType.UNDERLINE; + this._preparePopup(parameters.dict); + this.data.borderStyle.setWidth(0); + } + Util.inherit(UnderlineAnnotation, Annotation, {}); + return UnderlineAnnotation; + }(); + var SquigglyAnnotation = function SquigglyAnnotationClosure() { + function SquigglyAnnotation(parameters) { + Annotation.call(this, parameters); + this.data.annotationType = AnnotationType.SQUIGGLY; + this._preparePopup(parameters.dict); + this.data.borderStyle.setWidth(0); + } + Util.inherit(SquigglyAnnotation, Annotation, {}); + return SquigglyAnnotation; + }(); + var StrikeOutAnnotation = function StrikeOutAnnotationClosure() { + function StrikeOutAnnotation(parameters) { + Annotation.call(this, parameters); + this.data.annotationType = AnnotationType.STRIKEOUT; + this._preparePopup(parameters.dict); + this.data.borderStyle.setWidth(0); + } + Util.inherit(StrikeOutAnnotation, Annotation, {}); + return StrikeOutAnnotation; + }(); + var FileAttachmentAnnotation = function FileAttachmentAnnotationClosure() { + function FileAttachmentAnnotation(parameters) { + Annotation.call(this, parameters); + var file = new FileSpec(parameters.dict.get('FS'), parameters.xref); + this.data.annotationType = AnnotationType.FILEATTACHMENT; + this.data.file = file.serializable; + this._preparePopup(parameters.dict); + } + Util.inherit(FileAttachmentAnnotation, Annotation, {}); + return FileAttachmentAnnotation; + }(); + exports.Annotation = Annotation; + exports.AnnotationBorderStyle = AnnotationBorderStyle; + exports.AnnotationFactory = AnnotationFactory; + })); + (function (root, factory) { + factory(root.pdfjsCoreDocument = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreObj, root.pdfjsCoreParser, root.pdfjsCoreCrypto, root.pdfjsCoreEvaluator, root.pdfjsCoreAnnotation); + }(this, function (exports, sharedUtil, corePrimitives, coreStream, coreObj, coreParser, coreCrypto, coreEvaluator, coreAnnotation) { + var MissingDataException = sharedUtil.MissingDataException; + var Util = sharedUtil.Util; + var assert = sharedUtil.assert; + var error = sharedUtil.error; + var info = sharedUtil.info; + var isArray = sharedUtil.isArray; + var isArrayBuffer = sharedUtil.isArrayBuffer; + var isNum = sharedUtil.isNum; + var isString = sharedUtil.isString; + var shadow = sharedUtil.shadow; + var stringToBytes = sharedUtil.stringToBytes; + var stringToPDFString = sharedUtil.stringToPDFString; + var warn = sharedUtil.warn; + var isSpace = sharedUtil.isSpace; + var Dict = corePrimitives.Dict; + var isDict = corePrimitives.isDict; + var isName = corePrimitives.isName; + var isStream = corePrimitives.isStream; + var NullStream = coreStream.NullStream; + var Stream = coreStream.Stream; + var StreamsSequenceStream = coreStream.StreamsSequenceStream; + var Catalog = coreObj.Catalog; + var ObjectLoader = coreObj.ObjectLoader; + var XRef = coreObj.XRef; + var Linearization = coreParser.Linearization; + var calculateMD5 = coreCrypto.calculateMD5; + var OperatorList = coreEvaluator.OperatorList; + var PartialEvaluator = coreEvaluator.PartialEvaluator; + var Annotation = coreAnnotation.Annotation; + var AnnotationFactory = coreAnnotation.AnnotationFactory; + var Page = function PageClosure() { + var DEFAULT_USER_UNIT = 1.0; + var LETTER_SIZE_MEDIABOX = [ + 0, + 0, + 612, + 792 + ]; + function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { + this.pdfManager = pdfManager; + this.pageIndex = pageIndex; + this.pageDict = pageDict; + this.xref = xref; + this.ref = ref; + this.fontCache = fontCache; + this.evaluatorOptions = pdfManager.evaluatorOptions; + this.resourcesPromise = null; + var uniquePrefix = 'p' + this.pageIndex + '_'; + var idCounters = { obj: 0 }; + this.idFactory = { + createObjId: function () { + return uniquePrefix + ++idCounters.obj; + } + }; + } + Page.prototype = { + getPageProp: function Page_getPageProp(key) { + return this.pageDict.get(key); + }, + getInheritedPageProp: function Page_getInheritedPageProp(key, getArray) { + var dict = this.pageDict, valueArray = null, loopCount = 0; + var MAX_LOOP_COUNT = 100; + getArray = getArray || false; + while (dict) { + var value = getArray ? dict.getArray(key) : dict.get(key); + if (value) { + if (!valueArray) { + valueArray = []; + } + valueArray.push(value); + } + if (++loopCount > MAX_LOOP_COUNT) { + warn('Page_getInheritedPageProp: maximum loop count exceeded.'); + break; + } + dict = dict.get('Parent'); + } + if (!valueArray) { + return Dict.empty; + } + if (valueArray.length === 1 || !isDict(valueArray[0]) || loopCount > MAX_LOOP_COUNT) { + return valueArray[0]; + } + return Dict.merge(this.xref, valueArray); + }, + get content() { + return this.getPageProp('Contents'); + }, + get resources() { + return shadow(this, 'resources', this.getInheritedPageProp('Resources')); + }, + get mediaBox() { + var mediaBox = this.getInheritedPageProp('MediaBox', true); + if (!isArray(mediaBox) || mediaBox.length !== 4) { + return shadow(this, 'mediaBox', LETTER_SIZE_MEDIABOX); + } + return shadow(this, 'mediaBox', mediaBox); + }, + get cropBox() { + var cropBox = this.getInheritedPageProp('CropBox', true); + if (!isArray(cropBox) || cropBox.length !== 4) { + return shadow(this, 'cropBox', this.mediaBox); + } + return shadow(this, 'cropBox', cropBox); + }, + get userUnit() { + var obj = this.getPageProp('UserUnit'); + if (!isNum(obj) || obj <= 0) { + obj = DEFAULT_USER_UNIT; + } + return shadow(this, 'userUnit', obj); + }, + get view() { + var mediaBox = this.mediaBox, cropBox = this.cropBox; + if (mediaBox === cropBox) { + return shadow(this, 'view', mediaBox); + } + var intersection = Util.intersect(cropBox, mediaBox); + return shadow(this, 'view', intersection || mediaBox); + }, + get rotate() { + var rotate = this.getInheritedPageProp('Rotate') || 0; + if (rotate % 90 !== 0) { + rotate = 0; + } else if (rotate >= 360) { + rotate = rotate % 360; + } else if (rotate < 0) { + rotate = (rotate % 360 + 360) % 360; + } + return shadow(this, 'rotate', rotate); + }, + getContentStream: function Page_getContentStream() { + var content = this.content; + var stream; + if (isArray(content)) { + 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 { + stream = new NullStream(); + } + return stream; + }, + loadResources: function Page_loadResources(keys) { + if (!this.resourcesPromise) { + this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); + } + return this.resourcesPromise.then(function resourceSuccess() { + var objectLoader = new ObjectLoader(this.resources.map, keys, this.xref); + return objectLoader.load(); + }.bind(this)); + }, + getOperatorList: function Page_getOperatorList(handler, task, intent, renderInteractiveForms) { + var self = this; + var pdfManager = this.pdfManager; + var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', []); + var resourcesPromise = this.loadResources([ + 'ExtGState', + 'ColorSpace', + 'Pattern', + 'Shading', + 'XObject', + 'Font' + ]); + var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, handler, this.pageIndex, this.idFactory, this.fontCache, this.evaluatorOptions); + var dataPromises = Promise.all([ + contentStreamPromise, + resourcesPromise + ]); + var pageListPromise = dataPromises.then(function (data) { + var contentStream = data[0]; + var opList = new OperatorList(intent, handler, self.pageIndex); + handler.send('StartRenderPage', { + transparency: partialEvaluator.hasBlendModes(self.resources), + pageIndex: self.pageIndex, + intent: intent + }); + return partialEvaluator.getOperatorList(contentStream, task, self.resources, opList).then(function () { + return opList; + }); + }); + var annotationsPromise = pdfManager.ensure(this, 'annotations'); + return Promise.all([ + pageListPromise, + annotationsPromise + ]).then(function (datas) { + var pageOpList = datas[0]; + var annotations = datas[1]; + if (annotations.length === 0) { + pageOpList.flush(true); + return pageOpList; + } + var annotationsReadyPromise = Annotation.appendToOperatorList(annotations, pageOpList, partialEvaluator, task, intent, renderInteractiveForms); + return annotationsReadyPromise.then(function () { + pageOpList.flush(true); + return pageOpList; + }); + }); + }, + extractTextContent: function Page_extractTextContent(task, normalizeWhitespace, combineTextItems) { + var handler = { + on: function nullHandlerOn() { + }, + send: function nullHandlerSend() { + } + }; + var self = this; + var pdfManager = this.pdfManager; + var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', []); + var resourcesPromise = this.loadResources([ + 'ExtGState', + 'XObject', + 'Font' + ]); + var dataPromises = Promise.all([ + contentStreamPromise, + resourcesPromise + ]); + return dataPromises.then(function (data) { + var contentStream = data[0]; + var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, handler, self.pageIndex, self.idFactory, self.fontCache, self.evaluatorOptions); + return partialEvaluator.getTextContent(contentStream, task, self.resources, null, normalizeWhitespace, combineTextItems); + }); + }, + getAnnotationsData: function Page_getAnnotationsData(intent) { + var annotations = this.annotations; + var annotationsData = []; + for (var i = 0, n = annotations.length; i < n; ++i) { + if (intent) { + if (!(intent === 'display' && annotations[i].viewable) && !(intent === 'print' && annotations[i].printable)) { + continue; + } + } + annotationsData.push(annotations[i].data); + } + return annotationsData; + }, + get annotations() { + var annotations = []; + var annotationRefs = this.getInheritedPageProp('Annots') || []; + var annotationFactory = new AnnotationFactory(); + for (var i = 0, n = annotationRefs.length; i < n; ++i) { + var annotationRef = annotationRefs[i]; + var annotation = annotationFactory.create(this.xref, annotationRef, this.pdfManager, this.idFactory); + if (annotation) { + annotations.push(annotation); + } + } + return shadow(this, 'annotations', annotations); + } + }; + return Page; + }(); + var PDFDocument = function PDFDocumentClosure() { + var FINGERPRINT_FIRST_BYTES = 1024; + var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; + function PDFDocument(pdfManager, arg) { + var stream; + if (isStream(arg)) { + stream = arg; + } else if (isArrayBuffer(arg)) { + stream = new Stream(arg); + } else { + error('PDFDocument: Unknown argument type'); + } + assert(stream.length > 0, 'stream must have data'); + this.pdfManager = pdfManager; + this.stream = stream; + this.xref = new XRef(stream, pdfManager); + } + function find(stream, needle, limit, backwards) { + var pos = stream.pos; + var end = stream.end; + var strBuf = []; + if (pos + limit > end) { + limit = end - pos; + } + for (var n = 0; n < limit; ++n) { + strBuf.push(String.fromCharCode(stream.getByte())); + } + var str = strBuf.join(''); + stream.pos = pos; + var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); + if (index === -1) { + return false; + } + stream.pos += index; + return true; + } + var DocumentInfoValidators = { + get entries() { + 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); + var version = this.catalog.catDict.get('Version'); + if (isName(version)) { + this.pdfFormatVersion = version.name; + } + try { + this.acroForm = this.catalog.catDict.get('AcroForm'); + if (this.acroForm) { + this.xfa = this.acroForm.get('XFA'); + var fields = this.acroForm.get('Fields'); + if ((!fields || !isArray(fields) || fields.length === 0) && !this.xfa) { + this.acroForm = null; + } + } + } catch (ex) { + info('Something wrong with AcroForm entry'); + this.acroForm = null; + } + }, + get linearization() { + var linearization = null; + if (this.stream.length) { + try { + linearization = Linearization.create(this.stream); + } catch (err) { + if (err instanceof MissingDataException) { + throw err; + } + info(err); + } + } + return shadow(this, 'linearization', linearization); + }, + get startXRef() { + var stream = this.stream; + var startXRef = 0; + var linearization = this.linearization; + if (linearization) { + stream.reset(); + if (find(stream, 'endobj', 1024)) { + startXRef = stream.pos + 6; + } + } else { + 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 (isSpace(ch)); + var str = ''; + while (ch >= 0x20 && ch <= 0x39) { + str += String.fromCharCode(ch); + ch = stream.getByte(); + } + startXRef = parseInt(str, 10); + if (isNaN(startXRef)) { + startXRef = 0; + } + } + } + return shadow(this, 'startXRef', startXRef); + }, + get mainXRefEntriesOffset() { + var mainXRefEntriesOffset = 0; + var linearization = this.linearization; + if (linearization) { + mainXRefEntriesOffset = linearization.mainXRefEntriesOffset; + } + return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset); + }, + checkHeader: function PDFDocument_checkHeader() { + var stream = this.stream; + stream.reset(); + if (find(stream, '%PDF-', 1024)) { + stream.moveStart(); + var MAX_VERSION_LENGTH = 12; + var version = '', ch; + while ((ch = stream.getByte()) > 0x20) { + if (version.length >= MAX_VERSION_LENGTH) { + break; + } + version += String.fromCharCode(ch); + } + if (!this.pdfFormatVersion) { + this.pdfFormatVersion = version.substring(5); + } + return; + } + }, + parseStartXRef: function PDFDocument_parseStartXRef() { + var startXRef = this.startXRef; + this.xref.setStartXRef(startXRef); + }, + setup: function PDFDocument_setup(recoveryMode) { + this.xref.parse(recoveryMode); + var self = this; + var pageFactory = { + createPage: function (pageIndex, dict, ref, fontCache) { + return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, fontCache); + } + }; + this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); + }, + get numPages() { + var linearization = this.linearization; + var num = linearization ? linearization.numPages : this.catalog.numPages; + return shadow(this, 'numPages', num); + }, + get documentInfo() { + var docInfo = { + PDFFormatVersion: this.pdfFormatVersion, + IsAcroFormPresent: !!this.acroForm, + IsXFAPresent: !!this.xfa + }; + var infoDict; + try { + infoDict = this.xref.trailer.get('Info'); + } catch (err) { + info('The document information dictionary is invalid.'); + } + if (infoDict) { + var validEntries = DocumentInfoValidators.entries; + for (var key in validEntries) { + if (infoDict.has(key)) { + var value = infoDict.get(key); + 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, hash, fileID = ''; + var idArray = xref.trailer.get('ID'); + if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) { + hash = stringToBytes(idArray[0]); + } else { + if (this.stream.ensureRange) { + this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); + } + hash = calculateMD5(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); + } + for (var i = 0, n = hash.length; i < n; i++) { + var hex = hash[i].toString(16); + fileID += hex.length === 1 ? '0' + hex : hex; + } + return shadow(this, 'fingerprint', fileID); + }, + getPage: function PDFDocument_getPage(pageIndex) { + return this.catalog.getPage(pageIndex); + }, + cleanup: function PDFDocument_cleanup() { + return this.catalog.cleanup(); + } + }; + return PDFDocument; + }(); + exports.Page = Page; + exports.PDFDocument = PDFDocument; + })); + (function (root, factory) { + factory(root.pdfjsCorePdfManager = {}, root.pdfjsSharedUtil, root.pdfjsCoreStream, root.pdfjsCoreChunkedStream, root.pdfjsCoreDocument); + }(this, function (exports, sharedUtil, coreStream, coreChunkedStream, coreDocument) { + var warn = sharedUtil.warn; + var createValidAbsoluteUrl = sharedUtil.createValidAbsoluteUrl; + var shadow = sharedUtil.shadow; + var NotImplementedException = sharedUtil.NotImplementedException; + var MissingDataException = sharedUtil.MissingDataException; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var Util = sharedUtil.Util; + var Stream = coreStream.Stream; + var ChunkedStreamManager = coreChunkedStream.ChunkedStreamManager; + var PDFDocument = coreDocument.PDFDocument; + var BasePdfManager = function BasePdfManagerClosure() { + function BasePdfManager() { + throw new Error('Cannot initialize BaseManagerManager'); + } + BasePdfManager.prototype = { + get docId() { + return this._docId; + }, + get password() { + return this._password; + }, + get docBaseUrl() { + var docBaseUrl = null; + if (this._docBaseUrl) { + var absoluteUrl = createValidAbsoluteUrl(this._docBaseUrl); + if (absoluteUrl) { + docBaseUrl = absoluteUrl.href; + } else { + warn('Invalid absolute docBaseUrl: "' + this._docBaseUrl + '".'); + } + } + return shadow(this, 'docBaseUrl', docBaseUrl); + }, + onLoadedStream: function BasePdfManager_onLoadedStream() { + throw new NotImplementedException(); + }, + ensureDoc: function BasePdfManager_ensureDoc(prop, args) { + return this.ensure(this.pdfDocument, prop, args); + }, + ensureXRef: function BasePdfManager_ensureXRef(prop, args) { + return this.ensure(this.pdfDocument.xref, prop, args); + }, + ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { + return this.ensure(this.pdfDocument.catalog, prop, args); + }, + getPage: function BasePdfManager_getPage(pageIndex) { + return this.pdfDocument.getPage(pageIndex); + }, + cleanup: function BasePdfManager_cleanup() { + return this.pdfDocument.cleanup(); + }, + ensure: function BasePdfManager_ensure(obj, prop, args) { + return new NotImplementedException(); + }, + requestRange: function BasePdfManager_requestRange(begin, end) { + return new NotImplementedException(); + }, + requestLoadedStream: function BasePdfManager_requestLoadedStream() { + return new NotImplementedException(); + }, + sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { + return new NotImplementedException(); + }, + updatePassword: function BasePdfManager_updatePassword(password) { + this._password = password; + }, + terminate: function BasePdfManager_terminate() { + return new NotImplementedException(); + } + }; + return BasePdfManager; + }(); + var LocalPdfManager = function LocalPdfManagerClosure() { + function LocalPdfManager(docId, data, password, evaluatorOptions, docBaseUrl) { + this._docId = docId; + this._password = password; + this._docBaseUrl = docBaseUrl; + this.evaluatorOptions = evaluatorOptions; + var stream = new Stream(data); + this.pdfDocument = new PDFDocument(this, stream); + this._loadedStreamCapability = createPromiseCapability(); + this._loadedStreamCapability.resolve(stream); + } + Util.inherit(LocalPdfManager, BasePdfManager, { + ensure: function LocalPdfManager_ensure(obj, prop, args) { + return new Promise(function (resolve, reject) { + try { + var value = obj[prop]; + var result; + if (typeof value === 'function') { + result = value.apply(obj, args); + } else { + result = value; + } + resolve(result); + } catch (e) { + reject(e); + } + }); + }, + requestRange: function LocalPdfManager_requestRange(begin, end) { + return Promise.resolve(); + }, + requestLoadedStream: function LocalPdfManager_requestLoadedStream() { + }, + onLoadedStream: function LocalPdfManager_onLoadedStream() { + return this._loadedStreamCapability.promise; + }, + terminate: function LocalPdfManager_terminate() { + } + }); + return LocalPdfManager; + }(); + var NetworkPdfManager = function NetworkPdfManagerClosure() { + function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) { + this._docId = docId; + this._password = args.password; + this._docBaseUrl = docBaseUrl; + this.msgHandler = args.msgHandler; + this.evaluatorOptions = evaluatorOptions; + var params = { + msgHandler: args.msgHandler, + url: args.url, + length: args.length, + disableAutoFetch: args.disableAutoFetch, + rangeChunkSize: args.rangeChunkSize + }; + this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params); + this.pdfDocument = new PDFDocument(this, this.streamManager.getStream()); + } + Util.inherit(NetworkPdfManager, BasePdfManager, { + ensure: function NetworkPdfManager_ensure(obj, prop, args) { + var pdfManager = this; + return new Promise(function (resolve, reject) { + function ensureHelper() { + try { + var result; + var value = obj[prop]; + if (typeof value === 'function') { + result = value.apply(obj, args); + } else { + result = value; + } + resolve(result); + } catch (e) { + if (!(e instanceof MissingDataException)) { + reject(e); + return; + } + pdfManager.streamManager.requestRange(e.begin, e.end).then(ensureHelper, reject); + } + } + ensureHelper(); + }); + }, + requestRange: function NetworkPdfManager_requestRange(begin, end) { + return this.streamManager.requestRange(begin, end); + }, + requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { + this.streamManager.requestAllChunks(); + }, + sendProgressiveData: function NetworkPdfManager_sendProgressiveData(chunk) { + this.streamManager.onReceiveData({ chunk: chunk }); + }, + onLoadedStream: function NetworkPdfManager_onLoadedStream() { + return this.streamManager.onLoadedStream(); + }, + terminate: function NetworkPdfManager_terminate() { + this.streamManager.abort(); + } + }); + return NetworkPdfManager; + }(); + exports.LocalPdfManager = LocalPdfManager; + exports.NetworkPdfManager = NetworkPdfManager; + })); + (function (root, factory) { + factory(root.pdfjsCoreWorker = {}, root.pdfjsSharedUtil, root.pdfjsCorePrimitives, root.pdfjsCorePdfManager); + }(this, function (exports, sharedUtil, corePrimitives, corePdfManager) { + var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; + var InvalidPDFException = sharedUtil.InvalidPDFException; + var MessageHandler = sharedUtil.MessageHandler; + var MissingPDFException = sharedUtil.MissingPDFException; + var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; + var PasswordException = sharedUtil.PasswordException; + var PasswordResponses = sharedUtil.PasswordResponses; + var UnknownErrorException = sharedUtil.UnknownErrorException; + var XRefParseException = sharedUtil.XRefParseException; + var arrayByteLength = sharedUtil.arrayByteLength; + var arraysToBytes = sharedUtil.arraysToBytes; + var assert = sharedUtil.assert; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var error = sharedUtil.error; + var info = sharedUtil.info; + var warn = sharedUtil.warn; + var setVerbosityLevel = sharedUtil.setVerbosityLevel; + var Ref = corePrimitives.Ref; + var LocalPdfManager = corePdfManager.LocalPdfManager; + var NetworkPdfManager = corePdfManager.NetworkPdfManager; + var globalScope = sharedUtil.globalScope; + var WorkerTask = function WorkerTaskClosure() { + function WorkerTask(name) { + this.name = name; + this.terminated = false; + this._capability = createPromiseCapability(); + } + WorkerTask.prototype = { + get finished() { + return this._capability.promise; + }, + finish: function () { + this._capability.resolve(); + }, + terminate: function () { + this.terminated = true; + }, + ensureNotTerminated: function () { + if (this.terminated) { + throw new Error('Worker task was terminated'); + } + } + }; + return WorkerTask; + }(); + var PDFWorkerStream = function PDFWorkerStreamClosure() { + function PDFWorkerStream(params, msgHandler) { + this._queuedChunks = []; + var initialData = params.initialData; + if (initialData && initialData.length > 0) { + this._queuedChunks.push(initialData); + } + this._msgHandler = msgHandler; + this._isRangeSupported = !params.disableRange; + this._isStreamingSupported = !params.disableStream; + this._contentLength = params.length; + this._fullRequestReader = null; + this._rangeReaders = []; + msgHandler.on('OnDataRange', this._onReceiveData.bind(this)); + msgHandler.on('OnDataProgress', this._onProgress.bind(this)); + } + PDFWorkerStream.prototype = { + _onReceiveData: function PDFWorkerStream_onReceiveData(args) { + if (args.begin === undefined) { + if (this._fullRequestReader) { + this._fullRequestReader._enqueue(args.chunk); + } else { + this._queuedChunks.push(args.chunk); + } + } else { + var found = this._rangeReaders.some(function (rangeReader) { + if (rangeReader._begin !== args.begin) { + return false; + } + rangeReader._enqueue(args.chunk); + return true; + }); + assert(found); + } + }, + _onProgress: function PDFWorkerStream_onProgress(evt) { + if (this._rangeReaders.length > 0) { + var firstReader = this._rangeReaders[0]; + if (firstReader.onProgress) { + firstReader.onProgress({ loaded: evt.loaded }); + } + } + }, + _removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) { + var i = this._rangeReaders.indexOf(reader); + if (i >= 0) { + this._rangeReaders.splice(i, 1); + } + }, + getFullReader: function PDFWorkerStream_getFullReader() { + assert(!this._fullRequestReader); + var queuedChunks = this._queuedChunks; + this._queuedChunks = null; + return new PDFWorkerStreamReader(this, queuedChunks); + }, + getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) { + var reader = new PDFWorkerStreamRangeReader(this, begin, end); + this._msgHandler.send('RequestDataRange', { + begin: begin, + end: end + }); + this._rangeReaders.push(reader); + return reader; + }, + cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) { + if (this._fullRequestReader) { + this._fullRequestReader.cancel(reason); + } + var readers = this._rangeReaders.slice(0); + readers.forEach(function (rangeReader) { + rangeReader.cancel(reason); + }); + } + }; + function PDFWorkerStreamReader(stream, queuedChunks) { + this._stream = stream; + this._done = false; + this._queuedChunks = queuedChunks || []; + this._requests = []; + this._headersReady = Promise.resolve(); + stream._fullRequestReader = this; + this.onProgress = null; + } + PDFWorkerStreamReader.prototype = { + _enqueue: function PDFWorkerStreamReader_enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length > 0) { + var requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + return; + } + this._queuedChunks.push(chunk); + }, + get headersReady() { + return this._headersReady; + }, + get isRangeSupported() { + return this._stream._isRangeSupported; + }, + get isStreamingSupported() { + return this._stream._isStreamingSupported; + }, + get contentLength() { + return this._stream._contentLength; + }, + read: function PDFWorkerStreamReader_read() { + if (this._queuedChunks.length > 0) { + var chunk = this._queuedChunks.shift(); + return Promise.resolve({ + value: chunk, + done: false + }); + } + if (this._done) { + return Promise.resolve({ + value: undefined, + done: true + }); + } + var requestCapability = createPromiseCapability(); + this._requests.push(requestCapability); + return requestCapability.promise; + }, + cancel: function PDFWorkerStreamReader_cancel(reason) { + this._done = true; + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + } + }; + function PDFWorkerStreamRangeReader(stream, begin, end) { + this._stream = stream; + this._begin = begin; + this._end = end; + this._queuedChunk = null; + this._requests = []; + this._done = false; + this.onProgress = null; + } + PDFWorkerStreamRangeReader.prototype = { + _enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) { + if (this._done) { + return; + } + if (this._requests.length === 0) { + this._queuedChunk = chunk; + } else { + var requestsCapability = this._requests.shift(); + requestsCapability.resolve({ + value: chunk, + done: false + }); + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + } + this._done = true; + this._stream._removeRangeReader(this); + }, + get isStreamingSupported() { + return false; + }, + read: function PDFWorkerStreamRangeReader_read() { + if (this._queuedChunk) { + return Promise.resolve({ + value: this._queuedChunk, + done: false + }); + } + if (this._done) { + return Promise.resolve({ + value: undefined, + done: true + }); + } + var requestCapability = createPromiseCapability(); + this._requests.push(requestCapability); + return requestCapability.promise; + }, + cancel: function PDFWorkerStreamRangeReader_cancel(reason) { + this._done = true; + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + this._stream._removeRangeReader(this); + } + }; + return PDFWorkerStream; + }(); + var PDFNetworkStream; + function setPDFNetworkStreamClass(cls) { + PDFNetworkStream = cls; + } + var WorkerMessageHandler = { + setup: function wphSetup(handler, port) { + var testMessageProcessed = false; + handler.on('test', function wphSetupTest(data) { + if (testMessageProcessed) { + return; + } + testMessageProcessed = true; + if (!(data instanceof Uint8Array)) { + handler.send('test', 'main', false); + return; + } + var supportTransfers = data[0] === 255; + handler.postMessageTransfers = supportTransfers; + var xhr = new XMLHttpRequest(); + var responseExists = 'response' in xhr; + try { + var dummy = xhr.responseType; + } catch (e) { + responseExists = false; + } + if (!responseExists) { + handler.send('test', false); + return; + } + handler.send('test', { + supportTypedArray: true, + supportTransfers: supportTransfers + }); + }); + handler.on('configure', function wphConfigure(data) { + setVerbosityLevel(data.verbosity); + }); + handler.on('GetDocRequest', function wphSetupDoc(data) { + return WorkerMessageHandler.createDocumentHandler(data, port); + }); + }, + createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { + var pdfManager; + var terminated = false; + var cancelXHRs = null; + var WorkerTasks = []; + var docId = docParams.docId; + var docBaseUrl = docParams.docBaseUrl; + var workerHandlerName = docParams.docId + '_worker'; + var handler = new MessageHandler(workerHandlerName, docId, port); + handler.postMessageTransfers = docParams.postMessageTransfers; + function ensureNotTerminated() { + if (terminated) { + throw new Error('Worker was terminated'); + } + } + function startWorkerTask(task) { + WorkerTasks.push(task); + } + function finishWorkerTask(task) { + task.finish(); + var i = WorkerTasks.indexOf(task); + WorkerTasks.splice(i, 1); + } + function loadDocument(recoveryMode) { + var loadDocumentCapability = createPromiseCapability(); + var parseSuccess = function parseSuccess() { + var numPagesPromise = pdfManager.ensureDoc('numPages'); + var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); + var encryptedPromise = pdfManager.ensureXRef('encrypt'); + Promise.all([ + numPagesPromise, + fingerprintPromise, + encryptedPromise + ]).then(function onDocReady(results) { + var doc = { + numPages: results[0], + fingerprint: results[1], + encrypted: !!results[2] + }; + loadDocumentCapability.resolve(doc); + }, parseFailure); + }; + var parseFailure = function parseFailure(e) { + loadDocumentCapability.reject(e); + }; + pdfManager.ensureDoc('checkHeader', []).then(function () { + pdfManager.ensureDoc('parseStartXRef', []).then(function () { + pdfManager.ensureDoc('parse', [recoveryMode]).then(parseSuccess, parseFailure); + }, parseFailure); + }, parseFailure); + return loadDocumentCapability.promise; + } + function getPdfManager(data, evaluatorOptions) { + var pdfManagerCapability = createPromiseCapability(); + var pdfManager; + var source = data.source; + if (source.data) { + try { + pdfManager = new LocalPdfManager(docId, source.data, source.password, evaluatorOptions, docBaseUrl); + pdfManagerCapability.resolve(pdfManager); + } catch (ex) { + pdfManagerCapability.reject(ex); + } + return pdfManagerCapability.promise; + } + var pdfStream; + try { + if (source.chunkedViewerLoading) { + pdfStream = new PDFWorkerStream(source, handler); + } else { + assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded'); + pdfStream = new PDFNetworkStream(data); + } + } catch (ex) { + pdfManagerCapability.reject(ex); + return pdfManagerCapability.promise; + } + var fullRequest = pdfStream.getFullReader(); + fullRequest.headersReady.then(function () { + if (!fullRequest.isStreamingSupported || !fullRequest.isRangeSupported) { + fullRequest.onProgress = function (evt) { + handler.send('DocProgress', { + loaded: evt.loaded, + total: evt.total + }); + }; + } + if (!fullRequest.isRangeSupported) { + return; + } + var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported; + pdfManager = new NetworkPdfManager(docId, pdfStream, { + msgHandler: handler, + url: source.url, + password: source.password, + length: fullRequest.contentLength, + disableAutoFetch: disableAutoFetch, + rangeChunkSize: source.rangeChunkSize + }, evaluatorOptions, docBaseUrl); + pdfManagerCapability.resolve(pdfManager); + cancelXHRs = null; + }).catch(function (reason) { + pdfManagerCapability.reject(reason); + cancelXHRs = null; + }); + var cachedChunks = [], loaded = 0; + var flushChunks = function () { + var pdfFile = arraysToBytes(cachedChunks); + if (source.length && pdfFile.length !== source.length) { + warn('reported HTTP length is different from actual'); + } + try { + pdfManager = new LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, docBaseUrl); + pdfManagerCapability.resolve(pdfManager); + } catch (ex) { + pdfManagerCapability.reject(ex); + } + cachedChunks = []; + }; + var readPromise = new Promise(function (resolve, reject) { + var readChunk = function (chunk) { + try { + ensureNotTerminated(); + if (chunk.done) { + if (!pdfManager) { + flushChunks(); + } + cancelXHRs = null; + return; + } + var data = chunk.value; + loaded += arrayByteLength(data); + if (!fullRequest.isStreamingSupported) { + handler.send('DocProgress', { + loaded: loaded, + total: Math.max(loaded, fullRequest.contentLength || 0) + }); + } + if (pdfManager) { + pdfManager.sendProgressiveData(data); + } else { + cachedChunks.push(data); + } + fullRequest.read().then(readChunk, reject); + } catch (e) { + reject(e); + } + }; + fullRequest.read().then(readChunk, reject); + }); + readPromise.catch(function (e) { + pdfManagerCapability.reject(e); + cancelXHRs = null; + }); + cancelXHRs = function () { + pdfStream.cancelAllRequests('abort'); + }; + return pdfManagerCapability.promise; + } + function setupDoc(data) { + function onSuccess(doc) { + ensureNotTerminated(); + handler.send('GetDoc', { pdfInfo: doc }); + } + function onFailure(e) { + if (e instanceof PasswordException) { + var task = new WorkerTask('PasswordException: response ' + e.code); + startWorkerTask(task); + handler.sendWithPromise('PasswordRequest', e).then(function (data) { + finishWorkerTask(task); + pdfManager.updatePassword(data.password); + pdfManagerReady(); + }).catch(function (ex) { + finishWorkerTask(task); + handler.send('PasswordException', ex); + }.bind(null, e)); + } else if (e instanceof InvalidPDFException) { + handler.send('InvalidPDF', e); + } else if (e instanceof MissingPDFException) { + handler.send('MissingPDF', e); + } else if (e instanceof UnexpectedResponseException) { + handler.send('UnexpectedResponse', e); + } else { + handler.send('UnknownError', new UnknownErrorException(e.message, e.toString())); + } + } + function pdfManagerReady() { + ensureNotTerminated(); + loadDocument(false).then(onSuccess, function loadFailure(ex) { + ensureNotTerminated(); + if (!(ex instanceof XRefParseException)) { + onFailure(ex); + return; + } + pdfManager.requestLoadedStream(); + pdfManager.onLoadedStream().then(function () { + ensureNotTerminated(); + loadDocument(true).then(onSuccess, onFailure); + }); + }, onFailure); + } + ensureNotTerminated(); + var cMapOptions = { + url: data.cMapUrl === undefined ? null : data.cMapUrl, + packed: data.cMapPacked === true + }; + var evaluatorOptions = { + forceDataSchema: data.disableCreateObjectURL, + maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize, + disableFontFace: data.disableFontFace, + cMapOptions: cMapOptions + }; + getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { + if (terminated) { + newPdfManager.terminate(); + throw new Error('Worker was terminated'); + } + pdfManager = newPdfManager; + handler.send('PDFManagerReady', null); + pdfManager.onLoadedStream().then(function (stream) { + handler.send('DataLoaded', { length: stream.bytes.byteLength }); + }); + }).then(pdfManagerReady, onFailure); + } + handler.on('GetPage', function wphSetupGetPage(data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + var rotatePromise = pdfManager.ensure(page, 'rotate'); + var refPromise = pdfManager.ensure(page, 'ref'); + var userUnitPromise = pdfManager.ensure(page, 'userUnit'); + var viewPromise = pdfManager.ensure(page, 'view'); + return Promise.all([ + rotatePromise, + refPromise, + userUnitPromise, + viewPromise + ]).then(function (results) { + return { + rotate: results[0], + ref: results[1], + userUnit: results[2], + view: results[3] + }; + }); + }); + }); + handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { + var ref = new Ref(data.ref.num, data.ref.gen); + var catalog = pdfManager.pdfDocument.catalog; + return catalog.getPageIndex(ref); + }); + handler.on('GetDestinations', function wphSetupGetDestinations(data) { + return pdfManager.ensureCatalog('destinations'); + }); + handler.on('GetDestination', function wphSetupGetDestination(data) { + return pdfManager.ensureCatalog('getDestination', [data.id]); + }); + handler.on('GetPageLabels', function wphSetupGetPageLabels(data) { + return pdfManager.ensureCatalog('pageLabels'); + }); + handler.on('GetAttachments', function wphSetupGetAttachments(data) { + return pdfManager.ensureCatalog('attachments'); + }); + handler.on('GetJavaScript', function wphSetupGetJavaScript(data) { + return pdfManager.ensureCatalog('javaScript'); + }); + handler.on('GetOutline', function wphSetupGetOutline(data) { + return pdfManager.ensureCatalog('documentOutline'); + }); + handler.on('GetMetadata', function wphSetupGetMetadata(data) { + return Promise.all([ + pdfManager.ensureDoc('documentInfo'), + pdfManager.ensureCatalog('metadata') + ]); + }); + handler.on('GetData', function wphSetupGetData(data) { + pdfManager.requestLoadedStream(); + return pdfManager.onLoadedStream().then(function (stream) { + return stream.bytes; + }); + }); + handler.on('GetStats', function wphSetupGetStats(data) { + return pdfManager.pdfDocument.xref.stats; + }); + handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { + return pdfManager.getPage(data.pageIndex).then(function (page) { + return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); + }); + }); + handler.on('RenderPageRequest', function wphSetupRenderPage(data) { + var pageIndex = data.pageIndex; + pdfManager.getPage(pageIndex).then(function (page) { + var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); + startWorkerTask(task); + var pageNum = pageIndex + 1; + var start = Date.now(); + page.getOperatorList(handler, task, data.intent, data.renderInteractiveForms).then(function (operatorList) { + finishWorkerTask(task); + info('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength); + }, function (e) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + handler.send('UnsupportedFeature', { featureId: UNSUPPORTED_FEATURES.unknown }); + var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()'; + var wrappedException; + if (typeof e === 'string') { + wrappedException = { + message: e, + stack: minimumStackMessage + }; + } else if (typeof e === 'object') { + wrappedException = { + message: e.message || e.toString(), + stack: e.stack || minimumStackMessage + }; + } else { + wrappedException = { + message: 'Unknown exception type: ' + typeof e, + stack: minimumStackMessage + }; + } + handler.send('PageError', { + pageNum: pageNum, + error: wrappedException, + intent: data.intent + }); + }); + }); + }, this); + handler.on('GetTextContent', function wphExtractText(data) { + var pageIndex = data.pageIndex; + var normalizeWhitespace = data.normalizeWhitespace; + var combineTextItems = data.combineTextItems; + return pdfManager.getPage(pageIndex).then(function (page) { + var task = new WorkerTask('GetTextContent: page ' + pageIndex); + startWorkerTask(task); + var pageNum = pageIndex + 1; + var start = Date.now(); + return page.extractTextContent(task, normalizeWhitespace, combineTextItems).then(function (textContent) { + finishWorkerTask(task); + info('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms'); + return textContent; + }, function (reason) { + finishWorkerTask(task); + if (task.terminated) { + return; + } + throw reason; + }); + }); + }); + handler.on('Cleanup', function wphCleanup(data) { + return pdfManager.cleanup(); + }); + handler.on('Terminate', function wphTerminate(data) { + terminated = true; + if (pdfManager) { + pdfManager.terminate(); + pdfManager = null; + } + if (cancelXHRs) { + cancelXHRs(); + } + var waitOn = []; + WorkerTasks.forEach(function (task) { + waitOn.push(task.finished); + task.terminate(); + }); + return Promise.all(waitOn).then(function () { + handler.destroy(); + handler = null; + }); + }); + handler.on('Ready', function wphReady(data) { + setupDoc(docParams); + docParams = null; + }); + return workerHandlerName; + } + }; + function initializeWorker() { + if (!('console' in globalScope)) { + var consoleTimer = {}; + var workerConsole = { + log: function log() { + var args = Array.prototype.slice.call(arguments); + globalScope.postMessage({ + targetName: 'main', + action: 'console_log', + data: args + }); + }, + error: function error() { + var args = Array.prototype.slice.call(arguments); + globalScope.postMessage({ + targetName: 'main', + action: 'console_error', + data: args + }); + throw 'pdf.js execution error'; + }, + time: function time(name) { + consoleTimer[name] = Date.now(); + }, + timeEnd: function timeEnd(name) { + var time = consoleTimer[name]; + if (!time) { + error('Unknown timer name ' + name); + } + this.log('Timer:', name, Date.now() - time); + } + }; + globalScope.console = workerConsole; + } + var handler = new MessageHandler('worker', 'main', self); + WorkerMessageHandler.setup(handler, self); + handler.send('ready', null); + } + if (typeof window === 'undefined' && !(typeof module !== 'undefined' && module.require)) { + initializeWorker(); + } + exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass; + exports.WorkerTask = WorkerTask; + exports.WorkerMessageHandler = WorkerMessageHandler; + })); + (function (root, factory) { + factory(root.pdfjsCoreNetwork = {}, root.pdfjsSharedUtil, root.pdfjsCoreWorker); + }(this, function (exports, sharedUtil, coreWorker) { + var OK_RESPONSE = 200; + var PARTIAL_CONTENT_RESPONSE = 206; + function NetworkManager(url, args) { + this.url = url; + args = args || {}; + this.isHttp = /^https?:/i.test(url); + this.httpHeaders = this.isHttp && args.httpHeaders || {}; + this.withCredentials = args.withCredentials || false; + this.getXhr = args.getXhr || function NetworkManager_getXhr() { + return new XMLHttpRequest(); + }; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + this.loadedRequests = Object.create(null); + } + function getArrayBuffer(xhr) { + var data = xhr.response; + if (typeof data !== 'string') { + return data; + } + var length = data.length; + var array = new Uint8Array(length); + for (var i = 0; i < length; i++) { + array[i] = data.charCodeAt(i) & 0xFF; + } + return array.buffer; + } + var supportsMozChunked = function supportsMozChunkedClosure() { + try { + var x = new XMLHttpRequest(); + x.open('GET', 'https://example.com'); + x.responseType = 'moz-chunked-arraybuffer'; + return x.responseType === 'moz-chunked-arraybuffer'; + } catch (e) { + return false; + } + }(); + NetworkManager.prototype = { + requestRange: function NetworkManager_requestRange(begin, end, listeners) { + var args = { + begin: begin, + end: end + }; + for (var prop in listeners) { + args[prop] = listeners[prop]; + } + return this.request(args); + }, + requestFull: function NetworkManager_requestFull(listeners) { + return this.request(listeners); + }, + request: function NetworkManager_request(args) { + var xhr = this.getXhr(); + var xhrId = this.currXhrId++; + var pendingRequest = this.pendingRequests[xhrId] = { xhr: xhr }; + xhr.open('GET', this.url); + xhr.withCredentials = this.withCredentials; + for (var property in this.httpHeaders) { + var value = this.httpHeaders[property]; + if (typeof value === 'undefined') { + continue; + } + xhr.setRequestHeader(property, value); + } + if (this.isHttp && 'begin' in args && 'end' in args) { + var rangeStr = args.begin + '-' + (args.end - 1); + xhr.setRequestHeader('Range', 'bytes=' + rangeStr); + pendingRequest.expectedStatus = 206; + } else { + pendingRequest.expectedStatus = 200; + } + var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; + if (useMozChunkedLoading) { + xhr.responseType = 'moz-chunked-arraybuffer'; + pendingRequest.onProgressiveData = args.onProgressiveData; + pendingRequest.mozChunked = true; + } else { + xhr.responseType = 'arraybuffer'; + } + if (args.onError) { + xhr.onerror = function (evt) { + args.onError(xhr.status); + }; + } + xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); + xhr.onprogress = this.onProgress.bind(this, xhrId); + pendingRequest.onHeadersReceived = args.onHeadersReceived; + pendingRequest.onDone = args.onDone; + pendingRequest.onError = args.onError; + pendingRequest.onProgress = args.onProgress; + xhr.send(null); + return xhrId; + }, + onProgress: function NetworkManager_onProgress(xhrId, evt) { + var pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + if (pendingRequest.mozChunked) { + var chunk = getArrayBuffer(pendingRequest.xhr); + pendingRequest.onProgressiveData(chunk); + } + var onProgress = pendingRequest.onProgress; + if (onProgress) { + onProgress(evt); + } + }, + onStateChange: function NetworkManager_onStateChange(xhrId, evt) { + var pendingRequest = this.pendingRequests[xhrId]; + if (!pendingRequest) { + return; + } + var xhr = pendingRequest.xhr; + if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { + pendingRequest.onHeadersReceived(); + delete pendingRequest.onHeadersReceived; + } + if (xhr.readyState !== 4) { + return; + } + if (!(xhrId in this.pendingRequests)) { + return; + } + delete this.pendingRequests[xhrId]; + if (xhr.status === 0 && this.isHttp) { + if (pendingRequest.onError) { + pendingRequest.onError(xhr.status); + } + return; + } + var xhrStatus = xhr.status || OK_RESPONSE; + var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; + if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { + if (pendingRequest.onError) { + pendingRequest.onError(xhr.status); + } + return; + } + this.loadedRequests[xhrId] = true; + var chunk = getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + var rangeHeader = xhr.getResponseHeader('Content-Range'); + var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + var begin = parseInt(matches[1], 10); + pendingRequest.onDone({ + begin: begin, + chunk: chunk + }); + } else if (pendingRequest.onProgressiveData) { + pendingRequest.onDone(null); + } else if (chunk) { + pendingRequest.onDone({ + begin: 0, + chunk: chunk + }); + } else if (pendingRequest.onError) { + pendingRequest.onError(xhr.status); + } + }, + hasPendingRequests: function NetworkManager_hasPendingRequests() { + for (var xhrId in this.pendingRequests) { + return true; + } + return false; + }, + getRequestXhr: function NetworkManager_getXhr(xhrId) { + return this.pendingRequests[xhrId].xhr; + }, + isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { + return !!this.pendingRequests[xhrId].onProgressiveData; + }, + isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { + return xhrId in this.pendingRequests; + }, + isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { + return xhrId in this.loadedRequests; + }, + abortAllRequests: function NetworkManager_abortAllRequests() { + for (var xhrId in this.pendingRequests) { + this.abortRequest(xhrId | 0); + } + }, + abortRequest: function NetworkManager_abortRequest(xhrId) { + var xhr = this.pendingRequests[xhrId].xhr; + delete this.pendingRequests[xhrId]; + xhr.abort(); + } + }; + var assert = sharedUtil.assert; + var createPromiseCapability = sharedUtil.createPromiseCapability; + var isInt = sharedUtil.isInt; + var MissingPDFException = sharedUtil.MissingPDFException; + var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; + function PDFNetworkStream(options) { + this._options = options; + var source = options.source; + this._manager = new NetworkManager(source.url, { + httpHeaders: source.httpHeaders, + withCredentials: source.withCredentials + }); + this._rangeChunkSize = source.rangeChunkSize; + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + PDFNetworkStream.prototype = { + _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) { + var i = this._rangeRequestReaders.indexOf(reader); + if (i >= 0) { + this._rangeRequestReaders.splice(i, 1); + } + }, + getFullReader: function PDFNetworkStream_getFullReader() { + assert(!this._fullRequestReader); + this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._options); + return this._fullRequestReader; + }, + getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) { + var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); + reader.onClosed = this._onRangeRequestReaderClosed.bind(this); + this._rangeRequestReaders.push(reader); + return reader; + }, + cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) { + if (this._fullRequestReader) { + this._fullRequestReader.cancel(reason); + } + var readers = this._rangeRequestReaders.slice(0); + readers.forEach(function (reader) { + reader.cancel(reason); + }); + } + }; + function PDFNetworkStreamFullRequestReader(manager, options) { + this._manager = manager; + var source = options.source; + var args = { + onHeadersReceived: this._onHeadersReceived.bind(this), + onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._url = source.url; + this._fullRequestId = manager.requestFull(args); + this._headersReceivedCapability = createPromiseCapability(); + this._disableRange = options.disableRange || false; + this._contentLength = source.length; + this._rangeChunkSize = source.rangeChunkSize; + if (!this._rangeChunkSize && !this._disableRange) { + this._disableRange = true; + } + this._isStreamingSupported = false; + this._isRangeSupported = false; + this._cachedChunks = []; + this._requests = []; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + } + PDFNetworkStreamFullRequestReader.prototype = { + _validateRangeRequestCapabilities: function PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() { + if (this._disableRange) { + return false; + } + var networkManager = this._manager; + if (!networkManager.isHttp) { + return false; + } + var fullRequestXhrId = this._fullRequestId; + var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); + if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { + return false; + } + var contentEncoding = fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; + if (contentEncoding !== 'identity') { + return false; + } + var length = fullRequestXhr.getResponseHeader('Content-Length'); + length = parseInt(length, 10); + if (!isInt(length)) { + return false; + } + this._contentLength = length; + if (length <= 2 * this._rangeChunkSize) { + return false; + } + return true; + }, + _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() { + if (this._validateRangeRequestCapabilities()) { + this._isRangeSupported = true; + } + var networkManager = this._manager; + var fullRequestXhrId = this._fullRequestId; + if (networkManager.isStreamingRequest(fullRequestXhrId)) { + this._isStreamingSupported = true; + } else if (this._isRangeSupported) { + networkManager.abortRequest(fullRequestXhrId); + } + this._headersReceivedCapability.resolve(); + }, + _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) { + if (this._requests.length > 0) { + var requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._cachedChunks.push(chunk); + } + }, + _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) { + if (args) { + this._onProgressiveData(args.chunk); + } + this._done = true; + if (this._cachedChunks.length > 0) { + return; + } + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + }, + _onError: function PDFNetworkStreamFullRequestReader_onError(status) { + var url = this._url; + var exception; + if (status === 404 || status === 0 && /^file:/.test(url)) { + exception = new MissingPDFException('Missing PDF "' + url + '".'); + } else { + exception = new UnexpectedResponseException('Unexpected server response (' + status + ') while retrieving PDF "' + url + '".', status); + } + this._storedError = exception; + this._headersReceivedCapability.reject(exception); + this._requests.forEach(function (requestCapability) { + requestCapability.reject(exception); + }); + this._requests = []; + this._cachedChunks = []; + }, + _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) { + if (this.onProgress) { + this.onProgress({ + loaded: data.loaded, + total: data.lengthComputable ? data.total : this._contentLength + }); + } + }, + get isRangeSupported() { + return this._isRangeSupported; + }, + get isStreamingSupported() { + return this._isStreamingSupported; + }, + get contentLength() { + return this._contentLength; + }, + get headersReady() { + return this._headersReceivedCapability.promise; + }, + read: function PDFNetworkStreamFullRequestReader_read() { + if (this._storedError) { + return Promise.reject(this._storedError); + } + if (this._cachedChunks.length > 0) { + var chunk = this._cachedChunks.shift(); + return Promise.resolve(chunk); + } + if (this._done) { + return Promise.resolve({ + value: undefined, + done: true + }); + } + var requestCapability = createPromiseCapability(); + this._requests.push(requestCapability); + return requestCapability.promise; + }, + cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) { + this._done = true; + this._headersReceivedCapability.reject(reason); + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + if (this._manager.isPendingRequest(this._fullRequestId)) { + this._manager.abortRequest(this._fullRequestId); + } + this._fullRequestReader = null; + } + }; + function PDFNetworkStreamRangeRequestReader(manager, begin, end) { + this._manager = manager; + var args = { + onDone: this._onDone.bind(this), + onProgress: this._onProgress.bind(this) + }; + this._requestId = manager.requestRange(begin, end, args); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this.onProgress = null; + this.onClosed = null; + } + PDFNetworkStreamRangeRequestReader.prototype = { + _close: function PDFNetworkStreamRangeRequestReader_close() { + if (this.onClosed) { + this.onClosed(this); + } + }, + _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) { + var chunk = data.chunk; + if (this._requests.length > 0) { + var requestCapability = this._requests.shift(); + requestCapability.resolve({ + value: chunk, + done: false + }); + } else { + this._queuedChunk = chunk; + } + this._done = true; + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + this._close(); + }, + _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) { + if (!this.isStreamingSupported && this.onProgress) { + this.onProgress({ loaded: evt.loaded }); + } + }, + get isStreamingSupported() { + return false; + }, + read: function PDFNetworkStreamRangeRequestReader_read() { + if (this._queuedChunk !== null) { + var chunk = this._queuedChunk; + this._queuedChunk = null; + return Promise.resolve({ + value: chunk, + done: false + }); + } + if (this._done) { + return Promise.resolve({ + value: undefined, + done: true + }); + } + var requestCapability = createPromiseCapability(); + this._requests.push(requestCapability); + return requestCapability.promise; + }, + cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) { + this._done = true; + this._requests.forEach(function (requestCapability) { + requestCapability.resolve({ + value: undefined, + done: true + }); + }); + this._requests = []; + if (this._manager.isPendingRequest(this._requestId)) { + this._manager.abortRequest(this._requestId); + } + this._close(); + } + }; + coreWorker.setPDFNetworkStreamClass(PDFNetworkStream); + exports.PDFNetworkStream = PDFNetworkStream; + exports.NetworkManager = NetworkManager; + })); + }.call(pdfjsLibs)); + exports.WorkerMessageHandler = pdfjsLibs.pdfjsCoreWorker.WorkerMessageHandler; +})); \ No newline at end of file From 6f392f227016579547a2c1dd2849170a814b7cb6 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 2 Mar 2017 09:31:23 +0000 Subject: [PATCH 08/60] upgrade pdfjs to 1.7.225 --- services/web/app/coffee/infrastructure/PackageVersions.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/infrastructure/PackageVersions.coffee b/services/web/app/coffee/infrastructure/PackageVersions.coffee index 7342814ec7..f8c2011c11 100644 --- a/services/web/app/coffee/infrastructure/PackageVersions.coffee +++ b/services/web/app/coffee/infrastructure/PackageVersions.coffee @@ -1,5 +1,5 @@ version = { - "pdfjs": "1.6.210p2" + "pdfjs": "1.7.225" "moment": "2.9.0" "ace": "1.2.5" } From 4f270cfbaaf46fb728f9ef6c901b0f7913056dc6 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 2 Mar 2017 09:32:42 +0000 Subject: [PATCH 09/60] delete pdfjs-1.3.91 --- .../js/libs/pdfjs-1.3.91/compatibility.js | 593 - .../web/public/js/libs/pdfjs-1.3.91/pdf.js | 9534 ---- .../public/js/libs/pdfjs-1.3.91/pdf.worker.js | 40692 ---------------- 3 files changed, 50819 deletions(-) delete mode 100644 services/web/public/js/libs/pdfjs-1.3.91/compatibility.js delete mode 100644 services/web/public/js/libs/pdfjs-1.3.91/pdf.js delete mode 100644 services/web/public/js/libs/pdfjs-1.3.91/pdf.worker.js diff --git a/services/web/public/js/libs/pdfjs-1.3.91/compatibility.js b/services/web/public/js/libs/pdfjs-1.3.91/compatibility.js deleted file mode 100644 index 1119a2742a..0000000000 --- a/services/web/public/js/libs/pdfjs-1.3.91/compatibility.js +++ /dev/null @@ -1,593 +0,0 @@ -/* Copyright 2012 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. - */ -/* globals VBArray, PDFJS */ - -'use strict'; - -// Initializing PDFJS global object here, it case if we need to change/disable -// some PDF.js features, e.g. range requests -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -// Checking if the typed arrays are supported -// Support: iOS<6.0 (subarray), IE<10, Android<4.0 -(function checkTypedArrayCompatibility() { - if (typeof Uint8Array !== 'undefined') { - // Support: iOS<6.0 - if (typeof Uint8Array.prototype.subarray === 'undefined') { - Uint8Array.prototype.subarray = function subarray(start, end) { - return new Uint8Array(this.slice(start, end)); - }; - Float32Array.prototype.subarray = function subarray(start, end) { - return new Float32Array(this.slice(start, end)); - }; - } - - // Support: Android<4.1 - if (typeof Float64Array === 'undefined') { - window.Float64Array = Float32Array; - } - return; - } - - function subarray(start, end) { - return new TypedArray(this.slice(start, end)); - } - - function setArrayOffset(array, offset) { - if (arguments.length < 2) { - offset = 0; - } - for (var i = 0, n = array.length; i < n; ++i, ++offset) { - this[offset] = array[i] & 0xFF; - } - } - - function TypedArray(arg1) { - var result, i, n; - if (typeof arg1 === 'number') { - result = []; - for (i = 0; i < arg1; ++i) { - result[i] = 0; - } - } else if ('slice' in arg1) { - result = arg1.slice(0); - } else { - result = []; - for (i = 0, n = arg1.length; i < n; ++i) { - result[i] = arg1[i]; - } - } - - result.subarray = subarray; - result.buffer = result; - result.byteLength = result.length; - result.set = setArrayOffset; - - if (typeof arg1 === 'object' && arg1.buffer) { - result.buffer = arg1.buffer; - } - return result; - } - - window.Uint8Array = TypedArray; - window.Int8Array = TypedArray; - - // we don't need support for set, byteLength for 32-bit array - // so we can use the TypedArray as well - window.Uint32Array = TypedArray; - window.Int32Array = TypedArray; - window.Uint16Array = TypedArray; - window.Float32Array = TypedArray; - window.Float64Array = TypedArray; -})(); - -// URL = URL || webkitURL -// Support: Safari<7, Android 4.2+ -(function normalizeURLObject() { - if (!window.URL) { - window.URL = window.webkitURL; - } -})(); - -// Object.defineProperty()? -// Support: Android<4.0, Safari<5.1 -(function checkObjectDefinePropertyCompatibility() { - if (typeof Object.defineProperty !== 'undefined') { - var definePropertyPossible = true; - try { - // some browsers (e.g. safari) cannot use defineProperty() on DOM objects - // and thus the native version is not sufficient - Object.defineProperty(new Image(), 'id', { value: 'test' }); - // ... another test for android gb browser for non-DOM objects - var Test = function Test() {}; - Test.prototype = { get id() { } }; - Object.defineProperty(new Test(), 'id', - { value: '', configurable: true, enumerable: true, writable: false }); - } catch (e) { - definePropertyPossible = false; - } - if (definePropertyPossible) { - return; - } - } - - Object.defineProperty = function objectDefineProperty(obj, name, def) { - delete obj[name]; - if ('get' in def) { - obj.__defineGetter__(name, def['get']); - } - if ('set' in def) { - obj.__defineSetter__(name, def['set']); - } - if ('value' in def) { - obj.__defineSetter__(name, function objectDefinePropertySetter(value) { - this.__defineGetter__(name, function objectDefinePropertyGetter() { - return value; - }); - return value; - }); - obj[name] = def.value; - } - }; -})(); - - -// No XMLHttpRequest#response? -// Support: IE<11, Android <4.0 -(function checkXMLHttpRequestResponseCompatibility() { - var xhrPrototype = XMLHttpRequest.prototype; - var xhr = new XMLHttpRequest(); - if (!('overrideMimeType' in xhr)) { - // IE10 might have response, but not overrideMimeType - // Support: IE10 - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - if ('responseType' in xhr) { - return; - } - - // The worker will be using XHR, so we can save time and disable worker. - PDFJS.disableWorker = true; - - Object.defineProperty(xhrPrototype, 'responseType', { - get: function xmlHttpRequestGetResponseType() { - return this._responseType || 'text'; - }, - set: function xmlHttpRequestSetResponseType(value) { - if (value === 'text' || value === 'arraybuffer') { - this._responseType = value; - if (value === 'arraybuffer' && - typeof this.overrideMimeType === 'function') { - this.overrideMimeType('text/plain; charset=x-user-defined'); - } - } - } - }); - - // Support: IE9 - if (typeof VBArray !== 'undefined') { - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType === 'arraybuffer') { - return new Uint8Array(new VBArray(this.responseBody).toArray()); - } else { - return this.responseText; - } - } - }); - return; - } - - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType !== 'arraybuffer') { - return this.responseText; - } - var text = this.responseText; - var i, n = text.length; - var result = new Uint8Array(n); - for (i = 0; i < n; ++i) { - result[i] = text.charCodeAt(i) & 0xFF; - } - return result.buffer; - } - }); -})(); - -// window.btoa (base64 encode function) ? -// Support: IE<10 -(function checkWindowBtoaCompatibility() { - if ('btoa' in window) { - return; - } - - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - window.btoa = function windowBtoa(chars) { - var buffer = ''; - var i, n; - for (i = 0, n = chars.length; i < n; i += 3) { - var b1 = chars.charCodeAt(i) & 0xFF; - var b2 = chars.charCodeAt(i + 1) & 0xFF; - var b3 = chars.charCodeAt(i + 2) & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < n ? (b3 & 0x3F) : 64; - buffer += (digits.charAt(d1) + digits.charAt(d2) + - digits.charAt(d3) + digits.charAt(d4)); - } - return buffer; - }; -})(); - -// window.atob (base64 encode function)? -// Support: IE<10 -(function checkWindowAtobCompatibility() { - if ('atob' in window) { - return; - } - - // https://github.com/davidchambers/Base64.js - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - window.atob = function (input) { - input = input.replace(/=+$/, ''); - if (input.length % 4 === 1) { - throw new Error('bad atob input'); - } - for ( - // initialize result and counters - var bc = 0, bs, buffer, idx = 0, output = ''; - // get next character - buffer = input.charAt(idx++); - // character found in table? - // initialize bit storage and add its ascii value - ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, - // and if not first of each 4 characters, - // convert the first 8 bits to one ascii character - bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 - ) { - // try to find character in table (0-63, not found => -1) - buffer = digits.indexOf(buffer); - } - return output; - }; -})(); - -// Function.prototype.bind? -// Support: Android<4.0, iOS<6.0 -(function checkFunctionPrototypeBindCompatibility() { - if (typeof Function.prototype.bind !== 'undefined') { - return; - } - - Function.prototype.bind = function functionPrototypeBind(obj) { - var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); - var bound = function functionPrototypeBindBound() { - var args = headArgs.concat(Array.prototype.slice.call(arguments)); - return fn.apply(obj, args); - }; - return bound; - }; -})(); - -// HTMLElement dataset property -// Support: IE<11, Safari<5.1, Android<4.0 -(function checkDatasetProperty() { - var div = document.createElement('div'); - if ('dataset' in div) { - return; // dataset property exists - } - - Object.defineProperty(HTMLElement.prototype, 'dataset', { - get: function() { - if (this._dataset) { - return this._dataset; - } - - var dataset = {}; - for (var j = 0, jj = this.attributes.length; j < jj; j++) { - var attribute = this.attributes[j]; - if (attribute.name.substring(0, 5) !== 'data-') { - continue; - } - var key = attribute.name.substring(5).replace(/\-([a-z])/g, - function(all, ch) { - return ch.toUpperCase(); - }); - dataset[key] = attribute.value; - } - - Object.defineProperty(this, '_dataset', { - value: dataset, - writable: false, - enumerable: false - }); - return dataset; - }, - enumerable: true - }); -})(); - -// HTMLElement classList property -// Support: IE<10, Android<4.0, iOS<5.0 -(function checkClassListProperty() { - var div = document.createElement('div'); - if ('classList' in div) { - return; // classList property exists - } - - function changeList(element, itemName, add, remove) { - var s = element.className || ''; - var list = s.split(/\s+/g); - if (list[0] === '') { - list.shift(); - } - var index = list.indexOf(itemName); - if (index < 0 && add) { - list.push(itemName); - } - if (index >= 0 && remove) { - list.splice(index, 1); - } - element.className = list.join(' '); - return (index >= 0); - } - - var classListPrototype = { - add: function(name) { - changeList(this.element, name, true, false); - }, - contains: function(name) { - return changeList(this.element, name, false, false); - }, - remove: function(name) { - changeList(this.element, name, false, true); - }, - toggle: function(name) { - changeList(this.element, name, true, true); - } - }; - - Object.defineProperty(HTMLElement.prototype, 'classList', { - get: function() { - if (this._classList) { - return this._classList; - } - - var classList = Object.create(classListPrototype, { - element: { - value: this, - writable: false, - enumerable: true - } - }); - Object.defineProperty(this, '_classList', { - value: classList, - writable: false, - enumerable: false - }); - return classList; - }, - enumerable: true - }); -})(); - -// Check console compatibility -// In older IE versions the console object is not available -// unless console is open. -// Support: IE<10 -(function checkConsoleCompatibility() { - if (!('console' in window)) { - window.console = { - log: function() {}, - error: function() {}, - warn: function() {} - }; - } else if (!('bind' in console.log)) { - // native functions in IE9 might not have bind - console.log = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.log); - console.error = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.error); - console.warn = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.warn); - } -})(); - -// Check onclick compatibility in Opera -// Support: Opera<15 -(function checkOnClickCompatibility() { - // workaround for reported Opera bug DSK-354448: - // onclick fires on disabled buttons with opaque content - function ignoreIfTargetDisabled(event) { - if (isDisabled(event.target)) { - event.stopPropagation(); - } - } - function isDisabled(node) { - return node.disabled || (node.parentNode && isDisabled(node.parentNode)); - } - if (navigator.userAgent.indexOf('Opera') !== -1) { - // use browser detection since we cannot feature-check this bug - document.addEventListener('click', ignoreIfTargetDisabled, true); - } -})(); - -// Checks if possible to use URL.createObjectURL() -// Support: IE -(function checkOnBlobSupport() { - // sometimes IE loosing the data created with createObjectURL(), see #3977 - if (navigator.userAgent.indexOf('Trident') >= 0) { - PDFJS.disableCreateObjectURL = true; - } -})(); - -// Checks if navigator.language is supported -(function checkNavigatorLanguage() { - if ('language' in navigator) { - return; - } - PDFJS.locale = navigator.userLanguage || 'en-US'; -})(); - -(function checkRangeRequests() { - // Safari has issues with cached range requests see: - // https://github.com/mozilla/pdf.js/issues/3260 - // Last tested with version 6.0.4. - // Support: Safari 6.0+ - var isSafari = Object.prototype.toString.call( - window.HTMLElement).indexOf('Constructor') > 0; - - // Older versions of Android (pre 3.0) has issues with range requests, see: - // https://github.com/mozilla/pdf.js/issues/3381. - // Make sure that we only match webkit-based Android browsers, - // since Firefox/Fennec works as expected. - // Support: Android<3.0 - var regex = /Android\s[0-2][^\d]/; - var isOldAndroid = regex.test(navigator.userAgent); - - // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 - var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); - - if (isSafari || isOldAndroid || isChromeWithRangeBug) { - PDFJS.disableRange = true; - PDFJS.disableStream = true; - } -})(); - -// Check if the browser supports manipulation of the history. -// Support: IE<10, Android<4.2 -(function checkHistoryManipulation() { - // Android 2.x has so buggy pushState support that it was removed in - // Android 3.0 and restored as late as in Android 4.2. - // Support: Android 2.x - if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { - PDFJS.disableHistory = true; - } -})(); - -// Support: IE<11, Chrome<21, Android<4.4, Safari<6 -(function checkSetPresenceInImageData() { - // IE < 11 will use window.CanvasPixelArray which lacks set function. - if (window.CanvasPixelArray) { - if (typeof window.CanvasPixelArray.prototype.set !== 'function') { - window.CanvasPixelArray.prototype.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - } - } else { - // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. - // Because we cannot feature detect it, we rely on user agent parsing. - var polyfill = false, versionMatch; - if (navigator.userAgent.indexOf('Chrom') >= 0) { - versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - // Chrome < 21 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[2]) < 21; - } else if (navigator.userAgent.indexOf('Android') >= 0) { - // Android < 4.4 lacks the set function. - // Android >= 4.4 will contain Chrome in the user agent, - // thus pass the Chrome check above and not reach this block. - polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); - } else if (navigator.userAgent.indexOf('Safari') >= 0) { - versionMatch = navigator.userAgent. - match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); - // Safari < 6 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[1]) < 6; - } - - if (polyfill) { - var contextPrototype = window.CanvasRenderingContext2D.prototype; - var createImageData = contextPrototype.createImageData; - contextPrototype.createImageData = function(w, h) { - var imageData = createImageData.call(this, w, h); - imageData.data.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - return imageData; - }; - // this closure will be kept referenced, so clear its vars - contextPrototype = null; - } - } -})(); - -// Support: IE<10, Android<4.0, iOS -(function checkRequestAnimationFrame() { - function fakeRequestAnimationFrame(callback) { - window.setTimeout(callback, 20); - } - - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - if (isIOS) { - // requestAnimationFrame on iOS is broken, replacing with fake one. - window.requestAnimationFrame = fakeRequestAnimationFrame; - return; - } - if ('requestAnimationFrame' in window) { - return; - } - window.requestAnimationFrame = - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - fakeRequestAnimationFrame; -})(); - -(function checkCanvasSizeLimitation() { - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - var isAndroid = /Android/g.test(navigator.userAgent); - if (isIOS || isAndroid) { - // 5MP - PDFJS.maxCanvasPixels = 5242880; - } -})(); - -// Disable fullscreen support for certain problematic configurations. -// Support: IE11+ (when embedded). -(function checkFullscreenSupport() { - var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && - window.parent !== window); - if (isEmbeddedIE) { - PDFJS.disableFullscreen = true; - } -})(); - -// Provides document.currentScript support -// Support: IE, Chrome<29. -(function checkCurrentScript() { - if ('currentScript' in document) { - return; - } - Object.defineProperty(document, 'currentScript', { - get: function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - }, - enumerable: true, - configurable: true - }); -})(); diff --git a/services/web/public/js/libs/pdfjs-1.3.91/pdf.js b/services/web/public/js/libs/pdfjs-1.3.91/pdf.js deleted file mode 100644 index 5079c5dcbf..0000000000 --- a/services/web/public/js/libs/pdfjs-1.3.91/pdf.js +++ /dev/null @@ -1,9534 +0,0 @@ -/* Copyright 2012 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 globalstrict: false */ -/* globals PDFJS */ - -// Initializing PDFJS global object (if still undefined) -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -PDFJS.version = '1.3.91'; -PDFJS.build = 'd1e83b5'; - -(function pdfjsWrapper() { - // Use strict in our context only - users might not want it - 'use strict'; - - - -var globalScope = (typeof window === 'undefined') ? this : window; - -var isWorker = (typeof window === 'undefined'); - -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 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -// 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; - -PDFJS.VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = PDFJS.OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- treated as warnings. -function deprecated(details) { - warn('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Combines two URLs. The baseUrl shall be absolute URL. If the url is an -// absolute URL, it will be returned as is. -function combineUrl(baseUrl, url) { - if (!url) { - return baseUrl; - } - return new URL(url, baseUrl).href; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url) { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} -PDFJS.isValidUrl = isValidUrl; - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} -PDFJS.shadow = shadow; - -var LinkTarget = PDFJS.LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -function isExternalLinkTargetSet() { - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; - -var PasswordResponses = PDFJS.PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); -PDFJS.PasswordException = PasswordException; - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); -PDFJS.UnknownErrorException = UnknownErrorException; - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); -PDFJS.InvalidPDFException = InvalidPDFException; - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); -PDFJS.MissingPDFException = MissingPDFException; - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); -PDFJS.UnexpectedResponseException = UnexpectedResponseException; - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - return shadow(PDFJS, 'isLittleEndian', isLittleEndian()); - } -}); - - // Lazy test if the userAgent support CanvasTypedArrays -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - 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; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PDFJS.PageViewport - */ -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - if (!(v instanceof Dict)) { - return false; - } - if (!type) { - return true; - } - var dictType = v.get('Type'); - return isName(dictType) && dictType.name === type; -} - -function isArray(v) { - return v instanceof Array; -} - -function isStream(v) { - return typeof v === 'object' && v !== null && v.getBytes !== undefined; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -function isRef(v) { - return v instanceof Ref; -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fullfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -PDFJS.createPromiseCapability = createPromiseCapability; - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libaries are: - * - There currently isn't a seperate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} array of data and/or promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -PDFJS.createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - 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); -}; - -PDFJS.createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType) { - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = PDFJS.createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = {}; - var ah = this.actionHandler = {}; - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - /* jshint ignore:start */ - - // feature detect for URL constructor - var hasWorkingUrl = false; - if (typeof URL === 'function' && ('origin' in URL.prototype)) { - try { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } catch(e) {} - } - - if (hasWorkingUrl) - return; - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' == h) { - invalid.call(this) - } - // XXX - return h.toLowerCase() - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF = undefined, - ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message) - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' == c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' == this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF == c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c) - break loop; - } - break; - - case 'scheme data': - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' == c && '/' == input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue - } - break; - - case 'relative': - this._isRelative = true; - if ('file' != this._scheme) - this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' == c || '\\' == c) { - if ('\\' == c) - err('\\ is an invalid code point.'); - state = 'relative slash'; - } else if ('?' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1] - var nextNextC = input[cursor+2] - if ( - 'file' != this._scheme || !ALPHA.test(c) || - (nextC != ':' && nextC != '|') || - (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' == c || '\\' == c) { - if ('\\' == c) { - err('\\ is an invalid code point.'); - } - if ('file' == this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' == c) { - state = 'authority second slash'; - } else { - err("Expected '/', got: " + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' != c && '\\' != c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' == c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' == cp || '\n' == cp || '\r' == cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' == cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - (null !== this._password) ? this._password += tempC : this._username += tempC; - } - buffer = ''; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { - state = 'relative path'; - } else if (buffer.length == 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' == c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' == stateOverride) { - break loop; - } - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' != c && '\n' != c && '\r' != c) { - if ('[' == c) { - seenBracket = true; - } else if (']' == c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { - if ('' != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' == c) - err("'\\' not allowed in path."); - state = 'relative path'; - if ('/' != c && '\\' != c) { - continue; - } - break; - - case 'relative path': - if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { - if ('\\' == c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' == buffer) { - this._path.pop(); - if ('/' != c && '\\' != c) { - this._path.push(''); - } - } else if ('.' == buffer && '/' != c && '\\' != c) { - this._path.push(''); - } else if ('.' != buffer) { - if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' != c && '\n' != c && '\r' != c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function jURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof jURL)) - base = new jURL(String(base)); - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) - return this._url; - - var authority = ''; - if ('' != this._username || null != this._password) { - authority = this._username + - (null != this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) - return; - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) - return; - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' == this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) - return; - this._query = '?'; - if ('?' == search[0]) - search = search.slice(1); - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' == this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) - return; - this._fragment = '#'; - if ('#' == hash[0]) - hash = hash.slice(1); - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = jURL; - /* jshint ignore:end */ -})(globalScope); - - -var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 - -/** - * 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); - -/** - * The url of where the predefined Adobe CMaps are located. Include trailing - * slash. - * @var {string} - */ -PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); - -/** - * Specifies if CMaps are binary packed. - * @var {boolean} - */ -PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; - -/** - * By default fonts are converted to OpenType fonts and loaded via font face - * rules. If disabled, the font will be rendered using a built in font renderer - * that constructs the glyphs with primitive path commands. - * @var {boolean} - */ -PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? - false : PDFJS.disableFontFace); - -/** - * Path for image resources, mainly for annotation icons. Include trailing - * slash. - * @var {string} - */ -PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? - '' : PDFJS.imageResourcesPath); - -/** - * Disable the web worker and run all code on the main thread. This will happen - * automatically if the browser doesn't support workers or sending typed arrays - * to workers. - * @var {boolean} - */ -PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? - false : PDFJS.disableWorker); - -/** - * Path and filename of the worker file. Required when the worker is enabled in - * development mode. If unspecified in the production build, the worker will be - * loaded based on the location of the pdf.js file. It is recommended that - * the workerSrc is set in a custom application to prevent issues caused by - * third-party frameworks and libraries. - * @var {string} - */ -PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); - -/** - * Disable range request loading of PDF files. When enabled and if the server - * supports partial content requests then the PDF will be fetched in chunks. - * Enabled (false) by default. - * @var {boolean} - */ -PDFJS.disableRange = (PDFJS.disableRange === undefined ? - false : PDFJS.disableRange); - -/** - * Disable streaming of PDF file data. By default PDF.js attempts to load PDF - * in chunks. This default behavior can be disabled. - * @var {boolean} - */ -PDFJS.disableStream = (PDFJS.disableStream === undefined ? - false : PDFJS.disableStream); - -/** - * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js - * will automatically keep fetching more data even if it isn't needed to display - * the current page. This default behavior can be disabled. - * - * NOTE: It is also necessary to disable streaming, see above, - * in order for disabling of pre-fetching to work correctly. - * @var {boolean} - */ -PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? - false : PDFJS.disableAutoFetch); - -/** - * Enables special hooks for debugging PDF.js. - * @var {boolean} - */ -PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); - -/** - * Enables transfer usage in postMessage for ArrayBuffers. - * @var {boolean} - */ -PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? - true : PDFJS.postMessageTransfers); - -/** - * Disables URL.createObjectURL usage. - * @var {boolean} - */ -PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? - false : PDFJS.disableCreateObjectURL); - -/** - * Disables WebGL usage. - * @var {boolean} - */ -PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? - true : PDFJS.disableWebGL); - -/** - * Disables fullscreen support, and by extension Presentation Mode, - * in browsers which support the fullscreen API. - * @var {boolean} - */ -PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ? - false : PDFJS.disableFullscreen); - -/** - * Enables CSS only zooming. - * @var {boolean} - */ -PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ? - false : PDFJS.useOnlyCssZoom); - -/** - * Controls the logging level. - * The constants from PDFJS.VERBOSITY_LEVELS should be used: - * - errors - * - warnings [default] - * - infos - * @var {number} - */ -PDFJS.verbosity = (PDFJS.verbosity === undefined ? - PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity); - -/** - * The maximum supported canvas size in total pixels e.g. width * height. - * The default value is 4096 * 4096. Use -1 for no limit. - * @var {number} - */ -PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? - 16777216 : PDFJS.maxCanvasPixels); - -/** - * (Deprecated) Opens external links in a new window if enabled. - * The default behavior opens external links in the PDF.js window. - * - * NOTE: This property has been deprecated, please use - * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. - * @var {boolean} - */ -PDFJS.openExternalLinksInNewWindow = ( - PDFJS.openExternalLinksInNewWindow === undefined ? - false : PDFJS.openExternalLinksInNewWindow); - -/** - * Specifies the |target| attribute for external links. - * The constants from PDFJS.LinkTarget should be used: - * - NONE [default] - * - SELF - * - BLANK - * - PARENT - * - TOP - * @var {number} - */ -PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? - PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget); - -/** - * Determines if we can eval strings as JS. Primarily used to improve - * performance for font rendering. - * @var {boolean} - */ -PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? - true : PDFJS.isEvalSupported); - -/** - * Document initialization / loading parameters object. - * - * @typedef {Object} DocumentInitParameters - * @property {string} url - The URL of the PDF. - * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays - * (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded, - * use atob() to convert it to a binary string first. - * @property {Object} httpHeaders - Basic authentication headers. - * @property {boolean} withCredentials - Indicates whether or not cross-site - * Access-Control requests should be made using credentials such as cookies - * or authorization headers. The default is false. - * @property {string} password - For decrypting password-protected PDFs. - * @property {TypedArray} initialData - A typed array with the first portion or - * all of the pdf data. Used by the extension since some data is already - * loaded before the switch to range requests. - * @property {number} length - The PDF file length. It's used for progress - * reports and range requests operations. - * @property {PDFDataRangeTransport} range - * @property {number} rangeChunkSize - Optional parameter to specify - * maximum number of bytes fetched per range request. The default value is - * 2^16 = 65536. - * @property {PDFWorker} worker - The worker that will be used for the loading - * and parsing of the PDF data. - */ - -/** - * @typedef {Object} PDFDocumentStats - * @property {Array} streamTypes - Used stream types in the document (an item - * is set to true if specific stream ID was used in the document). - * @property {Array} fontTypes - Used font type in the document (an item is set - * to true if specific font ID was used in the document). - */ - -/** - * 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|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src - * Can be a url to where a PDF is located, a typed array (Uint8Array) - * already populated with data or parameter object. - * - * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used - * if you want to manually serve range requests for data in the PDF. - * - * @param {function} passwordCallback (deprecated) 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}). - * - * @param {function} progressCallback (deprecated) It is used to be able to - * monitor the loading progress of the PDF file (necessary to implement e.g. - * a loading bar). The callback receives an {Object} with the properties: - * {number} loaded and {number} total. - * - * @return {PDFDocumentLoadingTask} - */ -PDFJS.getDocument = function getDocument(src, - pdfDataRangeTransport, - passwordCallback, - progressCallback) { - var task = new PDFDocumentLoadingTask(); - - // Support of the obsolete arguments (for compatibility with API v1.0) - if (arguments.length > 1) { - deprecated('getDocument is called with pdfDataRangeTransport, ' + - 'passwordCallback or progressCallback argument'); - } - if (pdfDataRangeTransport) { - if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) { - // Not a PDFDataRangeTransport instance, trying to add missing properties. - pdfDataRangeTransport = Object.create(pdfDataRangeTransport); - pdfDataRangeTransport.length = src.length; - pdfDataRangeTransport.initialData = src.initialData; - if (!pdfDataRangeTransport.abort) { - pdfDataRangeTransport.abort = function () {}; - } - } - src = Object.create(src); - src.range = pdfDataRangeTransport; - } - task.onPassword = passwordCallback || null; - task.onProgress = progressCallback || null; - - var source; - if (typeof src === 'string') { - source = { url: src }; - } else if (isArrayBuffer(src)) { - source = { data: src }; - } else if (src instanceof PDFDataRangeTransport) { - source = { range: src }; - } else { - if (typeof src !== 'object') { - error('Invalid parameter in getDocument, need either Uint8Array, ' + - 'string or a parameter object'); - } - if (!src.url && !src.data && !src.range) { - error('Invalid parameter object: need either .data, .range or .url'); - } - - source = src; - } - - var params = {}; - var rangeTransport = null; - var worker = null; - for (var key in source) { - if (key === 'url' && typeof window !== 'undefined') { - // The full path is required in the 'url' field. - params[key] = combineUrl(window.location.href, source[key]); - continue; - } else if (key === 'range') { - rangeTransport = source[key]; - continue; - } else if (key === 'worker') { - worker = source[key]; - continue; - } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { - // Converting string or array-like data to Uint8Array. - var pdfBytes = source[key]; - if (typeof pdfBytes === 'string') { - params[key] = stringToBytes(pdfBytes); - } else if (typeof pdfBytes === 'object' && pdfBytes !== null && - !isNaN(pdfBytes.length)) { - params[key] = new Uint8Array(pdfBytes); - } else if (isArrayBuffer(pdfBytes)) { - params[key] = new Uint8Array(pdfBytes); - } else { - error('Invalid PDF binary data: either typed array, string or ' + - 'array-like object is expected in the data property.'); - } - continue; - } - params[key] = source[key]; - } - - params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - - if (!worker) { - // Worker was not provided -- creating and owning our own. - worker = new PDFWorker(); - task._worker = worker; - } - var docId = task.docId; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - return _fetchDocument(worker, params, rangeTransport, docId).then( - function (workerId) { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - var messageHandler = new MessageHandler(docId, workerId, worker.port); - messageHandler.send('Ready', null); - var transport = new WorkerTransport(messageHandler, task, rangeTransport); - task._transport = transport; - }); - }, task._capability.reject); - - return task; -}; - -/** - * Starts fetching of specified PDF document/data. - * @param {PDFWorker} worker - * @param {Object} source - * @param {PDFDataRangeTransport} pdfDataRangeTransport - * @param {string} docId Unique document id, used as MessageHandler id. - * @returns {Promise} The promise, which is resolved when worker id of - * MessageHandler is known. - * @private - */ -function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { - if (worker.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); - } - - source.disableAutoFetch = PDFJS.disableAutoFetch; - source.disableStream = PDFJS.disableStream; - source.chunkedViewerLoading = !!pdfDataRangeTransport; - if (pdfDataRangeTransport) { - source.length = pdfDataRangeTransport.length; - source.initialData = pdfDataRangeTransport.initialData; - } - return worker.messageHandler.sendWithPromise('GetDocRequest', { - docId: docId, - source: source, - disableRange: PDFJS.disableRange, - maxImageSize: PDFJS.maxImageSize, - cMapUrl: PDFJS.cMapUrl, - cMapPacked: PDFJS.cMapPacked, - disableFontFace: PDFJS.disableFontFace, - disableCreateObjectURL: PDFJS.disableCreateObjectURL, - verbosity: PDFJS.verbosity - }).then(function (workerId) { - if (worker.destroyed) { - throw new Error('Worker was destroyed'); - } - return workerId; - }); -} - -/** - * PDF document loading operation. - * @class - * @alias PDFDocumentLoadingTask - */ -var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { - var nextDocumentId = 0; - - /** @constructs PDFDocumentLoadingTask */ - function PDFDocumentLoadingTask() { - this._capability = createPromiseCapability(); - this._transport = null; - this._worker = null; - - /** - * Unique document loading task id -- used in MessageHandlers. - * @type {string} - */ - this.docId = 'd' + (nextDocumentId++); - - /** - * Shows if loading task is destroyed. - * @type {boolean} - */ - this.destroyed = false; - - /** - * Callback 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}). - */ - this.onPassword = null; - - /** - * Callback to be able to monitor the loading progress of the PDF file - * (necessary to implement e.g. a loading bar). The callback receives - * an {Object} with the properties: {number} loaded and {number} total. - */ - this.onProgress = null; - - /** - * Callback to when unsupported feature is used. The callback receives - * an {PDFJS.UNSUPPORTED_FEATURES} argument. - */ - this.onUnsupportedFeature = null; - } - - PDFDocumentLoadingTask.prototype = - /** @lends PDFDocumentLoadingTask.prototype */ { - /** - * @return {Promise} - */ - get promise() { - return this._capability.promise; - }, - - /** - * Aborts all network requests and destroys worker. - * @return {Promise} A promise that is resolved after destruction activity - * is completed. - */ - destroy: function () { - this.destroyed = true; - - var transportDestroyed = !this._transport ? Promise.resolve() : - this._transport.destroy(); - return transportDestroyed.then(function () { - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - }.bind(this)); - }, - - /** - * Registers callbacks to indicate the document loading completion. - * - * @param {function} onFulfilled The callback for the loading completion. - * @param {function} onRejected The callback for the loading failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return PDFDocumentLoadingTask; -})(); - -/** - * Abstract class to support range requests file loading. - * @class - * @alias PDFJS.PDFDataRangeTransport - * @param {number} length - * @param {Uint8Array} initialData - */ -var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() { - function PDFDataRangeTransport(length, initialData) { - this.length = length; - this.initialData = initialData; - - this._rangeListeners = []; - this._progressListeners = []; - this._progressiveReadListeners = []; - this._readyCapability = createPromiseCapability(); - } - PDFDataRangeTransport.prototype = - /** @lends PDFDataRangeTransport.prototype */ { - addRangeListener: - function PDFDataRangeTransport_addRangeListener(listener) { - this._rangeListeners.push(listener); - }, - - addProgressListener: - function PDFDataRangeTransport_addProgressListener(listener) { - this._progressListeners.push(listener); - }, - - addProgressiveReadListener: - function PDFDataRangeTransport_addProgressiveReadListener(listener) { - this._progressiveReadListeners.push(listener); - }, - - onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) { - var listeners = this._rangeListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](begin, chunk); - } - }, - - onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) { - this._readyCapability.promise.then(function () { - var listeners = this._progressListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](loaded); - } - }.bind(this)); - }, - - onDataProgressiveRead: - function PDFDataRangeTransport_onDataProgress(chunk) { - this._readyCapability.promise.then(function () { - var listeners = this._progressiveReadListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](chunk); - } - }.bind(this)); - }, - - transportReady: function PDFDataRangeTransport_transportReady() { - this._readyCapability.resolve(); - }, - - requestDataRange: - function PDFDataRangeTransport_requestDataRange(begin, end) { - throw new Error('Abstract method PDFDataRangeTransport.requestDataRange'); - }, - - abort: function PDFDataRangeTransport_abort() { - } - }; - return PDFDataRangeTransport; -})(); - -PDFJS.PDFDataRangeTransport = PDFDataRangeTransport; - -/** - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used - * properties that can be read synchronously. - * @class - * @alias PDFDocumentProxy - */ -var PDFDocumentProxy = (function PDFDocumentProxyClosure() { - function PDFDocumentProxy(pdfInfo, transport, loadingTask) { - this.pdfInfo = pdfInfo; - this.transport = transport; - this.loadingTask = loadingTask; - } - PDFDocumentProxy.prototype = /** @lends 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; - }, - /** - * @param {number} pageNumber The page number to get. The first page is 1. - * @return {Promise} A promise that is resolved with a {@link PDFPageProxy} - * object. - */ - getPage: function PDFDocumentProxy_getPage(pageNumber) { - return this.transport.getPage(pageNumber); - }, - /** - * @param {{num: number, gen: number}} ref The page reference. Must have - * the 'num' and 'gen' properties. - * @return {Promise} A promise that is resolved with the page index that is - * associated with the reference. - */ - getPageIndex: function PDFDocumentProxy_getPageIndex(ref) { - return this.transport.getPageIndex(ref); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named destinations to reference numbers. - * - * This can be slow for large documents: use getDestination instead - */ - getDestinations: function PDFDocumentProxy_getDestinations() { - return this.transport.getDestinations(); - }, - /** - * @param {string} id The named destination to get. - * @return {Promise} A promise that is resolved with all information - * of the given named destination. - */ - getDestination: function PDFDocumentProxy_getDestination(id) { - return this.transport.getDestination(id); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named attachments to their content. - */ - getAttachments: function PDFDocumentProxy_getAttachments() { - return this.transport.getAttachments(); - }, - /** - * @return {Promise} A promise that is resolved with an array of all the - * JavaScript strings in the name tree. - */ - getJavaScript: function PDFDocumentProxy_getJavaScript() { - return this.transport.getJavaScript(); - }, - /** - * @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() { - return this.transport.getOutline(); - }, - /** - * @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() { - return this.transport.getMetadata(); - }, - /** - * @return {Promise} A promise that is resolved with a TypedArray that has - * the raw data from the PDF. - */ - getData: function PDFDocumentProxy_getData() { - return this.transport.getData(); - }, - /** - * @return {Promise} A promise that is resolved when the document's data - * is loaded. It is resolved with an {Object} that contains the length - * property that indicates size of the PDF data in bytes. - */ - getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() { - return this.transport.downloadInfoCapability.promise; - }, - /** - * @return {Promise} A promise this is resolved with current stats about - * document structures (see {@link PDFDocumentStats}). - */ - getStats: function PDFDocumentProxy_getStats() { - return this.transport.getStats(); - }, - /** - * Cleans up resources allocated by the document, e.g. created @font-face. - */ - cleanup: function PDFDocumentProxy_cleanup() { - this.transport.startCleanup(); - }, - /** - * Destroys current document instance and terminates worker. - */ - destroy: function PDFDocumentProxy_destroy() { - return this.loadingTask.destroy(); - } - }; - return PDFDocumentProxy; -})(); - -/** - * Page getTextContent parameters. - * - * @typedef {Object} getTextContentParameters - * @param {boolean} normalizeWhitespace - replaces all occurrences of - * whitespace with standard spaces (0x20). The default value is `false`. - */ - -/** - * Page text content. - * - * @typedef {Object} TextContent - * @property {array} items - array of {@link TextItem} - * @property {Object} styles - {@link TextStyles} objects, indexed by font - * name. - */ - -/** - * Page text content part. - * - * @typedef {Object} TextItem - * @property {string} str - text content. - * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'. - * @property {array} transform - transformation matrix. - * @property {number} width - width in device space. - * @property {number} height - height in device space. - * @property {string} fontName - font name used by pdf.js for converted font. - */ - -/** - * Text style. - * - * @typedef {Object} TextStyle - * @property {number} ascent - font ascent. - * @property {number} descent - font descent. - * @property {boolean} vertical - text is in vertical mode. - * @property {string} fontFamily - possible font family - */ - -/** - * Page annotation parameters. - * - * @typedef {Object} GetAnnotationsParameters - * @param {string} intent - Determines the annotations that will be fetched, - * can be either 'display' (viewable annotations) or 'print' - * (printable annotations). - * If the parameter is omitted, all annotations are fetched. - */ - -/** - * Page render parameters. - * - * @typedef {Object} RenderParameters - * @property {Object} canvasContext - A 2D context of a DOM Canvas object. - * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by - * calling of PDFPage.getViewport method. - * @property {string} intent - Rendering intent, can be 'display' or 'print' - * (default value is 'display'). - * @property {Array} transform - (optional) Additional transform, applied - * just before viewport transform. - * @property {Object} imageLayer - (optional) An object that has beginLayout, - * endLayout and appendImage functions. - * @property {function} continueCallback - (deprecated) 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. - */ - -/** - * PDF page operator list. - * - * @typedef {Object} PDFOperatorList - * @property {Array} fnArray - Array containing the operator functions. - * @property {Array} argsArray - Array containing the arguments of the - * functions. - */ - -/** - * Proxy to a PDFPage in the worker thread. - * @class - * @alias PDFPageProxy - */ -var PDFPageProxy = (function PDFPageProxyClosure() { - function PDFPageProxy(pageIndex, pageInfo, transport) { - this.pageIndex = pageIndex; - 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.cleanupAfterRender = false; - this.pendingCleanup = false; - this.intentStates = {}; - this.destroyed = false; - } - PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ { - /** - * @return {number} Page number of the page. First page is 1. - */ - get pageNumber() { - return this.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 {PDFJS.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); - }, - /** - * @param {GetAnnotationsParameters} params - Annotation parameters. - * @return {Promise} A promise that is resolved with an {Array} of the - * annotation objects. - */ - getAnnotations: function PDFPageProxy_getAnnotations(params) { - var intent = (params && params.intent) || null; - - if (!this.annotationsPromise || this.annotationsIntent !== intent) { - this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, - intent); - this.annotationsIntent = intent; - } - return this.annotationsPromise; - }, - /** - * Begins the process of rendering a page to the desired context. - * @param {RenderParameters} params Page render parameters. - * @return {RenderTask} An object that contains the promise, which - * is resolved when the page finishes rendering. - */ - 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.pendingCleanup = false; - - var renderingIntent = (params.intent === 'print' ? 'print' : 'display'); - - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = {}; - } - var intentState = this.intentStates[renderingIntent]; - - // If there's no displayReadyCapability yet, then the operatorList - // was never requested before. Make the request and create the promise. - if (!intentState.displayReadyCapability) { - intentState.receivingOperatorList = true; - intentState.displayReadyCapability = createPromiseCapability(); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.stats.time('Page Request'); - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageNumber - 1, - intent: renderingIntent - }); - } - - var internalRenderTask = new InternalRenderTask(complete, params, - this.objs, - this.commonObjs, - intentState.operatorList, - this.pageNumber); - internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print'; - if (!intentState.renderTasks) { - intentState.renderTasks = []; - } - intentState.renderTasks.push(internalRenderTask); - var renderTask = internalRenderTask.task; - - // Obsolete parameter support - if (params.continueCallback) { - deprecated('render is used with continueCallback parameter'); - renderTask.onContinue = params.continueCallback; - } - - var self = this; - intentState.displayReadyCapability.promise.then( - function pageDisplayReadyPromise(transparency) { - if (self.pendingCleanup) { - complete(); - return; - } - stats.time('Rendering'); - internalRenderTask.initalizeGraphics(transparency); - internalRenderTask.operatorListChanged(); - }, - function pageDisplayReadPromiseError(reason) { - complete(reason); - } - ); - - function complete(error) { - var i = intentState.renderTasks.indexOf(internalRenderTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } - - if (self.cleanupAfterRender) { - self.pendingCleanup = true; - } - self._tryCleanup(); - - if (error) { - internalRenderTask.capability.reject(error); - } else { - internalRenderTask.capability.resolve(); - } - stats.timeEnd('Rendering'); - stats.timeEnd('Overall'); - } - - return renderTask; - }, - - /** - * @return {Promise} A promise resolved with an {@link PDFOperatorList} - * object that represents page's operator list. - */ - getOperatorList: function PDFPageProxy_getOperatorList() { - function operatorListChanged() { - if (intentState.operatorList.lastChunk) { - intentState.opListReadCapability.resolve(intentState.operatorList); - } - } - - var renderingIntent = 'oplist'; - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = {}; - } - var intentState = this.intentStates[renderingIntent]; - - if (!intentState.opListReadCapability) { - var opListTask = {}; - opListTask.operatorListChanged = operatorListChanged; - intentState.receivingOperatorList = true; - intentState.opListReadCapability = createPromiseCapability(); - intentState.renderTasks = []; - intentState.renderTasks.push(opListTask); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageIndex, - intent: renderingIntent - }); - } - return intentState.opListReadCapability.promise; - }, - - /** - * @param {getTextContentParameters} params - getTextContent parameters. - * @return {Promise} That is resolved a {@link TextContent} - * object that represent the page text content. - */ - getTextContent: function PDFPageProxy_getTextContent(params) { - var normalizeWhitespace = (params && params.normalizeWhitespace) || false; - - return this.transport.messageHandler.sendWithPromise('GetTextContent', { - pageIndex: this.pageNumber - 1, - normalizeWhitespace: normalizeWhitespace, - }); - }, - - /** - * Destroys page object. - */ - _destroy: function PDFPageProxy_destroy() { - this.destroyed = true; - this.transport.pageCache[this.pageIndex] = null; - - var waitOn = []; - Object.keys(this.intentStates).forEach(function(intent) { - var intentState = this.intentStates[intent]; - intentState.renderTasks.forEach(function(renderTask) { - var renderCompleted = renderTask.capability.promise. - catch(function () {}); // ignoring failures - waitOn.push(renderCompleted); - renderTask.cancel(); - }); - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - return Promise.all(waitOn); - }, - - /** - * Cleans up resources allocated by the page. (deprecated) - */ - destroy: function() { - deprecated('page destroy method, use cleanup() instead'); - this.cleanup(); - }, - - /** - * Cleans up resources allocated by the page. - */ - cleanup: function PDFPageProxy_cleanup() { - this.pendingCleanup = true; - this._tryCleanup(); - }, - /** - * For internal use only. Attempts to clean up if rendering is in a state - * where that's possible. - * @ignore - */ - _tryCleanup: function PDFPageProxy_tryCleanup() { - if (!this.pendingCleanup || - Object.keys(this.intentStates).some(function(intent) { - var intentState = this.intentStates[intent]; - return (intentState.renderTasks.length !== 0 || - intentState.receivingOperatorList); - }, this)) { - return; - } - - Object.keys(this.intentStates).forEach(function(intent) { - delete this.intentStates[intent]; - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - }, - /** - * For internal use only. - * @ignore - */ - _startRenderPage: function PDFPageProxy_startRenderPage(transparency, - intent) { - var intentState = this.intentStates[intent]; - // TODO Refactor RenderPageRequest to separate rendering - // and operator list logic - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.resolve(transparency); - } - }, - /** - * For internal use only. - * @ignore - */ - _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, - intent) { - var intentState = this.intentStates[intent]; - var i, ii; - // Add the new chunk to the current operator list. - for (i = 0, ii = operatorListChunk.length; i < ii; i++) { - intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); - intentState.operatorList.argsArray.push( - operatorListChunk.argsArray[i]); - } - intentState.operatorList.lastChunk = operatorListChunk.lastChunk; - - // Notify all the rendering tasks there are more operators to be consumed. - for (i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); - } - - if (operatorListChunk.lastChunk) { - intentState.receivingOperatorList = false; - this._tryCleanup(); - } - } - }; - return PDFPageProxy; -})(); - -/** - * PDF.js web worker abstraction, it controls instantiation of PDF documents and - * WorkerTransport for them. If creation of a web worker is not possible, - * a "fake" worker will be used instead. - * @class - */ -var PDFWorker = (function PDFWorkerClosure() { - var nextFakeWorkerId = 0; - - // Loads worker code into main thread. - function setupFakeWorkerGlobal() { - if (!PDFJS.fakeWorkerFilesLoadedCapability) { - PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); - // In the developer build load worker_loader which in turn loads all the - // other files and resolves the promise. In production only the - // pdf.worker.js file is needed. - Util.loadScript(PDFJS.workerSrc, function() { - PDFJS.fakeWorkerFilesLoadedCapability.resolve(); - }); - } - return PDFJS.fakeWorkerFilesLoadedCapability.promise; - } - - function PDFWorker(name) { - this.name = name; - this.destroyed = false; - - this._readyCapability = createPromiseCapability(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - this._initialize(); - } - - PDFWorker.prototype = /** @lends PDFWorker.prototype */ { - get promise() { - return this._readyCapability.promise; - }, - - get port() { - return this._port; - }, - - get messageHandler() { - return this._messageHandler; - }, - - _initialize: function PDFWorker_initialize() { - // 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 v.15.) - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = PDFJS.workerSrc; - if (!workerSrc) { - 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', worker); - - messageHandler.on('test', function PDFWorker_test(data) { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); - return; // worker was destroyed - } - var supportTypedArray = data && data.supportTypedArray; - if (supportTypedArray) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - if (!data.supportTransfers) { - PDFJS.postMessageTransfers = false; - } - this._readyCapability.resolve(); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }.bind(this)); - - messageHandler.on('console_log', function (data) { - console.log.apply(console, data); - }); - messageHandler.on('console_error', function (data) { - console.error.apply(console, data); - }); - - var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]); - // Some versions of Opera throw a DATA_CLONE_ERR on serializing the - // typed array. Also, checking if we can use transfers. - try { - messageHandler.send('test', testObj, [testObj.buffer]); - } catch (ex) { - info('Cannot use postMessage transfers'); - testObj[0] = 0; - 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. - this._setupFakeWorker(); - }, - - _setupFakeWorker: function PDFWorker_setupFakeWorker() { - warn('Setting up fake worker.'); - globalScope.PDFJS.disableWorker = true; - - setupFakeWorkerGlobal().then(function () { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - return; - } - - // If we don't use a worker, just post/sendMessage to the main thread. - var port = { - _listeners: [], - postMessage: function (obj) { - var e = {data: obj}; - this._listeners.forEach(function (listener) { - listener.call(this, e); - }, this); - }, - addEventListener: function (name, listener) { - this._listeners.push(listener); - }, - removeEventListener: function (name, listener) { - var i = this._listeners.indexOf(listener); - this._listeners.splice(i, 1); - }, - terminate: function () {} - }; - this._port = port; - - // All fake workers use the same port, making id unique. - var id = 'fake' + (nextFakeWorkerId++); - - // If the main thread is our worker, setup the handling for the - // messages -- the main thread sends to it self. - var workerHandler = new MessageHandler(id + '_worker', id, port); - PDFJS.WorkerMessageHandler.setup(workerHandler, port); - - var messageHandler = new MessageHandler(id, id + '_worker', port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - }.bind(this)); - }, - - /** - * Destroys the worker instance. - */ - destroy: function PDFWorker_destroy() { - this.destroyed = true; - if (this._webWorker) { - // We need to terminate only web worker created resource. - this._webWorker.terminate(); - this._webWorker = null; - } - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - }; - - return PDFWorker; -})(); -PDFJS.PDFWorker = PDFWorker; - -/** - * For internal use only. - * @ignore - */ -var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; - this.pdfDataRangeTransport = pdfDataRangeTransport; - this.commonObjs = new PDFObjects(); - this.fontLoader = new FontLoader(loadingTask.docId); - - this.destroyed = false; - this.destroyCapability = null; - - this.pageCache = []; - this.pagePromises = []; - this.downloadInfoCapability = createPromiseCapability(); - - this.setupMessageHandler(); - } - WorkerTransport.prototype = { - destroy: function WorkerTransport_destroy() { - if (this.destroyCapability) { - return this.destroyCapability.promise; - } - - this.destroyed = true; - this.destroyCapability = createPromiseCapability(); - - var waitOn = []; - // We need to wait for all renderings to be completed, e.g. - // timeout/rAF can take a long time. - this.pageCache.forEach(function (page) { - if (page) { - waitOn.push(page._destroy()); - } - }); - this.pageCache = []; - this.pagePromises = []; - var self = this; - // We also need to wait for the worker to finish its long running tasks. - var terminated = this.messageHandler.sendWithPromise('Terminate', null); - waitOn.push(terminated); - Promise.all(waitOn).then(function () { - self.fontLoader.clear(); - if (self.pdfDataRangeTransport) { - self.pdfDataRangeTransport.abort(); - self.pdfDataRangeTransport = null; - } - if (self.messageHandler) { - self.messageHandler.destroy(); - self.messageHandler = null; - } - self.destroyCapability.resolve(); - }, this.destroyCapability.reject); - return this.destroyCapability.promise; - }, - - setupMessageHandler: - function WorkerTransport_setupMessageHandler() { - var messageHandler = this.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 - }); - }); - - pdfDataRangeTransport.addProgressiveReadListener(function(chunk) { - messageHandler.send('OnDataRange', { - chunk: chunk - }); - }); - - messageHandler.on('RequestDataRange', - function transportDataRange(data) { - pdfDataRangeTransport.requestDataRange(data.begin, data.end); - }, this); - } - - messageHandler.on('GetDoc', function transportDoc(data) { - var pdfInfo = data.pdfInfo; - this.numPages = data.pdfInfo.numPages; - var loadingTask = this.loadingTask; - var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); - this.pdfDocument = pdfDocument; - loadingTask._capability.resolve(pdfDocument); - }, this); - - messageHandler.on('NeedPassword', - function transportNeedPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.NEED_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('IncorrectPassword', - function transportIncorrectPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.INCORRECT_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { - this.loadingTask._capability.reject( - new InvalidPDFException(exception.message)); - }, this); - - messageHandler.on('MissingPDF', function transportMissingPDF(exception) { - this.loadingTask._capability.reject( - new MissingPDFException(exception.message)); - }, this); - - messageHandler.on('UnexpectedResponse', - function transportUnexpectedResponse(exception) { - this.loadingTask._capability.reject( - new UnexpectedResponseException(exception.message, exception.status)); - }, this); - - messageHandler.on('UnknownError', - function transportUnknownError(exception) { - this.loadingTask._capability.reject( - new UnknownErrorException(exception.message, exception.details)); - }, this); - - messageHandler.on('DataLoaded', function transportPage(data) { - this.downloadInfoCapability.resolve(data); - }, this); - - messageHandler.on('PDFManagerReady', function transportPage(data) { - if (this.pdfDataRangeTransport) { - this.pdfDataRangeTransport.transportReady(); - } - }, this); - - messageHandler.on('StartRenderPage', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page.stats.timeEnd('Page Request'); - page._startRenderPage(data.transparency, data.intent); - }, this); - - messageHandler.on('RenderPageChunk', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page._renderPageChunk(data.operatorList, data.intent); - }, this); - - messageHandler.on('commonobj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - 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 FontFaceObject(exportedData); - } - - this.fontLoader.bind( - [font], - function fontReady(fontObjs) { - this.commonObjs.resolve(id, font); - }.bind(this) - ); - break; - case 'FontPath': - this.commonObjs.resolve(id, data[2]); - break; - default: - error('Got unknown common object type ' + type); - } - }, this); - - messageHandler.on('obj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var id = data[0]; - var pageIndex = data[1]; - var type = data[2]; - var pageProxy = this.pageCache[pageIndex]; - var imageData; - if (pageProxy.objs.hasData(id)) { - return; - } - - switch (type) { - case 'JpegStream': - imageData = data[3]; - loadJpegStream(id, imageData, pageProxy.objs); - break; - case 'Image': - 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 (imageData && '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.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var loadingTask = this.loadingTask; - if (loadingTask.onProgress) { - loadingTask.onProgress({ - loaded: data.loaded, - total: data.total - }); - } - }, this); - - messageHandler.on('PageError', function transportError(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var page = this.pageCache[data.pageNum - 1]; - var intentState = page.intentStates[data.intent]; - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(data.error); - } else { - error(data.error); - } - }, this); - - messageHandler.on('UnsupportedFeature', - function transportUnsupportedFeature(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var featureId = data.featureId; - var loadingTask = this.loadingTask; - if (loadingTask.onUnsupportedFeature) { - loadingTask.onUnsupportedFeature(featureId); - } - PDFJS.UnsupportedManager.notify(featureId); - }, this); - - messageHandler.on('JpegDecode', function(data) { - if (this.destroyed) { - return Promise.reject('Worker was terminated'); - } - - var imageUrl = data[0]; - var components = data[1]; - if (components !== 3 && components !== 1) { - return Promise.reject( - new Error('Only 3 components or 1 component can be returned')); - } - - return new Promise(function (resolve, reject) { - var img = new Image(); - img.onload = function () { - 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; - var i, j; - - if (components === 3) { - for (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 (i = 0, j = 0; i < rgbaLength; i += 4, j++) { - buf[j] = data[i]; - } - } - resolve({ data: buf, width: width, height: height}); - }; - img.onerror = function () { - reject(new Error('JpegDecode failed to load image')); - }; - img.src = imageUrl; - }); - }, this); - }, - - getData: function WorkerTransport_getData() { - return this.messageHandler.sendWithPromise('GetData', null); - }, - - getPage: function WorkerTransport_getPage(pageNumber, capability) { - if (pageNumber <= 0 || pageNumber > this.numPages || - (pageNumber|0) !== pageNumber) { - return Promise.reject(new Error('Invalid page request')); - } - - var pageIndex = pageNumber - 1; - if (pageIndex in this.pagePromises) { - return this.pagePromises[pageIndex]; - } - var promise = this.messageHandler.sendWithPromise('GetPage', { - pageIndex: pageIndex - }).then(function (pageInfo) { - if (this.destroyed) { - throw new Error('Transport destroyed'); - } - var page = new PDFPageProxy(pageIndex, pageInfo, this); - this.pageCache[pageIndex] = page; - return page; - }.bind(this)); - this.pagePromises[pageIndex] = promise; - return promise; - }, - - getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { - return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); - }, - - getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise('GetAnnotations', { - pageIndex: pageIndex, - intent: intent, - }); - }, - - getDestinations: function WorkerTransport_getDestinations() { - return this.messageHandler.sendWithPromise('GetDestinations', null); - }, - - getDestination: function WorkerTransport_getDestination(id) { - return this.messageHandler.sendWithPromise('GetDestination', { id: id }); - }, - - getAttachments: function WorkerTransport_getAttachments() { - return this.messageHandler.sendWithPromise('GetAttachments', null); - }, - - getJavaScript: function WorkerTransport_getJavaScript() { - return this.messageHandler.sendWithPromise('GetJavaScript', null); - }, - - getOutline: function WorkerTransport_getOutline() { - return this.messageHandler.sendWithPromise('GetOutline', null); - }, - - getMetadata: function WorkerTransport_getMetadata() { - return this.messageHandler.sendWithPromise('GetMetadata', null). - then(function transportMetadata(results) { - return { - info: results[0], - metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null) - }; - }); - }, - - getStats: function WorkerTransport_getStats() { - return this.messageHandler.sendWithPromise('GetStats', null); - }, - - startCleanup: function WorkerTransport_startCleanup() { - this.messageHandler.sendWithPromise('Cleanup', null). - then(function endCleanup() { - for (var i = 0, ii = this.pageCache.length; i < ii; i++) { - var page = this.pageCache[i]; - if (page) { - page.cleanup(); - } - } - this.commonObjs.clear(); - this.fontLoader.clear(); - }.bind(this)); - } - }; - return WorkerTransport; - -})(); - -/** - * 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. - * @ignore - */ -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 = { - capability: createPromiseCapability(), - 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).capability.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.capability.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; -})(); - -/** - * Allows controlling of the rendering tasks. - * @class - * @alias RenderTask - */ -var RenderTask = (function RenderTaskClosure() { - function RenderTask(internalRenderTask) { - this._internalRenderTask = internalRenderTask; - - /** - * Callback for incremental rendering -- 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. - * @type {function} - */ - this.onContinue = null; - } - - RenderTask.prototype = /** @lends RenderTask.prototype */ { - /** - * Promise for rendering task completion. - * @return {Promise} - */ - get promise() { - return this._internalRenderTask.capability.promise; - }, - - /** - * Cancels the rendering task. If the task is currently rendering it will - * not be cancelled until graphics pauses with a timeout. The promise that - * this object extends will resolved when cancelled. - */ - cancel: function RenderTask_cancel() { - this._internalRenderTask.cancel(); - }, - - /** - * Registers callbacks to indicate the rendering task completion. - * - * @param {function} onFulfilled The callback for the rendering completion. - * @param {function} onRejected The callback for the rendering failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function RenderTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return RenderTask; -})(); - -/** - * For internal use only. - * @ignore - */ -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.useRequestAnimationFrame = false; - this.cancelled = false; - this.capability = createPromiseCapability(); - this.task = new RenderTask(this); - // caching this-bound methods - this._continueBound = this._continue.bind(this); - this._scheduleNextBound = this._scheduleNext.bind(this); - this._nextBound = this._next.bind(this); - } - - 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.imageLayer); - - this.gfx.beginDrawing(params.transform, 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._continueBound; - } - 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.task.onContinue) { - this.task.onContinue.call(this.task, this._scheduleNextBound); - } else { - this._scheduleNext(); - } - }, - - _scheduleNext: function InternalRenderTask__scheduleNext() { - if (this.useRequestAnimationFrame) { - window.requestAnimationFrame(this._nextBound); - } else { - Promise.resolve(undefined).then(this._nextBound); - } - }, - - _next: function InternalRenderTask__next() { - if (this.cancelled) { - return; - } - this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, - this.operatorListIdx, - this._continueBound, - this.stepper); - if (this.operatorListIdx === this.operatorList.argsArray.length) { - this.running = false; - if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); - this.callback(); - } - } - } - - }; - - return InternalRenderTask; -})(); - -/** - * (Deprecated) Global observer of unsupported feature usages. Use - * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. - */ -PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() { - var listeners = []; - return { - listen: function (cb) { - deprecated('Global UnsupportedManager.listen is used: ' + - ' use PDFDocumentLoadingTask.onUnsupportedFeature instead'); - listeners.push(cb); - }, - notify: function (featureId) { - for (var i = 0, ii = listeners.length; i < ii; i++) { - listeners[i](featureId); - } - } - }; -})(); - - -var Metadata = PDFJS.Metadata = (function MetadataClosure() { - function fixMetadata(meta) { - return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { - var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, - function(code, d1, d2, d3) { - return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }); - var chars = ''; - for (var i = 0; i < bytes.length; i += 2) { - var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); - chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && - code !== 38 && false ? String.fromCharCode(code) : - '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; - } - return '>' + chars; - }); - } - - function Metadata(meta) { - if (typeof meta === 'string') { - // Ghostscript produces invalid metadata - meta = fixMetadata(meta); - - var parser = new DOMParser(); - meta = parser.parseFromString(meta, 'application/xml'); - } else if (!(meta instanceof Document)) { - error('Metadata: Invalid metadata object'); - } - - this.metaDocument = meta; - this.metadata = {}; - this.parse(); - } - - Metadata.prototype = { - parse: function Metadata_parse() { - var doc = this.metaDocument; - var rdf = doc.documentElement; - - if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in - rdf = rdf.firstChild; - while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') { - rdf = rdf.nextSibling; - } - } - - var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null; - if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) { - return; - } - - var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength; - for (i = 0, length = children.length; i < length; i++) { - desc = children[i]; - if (desc.nodeName.toLowerCase() !== 'rdf:description') { - continue; - } - - for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { - if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') { - entry = desc.childNodes[ii]; - name = entry.nodeName.toLowerCase(); - this.metadata[name] = entry.textContent.trim(); - } - } - } - }, - - get: function Metadata_get(name) { - return this.metadata[name] || null; - }, - - has: function Metadata_has(name) { - return typeof this.metadata[name] !== 'undefined'; - } - }; - - return Metadata; -})(); - - -// contexts store most of the state we need natively. -// However, PDF needs a bit more state, which we store here. - -// Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 16; -// Maximum font size that would be used during canvas fillText operations. -var MAX_FONT_SIZE = 100; -var MAX_GROUP_SIZE = 4096; - -// Heuristic value used when enforcing minimum line widths. -var MIN_WIDTH_FACTOR = 0.65; - -var COMPILE_TYPE3_GLYPHS = true; -var MAX_SIZE_TO_COMPILE = 1000; - -var FULL_CHUNK_HEIGHT = 16; - -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 one. - if (!ctx.mozCurrentTransform) { - 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._transformMatrix || [1, 0, 0, 1, 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() { - function CachedCanvases() { - this.cache = Object.create(null); - } - CachedCanvases.prototype = { - getCanvas: function CachedCanvases_getCanvas(id, width, height, - trackTransform) { - var canvasEntry; - if (this.cache[id] !== undefined) { - canvasEntry = this.cache[id]; - canvasEntry.canvas.width = width; - canvasEntry.canvas.height = height; - // reset canvas transform for emulated mozCurrentTransform, if needed - canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0); - } else { - var canvas = createScratchCanvas(width, height); - var ctx = canvas.getContext('2d'); - if (trackTransform) { - addContextCurrentTransform(ctx); - } - this.cache[id] = canvasEntry = {canvas: canvas, context: ctx}; - } - return canvasEntry; - }, - clear: function () { - for (var id in this.cache) { - var canvasEntry = this.cache[id]; - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - canvasEntry.canvas.width = 0; - canvasEntry.canvas.height = 0; - delete this.cache[id]; - } - } - }; - return CachedCanvases; -})(); - -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]); - - // decodes bit-packed mask data - var lineSize = (width + 7) & ~7, data0 = imgData.data; - var data = new Uint8Array(lineSize * height), pos = 0, ii; - for (i = 0, ii = data0.length; i < ii; i++) { - var mask = 128, elem = data0[i]; - while (mask > 0) { - data[pos++] = (elem & mask) ? 0 : 255; - mask >>= 1; - } - } - - // 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 count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - 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 + 1] ? 4 : 0) + - (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - 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.textMatrixScale = 1; - 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; - // Default fore and background colors - this.fillColor = '#000000'; - this.strokeColor = '#000000'; - this.patternFill = false; - // Note: fill alpha applies to all non-stroking operations - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.activeSMask = null; // nonclonable field (see the save method below) - - 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; - // Defines the number of steps before checking the execution time - var EXECUTION_STEPS = 10; - - function CanvasGraphics(canvasCtx, commonObjs, objs, 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.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 = []; - this.groupLevel = 0; - this.smaskStack = []; - this.smaskCounter = 0; - this.tempSMask = null; - this.cachedCanvases = new CachedCanvases(); - if (canvasCtx) { - // NOTE: if mozCurrentTransform is polyfilled, then the current state of - // the transformation must already be set in canvasCtx._transformMatrix. - addContextCurrentTransform(canvasCtx); - } - this.cachedGetSinglePixelWidth = null; - } - - function putBinaryImageData(ctx, imgData) { - if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) { - ctx.putImageData(imgData, 0, 0); - return; - } - - // Put the image data to the canvas in chunks, rather than putting the - // whole image at once. This saves JS memory, because the ImageData object - // is smaller. It also possibly saves C++ memory within the implementation - // of putImageData(). (E.g. in Firefox we make two short-lived copies of - // the data passed to putImageData()). |n| shouldn't be too small, however, - // because too many putImageData() calls will slow things down. - // - // Note: as written, if the last chunk is partial, the putImageData() call - // will (conceptually) put pixels past the bounds of the canvas. But - // that's ok; any such pixels are ignored. - - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0, destPos; - var src = imgData.data; - var dest = chunkImgData.data; - var i, j, thisChunkHeight, elemsInThisChunk; - - // There are multiple forms in which the pixel data can be passed, and - // imgData.kind tells us which one this is. - if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { - // Grayscale, 1 bit per pixel (i.e. black-and-white). - var srcLength = src.byteLength; - var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) : - new Uint32ArrayView(dest); - var dest32DataLength = dest32.length; - var fullSrcDiff = (width + 7) >> 3; - var white = 0xFFFFFFFF; - var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ? - 0xFF000000 : 0x000000FF; - for (i = 0; i < totalChunks; i++) { - thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - destPos = 0; - for (j = 0; j < thisChunkHeight; j++) { - var srcDiff = srcLength - srcPos; - var k = 0; - var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7; - var kEndUnrolled = kEnd & ~7; - var mask = 0; - var srcByte = 0; - for (; k < kEndUnrolled; k += 8) { - srcByte = src[srcPos++]; - dest32[destPos++] = (srcByte & 128) ? white : black; - dest32[destPos++] = (srcByte & 64) ? white : black; - dest32[destPos++] = (srcByte & 32) ? white : black; - dest32[destPos++] = (srcByte & 16) ? white : black; - dest32[destPos++] = (srcByte & 8) ? white : black; - dest32[destPos++] = (srcByte & 4) ? white : black; - dest32[destPos++] = (srcByte & 2) ? white : black; - dest32[destPos++] = (srcByte & 1) ? white : black; - } - for (; k < kEnd; k++) { - if (mask === 0) { - srcByte = src[srcPos++]; - mask = 128; - } - - dest32[destPos++] = (srcByte & mask) ? white : black; - mask >>= 1; - } - } - // We ran out of input. Make all remaining pixels transparent. - while (destPos < dest32DataLength) { - dest32[destPos++] = 0; - } - - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else if (imgData.kind === ImageKind.RGBA_32BPP) { - // RGBA, 32-bits per pixel. - - j = 0; - elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; - for (i = 0; i < fullChunks; i++) { - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - srcPos += elemsInThisChunk; - - ctx.putImageData(chunkImgData, 0, j); - j += FULL_CHUNK_HEIGHT; - } - if (i < totalChunks) { - elemsInThisChunk = width * partialChunkHeight * 4; - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - ctx.putImageData(chunkImgData, 0, j); - } - - } else if (imgData.kind === ImageKind.RGB_24BPP) { - // RGB, 24-bits per pixel. - thisChunkHeight = FULL_CHUNK_HEIGHT; - elemsInThisChunk = width * thisChunkHeight; - for (i = 0; i < totalChunks; i++) { - if (i >= fullChunks) { - thisChunkHeight = partialChunkHeight; - elemsInThisChunk = width * thisChunkHeight; - } - - destPos = 0; - for (j = elemsInThisChunk; j--;) { - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = 255; - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else { - error('bad image kind: ' + imgData.kind); - } - } - - function putBinaryImageMask(ctx, imgData) { - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0; - var src = imgData.data; - var dest = chunkImgData.data; - - for (var i = 0; i < totalChunks; i++) { - var thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - - // Expand the mask so it can be used by the canvas. Any required - // inversion has already been handled. - var destPos = 3; // alpha component offset - for (var j = 0; j < thisChunkHeight; j++) { - var mask = 0; - for (var k = 0; k < width; k++) { - if (!mask) { - var elem = src[srcPos++]; - mask = 128; - } - dest[destPos] = (elem & mask) ? 0 : 255; - destPos += 4; - mask >>= 1; - } - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } - - 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 (sourceCtx[property] !== undefined) { - destCtx[property] = sourceCtx[property]; - } - } - if (sourceCtx.setLineDash !== undefined) { - destCtx.setLineDash(sourceCtx.getLineDash()); - destCtx.lineDashOffset = sourceCtx.lineDashOffset; - } else if (sourceCtx.mozDashOffset !== undefined) { - destCtx.mozDash = sourceCtx.mozDash; - destCtx.mozDashOffset = sourceCtx.mozDashOffset; - } - } - - function composeSMaskBackdrop(bytes, r0, g0, b0) { - var length = bytes.length; - for (var i = 3; i < length; i += 4) { - var alpha = bytes[i]; - if (alpha === 0) { - bytes[i - 3] = r0; - bytes[i - 2] = g0; - bytes[i - 1] = b0; - } else if (alpha < 255) { - var alpha_ = 255 - alpha; - bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8; - bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8; - bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8; - } - } - } - - function composeSMaskAlpha(maskData, layerData, transferMap) { - var length = maskData.length; - var scale = 1 / 255; - for (var i = 3; i < length; i += 4) { - var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; - layerData[i] = (layerData[i] * alpha * scale) | 0; - } - } - - function composeSMaskLuminosity(maskData, layerData, transferMap) { - var length = maskData.length; - for (var i = 3; i < length; i += 4) { - var y = (maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000 - (maskData[i - 2] * 152) + // * 0.59 .... - (maskData[i - 1] * 28); // * 0.11 .... - layerData[i] = transferMap ? - (layerData[i] * transferMap[y >> 8]) >> 8 : - (layerData[i] * y) >> 16; - } - } - - function genericComposeSMask(maskCtx, layerCtx, width, height, - subtype, backdrop, transferMap) { - var hasBackdrop = !!backdrop; - var r0 = hasBackdrop ? backdrop[0] : 0; - var g0 = hasBackdrop ? backdrop[1] : 0; - var b0 = hasBackdrop ? backdrop[2] : 0; - - var composeFn; - if (subtype === 'Luminosity') { - composeFn = composeSMaskLuminosity; - } else { - composeFn = composeSMaskAlpha; - } - - // processing image in chunks to save memory - var PIXELS_TO_PROCESS = 1048576; - var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (var row = 0; row < height; row += chunkSize) { - var chunkHeight = Math.min(chunkSize, height - row); - var maskData = maskCtx.getImageData(0, row, width, chunkHeight); - var layerData = layerCtx.getImageData(0, row, width, chunkHeight); - - if (hasBackdrop) { - composeSMaskBackdrop(maskData.data, r0, g0, b0); - } - composeFn(maskData.data, layerData.data, transferMap); - - maskCtx.putImageData(layerData, 0, row); - } - } - - function composeSMask(ctx, smask, layerCtx) { - var mask = smask.canvas; - var maskCtx = smask.context; - - ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, - smask.offsetX, smask.offsetY); - - var backdrop = smask.backdrop || null; - if (!smask.transferMap && WebGLUtils.isEnabled) { - var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask, - {subtype: smask.subtype, backdrop: backdrop}); - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(composed, smask.offsetX, smask.offsetY); - return; - } - genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, - smask.subtype, backdrop, smask.transferMap); - ctx.drawImage(mask, 0, 0); - } - - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; - - CanvasGraphics.prototype = { - - beginDrawing: function CanvasGraphics_beginDrawing(transform, 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, creating temporary - // transparent canvas when we have blend modes. - var width = this.ctx.canvas.width; - var height = this.ctx.canvas.height; - - this.ctx.save(); - this.ctx.fillStyle = 'rgb(255, 255, 255)'; - this.ctx.fillRect(0, 0, width, height); - this.ctx.restore(); - - if (transparency) { - var transparentCanvas = this.cachedCanvases.getCanvas( - 'transparent', width, height, true); - this.compositeCtx = this.ctx; - this.transparentCanvas = transparentCanvas.canvas; - this.ctx = transparentCanvas.context; - this.ctx.save(); - // The transform can be applied before rendering, transferring it to - // the new canvas. - this.ctx.transform.apply(this.ctx, - this.compositeCtx.mozCurrentTransform); - } - - this.ctx.save(); - if (transform) { - this.ctx.transform.apply(this.ctx, transform); - } - this.ctx.transform.apply(this.ctx, viewport.transform); - - this.baseTransform = this.ctx.mozCurrentTransform.slice(); - - 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 chunkOperations = (argsArrayLen - i > EXECUTION_STEPS && - typeof continueCallback === 'function'); - var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; - var steps = 0; - - var commonObjs = this.commonObjs; - var objs = this.objs; - var fnId; - - while (true) { - if (stepper !== undefined && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - - fnId = fnArray[i]; - - if (fnId !== OPS.dependency) { - this[fnId].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[0] === 'g' && depObjId[1] === '_'; - var objsPool = common ? commonObjs : objs; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objsPool.isResolved(depObjId)) { - objsPool.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 and - // `continueCallback` is specified, interrupt the execution. - if (chunkOperations && ++steps > EXECUTION_STEPS) { - if (Date.now() > endTime) { - continueCallback(); - return i; - } - steps = 0; - } - - // 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(); - - if (this.transparentCanvas) { - this.ctx = this.compositeCtx; - this.ctx.drawImage(this.transparentCanvas, 0, 0); - this.transparentCanvas = null; - } - - this.cachedCanvases.clear(); - WebGLUtils.clear(); - - 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 (ctx.setLineDash !== undefined) { - 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; - case 'SMask': - if (this.current.activeSMask) { - this.endSMaskGroup(); - } - this.current.activeSMask = value ? this.tempSMask : null; - if (this.current.activeSMask) { - this.beginSMaskGroup(); - } - this.tempSMask = null; - break; - } - } - }, - beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { - - var activeSMask = this.current.activeSMask; - var drawnWidth = activeSMask.canvas.width; - var drawnHeight = activeSMask.canvas.height; - var cacheId = 'smaskGroupAt' + this.groupLevel; - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - - var currentCtx = this.ctx; - var currentTransform = currentCtx.mozCurrentTransform; - this.ctx.save(); - - var groupCtx = scratchCanvas.context; - groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); - groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - copyCtxState(currentCtx, groupCtx); - this.ctx = groupCtx; - this.setGState([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - endSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.ctx; - this.groupLevel--; - this.ctx = this.groupStack.pop(); - - composeSMask(this.ctx, this.current.activeSMask, groupCtx); - this.ctx.restore(); - copyCtxState(groupCtx, this.ctx); - }, - save: function CanvasGraphics_save() { - this.ctx.save(); - var old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - this.current.activeSMask = null; - }, - restore: function CanvasGraphics_restore() { - if (this.stateStack.length !== 0) { - if (this.current.activeSMask !== null) { - this.endSMaskGroup(); - } - - this.current = this.stateStack.pop(); - this.ctx.restore(); - - // Ensure that the clipping path is reset (fixes issue6413.pdf). - this.pendingClip = null; - - this.cachedGetSinglePixelWidth = null; - } - }, - transform: function CanvasGraphics_transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - - this.cachedGetSinglePixelWidth = null; - }, - - // Path - constructPath: function CanvasGraphics_constructPath(ops, args) { - var ctx = this.ctx; - var current = this.current; - var x = current.x, y = current.y; - for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - if (width === 0) { - width = this.getSinglePixelWidth(); - } - if (height === 0) { - height = this.getSinglePixelWidth(); - } - var xw = x + width; - var yh = y + height; - this.ctx.moveTo(x, y); - this.ctx.lineTo(xw, y); - this.ctx.lineTo(xw, yh); - this.ctx.lineTo(x, yh); - this.ctx.lineTo(x, y); - this.ctx.closePath(); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - ctx.moveTo(x, y); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - ctx.lineTo(x, y); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], - x, y); - j += 6; - break; - case OPS.curveTo2: - ctx.bezierCurveTo(x, y, args[j], args[j + 1], - args[j + 2], args[j + 3]); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); - j += 4; - break; - case OPS.closePath: - ctx.closePath(); - break; - } - } - current.setCurrentPoint(x, y); - }, - closePath: function CanvasGraphics_closePath() { - this.ctx.closePath(); - }, - stroke: function CanvasGraphics_stroke(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; - // Prevent drawing too thin lines by enforcing a minimum line width. - ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, - this.current.lineWidth); - // 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, this); - 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 isPatternFill = this.current.patternFill; - var needRestore = false; - - if (isPatternFill) { - ctx.save(); - if (this.baseTransform) { - ctx.setTransform.apply(ctx, this.baseTransform); - } - ctx.fillStyle = fillColor.getPattern(ctx, this); - needRestore = true; - } - - if (this.pendingEOFill) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.fill(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.fill('evenodd'); - } - this.pendingEOFill = false; - } else { - 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.textMatrixScale = 1; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - endText: function CanvasGraphics_endText() { - var paths = this.pendingTextPaths; - var ctx = this.ctx; - if (paths === undefined) { - ctx.beginPath(); - return; - } - - 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.isType3Font) { - return; // we don't need ctx.font for Type3 fonts - } - - var name = fontObj.loadedName || 'sans-serif'; - var bold = fontObj.black ? (fontObj.bold ? '900' : '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 ? MIN_FONT_SIZE : - size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size; - this.current.fontSizeScale = size / browserFontSize; - - 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.textMatrixScale = Math.sqrt(a * a + b * b); - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - nextLine: function CanvasGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - paintChar: function CanvasGraphics_paintChar(character, x, y) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var textRenderingMode = current.textRenderingMode; - var fontSize = current.fontSize / current.fontSizeScale; - var fillStrokeMode = textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - var isAddToPathSet = !!(textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - - var addToPath; - if (font.disableFontFace || isAddToPathSet) { - addToPath = font.getPathGenerator(this.commonObjs, 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 - }); - } - }, - - get isFontSubpixelAAEnabled() { - // Checks if anti-aliasing is enabled when scaled text is painted. - // On Windows GDI scaled fonts looks bad. - var ctx = document.createElement('canvas').getContext('2d'); - ctx.scale(1.5, 1); - ctx.fillText('I', 0, 10); - var data = ctx.getImageData(0, 0, 10, 10).data; - var enabled = false; - for (var i = 3; i < data.length; i += 4) { - if (data[i] > 0 && data[i] < 255) { - enabled = true; - break; - } - } - return shadow(this, 'isFontSubpixelAAEnabled', enabled); - }, - - showText: function CanvasGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - if (font.isType3Font) { - return this.showType3Text(glyphs); - } - - var fontSize = current.fontSize; - if (fontSize === 0) { - return; - } - - var ctx = this.ctx; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var spacingDir = vertical ? 1 : -1; - var defaultVMetrics = font.defaultVMetrics; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var simpleFillText = - current.textRenderingMode === TextRenderingMode.FILL && - !font.disableFontFace; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - - if (fontDirection > 0) { - ctx.scale(textHScale, -1); - } else { - ctx.scale(textHScale, 1); - } - - var lineWidth = current.lineWidth; - var scale = current.textMatrixScale; - if (scale === 0 || lineWidth === 0) { - var fillStrokeMode = current.textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - this.cachedGetSinglePixelWidth = null; - lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; - } - } else { - lineWidth /= scale; - } - - if (fontSizeScale !== 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - - ctx.lineWidth = lineWidth; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (isNum(glyph)) { - x += spacingDir * glyph * fontSize / 1000; - continue; - } - - var restoreNeeded = false; - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var character = glyph.fontChar; - var accent = glyph.accent; - var scaledX, scaledY, scaledAccentX, scaledAccentY; - var width = glyph.width; - if (vertical) { - var vmetric, vx, vy; - vmetric = glyph.vmetric || defaultVMetrics; - vx = glyph.vmetric ? vmetric[1] : width * 0.5; - vx = -vx * widthAdvanceScale; - vy = vmetric[2] * widthAdvanceScale; - - width = vmetric ? -vmetric[0] : width; - 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: rescale per - // character if measured width is greater than expected glyph width - // and subpixel-aa is enabled, otherwise just center the glyph. - var measuredWidth = ctx.measureText(character).width * 1000 / - fontSize * fontSizeScale; - if (width < measuredWidth && this.isFontSubpixelAAEnabled) { - var characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - } else if (width !== measuredWidth) { - scaledX += (width - measuredWidth) / 2000 * - fontSize / fontSizeScale; - } - } - - if (simpleFillText && !accent) { - // common case - ctx.fillText(character, scaledX, scaledY); - } else { - 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); - } - } - - var charWidth = width * widthAdvanceScale + spacing * fontDirection; - x += charWidth; - - if (restoreNeeded) { - ctx.restore(); - } - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - ctx.restore(); - }, - - showType3Text: function CanvasGraphics_showType3Text(glyphs) { - // Type3 fonts - each glyph is a "mini-PDF" - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var fontDirection = current.fontDirection; - var spacingDir = font.vertical ? 1 : -1; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * fontDirection; - var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; - var glyphsLength = glyphs.length; - var isTextInvisible = - current.textRenderingMode === TextRenderingMode.INVISIBLE; - var i, glyph, width, spacingLength; - - if (isTextInvisible || fontSize === 0) { - return; - } - this.cachedGetSinglePixelWidth = null; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); - - ctx.scale(textHScale, fontDirection); - - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (isNum(glyph)) { - spacingLength = spacingDir * glyph * fontSize / 1000; - this.ctx.translate(spacingLength, 0); - current.x += spacingLength * textHScale; - continue; - } - - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var operatorList = font.charProcOperatorList[glyph.operatorListId]; - if (!operatorList) { - warn('Type3 character \"' + glyph.operatorListId + - '\" is not available'); - continue; - } - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - this.executeOperatorList(operatorList); - this.restore(); - - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + spacing; - - ctx.translate(width, 0); - current.x += width * textHScale; - } - ctx.restore(); - this.processingType3 = null; - }, - - // 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.ctx.rect(llx, lly, urx - llx, ury - lly); - this.clip(); - this.endPath(); - }, - - // Color - getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { - var pattern; - if (IR[0] === 'TilingPattern') { - var color = IR[1]; - var baseTransform = this.baseTransform || - this.ctx.mozCurrentTransform.slice(); - pattern = new TilingPattern(IR, color, this.ctx, this.objs, - this.commonObjs, baseTransform); - } else { - pattern = getShadingPatternFromIR(IR); - } - return pattern; - }, - setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { - this.current.strokeColor = this.getColorN_Pattern(arguments); - }, - setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { - this.current.fillColor = this.getColorN_Pattern(arguments); - this.current.patternFill = true; - }, - setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - this.current.patternFill = false; - }, - - shadingFill: function CanvasGraphics_shadingFill(patternIR) { - var ctx = this.ctx; - - this.save(); - var pattern = getShadingPatternFromIR(patternIR); - ctx.fillStyle = pattern.getPattern(ctx, this, true); - - 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); - } 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.baseTransformStack.push(this.baseTransform); - - if (isArray(matrix) && 6 === matrix.length) { - this.transform.apply(this, matrix); - } - - this.baseTransform = this.ctx.mozCurrentTransform; - - if (isArray(bbox) && 4 === bbox.length) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - this.ctx.rect(bbox[0], bbox[1], width, height); - this.clip(); - this.endPath(); - } - }, - - paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { - this.restore(); - 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) { - warn('Knockout groups not supported.'); - } - - 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); - // Clip the bounding box to the current canvas. - var canvasBounds = [0, - 0, - currentCtx.canvas.width, - currentCtx.canvas.height]; - bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; - // 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 offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - var scaleX = 1, scaleY = 1; - if (drawnWidth > MAX_GROUP_SIZE) { - scaleX = drawnWidth / MAX_GROUP_SIZE; - drawnWidth = MAX_GROUP_SIZE; - } - if (drawnHeight > MAX_GROUP_SIZE) { - scaleY = drawnHeight / MAX_GROUP_SIZE; - drawnHeight = MAX_GROUP_SIZE; - } - - var cacheId = 'groupAt' + this.groupLevel; - if (group.smask) { - // Using two cache entries is case if masks are used one after another. - cacheId += '_smask_' + ((this.smaskCounter++) % 2); - } - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - var groupCtx = scratchCanvas.context; - - // Since we created a new canvas that is just the size of the bounding box - // we have to translate the group ctx. - groupCtx.scale(1 / scaleX, 1 / scaleY); - groupCtx.translate(-offsetX, -offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - if (group.smask) { - // Saving state and cached mask to be used in setGState. - this.smaskStack.push({ - canvas: scratchCanvas.canvas, - context: groupCtx, - offsetX: offsetX, - offsetY: offsetY, - scaleX: scaleX, - scaleY: scaleY, - subtype: group.smask.subtype, - backdrop: group.smask.backdrop, - transferMap: group.smask.transferMap || null - }); - } else { - // Setup the current ctx so when the group is popped we draw it at the - // right location. - currentCtx.setTransform(1, 0, 0, 1, 0, 0); - currentCtx.translate(offsetX, offsetY); - currentCtx.scale(scaleX, scaleY); - } - // 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([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - - endGroup: function CanvasGraphics_endGroup(group) { - this.groupLevel--; - 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 (this.ctx.imageSmoothingEnabled !== undefined) { - this.ctx.imageSmoothingEnabled = false; - } else { - this.ctx.mozImageSmoothingEnabled = false; - } - if (group.smask) { - this.tempSMask = this.smaskStack.pop(); - } else { - 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 (isArray(rect) && 4 === rect.length) { - var width = rect[2] - rect[0]; - var height = rect[3] - rect[1]; - this.ctx.rect(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) { - warn('Dependent image isn\'t ready yet'); - return; - } - - 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 fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var glyph = this.processingType3; - - if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { - 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 = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, img); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - this.paintInlineImageXObject(maskCanvas.canvas); - }, - - paintImageMaskXObjectRepeat: - function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, - scaleY, positions) { - var width = imgData.width; - var height = imgData.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, imgData); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - var ctx = this.ctx; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - ctx.save(); - ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageMaskXObjectGroup: - function CanvasGraphics_paintImageMaskXObjectGroup(images) { - var ctx = this.ctx; - - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - for (var i = 0, ii = images.length; i < ii; i++) { - var image = images[i]; - var width = image.width, height = image.height; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, image); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - ctx.save(); - ctx.transform.apply(ctx, image.transform); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - this.paintInlineImageXObject(imgData); - }, - - paintImageXObjectRepeat: - function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, - positions) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - var width = imgData.width; - var height = imgData.height; - var map = []; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - map.push({transform: [scaleX, 0, 0, scaleY, positions[i], - positions[i + 1]], x: 0, y: 0, w: width, h: height}); - } - this.paintInlineImageXObjectGroup(imgData, map); - }, - - 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, tmpCanvas; - // instanceof HTMLElement does not work in jsdom node.js module - if (imgData instanceof HTMLElement || !imgData.data) { - imgToPaint = imgData; - } else { - tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', - width, height); - var tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - imgToPaint = tmpCanvas.canvas; - } - - 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; - } - tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, - newWidth, newHeight); - tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, newWidth, newHeight); - tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, - 0, 0, newWidth, newHeight); - imgToPaint = tmpCanvas.canvas; - 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 = this.cachedCanvases.getCanvas('inlineImage', w, h); - var tmpCtx = tmpCanvas.context; - 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.canvas, 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(); - } - }, - - paintSolidColorImageMask: - function CanvasGraphics_paintSolidColorImageMask() { - this.ctx.fillRect(0, 0, 1, 1); - }, - - paintXObject: function CanvasGraphics_paintXObject() { - warn('Unsupported \'paintXObject\' command.'); - }, - - // 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() { - var ctx = this.ctx; - if (this.pendingClip) { - if (this.pendingClip === EO_CLIP) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.clip(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.clip('evenodd'); - } - } else { - ctx.clip(); - } - this.pendingClip = null; - } - ctx.beginPath(); - }, - getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { - if (this.cachedGetSinglePixelWidth === null) { - var inverse = this.ctx.mozCurrentTransformInverse; - // max of the current horizontal and vertical scale - this.cachedGetSinglePixelWidth = Math.sqrt(Math.max( - (inverse[0] * inverse[0] + inverse[1] * inverse[1]), - (inverse[2] * inverse[2] + inverse[3] * inverse[3]))); - } - return this.cachedGetSinglePixelWidth; - }, - 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] - ]; - } - }; - - for (var op in OPS) { - CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; - } - - return CanvasGraphics; -})(); - - -var WebGLUtils = (function WebGLUtilsClosure() { - function loadShader(gl, code, shaderType) { - var shader = gl.createShader(shaderType); - gl.shaderSource(shader, code); - gl.compileShader(shader); - var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); - if (!compiled) { - var errorMsg = gl.getShaderInfoLog(shader); - throw new Error('Error during shader compilation: ' + errorMsg); - } - return shader; - } - function createVertexShader(gl, code) { - return loadShader(gl, code, gl.VERTEX_SHADER); - } - function createFragmentShader(gl, code) { - return loadShader(gl, code, gl.FRAGMENT_SHADER); - } - function createProgram(gl, shaders) { - var program = gl.createProgram(); - for (var i = 0, ii = shaders.length; i < ii; ++i) { - gl.attachShader(program, shaders[i]); - } - gl.linkProgram(program); - var linked = gl.getProgramParameter(program, gl.LINK_STATUS); - if (!linked) { - var errorMsg = gl.getProgramInfoLog(program); - throw new Error('Error during program linking: ' + errorMsg); - } - return program; - } - function createTexture(gl, image, textureId) { - gl.activeTexture(textureId); - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - - // Set the parameters so we can render any size image. - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - - // Upload the image into the texture. - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); - return texture; - } - - var currentGL, currentCanvas; - function generateGL() { - if (currentGL) { - return; - } - currentCanvas = document.createElement('canvas'); - currentGL = currentCanvas.getContext('webgl', - { premultipliedalpha: false }); - } - - var smaskVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec2 a_texCoord; \ - \ - uniform vec2 u_resolution; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_texCoord = a_texCoord; \ - } '; - - var smaskFragmentShaderCode = '\ - precision mediump float; \ - \ - uniform vec4 u_backdrop; \ - uniform int u_subtype; \ - uniform sampler2D u_image; \ - uniform sampler2D u_mask; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec4 imageColor = texture2D(u_image, v_texCoord); \ - vec4 maskColor = texture2D(u_mask, v_texCoord); \ - if (u_backdrop.a > 0.0) { \ - maskColor.rgb = maskColor.rgb * maskColor.a + \ - u_backdrop.rgb * (1.0 - maskColor.a); \ - } \ - float lum; \ - if (u_subtype == 0) { \ - lum = maskColor.a; \ - } else { \ - lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \ - maskColor.b * 0.11; \ - } \ - imageColor.a *= lum; \ - imageColor.rgb *= imageColor.a; \ - gl_FragColor = imageColor; \ - } '; - - var smaskCache = null; - - function initSmaskGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, smaskVertexShaderCode); - var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop'); - cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype'); - - var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord'); - var texLayerLocation = gl.getUniformLocation(program, 'u_image'); - var texMaskLocation = gl.getUniformLocation(program, 'u_mask'); - - // provide texture coordinates for the rectangle. - var texCoordBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 0.0, 1.0, - 1.0, 0.0, - 1.0, 1.0]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(texCoordLocation); - gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); - - gl.uniform1i(texLayerLocation, 0); - gl.uniform1i(texMaskLocation, 1); - - smaskCache = cache; - } - - function composeSMask(layer, mask, properties) { - var width = layer.width, height = layer.height; - - if (!smaskCache) { - initSmaskGL(); - } - var cache = smaskCache,canvas = cache.canvas, gl = cache.gl; - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - if (properties.backdrop) { - gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], - properties.backdrop[1], properties.backdrop[2], 1); - } else { - gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0); - } - gl.uniform1i(cache.subtypeLocation, - properties.subtype === 'Luminosity' ? 1 : 0); - - // Create a textures - var texture = createTexture(gl, layer, gl.TEXTURE0); - var maskTexture = createTexture(gl, mask, gl.TEXTURE1); - - - // Create a buffer and put a single clipspace rectangle in - // it (2 triangles) - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0, 0, - width, 0, - 0, height, - 0, height, - width, 0, - width, height]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - // draw - gl.clearColor(0, 0, 0, 0); - gl.enable(gl.BLEND); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.clear(gl.COLOR_BUFFER_BIT); - - gl.drawArrays(gl.TRIANGLES, 0, 6); - - gl.flush(); - - gl.deleteTexture(texture); - gl.deleteTexture(maskTexture); - gl.deleteBuffer(buffer); - - return canvas; - } - - var figuresVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec3 a_color; \ - \ - uniform vec2 u_resolution; \ - uniform vec2 u_scale; \ - uniform vec2 u_offset; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - vec2 position = (a_position + u_offset) * u_scale; \ - vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_color = vec4(a_color / 255.0, 1.0); \ - } '; - - var figuresFragmentShaderCode = '\ - precision mediump float; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - gl_FragColor = v_color; \ - } '; - - var figuresCache = null; - - function initFiguresGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, figuresVertexShaderCode); - var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.scaleLocation = gl.getUniformLocation(program, 'u_scale'); - cache.offsetLocation = gl.getUniformLocation(program, 'u_offset'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.colorLocation = gl.getAttribLocation(program, 'a_color'); - - figuresCache = cache; - } - - function drawFigures(width, height, backgroundColor, figures, context) { - if (!figuresCache) { - initFiguresGL(); - } - var cache = figuresCache, canvas = cache.canvas, gl = cache.gl; - - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - // count triangle points - var count = 0; - var i, ii, rows; - for (i = 0, ii = figures.length; i < ii; i++) { - switch (figures[i].type) { - case 'lattice': - rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0; - count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; - break; - case 'triangles': - count += figures[i].coords.length; - break; - } - } - // transfer data - var coords = new Float32Array(count * 2); - var colors = new Uint8Array(count * 3); - var coordsMap = context.coords, colorsMap = context.colors; - var pIndex = 0, cIndex = 0; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - switch (figure.type) { - case 'lattice': - var cols = figure.verticesPerRow; - rows = (ps.length / cols) | 0; - for (var row = 1; row < rows; row++) { - var offset = row * cols + 1; - for (var col = 1; col < cols; col++, offset++) { - coords[pIndex] = coordsMap[ps[offset - cols - 1]]; - coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; - coords[pIndex + 2] = coordsMap[ps[offset - cols]]; - coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1]; - coords[pIndex + 4] = coordsMap[ps[offset - 1]]; - coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1]; - colors[cIndex] = colorsMap[cs[offset - cols - 1]]; - colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1]; - colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2]; - colors[cIndex + 3] = colorsMap[cs[offset - cols]]; - colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1]; - colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2]; - colors[cIndex + 6] = colorsMap[cs[offset - 1]]; - colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1]; - colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2]; - - coords[pIndex + 6] = coords[pIndex + 2]; - coords[pIndex + 7] = coords[pIndex + 3]; - coords[pIndex + 8] = coords[pIndex + 4]; - coords[pIndex + 9] = coords[pIndex + 5]; - coords[pIndex + 10] = coordsMap[ps[offset]]; - coords[pIndex + 11] = coordsMap[ps[offset] + 1]; - colors[cIndex + 9] = colors[cIndex + 3]; - colors[cIndex + 10] = colors[cIndex + 4]; - colors[cIndex + 11] = colors[cIndex + 5]; - colors[cIndex + 12] = colors[cIndex + 6]; - colors[cIndex + 13] = colors[cIndex + 7]; - colors[cIndex + 14] = colors[cIndex + 8]; - colors[cIndex + 15] = colorsMap[cs[offset]]; - colors[cIndex + 16] = colorsMap[cs[offset] + 1]; - colors[cIndex + 17] = colorsMap[cs[offset] + 2]; - pIndex += 12; - cIndex += 18; - } - } - break; - case 'triangles': - for (var j = 0, jj = ps.length; j < jj; j++) { - coords[pIndex] = coordsMap[ps[j]]; - coords[pIndex + 1] = coordsMap[ps[j] + 1]; - colors[cIndex] = colorsMap[cs[j]]; - colors[cIndex + 1] = colorsMap[cs[j] + 1]; - colors[cIndex + 2] = colorsMap[cs[j] + 2]; - pIndex += 2; - cIndex += 3; - } - break; - } - } - - // draw - if (backgroundColor) { - gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, - backgroundColor[2] / 255, 1.0); - } else { - gl.clearColor(0, 0, 0, 0); - } - gl.clear(gl.COLOR_BUFFER_BIT); - - var coordsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - var colorsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.colorLocation); - gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, - 0, 0); - - gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY); - gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY); - - gl.drawArrays(gl.TRIANGLES, 0, count); - - gl.flush(); - - gl.deleteBuffer(coordsBuffer); - gl.deleteBuffer(colorsBuffer); - - return canvas; - } - - function cleanup() { - if (smaskCache && smaskCache.canvas) { - smaskCache.canvas.width = 0; - smaskCache.canvas.height = 0; - } - if (figuresCache && figuresCache.canvas) { - figuresCache.canvas.width = 0; - figuresCache.canvas.height = 0; - } - smaskCache = null; - figuresCache = null; - } - - return { - get isEnabled() { - if (PDFJS.disableWebGL) { - return false; - } - var enabled = false; - try { - generateGL(); - enabled = !!currentGL; - } catch (e) { } - return shadow(this, 'isEnabled', enabled); - }, - composeSMask: composeSMask, - drawFigures: drawFigures, - clear: cleanup - }; -})(); - - -var ShadingIRs = {}; - -ShadingIRs.RadialAxial = { - fromIR: function RadialAxial_fromIR(raw) { - var type = raw[1]; - var colorStops = raw[2]; - var p0 = raw[3]; - var p1 = raw[4]; - var r0 = raw[5]; - var r1 = raw[6]; - return { - type: 'Pattern', - getPattern: function RadialAxial_getPattern(ctx) { - var grad; - if (type === 'axial') { - grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); - } else if (type === 'radial') { - grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); - } - - for (var i = 0, ii = colorStops.length; i < ii; ++i) { - var c = colorStops[i]; - grad.addColorStop(c[0], c[1]); - } - return grad; - } - }; - } -}; - -var createMeshCanvas = (function createMeshCanvasClosure() { - function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { - // Very basic Gouraud-shaded triangle rasterization algorithm. - var coords = context.coords, colors = context.colors; - var bytes = data.data, rowSize = data.width * 4; - var tmp; - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - if (coords[p2 + 1] > coords[p3 + 1]) { - tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp; - } - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - var x1 = (coords[p1] + context.offsetX) * context.scaleX; - var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - var x2 = (coords[p2] + context.offsetX) * context.scaleX; - var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - var x3 = (coords[p3] + context.offsetX) * context.scaleX; - var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; - if (y1 >= y3) { - return; - } - var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2]; - var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2]; - var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2]; - - var minY = Math.round(y1), maxY = Math.round(y3); - var xa, car, cag, cab; - var xb, cbr, cbg, cbb; - var k; - for (var y = minY; y <= maxY; y++) { - if (y < y2) { - k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2); - xa = x1 - (x1 - x2) * k; - car = c1r - (c1r - c2r) * k; - cag = c1g - (c1g - c2g) * k; - cab = c1b - (c1b - c2b) * k; - } else { - k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3); - xa = x2 - (x2 - x3) * k; - car = c2r - (c2r - c3r) * k; - cag = c2g - (c2g - c3g) * k; - cab = c2b - (c2b - c3b) * k; - } - k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3); - xb = x1 - (x1 - x3) * k; - cbr = c1r - (c1r - c3r) * k; - cbg = c1g - (c1g - c3g) * k; - cbb = c1b - (c1b - c3b) * k; - var x1_ = Math.round(Math.min(xa, xb)); - var x2_ = Math.round(Math.max(xa, xb)); - var j = rowSize * y + x1_ * 4; - for (var x = x1_; x <= x2_; x++) { - k = (xa - x) / (xa - xb); - k = k < 0 ? 0 : k > 1 ? 1 : k; - bytes[j++] = (car - (car - cbr) * k) | 0; - bytes[j++] = (cag - (cag - cbg) * k) | 0; - bytes[j++] = (cab - (cab - cbb) * k) | 0; - bytes[j++] = 255; - } - } - } - - function drawFigure(data, figure, context) { - var ps = figure.coords; - var cs = figure.colors; - var i, ii; - switch (figure.type) { - case 'lattice': - var verticesPerRow = figure.verticesPerRow; - var rows = Math.floor(ps.length / verticesPerRow) - 1; - var cols = verticesPerRow - 1; - for (i = 0; i < rows; i++) { - var q = i * verticesPerRow; - for (var j = 0; j < cols; j++, q++) { - drawTriangle(data, context, - ps[q], ps[q + 1], ps[q + verticesPerRow], - cs[q], cs[q + 1], cs[q + verticesPerRow]); - drawTriangle(data, context, - ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], - cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); - } - } - break; - case 'triangles': - for (i = 0, ii = ps.length; i < ii; i += 3) { - drawTriangle(data, context, - ps[i], ps[i + 1], ps[i + 2], - cs[i], cs[i + 1], cs[i + 2]); - } - break; - default: - error('illigal figure'); - break; - } - } - - function createMeshCanvas(bounds, combinesScale, coords, colors, figures, - backgroundColor, cachedCanvases) { - // we will increase scale on some weird factor to let antialiasing take - // care of "rough" edges - var EXPECTED_SCALE = 1.1; - // MAX_PATTERN_SIZE is used to avoid OOM situation. - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var boundsWidth = Math.ceil(bounds[2]) - offsetX; - var boundsHeight = Math.ceil(bounds[3]) - offsetY; - - var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var scaleX = boundsWidth / width; - var scaleY = boundsHeight / height; - - var context = { - coords: coords, - colors: colors, - offsetX: -offsetX, - offsetY: -offsetY, - scaleX: 1 / scaleX, - scaleY: 1 / scaleY - }; - - var canvas, tmpCanvas, i, ii; - if (WebGLUtils.isEnabled) { - canvas = WebGLUtils.drawFigures(width, height, backgroundColor, - figures, context); - - // https://bugzilla.mozilla.org/show_bug.cgi?id=972126 - tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false); - tmpCanvas.context.drawImage(canvas, 0, 0); - canvas = tmpCanvas.canvas; - } else { - tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false); - var tmpCtx = tmpCanvas.context; - - var data = tmpCtx.createImageData(width, height); - if (backgroundColor) { - var bytes = data.data; - for (i = 0, ii = bytes.length; i < ii; i += 4) { - bytes[i] = backgroundColor[0]; - bytes[i + 1] = backgroundColor[1]; - bytes[i + 2] = backgroundColor[2]; - bytes[i + 3] = 255; - } - } - for (i = 0; i < figures.length; i++) { - drawFigure(data, figures[i], context); - } - tmpCtx.putImageData(data, 0, 0); - canvas = tmpCanvas.canvas; - } - - return {canvas: canvas, offsetX: offsetX, offsetY: offsetY, - scaleX: scaleX, scaleY: scaleY}; - } - return createMeshCanvas; -})(); - -ShadingIRs.Mesh = { - fromIR: function Mesh_fromIR(raw) { - //var type = raw[1]; - var coords = raw[2]; - var colors = raw[3]; - var figures = raw[4]; - var bounds = raw[5]; - var matrix = raw[6]; - //var bbox = raw[7]; - var background = raw[8]; - return { - type: 'Pattern', - getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { - var scale; - if (shadingFill) { - scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); - } else { - // Obtain scale from matrix and current transformation matrix. - scale = Util.singularValueDecompose2dScale(owner.baseTransform); - if (matrix) { - var matrixScale = Util.singularValueDecompose2dScale(matrix); - scale = [scale[0] * matrixScale[0], - scale[1] * matrixScale[1]]; - } - } - - - // Rasterizing on the main thread since sending/queue large canvases - // might cause OOM. - var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, - colors, figures, shadingFill ? null : background, - owner.cachedCanvases); - - if (!shadingFill) { - ctx.setTransform.apply(ctx, owner.baseTransform); - if (matrix) { - ctx.transform.apply(ctx, matrix); - } - } - - ctx.translate(temporaryPatternCanvas.offsetX, - temporaryPatternCanvas.offsetY); - ctx.scale(temporaryPatternCanvas.scaleX, - temporaryPatternCanvas.scaleY); - - return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat'); - } - }; - } -}; - -ShadingIRs.Dummy = { - fromIR: function Dummy_fromIR() { - return { - type: 'Pattern', - getPattern: function Dummy_fromIR_getPattern() { - return 'hotpink'; - } - }; - } -}; - -function getShadingPatternFromIR(raw) { - var shadingIR = ShadingIRs[raw[0]]; - if (!shadingIR) { - error('Unknown IR type: ' + raw[0]); - } - return shadingIR.fromIR(raw); -} - -var TilingPattern = (function TilingPatternClosure() { - var PaintType = { - COLORED: 1, - UNCOLORED: 2 - }; - - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) { - this.operatorList = IR[2]; - this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; - this.bbox = IR[4]; - this.xstep = IR[5]; - this.ystep = IR[6]; - this.paintType = IR[7]; - this.tilingType = IR[8]; - this.color = color; - this.objs = objs; - this.commonObjs = commonObjs; - this.baseTransform = baseTransform; - this.type = 'Pattern'; - this.ctx = ctx; - } - - TilingPattern.prototype = { - createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { - var operatorList = this.operatorList; - var bbox = this.bbox; - var xstep = this.xstep; - var ystep = this.ystep; - var paintType = this.paintType; - var tilingType = this.tilingType; - var color = this.color; - var objs = this.objs; - var commonObjs = this.commonObjs; - - info('TilingType: ' + tilingType); - - var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; - - var topLeft = [x0, y0]; - // we want the canvas to be as large as the step size - var botRight = [x0 + xstep, y0 + ystep]; - - var width = botRight[0] - topLeft[0]; - var height = botRight[1] - topLeft[1]; - - // Obtain scale from matrix and current transformation matrix. - var matrixScale = Util.singularValueDecompose2dScale(this.matrix); - var curMatrixScale = Util.singularValueDecompose2dScale( - this.baseTransform); - var combinedScale = [matrixScale[0] * curMatrixScale[0], - matrixScale[1] * curMatrixScale[1]]; - - // MAX_PATTERN_SIZE is used to avoid OOM situation. - // Use width and height values that are as close as possible to the end - // result when the pattern is used. Too low value makes the pattern look - // blurry. Too large value makes it look too crispy. - width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), - MAX_PATTERN_SIZE); - - height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), - MAX_PATTERN_SIZE); - - var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', - width, height, true); - var tmpCtx = tmpCanvas.context; - var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs); - graphics.groupLevel = owner.groupLevel; - - this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color); - - this.setScale(width, height, xstep, ystep); - this.transformToScale(graphics); - - // transform coordinates to pattern space - var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; - graphics.transform.apply(graphics, tmpTranslate); - - this.clipBbox(graphics, bbox, x0, y0, x1, y1); - - graphics.executeOperatorList(operatorList); - return tmpCanvas.canvas; - }, - - setScale: function TilingPattern_setScale(width, height, xstep, ystep) { - this.scale = [width / xstep, height / ystep]; - }, - - transformToScale: function TilingPattern_transformToScale(graphics) { - var scale = this.scale; - var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; - graphics.transform.apply(graphics, tmpScale); - }, - - scaleToContext: function TilingPattern_scaleToContext() { - var scale = this.scale; - this.ctx.scale(1 / scale[0], 1 / scale[1]); - }, - - clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { - if (bbox && isArray(bbox) && bbox.length === 4) { - var bboxWidth = x1 - x0; - var bboxHeight = y1 - y0; - graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); - graphics.clip(); - graphics.endPath(); - } - }, - - setFillAndStrokeStyleToContext: - function setFillAndStrokeStyleToContext(context, paintType, color) { - switch (paintType) { - case PaintType.COLORED: - var ctx = this.ctx; - context.fillStyle = ctx.fillStyle; - context.strokeStyle = ctx.strokeStyle; - break; - case PaintType.UNCOLORED: - var cssColor = Util.makeCssRgb(color[0], color[1], color[2]); - context.fillStyle = cssColor; - context.strokeStyle = cssColor; - break; - default: - error('Unsupported paint type: ' + paintType); - } - }, - - getPattern: function TilingPattern_getPattern(ctx, owner) { - var temporaryPatternCanvas = this.createPatternCanvas(owner); - - ctx = this.ctx; - ctx.setTransform.apply(ctx, this.baseTransform); - ctx.transform.apply(ctx, this.matrix); - this.scaleToContext(); - - return ctx.createPattern(temporaryPatternCanvas, 'repeat'); - } - }; - - return TilingPattern; -})(); - - -function FontLoader(docId) { - this.docId = docId; - this.styleElement = null; - this.nativeFontFaces = []; - this.loadTestFontId = 0; - this.loadingContext = { - requests: [], - nextRequestId: 0 - }; -} -FontLoader.prototype = { - insertRule: function fontLoaderInsertRule(rule) { - var styleElement = this.styleElement; - if (!styleElement) { - styleElement = this.styleElement = document.createElement('style'); - styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; - document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); - } - - var styleSheet = styleElement.sheet; - styleSheet.insertRule(rule, styleSheet.cssRules.length); - }, - - clear: function fontLoaderClear() { - var styleElement = this.styleElement; - if (styleElement) { - styleElement.parentNode.removeChild(styleElement); - styleElement = this.styleElement = null; - } - this.nativeFontFaces.forEach(function(nativeFontFace) { - document.fonts.delete(nativeFontFace); - }); - this.nativeFontFaces.length = 0; - }, - get loadTestFont() { - // This is a CFF font with 1 glyph for '.' that fills its entire width and - // height. - return shadow(this, 'loadTestFont', atob( - 'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + - 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + - 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + - 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + - 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + - 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + - 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + - 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + - 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + - 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + - 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + - 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + - 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + - 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + - 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + - 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + - 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + - 'ABAAAAAAAAAAAD6AAAAAAAAA==' - )); - }, - - addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) { - this.nativeFontFaces.push(nativeFontFace); - document.fonts.add(nativeFontFace); - }, - - bind: function fontLoaderBind(fonts, callback) { - assert(!isWorker, 'bind() shall be called from main thread'); - - var rules = []; - var fontsToLoad = []; - var fontLoadPromises = []; - var getNativeFontPromise = function(nativeFontFace) { - // Return a promise that is always fulfilled, even when the font fails to - // load. - return nativeFontFace.loaded.catch(function(e) { - warn('Failed to load font "' + nativeFontFace.family + '": ' + e); - }); - }; - for (var i = 0, ii = fonts.length; i < ii; i++) { - var font = fonts[i]; - - // Add the font to the DOM only once or skip if the font - // is already loaded. - if (font.attached || font.loading === false) { - continue; - } - font.attached = true; - - if (FontLoader.isFontLoadingAPISupported) { - var nativeFontFace = font.createNativeFontFace(); - if (nativeFontFace) { - this.addNativeFontFace(nativeFontFace); - fontLoadPromises.push(getNativeFontPromise(nativeFontFace)); - } - } else { - var rule = font.createFontFaceRule(); - if (rule) { - this.insertRule(rule); - rules.push(rule); - fontsToLoad.push(font); - } - } - } - - var request = this.queueLoadingCallback(callback); - if (FontLoader.isFontLoadingAPISupported) { - Promise.all(fontLoadPromises).then(function() { - request.complete(); - }); - } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) { - this.prepareFontLoadEvent(rules, fontsToLoad, request); - } else { - request.complete(); - } - }, - - queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) { - function LoadLoader_completeRequest() { - assert(!request.end, 'completeRequest() cannot be called twice'); - request.end = Date.now(); - - // sending all completed requests in order how they were queued - while (context.requests.length > 0 && context.requests[0].end) { - var otherRequest = context.requests.shift(); - setTimeout(otherRequest.callback, 0); - } - } - - var context = this.loadingContext; - var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++); - var request = { - id: requestId, - complete: LoadLoader_completeRequest, - callback: callback, - started: Date.now() - }; - context.requests.push(request); - return request; - }, - - prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, - fonts, - request) { - /** Hack begin */ - // There's currently no event when a font has finished downloading so the - // following code is a dirty hack to 'guess' when a font is - // ready. It's assumed fonts are loaded in order, so add a known test - // font after the desired fonts and then test for the loading of that - // test font. - - function int32(data, offset) { - return (data.charCodeAt(offset) << 24) | - (data.charCodeAt(offset + 1) << 16) | - (data.charCodeAt(offset + 2) << 8) | - (data.charCodeAt(offset + 3) & 0xff); - } - - function spliceString(s, offset, remove, insert) { - var chunk1 = s.substr(0, offset); - var chunk2 = s.substr(offset + remove); - return chunk1 + insert + chunk2; - } - - var i, ii; - - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - - var called = 0; - function isFontReady(name, callback) { - called++; - // With setTimeout clamping this gives the font ~100ms to load. - if(called > 30) { - warn('Load test font never loaded.'); - callback(); - return; - } - ctx.font = '30px ' + name; - ctx.fillText('.', 0, 20); - var imageData = ctx.getImageData(0, 0, 1, 1); - if (imageData.data[3] > 0) { - callback(); - return; - } - setTimeout(isFontReady.bind(null, name, callback)); - } - - var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++; - // Chromium seems to cache fonts based on a hash of the actual font data, - // so the font must be modified for each load test else it will appear to - // be loaded already. - // TODO: This could maybe be made faster by avoiding the btoa of the full - // font by splitting it in chunks before hand and padding the font id. - var data = this.loadTestFont; - var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum) - data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, - loadTestFontId); - // CFF checksum is important for IE, adjusting it - var CFF_CHECKSUM_OFFSET = 16; - var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X' - var checksum = int32(data, CFF_CHECKSUM_OFFSET); - for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { - checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0; - } - if (i < loadTestFontId.length) { // align to 4 bytes boundary - checksum = (checksum - XXXX_VALUE + - int32(loadTestFontId + 'XXX', i)) | 0; - } - data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); - - var url = 'url(data:font/opentype;base64,' + btoa(data) + ');'; - var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' + - url + '}'; - this.insertRule(rule); - - var names = []; - for (i = 0, ii = fonts.length; i < ii; i++) { - names.push(fonts[i].loadedName); - } - names.push(loadTestFontId); - - var div = document.createElement('div'); - div.setAttribute('style', - 'visibility: hidden;' + - 'width: 10px; height: 10px;' + - 'position: absolute; top: 0px; left: 0px;'); - for (i = 0, ii = names.length; i < ii; ++i) { - var span = document.createElement('span'); - span.textContent = 'Hi'; - span.style.fontFamily = names[i]; - div.appendChild(span); - } - document.body.appendChild(div); - - isFontReady(loadTestFontId, function() { - document.body.removeChild(div); - request.complete(); - }); - /** Hack end */ - } -}; -FontLoader.isFontLoadingAPISupported = (!isWorker && - typeof document !== 'undefined' && !!document.fonts); -Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { - get: function () { - var supported = false; - - // User agent string sniffing is bad, but there is no reliable way to tell - // if font is fully loaded and ready to be used with canvas. - var userAgent = window.navigator.userAgent; - var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent); - if (m && m[1] >= 14) { - supported = true; - } - // TODO other browsers - if (userAgent === 'node') { - supported = true; - } - return shadow(FontLoader, 'isSyncFontLoadingSupported', supported); - }, - enumerable: true, - configurable: true -}); - -var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData) { - this.compiledGlyphs = {}; - // importing translated data - for (var i in translatedData) { - this[i] = translatedData[i]; - } - } - Object.defineProperty(FontFaceObject, 'isEvalSupported', { - get: function () { - var evalSupport = false; - if (PDFJS.isEvalSupported) { - try { - /* jshint evil: true */ - new Function(''); - evalSupport = true; - } catch (e) {} - } - return shadow(this, 'isEvalSupported', evalSupport); - }, - enumerable: true, - configurable: true - }); - FontFaceObject.prototype = { - createNativeFontFace: function FontFaceObject_createNativeFontFace() { - if (!this.data) { - return null; - } - - if (PDFJS.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var nativeFontFace = new FontFace(this.loadedName, this.data, {}); - - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this); - } - return nativeFontFace; - }, - - createFontFaceRule: function FontFaceObject_createFontFaceRule() { - if (!this.data) { - return null; - } - - if (PDFJS.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var data = bytesToString(new Uint8Array(this.data)); - var fontName = this.loadedName; - - // Add the font-face rule to the document - var url = ('url(data:' + this.mimetype + ';base64,' + - window.btoa(data) + ');'); - var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this, url); - } - - return rule; - }, - - getPathGenerator: - function FontFaceObject_getPathGenerator(objs, character) { - if (!(character in this.compiledGlyphs)) { - var cmds = objs.get(this.loadedName + '_path_' + character); - var current, i, len; - - // If we can, compile cmds into JS for MAXIMUM SPEED - if (FontFaceObject.isEvalSupported) { - var args, js = ''; - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.args !== undefined) { - args = current.args.join(','); - } else { - args = ''; - } - - js += 'c.' + current.cmd + '(' + args + ');\n'; - } - /* jshint -W054 */ - this.compiledGlyphs[character] = new Function('c', 'size', js); - } else { - // But fall back on using Function.prototype.apply() if we're - // blocked from using eval() for whatever reason (like CSP policies) - this.compiledGlyphs[character] = function(c, size) { - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.cmd === 'scale') { - current.args = [size, -size]; - } - - c[current.cmd].apply(c, current.args); - } - }; - } - } - return this.compiledGlyphs[character]; - } - }; - return FontFaceObject; -})(); - - -/** - * Optimised CSS custom property getter/setter. - * @class - */ -var CustomStyle = (function CustomStyleClosure() { - - // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ - // animate-css-transforms-firefox-webkit.html - // in some versions of IE9 it is critical that ms appear in this list - // before Moz - var prefixes = ['ms', 'Moz', 'Webkit', 'O']; - var _cache = {}; - - function CustomStyle() {} - - CustomStyle.getProp = function get(propName, element) { - // check cache only when no element is given - if (arguments.length === 1 && typeof _cache[propName] === 'string') { - return _cache[propName]; - } - - element = element || document.documentElement; - var style = element.style, prefixed, uPropName; - - // test standard property first - if (typeof style[propName] === 'string') { - return (_cache[propName] = propName); - } - - // capitalize - uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); - - // test vendor specific properties - for (var i = 0, l = prefixes.length; i < l; i++) { - prefixed = prefixes[i] + uPropName; - if (typeof style[prefixed] === 'string') { - return (_cache[propName] = prefixed); - } - } - - //if all fails then set to undefined - return (_cache[propName] = 'undefined'); - }; - - CustomStyle.setProp = function set(propName, element, str) { - var prop = this.getProp(propName); - if (prop !== 'undefined') { - element.style[prop] = str; - } - }; - - return CustomStyle; -})(); - -PDFJS.CustomStyle = CustomStyle; - - -var ANNOT_MIN_SIZE = 10; // px - -var AnnotationLayer = (function AnnotationLayerClosure() { - // 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; - } - - function getContainer(data, page, viewport) { - var container = document.createElement('section'); - var width = data.rect[2] - data.rect[0]; - var height = data.rect[3] - data.rect[1]; - - container.setAttribute('data-annotation-id', data.id); - - data.rect = Util.normalizeRect([ - data.rect[0], - page.view[3] - data.rect[1] + page.view[1], - data.rect[2], - page.view[3] - data.rect[3] + page.view[1] - ]); - - CustomStyle.setProp('transform', container, - 'matrix(' + viewport.transform.join(',') + ')'); - CustomStyle.setProp('transformOrigin', container, - -data.rect[0] + 'px ' + -data.rect[1] + 'px'); - - if (data.borderStyle.width > 0) { - container.style.borderWidth = data.borderStyle.width + 'px'; - if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { - // Underline styles only have a bottom border, so we do not need - // to adjust for all borders. This yields a similar result as - // Adobe Acrobat/Reader. - width = width - 2 * data.borderStyle.width; - height = height - 2 * data.borderStyle.width; - } - - var horizontalRadius = data.borderStyle.horizontalCornerRadius; - var verticalRadius = data.borderStyle.verticalCornerRadius; - if (horizontalRadius > 0 || verticalRadius > 0) { - var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; - CustomStyle.setProp('borderRadius', container, radius); - } - - switch (data.borderStyle.style) { - case AnnotationBorderStyleType.SOLID: - container.style.borderStyle = 'solid'; - break; - - case AnnotationBorderStyleType.DASHED: - container.style.borderStyle = 'dashed'; - break; - - case AnnotationBorderStyleType.BEVELED: - warn('Unimplemented border style: beveled'); - break; - - case AnnotationBorderStyleType.INSET: - warn('Unimplemented border style: inset'); - break; - - case AnnotationBorderStyleType.UNDERLINE: - container.style.borderBottomStyle = 'solid'; - break; - - default: - break; - } - - if (data.color) { - container.style.borderColor = - Util.makeCssRgb(data.color[0] | 0, - data.color[1] | 0, - data.color[2] | 0); - } else { - // Transparent (invisible) border, so do not draw it at all. - container.style.borderWidth = 0; - } - } - - container.style.left = data.rect[0] + 'px'; - container.style.top = data.rect[1] + 'px'; - - container.style.width = width + 'px'; - container.style.height = height + 'px'; - - return container; - } - - function getHtmlElementForTextWidgetAnnotation(item, page) { - var element = document.createElement('div'); - var width = item.rect[2] - item.rect[0]; - var height = item.rect[3] - item.rect[1]; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - 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 ? - page.commonObjs.getData(item.fontRefName) : null; - setTextStyles(content, item, fontObj); - - element.appendChild(content); - - return element; - } - - function getHtmlElementForTextAnnotation(item, page, viewport) { - 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 = getContainer(item, page, viewport); - container.className = 'annotText'; - - var image = document.createElement('img'); - image.style.height = container.style.height; - image.style.width = container.style.width; - 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 contentWrapper = document.createElement('div'); - contentWrapper.className = 'annotTextContentWrapper'; - contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px'; - contentWrapper.style.top = '-10px'; - - var content = document.createElement('div'); - content.className = 'annotTextContent'; - content.setAttribute('hidden', true); - - var i, ii; - if (item.hasBgColor && item.color) { - var color = item.color; - - // Enlighten the color (70%) - var BACKGROUND_ENLIGHT = 0.7; - var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; - var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; - var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; - content.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0); - } - - var title = document.createElement('h1'); - var text = document.createElement('p'); - 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 (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); - - var pinned = false; - - var showAnnotation = function showAnnotation(pin) { - if (pin) { - pinned = true; - } - if (content.hasAttribute('hidden')) { - container.style.zIndex += 1; - content.removeAttribute('hidden'); - } - }; - - var hideAnnotation = function hideAnnotation(unpin) { - if (unpin) { - pinned = false; - } - if (!content.hasAttribute('hidden') && !pinned) { - container.style.zIndex -= 1; - content.setAttribute('hidden', true); - } - }; - - var toggleAnnotation = function toggleAnnotation() { - if (pinned) { - hideAnnotation(true); - } else { - showAnnotation(true); - } - }; - - image.addEventListener('click', function image_clickHandler() { - toggleAnnotation(); - }, false); - image.addEventListener('mouseover', function image_mouseOverHandler() { - showAnnotation(); - }, false); - image.addEventListener('mouseout', function image_mouseOutHandler() { - hideAnnotation(); - }, false); - - content.addEventListener('click', function content_clickHandler() { - hideAnnotation(true); - }, false); - } - - content.appendChild(title); - content.appendChild(text); - contentWrapper.appendChild(content); - container.appendChild(image); - container.appendChild(contentWrapper); - - return container; - } - - function getHtmlElementForLinkAnnotation(item, page, viewport, linkService) { - function bindLink(link, dest) { - link.href = linkService.getDestinationHash(dest); - link.onclick = function annotationsLayerBuilderLinksOnclick() { - if (dest) { - linkService.navigateTo(dest); - } - return false; - }; - if (dest) { - link.className = 'internalLink'; - } - } - - function bindNamedAction(link, action) { - link.href = linkService.getAnchorUrl(''); - link.onclick = function annotationsLayerBuilderNamedActionOnClick() { - linkService.executeNamedAction(action); - return false; - }; - link.className = 'internalLink'; - } - - var container = getContainer(item, page, viewport); - container.className = 'annotLink'; - - var link = document.createElement('a'); - link.href = link.title = item.url || ''; - - if (item.url && isExternalLinkTargetSet()) { - link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; - } - - if (!item.url) { - if (item.action) { - bindNamedAction(link, item.action); - } else { - bindLink(link, ('dest' in item) ? item.dest : null); - } - } - - container.appendChild(link); - - return container; - } - - function getHtmlElement(data, page, viewport, linkService) { - switch (data.annotationType) { - case AnnotationType.WIDGET: - return getHtmlElementForTextWidgetAnnotation(data, page); - case AnnotationType.TEXT: - return getHtmlElementForTextAnnotation(data, page, viewport); - case AnnotationType.LINK: - return getHtmlElementForLinkAnnotation(data, page, viewport, - linkService); - default: - throw new Error('Unsupported annotationType: ' + data.annotationType); - } - } - - function render(viewport, div, annotations, page, linkService) { - for (var i = 0, ii = annotations.length; i < ii; i++) { - var data = annotations[i]; - if (!data || !data.hasHtml) { - continue; - } - - var element = getHtmlElement(data, page, viewport, linkService); - div.appendChild(element); - } - } - - function update(viewport, div, annotations) { - for (var i = 0, ii = annotations.length; i < ii; i++) { - var data = annotations[i]; - var element = div.querySelector( - '[data-annotation-id="' + data.id + '"]'); - if (element) { - CustomStyle.setProp('transform', element, - 'matrix(' + viewport.transform.join(',') + ')'); - } - } - div.removeAttribute('hidden'); - } - - return { - render: render, - update: update - }; -})(); - -PDFJS.AnnotationLayer = AnnotationLayer; - - -/** - * Text layer render parameters. - * - * @typedef {Object} TextLayerRenderParameters - * @property {TextContent} textContent - Text content to render (the object is - * returned by the page's getTextContent() method). - * @property {HTMLElement} container - HTML element that will contain text runs. - * @property {PDFJS.PageViewport} viewport - The target viewport to properly - * layout the text runs. - * @property {Array} textDivs - (optional) HTML elements that are correspond - * the text items of the textContent input. This is output and shall be - * initially be set to empty array. - * @property {number} timeout - (optional) Delay in milliseconds before - * rendering of the text runs occurs. - */ -var renderTextLayer = (function renderTextLayerClosure() { - var MAX_TEXT_DIVS_TO_RENDER = 100000; - - var NonWhitespaceRegexp = /\S/; - - function isAllWhitespace(str) { - return !NonWhitespaceRegexp.test(str); - } - - function appendText(textDivs, viewport, geom, styles) { - var style = styles[geom.fontName]; - var textDiv = document.createElement('div'); - textDivs.push(textDiv); - if (isAllWhitespace(geom.str)) { - textDiv.dataset.isWhitespace = true; - return; - } - var tx = PDFJS.Util.transform(viewport.transform, geom.transform); - var angle = Math.atan2(tx[1], tx[0]); - if (style.vertical) { - angle += Math.PI / 2; - } - var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3])); - var fontAscent = fontHeight; - if (style.ascent) { - fontAscent = style.ascent * fontAscent; - } else if (style.descent) { - fontAscent = (1 + style.descent) * fontAscent; - } - - var left; - var top; - if (angle === 0) { - left = tx[4]; - top = tx[5] - fontAscent; - } else { - left = tx[4] + (fontAscent * Math.sin(angle)); - top = tx[5] - (fontAscent * Math.cos(angle)); - } - textDiv.style.left = left + 'px'; - textDiv.style.top = top + 'px'; - textDiv.style.fontSize = fontHeight + 'px'; - textDiv.style.fontFamily = style.fontFamily; - - textDiv.textContent = geom.str; - // |fontName| is only used by the Font Inspector. This test will succeed - // when e.g. the Font Inspector is off but the Stepper is on, but it's - // not worth the effort to do a more accurate test. - if (PDFJS.pdfBug) { - textDiv.dataset.fontName = geom.fontName; - } - // Storing into dataset will convert number into string. - if (angle !== 0) { - textDiv.dataset.angle = angle * (180 / Math.PI); - } - // We don't bother scaling single-char text divs, because it has very - // little effect on text highlighting. This makes scrolling on docs with - // lots of such divs a lot faster. - if (geom.str.length > 1) { - if (style.vertical) { - textDiv.dataset.canvasWidth = geom.height * viewport.scale; - } else { - textDiv.dataset.canvasWidth = geom.width * viewport.scale; - } - } - } - - function render(task) { - if (task._canceled) { - return; - } - var textLayerFrag = task._container; - var textDivs = task._textDivs; - var capability = task._capability; - var textDivsLength = textDivs.length; - - // No point in rendering many divs as it would make the browser - // unusable even after the divs are rendered. - if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { - capability.resolve(); - return; - } - - var canvas = document.createElement('canvas'); - canvas.mozOpaque = true; - var ctx = canvas.getContext('2d', {alpha: false}); - - var lastFontSize; - var lastFontFamily; - for (var i = 0; i < textDivsLength; i++) { - var textDiv = textDivs[i]; - if (textDiv.dataset.isWhitespace !== undefined) { - continue; - } - - var fontSize = textDiv.style.fontSize; - var fontFamily = textDiv.style.fontFamily; - - // Only build font string and set to context if different from last. - if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { - ctx.font = fontSize + ' ' + fontFamily; - lastFontSize = fontSize; - lastFontFamily = fontFamily; - } - - var width = ctx.measureText(textDiv.textContent).width; - if (width > 0) { - textLayerFrag.appendChild(textDiv); - var transform; - if (textDiv.dataset.canvasWidth !== undefined) { - // Dataset values come of type string. - var textScale = textDiv.dataset.canvasWidth / width; - transform = 'scaleX(' + textScale + ')'; - } else { - transform = ''; - } - var rotation = textDiv.dataset.angle; - if (rotation) { - transform = 'rotate(' + rotation + 'deg) ' + transform; - } - if (transform) { - PDFJS.CustomStyle.setProp('transform' , textDiv, transform); - } - } - } - capability.resolve(); - } - - /** - * Text layer rendering task. - * - * @param {TextContent} textContent - * @param {HTMLElement} container - * @param {PDFJS.PageViewport} viewport - * @param {Array} textDivs - * @private - */ - function TextLayerRenderTask(textContent, container, viewport, textDivs) { - this._textContent = textContent; - this._container = container; - this._viewport = viewport; - textDivs = textDivs || []; - this._textDivs = textDivs; - this._canceled = false; - this._capability = createPromiseCapability(); - this._renderTimer = null; - } - TextLayerRenderTask.prototype = { - get promise() { - return this._capability.promise; - }, - - cancel: function TextLayer_cancel() { - this._canceled = true; - if (this._renderTimer !== null) { - clearTimeout(this._renderTimer); - this._renderTimer = null; - } - this._capability.reject('canceled'); - }, - - _render: function TextLayer_render(timeout) { - var textItems = this._textContent.items; - var styles = this._textContent.styles; - var textDivs = this._textDivs; - var viewport = this._viewport; - for (var i = 0, len = textItems.length; i < len; i++) { - appendText(textDivs, viewport, textItems[i], styles); - } - - if (!timeout) { // Render right away - render(this); - } else { // Schedule - var self = this; - this._renderTimer = setTimeout(function() { - render(self); - self._renderTimer = null; - }, timeout); - } - } - }; - - - /** - * Starts rendering of the text layer. - * - * @param {TextLayerRenderParameters} renderParameters - * @returns {TextLayerRenderTask} - */ - function renderTextLayer(renderParameters) { - var task = new TextLayerRenderTask(renderParameters.textContent, - renderParameters.container, - renderParameters.viewport, - renderParameters.textDivs); - task._render(renderParameters.timeout); - return task; - } - - return renderTextLayer; -})(); - -PDFJS.renderTextLayer = renderTextLayer; - - -var SVG_DEFAULTS = { - fontStyle: 'normal', - fontWeight: 'normal', - fillColor: '#000000' -}; - -var convertImgDataToPng = (function convertImgDataToPngClosure() { - var PNG_HEADER = - new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); - - var CHUNK_WRAPPER_SIZE = 12; - - var crcTable = new Int32Array(256); - for (var i = 0; i < 256; i++) { - var c = i; - for (var h = 0; h < 8; h++) { - if (c & 1) { - c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff); - } else { - c = (c >> 1) & 0x7fffffff; - } - } - crcTable[i] = c; - } - - function crc32(data, start, end) { - var crc = -1; - for (var i = start; i < end; i++) { - var a = (crc ^ data[i]) & 0xff; - var b = crcTable[a]; - crc = (crc >>> 8) ^ b; - } - return crc ^ -1; - } - - function writePngChunk(type, body, data, offset) { - var p = offset; - var len = body.length; - - data[p] = len >> 24 & 0xff; - data[p + 1] = len >> 16 & 0xff; - data[p + 2] = len >> 8 & 0xff; - data[p + 3] = len & 0xff; - p += 4; - - data[p] = type.charCodeAt(0) & 0xff; - data[p + 1] = type.charCodeAt(1) & 0xff; - data[p + 2] = type.charCodeAt(2) & 0xff; - data[p + 3] = type.charCodeAt(3) & 0xff; - p += 4; - - data.set(body, p); - p += body.length; - - var crc = crc32(data, offset + 4, p); - - data[p] = crc >> 24 & 0xff; - data[p + 1] = crc >> 16 & 0xff; - data[p + 2] = crc >> 8 & 0xff; - data[p + 3] = crc & 0xff; - } - - function adler32(data, start, end) { - var a = 1; - var b = 0; - for (var i = start; i < end; ++i) { - a = (a + (data[i] & 0xff)) % 65521; - b = (b + a) % 65521; - } - return (b << 16) | a; - } - - function encode(imgData, kind) { - var width = imgData.width; - var height = imgData.height; - var bitDepth, colorType, lineSize; - var bytes = imgData.data; - - switch (kind) { - case ImageKind.GRAYSCALE_1BPP: - colorType = 0; - bitDepth = 1; - lineSize = (width + 7) >> 3; - break; - case ImageKind.RGB_24BPP: - colorType = 2; - bitDepth = 8; - lineSize = width * 3; - break; - case ImageKind.RGBA_32BPP: - colorType = 6; - bitDepth = 8; - lineSize = width * 4; - break; - default: - throw new Error('invalid format'); - } - - // prefix every row with predictor 0 - var literals = new Uint8Array((1 + lineSize) * height); - var offsetLiterals = 0, offsetBytes = 0; - var y, i; - for (y = 0; y < height; ++y) { - literals[offsetLiterals++] = 0; // no prediction - literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), - offsetLiterals); - offsetBytes += lineSize; - offsetLiterals += lineSize; - } - - if (kind === ImageKind.GRAYSCALE_1BPP) { - // inverting for B/W - offsetLiterals = 0; - for (y = 0; y < height; y++) { - offsetLiterals++; // skipping predictor - for (i = 0; i < lineSize; i++) { - literals[offsetLiterals++] ^= 0xFF; - } - } - } - - var ihdr = new Uint8Array([ - width >> 24 & 0xff, - width >> 16 & 0xff, - width >> 8 & 0xff, - width & 0xff, - height >> 24 & 0xff, - height >> 16 & 0xff, - height >> 8 & 0xff, - height & 0xff, - bitDepth, // bit depth - colorType, // color type - 0x00, // compression method - 0x00, // filter method - 0x00 // interlace method - ]); - - var len = literals.length; - var maxBlockLength = 0xFFFF; - - var deflateBlocks = Math.ceil(len / maxBlockLength); - var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); - var pi = 0; - idat[pi++] = 0x78; // compression method and flags - idat[pi++] = 0x9c; // flags - - var pos = 0; - while (len > maxBlockLength) { - // writing non-final DEFLATE blocks type 0 and length of 65535 - idat[pi++] = 0x00; - idat[pi++] = 0xff; - idat[pi++] = 0xff; - idat[pi++] = 0x00; - idat[pi++] = 0x00; - idat.set(literals.subarray(pos, pos + maxBlockLength), pi); - pi += maxBlockLength; - pos += maxBlockLength; - len -= maxBlockLength; - } - - // writing non-final DEFLATE blocks type 0 - idat[pi++] = 0x01; - idat[pi++] = len & 0xff; - idat[pi++] = len >> 8 & 0xff; - idat[pi++] = (~len & 0xffff) & 0xff; - idat[pi++] = (~len & 0xffff) >> 8 & 0xff; - idat.set(literals.subarray(pos), pi); - pi += literals.length - pos; - - var adler = adler32(literals, 0, literals.length); // checksum - idat[pi++] = adler >> 24 & 0xff; - idat[pi++] = adler >> 16 & 0xff; - idat[pi++] = adler >> 8 & 0xff; - idat[pi++] = adler & 0xff; - - // PNG will consists: header, IHDR+data, IDAT+data, and IEND. - var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) + - ihdr.length + idat.length; - var data = new Uint8Array(pngLength); - var offset = 0; - data.set(PNG_HEADER, offset); - offset += PNG_HEADER.length; - writePngChunk('IHDR', ihdr, data, offset); - offset += CHUNK_WRAPPER_SIZE + ihdr.length; - writePngChunk('IDATA', idat, data, offset); - offset += CHUNK_WRAPPER_SIZE + idat.length; - writePngChunk('IEND', new Uint8Array(0), data, offset); - - return PDFJS.createObjectURL(data, 'image/png'); - } - - return function convertImgDataToPng(imgData) { - var kind = (imgData.kind === undefined ? - ImageKind.GRAYSCALE_1BPP : imgData.kind); - return encode(imgData, kind); - }; -})(); - -var SVGExtraState = (function SVGExtraStateClosure() { - function SVGExtraState() { - this.fontSizeScale = 1; - this.fontWeight = SVG_DEFAULTS.fontWeight; - this.fontSize = 0; - - 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.textRise = 0; - - // Default foreground and background colors - this.fillColor = SVG_DEFAULTS.fillColor; - this.strokeColor = '#000000'; - - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.lineJoin = ''; - this.lineCap = ''; - this.miterLimit = 0; - - this.dashArray = []; - this.dashPhase = 0; - - this.dependencies = []; - - // Clipping - this.clipId = ''; - this.pendingClip = false; - - this.maskId = ''; - } - - SVGExtraState.prototype = { - clone: function SVGExtraState_clone() { - return Object.create(this); - }, - setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - }; - return SVGExtraState; -})(); - -var SVGGraphics = (function SVGGraphicsClosure() { - function createScratchSVG(width, height) { - var NS = 'http://www.w3.org/2000/svg'; - var svg = document.createElementNS(NS, 'svg:svg'); - svg.setAttributeNS(null, 'version', '1.1'); - svg.setAttributeNS(null, 'width', width + 'px'); - svg.setAttributeNS(null, 'height', height + 'px'); - svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height); - return svg; - } - - function opListToTree(opList) { - var opTree = []; - var tmp = []; - var opListLen = opList.length; - - for (var x = 0; x < opListLen; x++) { - if (opList[x].fn === 'save') { - opTree.push({'fnId': 92, 'fn': 'group', 'items': []}); - tmp.push(opTree); - opTree = opTree[opTree.length - 1].items; - continue; - } - - if(opList[x].fn === 'restore') { - opTree = tmp.pop(); - } else { - opTree.push(opList[x]); - } - } - return opTree; - } - - /** - * Formats float number. - * @param value {number} number to format. - * @returns {string} - */ - function pf(value) { - if (value === (value | 0)) { // integer number - return value.toString(); - } - var s = value.toFixed(10); - var i = s.length - 1; - if (s[i] !== '0') { - return s; - } - // removing trailing zeros - do { - i--; - } while (s[i] === '0'); - return s.substr(0, s[i] === '.' ? i : i + 1); - } - - /** - * Formats transform matrix. The standard rotation, scale and translate - * matrices are replaced by their shorter forms, and for identity matrix - * returns empty string to save the memory. - * @param m {Array} matrix to format. - * @returns {string} - */ - function pm(m) { - if (m[4] === 0 && m[5] === 0) { - if (m[1] === 0 && m[2] === 0) { - if (m[0] === 1 && m[3] === 1) { - return ''; - } - return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; - } - if (m[0] === m[3] && m[1] === -m[2]) { - var a = Math.acos(m[0]) * 180 / Math.PI; - return 'rotate(' + pf(a) + ')'; - } - } else { - if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { - return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - } - return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + - pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - - function SVGGraphics(commonObjs, objs) { - this.current = new SVGExtraState(); - this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix - this.transformStack = []; - this.extraStack = []; - this.commonObjs = commonObjs; - this.objs = objs; - this.pendingEOFill = false; - - this.embedFonts = false; - this.embeddedFonts = {}; - this.cssStyle = null; - } - - var NS = 'http://www.w3.org/2000/svg'; - var XML_NS = 'http://www.w3.org/XML/1998/namespace'; - var XLINK_NS = 'http://www.w3.org/1999/xlink'; - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var clipCount = 0; - var maskCount = 0; - - SVGGraphics.prototype = { - save: function SVGGraphics_save() { - this.transformStack.push(this.transformMatrix); - var old = this.current; - this.extraStack.push(old); - this.current = old.clone(); - }, - - restore: function SVGGraphics_restore() { - this.transformMatrix = this.transformStack.pop(); - this.current = this.extraStack.pop(); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.pgrp.appendChild(this.tgrp); - }, - - group: function SVGGraphics_group(items) { - this.save(); - this.executeOpTree(items); - this.restore(); - }, - - loadDependencies: function SVGGraphics_loadDependencies(operatorList) { - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var argsArray = operatorList.argsArray; - - var self = this; - for (var i = 0; i < fnArrayLen; i++) { - if (OPS.dependency === fnArray[i]) { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var obj = deps[n]; - var common = obj.substring(0, 2) === 'g_'; - var promise; - if (common) { - promise = new Promise(function(resolve) { - self.commonObjs.get(obj, resolve); - }); - } else { - promise = new Promise(function(resolve) { - self.objs.get(obj, resolve); - }); - } - this.current.dependencies.push(promise); - } - } - } - return Promise.all(this.current.dependencies); - }, - - transform: function SVGGraphics_transform(a, b, c, d, e, f) { - var transformMatrix = [a, b, c, d, e, f]; - this.transformMatrix = PDFJS.Util.transform(this.transformMatrix, - transformMatrix); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - getSVG: function SVGGraphics_getSVG(operatorList, viewport) { - this.svg = createScratchSVG(viewport.width, viewport.height); - this.viewport = viewport; - - return this.loadDependencies(operatorList).then(function () { - this.transformMatrix = IDENTITY_MATRIX; - this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group - this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform)); - this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.defs = document.createElementNS(NS, 'svg:defs'); - this.pgrp.appendChild(this.defs); - this.pgrp.appendChild(this.tgrp); - this.svg.appendChild(this.pgrp); - var opTree = this.convertOpList(operatorList); - this.executeOpTree(opTree); - return this.svg; - }.bind(this)); - }, - - convertOpList: function SVGGraphics_convertOpList(operatorList) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var REVOPS = []; - var opList = []; - - for (var op in OPS) { - REVOPS[OPS[op]] = op; - } - - for (var x = 0; x < fnArrayLen; x++) { - var fnId = fnArray[x]; - opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]}); - } - return opListToTree(opList); - }, - - executeOpTree: function SVGGraphics_executeOpTree(opTree) { - var opTreeLen = opTree.length; - for(var x = 0; x < opTreeLen; x++) { - var fn = opTree[x].fn; - var fnId = opTree[x].fnId; - var args = opTree[x].args; - - switch (fnId | 0) { - case OPS.beginText: - this.beginText(); - break; - case OPS.setLeading: - this.setLeading(args); - break; - case OPS.setLeadingMoveText: - this.setLeadingMoveText(args[0], args[1]); - break; - case OPS.setFont: - this.setFont(args); - break; - case OPS.showText: - this.showText(args[0]); - break; - case OPS.showSpacedText: - this.showText(args[0]); - break; - case OPS.endText: - this.endText(); - break; - case OPS.moveText: - this.moveText(args[0], args[1]); - break; - case OPS.setCharSpacing: - this.setCharSpacing(args[0]); - break; - case OPS.setWordSpacing: - this.setWordSpacing(args[0]); - break; - case OPS.setHScale: - this.setHScale(args[0]); - break; - case OPS.setTextMatrix: - this.setTextMatrix(args[0], args[1], args[2], - args[3], args[4], args[5]); - break; - case OPS.setLineWidth: - this.setLineWidth(args[0]); - break; - case OPS.setLineJoin: - this.setLineJoin(args[0]); - break; - case OPS.setLineCap: - this.setLineCap(args[0]); - break; - case OPS.setMiterLimit: - this.setMiterLimit(args[0]); - break; - case OPS.setFillRGBColor: - this.setFillRGBColor(args[0], args[1], args[2]); - break; - case OPS.setStrokeRGBColor: - this.setStrokeRGBColor(args[0], args[1], args[2]); - break; - case OPS.setDash: - this.setDash(args[0], args[1]); - break; - case OPS.setGState: - this.setGState(args[0]); - break; - case OPS.fill: - this.fill(); - break; - case OPS.eoFill: - this.eoFill(); - break; - case OPS.stroke: - this.stroke(); - break; - case OPS.fillStroke: - this.fillStroke(); - break; - case OPS.eoFillStroke: - this.eoFillStroke(); - break; - case OPS.clip: - this.clip('nonzero'); - break; - case OPS.eoClip: - this.clip('evenodd'); - break; - case OPS.paintSolidColorImageMask: - this.paintSolidColorImageMask(); - break; - case OPS.paintJpegXObject: - this.paintJpegXObject(args[0], args[1], args[2]); - break; - case OPS.paintImageXObject: - this.paintImageXObject(args[0]); - break; - case OPS.paintInlineImageXObject: - this.paintInlineImageXObject(args[0]); - break; - case OPS.paintImageMaskXObject: - this.paintImageMaskXObject(args[0]); - break; - case OPS.paintFormXObjectBegin: - this.paintFormXObjectBegin(args[0], args[1]); - break; - case OPS.paintFormXObjectEnd: - this.paintFormXObjectEnd(); - break; - case OPS.closePath: - this.closePath(); - break; - case OPS.closeStroke: - this.closeStroke(); - break; - case OPS.closeFillStroke: - this.closeFillStroke(); - break; - case OPS.nextLine: - this.nextLine(); - break; - case OPS.transform: - this.transform(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.constructPath: - this.constructPath(args[0], args[1]); - break; - case OPS.endPath: - this.endPath(); - break; - case 92: - this.group(opTree[x].items); - break; - default: - warn('Unimplemented method '+ fn); - break; - } - } - }, - - setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { - this.current.wordSpacing = wordSpacing; - }, - - setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { - this.current.charSpacing = charSpacing; - }, - - nextLine: function SVGGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { - var current = this.current; - this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f]; - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - - current.txtElement = document.createElementNS(NS, 'svg:text'); - current.txtElement.appendChild(current.tspan); - }, - - beginText: function SVGGraphics_beginText() { - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - this.current.textMatrix = IDENTITY_MATRIX; - this.current.lineMatrix = IDENTITY_MATRIX; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.txtElement = document.createElementNS(NS, 'svg:text'); - this.current.txtgrp = document.createElementNS(NS, 'svg:g'); - this.current.xcoords = []; - }, - - moveText: function SVGGraphics_moveText(x, y) { - var current = this.current; - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - }, - - showText: function SVGGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - - if (fontSize === 0) { - return; - } - - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += fontDirection * wordSpacing; - continue; - } else if (isNum(glyph)) { - x += -glyph * fontSize * 0.001; - continue; - } - current.xcoords.push(current.x + x * textHScale); - - var width = glyph.width; - var character = glyph.fontChar; - var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; - x += charWidth; - - current.tspan.textContent += character; - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - - current.tspan.setAttributeNS(null, 'x', - current.xcoords.map(pf).join(' ')); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { - current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); - } - if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { - current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight); - } - if (current.fillColor !== SVG_DEFAULTS.fillColor) { - current.tspan.setAttributeNS(null, 'fill', current.fillColor); - } - - current.txtElement.setAttributeNS(null, 'transform', - pm(current.textMatrix) + - ' scale(1, -1)' ); - current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); - current.txtElement.appendChild(current.tspan); - current.txtgrp.appendChild(current.txtElement); - - this.tgrp.appendChild(current.txtElement); - - }, - - setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - }, - - addFontStyle: function SVGGraphics_addFontStyle(fontObj) { - if (!this.cssStyle) { - this.cssStyle = document.createElementNS(NS, 'svg:style'); - this.cssStyle.setAttributeNS(null, 'type', 'text/css'); - this.defs.appendChild(this.cssStyle); - } - - var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype); - this.cssStyle.textContent += - '@font-face { font-family: "' + fontObj.loadedName + '";' + - ' src: url(' + url + '); }\n'; - }, - - setFont: function SVGGraphics_setFont(details) { - var current = this.current; - var fontObj = this.commonObjs.get(details[0]); - var size = details[1]; - this.current.font = fontObj; - - if (this.embedFonts && fontObj.data && - !this.embeddedFonts[fontObj.loadedName]) { - this.addFontStyle(fontObj); - this.embeddedFonts[fontObj.loadedName] = fontObj; - } - - current.fontMatrix = (fontObj.fontMatrix ? - fontObj.fontMatrix : FONT_IDENTITY_MATRIX); - - var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - var italic = fontObj.italic ? 'italic' : 'normal'; - - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - current.fontSize = size; - current.fontFamily = fontObj.loadedName; - current.fontWeight = bold; - current.fontStyle = italic; - - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.xcoords = []; - }, - - endText: function SVGGraphics_endText() { - if (this.current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - // Path properties - setLineWidth: function SVGGraphics_setLineWidth(width) { - this.current.lineWidth = width; - }, - setLineCap: function SVGGraphics_setLineCap(style) { - this.current.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function SVGGraphics_setLineJoin(style) { - this.current.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function SVGGraphics_setMiterLimit(limit) { - this.current.miterLimit = limit; - }, - setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.strokeColor = color; - }, - setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.fillColor = color; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.xcoords = []; - }, - setDash: function SVGGraphics_setDash(dashArray, dashPhase) { - this.current.dashArray = dashArray; - this.current.dashPhase = dashPhase; - }, - - constructPath: function SVGGraphics_constructPath(ops, args) { - var current = this.current; - var x = current.x, y = current.y; - current.path = document.createElementNS(NS, 'svg:path'); - var d = []; - var opLength = ops.length; - - for (var i = 0, j = 0; i < opLength; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - var xw = x + width; - var yh = y + height; - d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh), - 'L', pf(x), pf(yh), 'Z'); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - d.push('M', pf(x), pf(y)); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - d.push('L', pf(x) , pf(y)); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), - pf(args[j + 3]), pf(x), pf(y)); - j += 6; - break; - case OPS.curveTo2: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), - pf(args[j + 2]), pf(args[j + 3])); - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), - pf(x), pf(y)); - j += 4; - break; - case OPS.closePath: - d.push('Z'); - break; - } - } - current.path.setAttributeNS(null, 'd', d.join(' ')); - current.path.setAttributeNS(null, 'stroke-miterlimit', - pf(current.miterLimit)); - current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap); - current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); - current.path.setAttributeNS(null, 'stroke-width', - pf(current.lineWidth) + 'px'); - current.path.setAttributeNS(null, 'stroke-dasharray', - current.dashArray.map(pf).join(' ')); - current.path.setAttributeNS(null, 'stroke-dashoffset', - pf(current.dashPhase) + 'px'); - current.path.setAttributeNS(null, 'fill', 'none'); - - this.tgrp.appendChild(current.path); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - // Saving a reference in current.element so that it can be addressed - // in 'fill' and 'stroke' - current.element = current.path; - current.setCurrentPoint(x, y); - }, - - endPath: function SVGGraphics_endPath() { - var current = this.current; - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - clip: function SVGGraphics_clip(type) { - var current = this.current; - // Add current path to clipping path - current.clipId = 'clippath' + clipCount; - clipCount++; - this.clippath = document.createElementNS(NS, 'svg:clipPath'); - this.clippath.setAttributeNS(null, 'id', current.clipId); - var clipElement = current.element.cloneNode(); - if (type === 'evenodd') { - clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); - } else { - clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); - } - this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.clippath.appendChild(clipElement); - this.defs.appendChild(this.clippath); - - // Create a new group with that attribute - current.pendingClip = true; - this.cgrp = document.createElementNS(NS, 'svg:g'); - this.cgrp.setAttributeNS(null, 'clip-path', - 'url(#' + current.clipId + ')'); - this.pgrp.appendChild(this.cgrp); - }, - - closePath: function SVGGraphics_closePath() { - var current = this.current; - var d = current.path.getAttributeNS(null, 'd'); - d += 'Z'; - current.path.setAttributeNS(null, 'd', d); - }, - - setLeading: function SVGGraphics_setLeading(leading) { - this.current.leading = -leading; - }, - - setTextRise: function SVGGraphics_setTextRise(textRise) { - this.current.textRise = textRise; - }, - - setHScale: function SVGGraphics_setHScale(scale) { - this.current.textHScale = scale / 100; - }, - - setGState: function SVGGraphics_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': - break; - case 'FL': - break; - case 'Font': - this.setFont(value); - break; - case 'CA': - break; - case 'ca': - break; - case 'BM': - break; - case 'SMask': - break; - } - } - }, - - fill: function SVGGraphics_fill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - }, - - stroke: function SVGGraphics_stroke() { - var current = this.current; - current.element.setAttributeNS(null, 'stroke', current.strokeColor); - current.element.setAttributeNS(null, 'fill', 'none'); - }, - - eoFill: function SVGGraphics_eoFill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - }, - - fillStroke: function SVGGraphics_fillStroke() { - // Order is important since stroke wants fill to be none. - // First stroke, then if fill needed, it will be overwritten. - this.stroke(); - this.fill(); - }, - - eoFillStroke: function SVGGraphics_eoFillStroke() { - this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - this.fillStroke(); - }, - - closeStroke: function SVGGraphics_closeStroke() { - this.closePath(); - this.stroke(); - }, - - closeFillStroke: function SVGGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - - paintSolidColorImageMask: - function SVGGraphics_paintSolidColorImageMask() { - var current = this.current; - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', '1px'); - rect.setAttributeNS(null, 'height', '1px'); - rect.setAttributeNS(null, 'fill', current.fillColor); - this.tgrp.appendChild(rect); - }, - - paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { - var current = this.current; - var imgObj = this.objs.get(objId); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); - imgEl.setAttributeNS(null, 'width', imgObj.width + 'px'); - imgEl.setAttributeNS(null, 'height', imgObj.height + 'px'); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-h)); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); - - this.tgrp.appendChild(imgEl); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageXObject: function SVGGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - this.paintInlineImageXObject(imgData); - }, - - paintInlineImageXObject: - function SVGGraphics_paintInlineImageXObject(imgData, mask) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - - var imgSrc = convertImgDataToPng(imgData); - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', '0'); - cliprect.setAttributeNS(null, 'y', '0'); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - current.element = cliprect; - this.clip('nonzero'); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-height)); - imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); - imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / width) + ' ' + - pf(-1 / height) + ')'); - if (mask) { - mask.appendChild(imgEl); - } else { - this.tgrp.appendChild(imgEl); - } - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageMaskXObject: - function SVGGraphics_paintImageMaskXObject(imgData) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - var fillColor = current.fillColor; - - current.maskId = 'mask' + maskCount++; - var mask = document.createElementNS(NS, 'svg:mask'); - mask.setAttributeNS(null, 'id', current.maskId); - - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', pf(width)); - rect.setAttributeNS(null, 'height', pf(height)); - rect.setAttributeNS(null, 'fill', fillColor); - rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')'); - this.defs.appendChild(mask); - this.tgrp.appendChild(rect); - - this.paintInlineImageXObject(imgData, mask); - }, - - paintFormXObjectBegin: - function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { - this.save(); - - if (isArray(matrix) && matrix.length === 6) { - this.transform(matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); - } - - if (isArray(bbox) && bbox.length === 4) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', bbox[0]); - cliprect.setAttributeNS(null, 'y', bbox[1]); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - this.current.element = cliprect; - this.clip('nonzero'); - this.endPath(); - } - }, - - paintFormXObjectEnd: - function SVGGraphics_paintFormXObjectEnd() { - this.restore(); - } - }; - return SVGGraphics; -})(); - -PDFJS.SVGGraphics = SVGGraphics; - - -}).call((typeof window === 'undefined') ? this : window); - -if (!PDFJS.workerSrc && typeof document !== 'undefined') { - // workerSrc is not set -- using last script url to define default location - PDFJS.workerSrc = (function () { - 'use strict'; - var pdfJsSrc = document.currentScript.src; - return pdfJsSrc && pdfJsSrc.replace(/\.js$/i, '.worker.js'); - })(); -} - - diff --git a/services/web/public/js/libs/pdfjs-1.3.91/pdf.worker.js b/services/web/public/js/libs/pdfjs-1.3.91/pdf.worker.js deleted file mode 100644 index 72a29334c6..0000000000 --- a/services/web/public/js/libs/pdfjs-1.3.91/pdf.worker.js +++ /dev/null @@ -1,40692 +0,0 @@ -/* Copyright 2012 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 globalstrict: false */ -/* globals PDFJS */ - -// Initializing PDFJS global object (if still undefined) -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -PDFJS.version = '1.3.91'; -PDFJS.build = 'd1e83b5'; - -(function pdfjsWrapper() { - // Use strict in our context only - users might not want it - 'use strict'; - - - -var globalScope = (typeof window === 'undefined') ? this : window; - -var isWorker = (typeof window === 'undefined'); - -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 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -// 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; - -PDFJS.VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = PDFJS.OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- treated as warnings. -function deprecated(details) { - warn('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Combines two URLs. The baseUrl shall be absolute URL. If the url is an -// absolute URL, it will be returned as is. -function combineUrl(baseUrl, url) { - if (!url) { - return baseUrl; - } - return new URL(url, baseUrl).href; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url) { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} -PDFJS.isValidUrl = isValidUrl; - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} -PDFJS.shadow = shadow; - -var LinkTarget = PDFJS.LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -function isExternalLinkTargetSet() { - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; - -var PasswordResponses = PDFJS.PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); -PDFJS.PasswordException = PasswordException; - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); -PDFJS.UnknownErrorException = UnknownErrorException; - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); -PDFJS.InvalidPDFException = InvalidPDFException; - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); -PDFJS.MissingPDFException = MissingPDFException; - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); -PDFJS.UnexpectedResponseException = UnexpectedResponseException; - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - return shadow(PDFJS, 'isLittleEndian', isLittleEndian()); - } -}); - - // Lazy test if the userAgent support CanvasTypedArrays -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - 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; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PDFJS.PageViewport - */ -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - if (!(v instanceof Dict)) { - return false; - } - if (!type) { - return true; - } - var dictType = v.get('Type'); - return isName(dictType) && dictType.name === type; -} - -function isArray(v) { - return v instanceof Array; -} - -function isStream(v) { - return typeof v === 'object' && v !== null && v.getBytes !== undefined; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -function isRef(v) { - return v instanceof Ref; -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fullfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -PDFJS.createPromiseCapability = createPromiseCapability; - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libaries are: - * - There currently isn't a seperate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} array of data and/or promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -PDFJS.createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - 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); -}; - -PDFJS.createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType) { - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = PDFJS.createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = {}; - var ah = this.actionHandler = {}; - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - /* jshint ignore:start */ - - // feature detect for URL constructor - var hasWorkingUrl = false; - if (typeof URL === 'function' && ('origin' in URL.prototype)) { - try { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } catch(e) {} - } - - if (hasWorkingUrl) - return; - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' == h) { - invalid.call(this) - } - // XXX - return h.toLowerCase() - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF = undefined, - ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message) - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' == c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' == this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF == c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c) - break loop; - } - break; - - case 'scheme data': - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' == c && '/' == input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue - } - break; - - case 'relative': - this._isRelative = true; - if ('file' != this._scheme) - this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' == c || '\\' == c) { - if ('\\' == c) - err('\\ is an invalid code point.'); - state = 'relative slash'; - } else if ('?' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1] - var nextNextC = input[cursor+2] - if ( - 'file' != this._scheme || !ALPHA.test(c) || - (nextC != ':' && nextC != '|') || - (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' == c || '\\' == c) { - if ('\\' == c) { - err('\\ is an invalid code point.'); - } - if ('file' == this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' == c) { - state = 'authority second slash'; - } else { - err("Expected '/', got: " + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' != c && '\\' != c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' == c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' == cp || '\n' == cp || '\r' == cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' == cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - (null !== this._password) ? this._password += tempC : this._username += tempC; - } - buffer = ''; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { - state = 'relative path'; - } else if (buffer.length == 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' == c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' == stateOverride) { - break loop; - } - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' != c && '\n' != c && '\r' != c) { - if ('[' == c) { - seenBracket = true; - } else if (']' == c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { - if ('' != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' == c) - err("'\\' not allowed in path."); - state = 'relative path'; - if ('/' != c && '\\' != c) { - continue; - } - break; - - case 'relative path': - if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { - if ('\\' == c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' == buffer) { - this._path.pop(); - if ('/' != c && '\\' != c) { - this._path.push(''); - } - } else if ('.' == buffer && '/' != c && '\\' != c) { - this._path.push(''); - } else if ('.' != buffer) { - if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' != c && '\n' != c && '\r' != c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function jURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof jURL)) - base = new jURL(String(base)); - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) - return this._url; - - var authority = ''; - if ('' != this._username || null != this._password) { - authority = this._username + - (null != this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) - return; - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) - return; - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' == this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) - return; - this._query = '?'; - if ('?' == search[0]) - search = search.slice(1); - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' == this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) - return; - this._fragment = '#'; - if ('#' == hash[0]) - hash = hash.slice(1); - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = jURL; - /* jshint ignore:end */ -})(globalScope); - - - - -var NetworkManager = (function NetworkManagerClosure() { - - var OK_RESPONSE = 200; - var PARTIAL_CONTENT_RESPONSE = 206; - - function NetworkManager(url, args) { - this.url = url; - args = args || {}; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = (this.isHttp && args.httpHeaders) || {}; - this.withCredentials = args.withCredentials || false; - this.getXhr = args.getXhr || - function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; - - this.currXhrId = 0; - this.pendingRequests = {}; - this.loadedRequests = {}; - } - - function getArrayBuffer(xhr) { - var data = xhr.response; - if (typeof data !== 'string') { - return data; - } - var length = data.length; - var array = new Uint8Array(length); - for (var i = 0; i < length; i++) { - array[i] = data.charCodeAt(i) & 0xFF; - } - return array.buffer; - } - - var supportsMozChunked = (function supportsMozChunkedClosure() { - try { - var x = new XMLHttpRequest(); - // Firefox 37- required .open() to be called before setting responseType. - // https://bugzilla.mozilla.org/show_bug.cgi?id=707484 - // Even though the URL is not visited, .open() could fail if the URL is - // blocked, e.g. via the connect-src CSP directive or the NoScript addon. - // When this error occurs, this feature detection method will mistakenly - // report that moz-chunked-arraybuffer is not supported in Firefox 37-. - x.open('GET', 'https://example.com'); - x.responseType = 'moz-chunked-arraybuffer'; - return x.responseType === 'moz-chunked-arraybuffer'; - } catch (e) { - return false; - } - })(); - - NetworkManager.prototype = { - requestRange: function NetworkManager_requestRange(begin, end, listeners) { - var args = { - begin: begin, - end: end - }; - for (var prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - }, - - requestFull: function NetworkManager_requestFull(listeners) { - return this.request(listeners); - }, - - request: function NetworkManager_request(args) { - var xhr = this.getXhr(); - var xhrId = this.currXhrId++; - var pendingRequest = this.pendingRequests[xhrId] = { - xhr: xhr - }; - - xhr.open('GET', this.url); - xhr.withCredentials = this.withCredentials; - for (var property in this.httpHeaders) { - var value = this.httpHeaders[property]; - if (typeof value === 'undefined') { - continue; - } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && 'begin' in args && 'end' in args) { - var rangeStr = args.begin + '-' + (args.end - 1); - xhr.setRequestHeader('Range', 'bytes=' + rangeStr); - pendingRequest.expectedStatus = 206; - } else { - pendingRequest.expectedStatus = 200; - } - - var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; - if (useMozChunkedLoading) { - xhr.responseType = 'moz-chunked-arraybuffer'; - pendingRequest.onProgressiveData = args.onProgressiveData; - pendingRequest.mozChunked = true; - } else { - xhr.responseType = 'arraybuffer'; - } - - if (args.onError) { - xhr.onerror = function(evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - - xhr.send(null); - - return xhrId; - }, - - onProgress: function NetworkManager_onProgress(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - if (pendingRequest.mozChunked) { - var chunk = getArrayBuffer(pendingRequest.xhr); - pendingRequest.onProgressiveData(chunk); - } - - var onProgress = pendingRequest.onProgress; - if (onProgress) { - onProgress(evt); - } - }, - - onStateChange: function NetworkManager_onStateChange(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - var xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - - if (xhr.readyState !== 4) { - return; - } - - if (!(xhrId in this.pendingRequests)) { - // The XHR request might have been aborted in onHeadersReceived() - // callback, in which case we should abort request - return; - } - - delete this.pendingRequests[xhrId]; - - // success status == 0 can be on ftp, file and other protocols - if (xhr.status === 0 && this.isHttp) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - var xhrStatus = xhr.status || OK_RESPONSE; - - // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: - // "A server MAY ignore the Range header". This means it's possible to - // get a 200 rather than a 206 response from a range request. - var ok_response_on_range_request = - xhrStatus === OK_RESPONSE && - pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - - if (!ok_response_on_range_request && - xhrStatus !== pendingRequest.expectedStatus) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - - this.loadedRequests[xhrId] = true; - - var chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - var rangeHeader = xhr.getResponseHeader('Content-Range'); - var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - var begin = parseInt(matches[1], 10); - pendingRequest.onDone({ - begin: begin, - chunk: chunk - }); - } else if (pendingRequest.onProgressiveData) { - pendingRequest.onDone(null); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk: chunk - }); - } else if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - }, - - hasPendingRequests: function NetworkManager_hasPendingRequests() { - for (var xhrId in this.pendingRequests) { - return true; - } - return false; - }, - - getRequestXhr: function NetworkManager_getXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - }, - - isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { - return !!(this.pendingRequests[xhrId].onProgressiveData); - }, - - isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - }, - - isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { - return xhrId in this.loadedRequests; - }, - - abortAllRequests: function NetworkManager_abortAllRequests() { - for (var xhrId in this.pendingRequests) { - this.abortRequest(xhrId | 0); - } - }, - - abortRequest: function NetworkManager_abortRequest(xhrId) { - var xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } - }; - - return NetworkManager; -})(); - - -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; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache - } - - // 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 (!this.loadedChunks[chunk]) { - chunks.push(chunk); - } - } - return chunks; - }, - - getBaseStreams: function ChunkedStream_getBaseStreams() { - return [this]; - }, - - allChunksLoaded: function ChunkedStream_allChunksLoaded() { - return this.numChunksLoaded === this.numChunks; - }, - - onReceiveData: function ChunkedStream_onReceiveData(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; - var curChunk; - - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - onReceiveProgressiveData: - function ChunkedStream_onReceiveProgressiveData(data) { - var position = this.progressiveDataLength; - var beginChunk = Math.floor(position / this.chunkSize); - - this.bytes.set(new Uint8Array(data), position); - position += data.byteLength; - this.progressiveDataLength = position; - var endChunk = position >= this.end ? this.numChunks : - Math.floor(position / this.chunkSize); - var curChunk; - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - ensureByte: function ChunkedStream_ensureByte(pos) { - var chunk = Math.floor(pos / this.chunkSize); - if (chunk === this.lastSuccessfulEnsureByteChunk) { - return; - } - - if (!this.loadedChunks[chunk]) { - throw new MissingDataException(pos, pos + 1); - } - this.lastSuccessfulEnsureByteChunk = chunk; - }, - - ensureRange: function ChunkedStream_ensureRange(begin, end) { - if (begin >= end) { - return; - } - - if (end <= this.progressiveDataLength) { - 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 (!this.loadedChunks[chunk]) { - throw new MissingDataException(begin, end); - } - } - }, - - nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) { - var chunk, numChunks = this.numChunks; - for (var i = 0; i < numChunks; ++i) { - chunk = (beginChunk + i) % numChunks; // Wrap around to beginning - if (!this.loadedChunks[chunk]) { - return chunk; - } - } - return null; - }, - - hasChunk: function ChunkedStream_hasChunk(chunk) { - return !!this.loadedChunks[chunk]; - }, - - get length() { - return this.end - this.start; - }, - - get isEmpty() { - return this.length === 0; - }, - - getByte: function ChunkedStream_getByte() { - var pos = this.pos; - if (pos >= this.end) { - return -1; - } - this.ensureByte(pos); - return this.bytes[this.pos++]; - }, - - getUint16: function ChunkedStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - - getInt32: function ChunkedStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - - // 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); - }, - - peekByte: function ChunkedStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - - 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) { - this.ensureRange(start, start + length); - - 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 (!this.loadedChunks[chunk]) { - 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) { - 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, - withCredentials: args.withCredentials - }); - 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.promisesByRequest = {}; - this.progressiveDataLength = 0; - - this._loadedStreamCapability = createPromiseCapability(); - - if (args.initialData) { - this.onReceiveData({chunk: args.initialData}); - } - } - - ChunkedStreamManager.prototype = { - onLoadedStream: function ChunkedStreamManager_getLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - // 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._loadedStreamCapability.promise; - }, - - _requestChunks: function ChunkedStreamManager_requestChunks(chunks) { - var requestId = this.currRequestId++; - - var chunksNeeded; - var i, ii; - this.chunksNeededByRequest[requestId] = chunksNeeded = {}; - for (i = 0, ii = chunks.length; i < ii; i++) { - if (!this.stream.hasChunk(chunks[i])) { - chunksNeeded[chunks[i]] = true; - } - } - - if (isEmptyObj(chunksNeeded)) { - return Promise.resolve(); - } - - var capability = createPromiseCapability(); - this.promisesByRequest[requestId] = capability; - - 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 capability.promise; - } - - var groupedChunksToRequest = this.groupChunks(chunksToRequest); - - for (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); - } - - return capability.promise; - }, - - 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) { - - 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); - } - - return this._requestChunks(chunks); - }, - - requestRanges: function ChunkedStreamManager_requestRanges(ranges) { - 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; }); - return this._requestChunks(chunksToRequest); - }, - - // Groups a sorted array of chunks into as few contiguous larger - // chunks as possible - groupChunks: function ChunkedStreamManager_groupChunks(chunks) { - var groupedChunks = []; - var beginChunk = -1; - var prevChunk = -1; - for (var i = 0; i < chunks.length; ++i) { - var chunk = chunks[i]; - - if (beginChunk < 0) { - beginChunk = chunk; - } - - if (prevChunk >= 0 && 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 isProgressive = args.begin === undefined; - var begin = isProgressive ? this.progressiveDataLength : args.begin; - var end = begin + chunk.byteLength; - - var beginChunk = Math.floor(begin / this.chunkSize); - var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : - Math.ceil(end / this.chunkSize); - - if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; - } else { - this.stream.onReceiveData(begin, chunk); - } - - if (this.stream.allChunksLoaded()) { - this._loadedStreamCapability.resolve(this.stream); - } - - var loadedRequests = []; - var i, requestId; - for (chunk = beginChunk; chunk < endChunk; ++chunk) { - // The server might return more chunks than requested - var requestIds = this.requestsByChunk[chunk] || []; - delete this.requestsByChunk[chunk]; - - for (i = 0; i < requestIds.length; ++i) { - 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 (i = 0; i < loadedRequests.length; ++i) { - requestId = loadedRequests[i]; - var capability = this.promisesByRequest[requestId]; - delete this.promisesByRequest[requestId]; - capability.resolve(); - } - - this.msgHandler.send('DocProgress', { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length - }); - }, - - onError: function ChunkedStreamManager_onError(err) { - this._loadedStreamCapability.reject(err); - }, - - getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) { - var chunk = Math.floor(begin / this.chunkSize); - return chunk; - }, - - getEndChunk: function ChunkedStreamManager_getEndChunk(end) { - var chunk = Math.floor((end - 1) / this.chunkSize) + 1; - return chunk; - }, - - abort: function ChunkedStreamManager_abort() { - if (this.networkManager) { - this.networkManager.abortAllRequests(); - } - for(var requestId in this.promisesByRequest) { - var capability = this.promisesByRequest[requestId]; - capability.reject(new Error('Request was aborted')); - } - } - }; - - return ChunkedStreamManager; -})(); - - -var BasePdfManager = (function BasePdfManagerClosure() { - function BasePdfManager() { - throw new Error('Cannot initialize BaseManagerManager'); - } - - BasePdfManager.prototype = { - get docId() { - return this._docId; - }, - - onLoadedStream: function BasePdfManager_onLoadedStream() { - throw new NotImplementedException(); - }, - - ensureDoc: function BasePdfManager_ensureDoc(prop, args) { - return this.ensure(this.pdfDocument, prop, args); - }, - - ensureXRef: function BasePdfManager_ensureXRef(prop, args) { - return this.ensure(this.pdfDocument.xref, prop, args); - }, - - ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { - return this.ensure(this.pdfDocument.catalog, prop, args); - }, - - getPage: function BasePdfManager_getPage(pageIndex) { - return this.pdfDocument.getPage(pageIndex); - }, - - cleanup: function BasePdfManager_cleanup() { - return this.pdfDocument.cleanup(); - }, - - ensure: function BasePdfManager_ensure(obj, prop, args) { - return new NotImplementedException(); - }, - - requestRange: function BasePdfManager_requestRange(begin, end) { - return new NotImplementedException(); - }, - - requestLoadedStream: function BasePdfManager_requestLoadedStream() { - return new NotImplementedException(); - }, - - sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { - return new NotImplementedException(); - }, - - updatePassword: function BasePdfManager_updatePassword(password) { - this.pdfDocument.xref.password = this.password = password; - if (this._passwordChangedCapability) { - this._passwordChangedCapability.resolve(); - } - }, - - passwordChanged: function BasePdfManager_passwordChanged() { - this._passwordChangedCapability = createPromiseCapability(); - return this._passwordChangedCapability.promise; - }, - - terminate: function BasePdfManager_terminate() { - return new NotImplementedException(); - } - }; - - return BasePdfManager; -})(); - -var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(docId, data, password) { - this._docId = docId; - var stream = new Stream(data); - this.pdfDocument = new PDFDocument(this, stream, password); - this._loadedStreamCapability = createPromiseCapability(); - this._loadedStreamCapability.resolve(stream); - } - - Util.inherit(LocalPdfManager, BasePdfManager, { - ensure: function LocalPdfManager_ensure(obj, prop, args) { - return new Promise(function (resolve, reject) { - try { - var value = obj[prop]; - var result; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch (e) { - reject(e); - } - }); - }, - - requestRange: function LocalPdfManager_requestRange(begin, end) { - return Promise.resolve(); - }, - - requestLoadedStream: function LocalPdfManager_requestLoadedStream() { - return; - }, - - onLoadedStream: function LocalPdfManager_onLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - terminate: function LocalPdfManager_terminate() { - return; - } - }); - - return LocalPdfManager; -})(); - -var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(docId, args, msgHandler) { - this._docId = docId; - this.msgHandler = msgHandler; - - var params = { - msgHandler: msgHandler, - httpHeaders: args.httpHeaders, - withCredentials: args.withCredentials, - chunkedViewerLoading: args.chunkedViewerLoading, - disableAutoFetch: args.disableAutoFetch, - initialData: args.initialData - }; - this.streamManager = new ChunkedStreamManager(args.length, - args.rangeChunkSize, - args.url, params); - this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(), - args.password); - } - - Util.inherit(NetworkPdfManager, BasePdfManager, { - ensure: function NetworkPdfManager_ensure(obj, prop, args) { - var pdfManager = this; - - return new Promise(function (resolve, reject) { - function ensureHelper() { - try { - var result; - var value = obj[prop]; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch(e) { - if (!(e instanceof MissingDataException)) { - reject(e); - return; - } - pdfManager.streamManager.requestRange(e.begin, e.end). - then(ensureHelper, reject); - } - } - - ensureHelper(); - }); - }, - - requestRange: function NetworkPdfManager_requestRange(begin, end) { - return this.streamManager.requestRange(begin, end); - }, - - requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { - this.streamManager.requestAllChunks(); - }, - - sendProgressiveData: - function NetworkPdfManager_sendProgressiveData(chunk) { - this.streamManager.onReceiveData({ chunk: chunk }); - }, - - onLoadedStream: function NetworkPdfManager_onLoadedStream() { - return this.streamManager.onLoadedStream(); - }, - - terminate: function NetworkPdfManager_terminate() { - this.streamManager.abort(); - } - }); - - return NetworkPdfManager; -})(); - - -var Page = (function PageClosure() { - - var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; - - function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { - this.pdfManager = pdfManager; - this.pageIndex = pageIndex; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - this.fontCache = fontCache; - this.idCounters = { - obj: 0 - }; - this.resourcesPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - - getInheritedPageProp: function Page_getInheritedPageProp(key) { - var dict = this.pageDict, valueArray = null, loopCount = 0; - var MAX_LOOP_COUNT = 100; - // Always walk up the entire parent chain, to be able to find - // e.g. \Resources placed on multiple levels of the tree. - while (dict) { - var value = dict.get(key); - if (value) { - if (!valueArray) { - valueArray = []; - } - valueArray.push(value); - } - if (++loopCount > MAX_LOOP_COUNT) { - warn('Page_getInheritedPageProp: maximum loop count exceeded.'); - break; - } - dict = dict.get('Parent'); - } - if (!valueArray) { - return Dict.empty; - } - if (valueArray.length === 1 || !isDict(valueArray[0]) || - loopCount > MAX_LOOP_COUNT) { - return valueArray[0]; - } - return Dict.merge(this.xref, valueArray); - }, - - get content() { - return this.getPageProp('Contents'); - }, - - get resources() { - // For robustness: The spec states that a \Resources entry has to be - // present, but can be empty. Some document omit it still, in this case - // we return an empty dictionary. - return shadow(this, 'resources', this.getInheritedPageProp('Resources')); - }, - - get mediaBox() { - var obj = this.getInheritedPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) { - obj = LETTER_SIZE_MEDIABOX; - } - return shadow(this, 'mediaBox', obj); - }, - - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.getInheritedPageProp('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 rotate() { - var rotate = this.getInheritedPageProp('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 Page_loadResources(keys) { - if (!this.resourcesPromise) { - // TODO: add async getInheritedPageProp and remove this. - this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); - } - return this.resourcesPromise.then(function resourceSuccess() { - var objectLoader = new ObjectLoader(this.resources.map, - keys, - this.xref); - return objectLoader.load(); - }.bind(this)); - }, - - getOperatorList: function Page_getOperatorList(handler, task, intent) { - var self = this; - - 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, - this.fontCache); - - var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - var pageListPromise = dataPromises.then(function(data) { - var contentStream = data[0]; - var opList = new OperatorList(intent, handler, self.pageIndex); - - handler.send('StartRenderPage', { - transparency: partialEvaluator.hasBlendModes(self.resources), - pageIndex: self.pageIndex, - intent: intent - }); - return partialEvaluator.getOperatorList(contentStream, task, - self.resources, opList).then(function () { - return opList; - }); - }); - - var annotationsPromise = pdfManager.ensure(this, 'annotations'); - return Promise.all([pageListPromise, annotationsPromise]).then( - function(datas) { - var pageOpList = datas[0]; - var annotations = datas[1]; - - if (annotations.length === 0) { - pageOpList.flush(true); - return pageOpList; - } - - var annotationsReadyPromise = Annotation.appendToOperatorList( - annotations, pageOpList, partialEvaluator, task, intent); - return annotationsReadyPromise.then(function () { - pageOpList.flush(true); - return pageOpList; - }); - }); - }, - - extractTextContent: function Page_extractTextContent(task, - normalizeWhitespace) { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'XObject', - 'Font' - ]); - - var dataPromises = Promise.all([contentStreamPromise, - resourcesPromise]); - return dataPromises.then(function(data) { - var contentStream = data[0]; - var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, - handler, self.pageIndex, - 'p' + self.pageIndex + '_', - self.idCounters, - self.fontCache); - - return partialEvaluator.getTextContent(contentStream, - task, - self.resources, - /* stateManager = */ null, - normalizeWhitespace); - }); - }, - - getAnnotationsData: function Page_getAnnotationsData(intent) { - var annotations = this.annotations; - var annotationsData = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } - } - annotationsData.push(annotations[i].data); - } - return annotationsData; - }, - - get annotations() { - var annotations = []; - var annotationRefs = this.getInheritedPageProp('Annots') || []; - var annotationFactory = new AnnotationFactory(); - for (var i = 0, n = annotationRefs.length; i < n; ++i) { - var annotationRef = annotationRefs[i]; - var annotation = annotationFactory.create(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() { - var FINGERPRINT_FIRST_BYTES = 1024; - var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + - '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; - - 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) { - assert(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 strBuf = []; - if (pos + limit > end) { - limit = end - pos; - } - for (var n = 0; n < limit; ++n) { - strBuf.push(String.fromCharCode(stream.getByte())); - } - var str = strBuf.join(''); - 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); - var version = this.catalog.catDict.get('Version'); - if (isName(version)) { - this.pdfFormatVersion = version.name; - } - try { - // checking if AcroForm is present - this.acroForm = this.catalog.catDict.get('AcroForm'); - if (this.acroForm) { - this.xfa = this.acroForm.get('XFA'); - var fields = this.acroForm.get('Fields'); - if ((!fields || !isArray(fields) || fields.length === 0) && - !this.xfa) { - // no fields and no XFA -- not a form (?) - this.acroForm = null; - } - } - } catch (ex) { - info('Something wrong with AcroForm entry'); - this.acroForm = null; - } - }, - - get linearization() { - var linearization = null; - if (this.stream.length) { - try { - linearization = Linearization.create(this.stream); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info(err); - } - } - // 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); - } - if (!this.pdfFormatVersion) { - // 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, - IsXFAPresent: !!this.xfa - }; - 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, hash, fileID = ''; - var idArray = xref.trailer.get('ID'); - - if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && - idArray[0] !== EMPTY_FINGERPRINT) { - hash = stringToBytes(idArray[0]); - } else { - if (this.stream.ensureRange) { - this.stream.ensureRange(0, - Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); - } - hash = calculateMD5(this.stream.bytes.subarray(0, - FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); - } - - for (var i = 0, n = hash.length; i < n; i++) { - var hex = hash[i].toString(16); - fileID += hex.length === 1 ? '0' + hex : hex; - } - - return shadow(this, 'fingerprint', fileID); - }, - - getPage: function PDFDocument_getPage(pageIndex) { - return this.catalog.getPage(pageIndex); - }, - - cleanup: function PDFDocument_cleanup() { - return this.catalog.cleanup(); - } - }; - - return PDFDocument; -})(); - - -var Name = (function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - - var nameCache = {}; - - Name.get = function Name_get(name) { - var nameValue = nameCache[name]; - return (nameValue ? nameValue : (nameCache[name] = new Name(name))); - }; - - 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]; - return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd))); - }; - - return Cmd; -})(); - -var Dict = (function DictClosure() { - var nonSerializable = function nonSerializableClosure() { - return nonSerializable; // creating closure on some variable - }; - - var GETALL_DICTIONARY_TYPES_WHITELIST = { - 'Background': true, - 'ExtGState': true, - 'Halftone': true, - 'Layout': true, - 'Mask': true, - 'Pagination': true, - 'Printing': true - }; - - function isRecursionAllowedFor(dict) { - if (!isName(dict.Type)) { - return true; - } - var dictType = dict.Type.name; - return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true; - } - - // 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.objId = null; - 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 xref = this.xref; - if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || - typeof key2 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || - typeof key3 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - value = this.map[key3] || null; - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - }, - - // Same as get(), but dereferences all elements if the result is an Array. - getArray: function Dict_getArray(key1, key2, key3) { - var value = this.get(key1, key2, key3); - var xref = this.xref; - if (!isArray(value) || !xref) { - return value; - } - value = value.slice(); // Ensure that we don't modify the Dict data. - for (var i = 0, ii = value.length; i < ii; i++) { - if (!isRef(value[i])) { - continue; - } - value[i] = xref.fetch(value[i]); - } - return value; - }, - - // no dereferencing - getRaw: function Dict_getRaw(key) { - return this.map[key]; - }, - - // creates new map and dereferences all Refs - getAll: function Dict_getAll() { - var all = Object.create(null); - var queue = null; - var key, obj; - for (key in this.map) { - obj = this.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - (queue || (queue = [])).push({target: all, key: key, obj: obj}); - } else { - all[key] = this.getRaw(key); - } - } else { - all[key] = obj; - } - } - if (!queue) { - return all; - } - - // trying to take cyclic references into the account - var processed = Object.create(null); - while (queue.length > 0) { - var item = queue.shift(); - var itemObj = item.obj; - var objId = itemObj.objId; - if (objId && objId in processed) { - item.target[item.key] = processed[objId]; - continue; - } - var dereferenced = Object.create(null); - for (key in itemObj.map) { - obj = itemObj.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - queue.push({target: dereferenced, key: key, obj: obj}); - } else { - dereferenced[key] = itemObj.getRaw(key); - } - } else { - dereferenced[key] = obj; - } - } - if (objId) { - processed[objId] = dereferenced; - } - item.target[item.key] = dereferenced; - } - return all; - }, - - getKeys: function Dict_getKeys() { - return Object.keys(this.map); - }, - - 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)); - } - } - }; - - Dict.empty = new Dict(null); - - Dict.merge = function Dict_merge(xref, dictArray) { - var mergedDict = new Dict(xref); - - for (var i = 0, ii = dictArray.length; i < ii; i++) { - var dict = dictArray[i]; - if (!isDict(dict)) { - continue; - } - for (var keyName in dict.map) { - if (mergedDict.map[keyName]) { - continue; - } - mergedDict.map[keyName] = dict.map[keyName]; - } - } - return mergedDict; - }; - - return Dict; -})(); - -var Ref = (function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = { - toString: function Ref_toString() { - // This function is hot, so we make the string as compact as possible. - // |this.gen| is almost always zero, so we treat that case specially. - var str = this.num + 'R'; - if (this.gen !== 0) { - str += this.gen; - } - return str; - } - }; - - 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 ref.toString() in this.dict; - }, - - put: function RefSet_put(ref) { - this.dict[ref.toString()] = true; - }, - - remove: function RefSet_remove(ref) { - delete this.dict[ref.toString()]; - } - }; - - return RefSet; -})(); - -var RefSetCache = (function RefSetCacheClosure() { - function RefSetCache() { - this.dict = Object.create(null); - } - - RefSetCache.prototype = { - get: function RefSetCache_get(ref) { - return this.dict[ref.toString()]; - }, - - has: function RefSetCache_has(ref) { - return ref.toString() in this.dict; - }, - - put: function RefSetCache_put(ref, obj) { - this.dict[ref.toString()] = obj; - }, - - putAlias: function RefSetCache_putAlias(ref, aliasRef) { - this.dict[ref.toString()] = this.get(aliasRef); - }, - - forEach: function RefSetCache_forEach(fn, thisArg) { - for (var i in this.dict) { - fn.call(thisArg, this.dict[i]); - } - }, - - clear: function RefSetCache_clear() { - this.dict = Object.create(null); - } - }; - - return RefSetCache; -})(); - -var Catalog = (function CatalogClosure() { - function Catalog(pdfManager, xref) { - this.pdfManager = pdfManager; - this.xref = xref; - this.catDict = xref.getCatalogObj(); - this.fontCache = new RefSetCache(); - assert(isDict(this.catDict), - 'catalog object is not a dictionary'); - - this.pagePromises = []; - } - - 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'); - assert(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'); - assert( - 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 && obj.has('Dests')) { - 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); - }, - getDestination: function Catalog_getDestination(destinationId) { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dest = null, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { // Simple destination dictionary. - var value = nameDictionaryRef.get(destinationId); - if (value) { - dest = fetchDestination(value); - } - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - dest = fetchDestination(nameTree.get(destinationId)); - } - return dest; - }, - get attachments() { - var xref = this.xref; - var attachments = null, nameTreeRef; - var obj = this.catDict.get('Names'); - if (obj) { - nameTreeRef = obj.getRaw('EmbeddedFiles'); - } - - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - if (!names.hasOwnProperty(name)) { - continue; - } - var fs = new FileSpec(names[name], xref); - if (!attachments) { - attachments = {}; - } - attachments[stringToPDFString(name)] = fs.serializable; - } - } - return shadow(this, 'attachments', attachments); - }, - get javaScript() { - var xref = this.xref; - var obj = this.catDict.get('Names'); - - var javaScript = []; - function appendIfJavaScriptDict(jsDict) { - var type = jsDict.get('S'); - if (!isName(type) || type.name !== 'JavaScript') { - return; - } - var js = jsDict.get('JS'); - if (isStream(js)) { - js = bytesToString(js.getBytes()); - } else if (!isString(js)) { - return; - } - javaScript.push(stringToPDFString(js)); - } - 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. This code is - // defensive so we don't cause errors on document load. - var jsDict = names[name]; - if (isDict(jsDict)) { - appendIfJavaScriptDict(jsDict); - } - } - } - - // Append OpenAction actions to javaScript array - var openactionDict = this.catDict.get('OpenAction'); - if (isDict(openactionDict, 'Action')) { - var actionType = openactionDict.get('S'); - if (isName(actionType) && actionType.name === 'Named') { - // The named Print action is not a part of the PDF 1.7 specification, - // but is supported by many PDF readers/writers (including Adobe's). - var action = openactionDict.get('N'); - if (isName(action) && action.name === 'Print') { - javaScript.push('print({});'); - } - } else { - appendIfJavaScriptDict(openactionDict); - } - } - - return shadow(this, 'javaScript', javaScript); - }, - - cleanup: function Catalog_cleanup() { - var promises = []; - this.fontCache.forEach(function (promise) { - promises.push(promise); - }); - return Promise.all(promises).then(function (translatedFonts) { - for (var i = 0, ii = translatedFonts.length; i < ii; i++) { - var font = translatedFonts[i].dict; - delete font.translated; - } - this.fontCache.clear(); - }.bind(this)); - }, - - getPage: function Catalog_getPage(pageIndex) { - if (!(pageIndex in this.pagePromises)) { - this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then( - function (a) { - var dict = a[0]; - var ref = a[1]; - return new Page(this.pdfManager, this.xref, pageIndex, dict, ref, - this.fontCache); - }.bind(this) - ); - } - return this.pagePromises[pageIndex]; - }, - - getPageDict: function Catalog_getPageDict(pageIndex) { - var capability = createPromiseCapability(); - var nodesToVisit = [this.catDict.getRaw('Pages')]; - var currentPageIndex = 0; - var xref = this.xref; - var checkAllKids = false; - - function next() { - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - if (isRef(currentNode)) { - xref.fetchAsync(currentNode).then(function (obj) { - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - if (pageIndex === currentPageIndex) { - capability.resolve([obj, currentNode]); - } else { - currentPageIndex++; - next(); - } - return; - } - nodesToVisit.push(obj); - next(); - }, capability.reject); - return; - } - - // Must be a child page dictionary. - assert( - isDict(currentNode), - 'page dictionary kid reference points to wrong type of object' - ); - var count = currentNode.get('Count'); - // If the current node doesn't have any children, avoid getting stuck - // in an empty node further down in the tree (see issue5644.pdf). - if (count === 0) { - checkAllKids = true; - } - // Skip nodes where the page can't be. - if (currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - - var kids = currentNode.get('Kids'); - assert(isArray(kids), 'page dictionary kids object is not an array'); - if (!checkAllKids && count === kids.length) { - // Nodes that don't have the page have been skipped and this is the - // bottom of the tree which means the page requested must be a - // descendant of this pages node. Ideally we would just resolve the - // promise with the page ref here, but there is the case where more - // pages nodes could link to single a page (see issue 3666 pdf). To - // handle this push it back on the queue so if it is a pages node it - // will be descended into. - nodesToVisit = [kids[pageIndex - currentPageIndex]]; - currentPageIndex = pageIndex; - continue; - } else { - for (var last = kids.length - 1; last >= 0; last--) { - nodesToVisit.push(kids[last]); - } - } - } - capability.reject('Page index ' + pageIndex + ' not found.'); - } - next(); - return capability.promise; - }, - - getPageIndex: function Catalog_getPageIndex(ref) { - // The page tree nodes have the count of all the leaves below them. To get - // how many pages are before we just have to walk up the tree and keep - // adding the count of siblings to the left of the node. - var xref = this.xref; - function pagesBeforeRef(kidRef) { - var total = 0; - var parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (!node) { - return null; - } - parentRef = node.getRaw('Parent'); - return node.getAsync('Parent'); - }).then(function (parent) { - if (!parent) { - return null; - } - return parent.getAsync('Kids'); - }).then(function (kids) { - if (!kids) { - return null; - } - var kidPromises = []; - var found = false; - for (var i = 0; i < kids.length; i++) { - var kid = kids[i]; - assert(isRef(kid), 'kids must be a ref'); - if (kid.num === kidRef.num) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (kid) { - if (kid.has('Count')) { - var count = kid.get('Count'); - total += count; - } else { // page leaf node - total++; - } - })); - } - if (!found) { - error('kid ref not found in parents kids'); - } - return Promise.all(kidPromises).then(function () { - return [total, parentRef]; - }); - }); - } - - var total = 0; - function next(ref) { - return pagesBeforeRef(ref).then(function (args) { - if (!args) { - return total; - } - var count = args[0]; - var parentRef = args[1]; - total += count; - return next(parentRef); - }); - } - - return next(ref); - } - }; - - 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; - this.stats = { - streamTypes: [], - fontTypes: [] - }; - } - - 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(); - - // The pdflib PDF generator can generate a nested trailer dictionary - if (!isDict(dict) && dict.dict) { - dict = dict.dict; - } - 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)) { - 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 is 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. - var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; - var PERCENT = 0x25, LT = 0x3C; - - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== LF && ch !== CR && ch !== LT) { - 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 objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; - 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]); - - // Clear out any existing entries, since they may be bogus. - this.entries.length = 0; - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - while (position < length) { - var ch = buffer[position]; - if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { - ++position; - continue; - } - if (ch === PERCENT) { // %-comment - do { - ++position; - if (position >= length) { - break; - } - ch = buffer[position]; - } while (ch !== LF && ch !== CR); - continue; - } - var token = readToken(buffer, position); - var m; - if (token.indexOf('xref') === 0 && - (token.length === 4 || /\s/.test(token[4]))) { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = objRegExp.exec(token))) { - if (typeof this.entries[m[1]] === 'undefined') { - this.entries[m[1]] = { - offset: position - stream.start, - 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 - stream.start); - this.xrefstms[position - stream.start] = 1; // Avoid recursion - } - - position += contentLength; - } else if (token.indexOf('trailer') === 0 && - (token.length === 7 || /\s/.test(token[7]))) { - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else { - position += token.length + 1; - } - } - // reading XRef streams - var i, ii; - for (i = 0, ii = xrefStms.length; i < ii; ++i) { - this.startXRefQueue.push(xrefStms[i]); - this.readXRef(/* recoveryMode */ true); - } - // finding main trailer - var dict; - for (i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), true, this); - 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 + stream.start; - - var parser = new Parser(new Lexer(stream), true, this); - 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'); - } - } else { - error('Invalid XRef stream header'); - } - - // 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; - } - info('(while reading XRef): ' + e); - } - - if (recoveryMode) { - return; - } - throw new XRefParseException(); - }, - - getEntry: function XRef_getEntry(i) { - var xrefEntry = this.entries[i]; - if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { - return xrefEntry; - } - return null; - }, - - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) { - return obj; - } - return this.fetch(obj); - }, - - fetch: function XRef_fetch(ref, suppressEncryption) { - assert(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) { - var cacheEntry = this.cache[num]; - return cacheEntry; - } - - var xrefEntry = this.getEntry(num); - - // the referenced entry can be free - if (xrefEntry === null) { - return (this.cache[num] = null); - } - - if (xrefEntry.uncompressed) { - xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); - } else { - xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); - } - if (isDict(xrefEntry)){ - xrefEntry.objId = ref.toString(); - } else if (isStream(xrefEntry)) { - xrefEntry.dict.objId = ref.toString(); - } - return xrefEntry; - }, - - fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, - suppressEncryption) { - var gen = ref.gen; - var num = ref.num; - if (xrefEntry.gen !== gen) { - error('inconsistent generation in XRef'); - } - var stream = this.stream.makeSubStream(xrefEntry.offset + - this.stream.start); - var parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || parseInt(obj1, 10) !== num || - !isInt(obj2) || parseInt(obj2, 10) !== 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) { - xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } else { - xrefEntry = parser.getObj(); - } - if (!isStream(xrefEntry)) { - this.cache[num] = xrefEntry; - } - return xrefEntry; - }, - - fetchCompressed: function XRef_fetchCompressed(xrefEntry, - suppressEncryption) { - var tableOffset = xrefEntry.offset; - var 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'); - } - var parser = new Parser(new Lexer(stream), false, this); - parser.allowStreams = true; - var i, entries = [], num, 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]; - } - } - xrefEntry = entries[xrefEntry.gen]; - if (xrefEntry === undefined) { - error('bad XRef entry for compressed object'); - } - return xrefEntry; - }, - - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { - if (!isRef(obj)) { - return Promise.resolve(obj); - } - return this.fetchAsync(obj); - }, - - fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { - var streamManager = this.stream.manager; - var xref = this; - return new Promise(function tryFetch(resolve, reject) { - try { - resolve(xref.fetch(ref, suppressEncryption)); - } catch (e) { - if (e instanceof MissingDataException) { - streamManager.requestRange(e.begin, e.end).then(function () { - tryFetch(resolve, reject); - }, reject); - return; - } - reject(e); - } - }); - }, - - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * A NameTree is like a Dict but has some advantageous 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[xref.fetchIfRef(names[i])] = xref.fetchIfRef(names[i + 1]); - } - } - } - return dict; - }, - - get: function NameTree_get(destinationId) { - if (!this.root) { - return null; - } - - var xref = this.xref; - var kidsOrNames = xref.fetchIfRef(this.root); - var loopCount = 0; - var MAX_NAMES_LEVELS = 10; - var l, r, m; - - // Perform a binary search to quickly find the entry that - // contains the named destination we are looking for. - while (kidsOrNames.has('Kids')) { - loopCount++; - if (loopCount > MAX_NAMES_LEVELS) { - warn('Search depth limit for named destionations has been reached.'); - return null; - } - - var kids = kidsOrNames.get('Kids'); - if (!isArray(kids)) { - return null; - } - - l = 0; - r = kids.length - 1; - while (l <= r) { - m = (l + r) >> 1; - var kid = xref.fetchIfRef(kids[m]); - var limits = kid.get('Limits'); - - if (destinationId < xref.fetchIfRef(limits[0])) { - r = m - 1; - } else if (destinationId > xref.fetchIfRef(limits[1])) { - l = m + 1; - } else { - kidsOrNames = xref.fetchIfRef(kids[m]); - break; - } - } - if (l > r) { - return null; - } - } - - // If we get here, then we have found the right entry. Now - // go through the named destinations in the Named dictionary - // until we find the exact destination we're looking for. - var names = kidsOrNames.get('Names'); - if (isArray(names)) { - // Perform a binary search to reduce the lookup time. - l = 0; - r = names.length - 2; - while (l <= r) { - // Check only even indices (0, 2, 4, ...) because the - // odd indices contain the actual D array. - m = (l + r) & ~1; - if (destinationId < xref.fetchIfRef(names[m])) { - r = m - 2; - } else if (destinationId > xref.fetchIfRef(names[m])) { - l = m + 2; - } else { - return xref.fetchIfRef(names[m + 1]); - } - } - } - return null; - } - }; - return NameTree; -})(); - -/** - * "A PDF file can refer to the contents of another file by using a File - * Specification (PDF 1.1)", see the spec (7.11) for more details. - * NOTE: Only embedded files are supported (as part of the attachments support) - * TODO: support the 'URL' file system (with caching if !/V), portable - * collections attributes and related files (/RF) - */ -var FileSpec = (function FileSpecClosure() { - function FileSpec(root, xref) { - if (!root || !isDict(root)) { - return; - } - this.xref = xref; - this.root = root; - if (root.has('FS')) { - this.fs = root.get('FS'); - } - this.description = root.has('Desc') ? - stringToPDFString(root.get('Desc')) : - ''; - if (root.has('RF')) { - warn('Related file specifications are not supported'); - } - this.contentAvailable = true; - if (!root.has('EF')) { - this.contentAvailable = false; - warn('Non-embedded file specifications are not supported'); - } - } - - function pickPlatformItem(dict) { - // Look for the filename in this order: - // UF, F, Unix, Mac, DOS - if (dict.has('UF')) { - return dict.get('UF'); - } else if (dict.has('F')) { - return dict.get('F'); - } else if (dict.has('Unix')) { - return dict.get('Unix'); - } else if (dict.has('Mac')) { - return dict.get('Mac'); - } else if (dict.has('DOS')) { - return dict.get('DOS'); - } else { - return null; - } - } - - FileSpec.prototype = { - get filename() { - if (!this._filename && this.root) { - var filename = pickPlatformItem(this.root) || 'unnamed'; - this._filename = stringToPDFString(filename). - replace(/\\\\/g, '\\'). - replace(/\\\//g, '/'). - replace(/\\/g, '/'); - } - return this._filename; - }, - get content() { - if (!this.contentAvailable) { - return null; - } - if (!this.contentRef && this.root) { - this.contentRef = pickPlatformItem(this.root.get('EF')); - } - var content = null; - if (this.contentRef) { - var xref = this.xref; - var fileObj = xref.fetchIfRef(this.contentRef); - if (fileObj && isStream(fileObj)) { - content = fileObj.getBytes(); - } else { - warn('Embedded file specification points to non-existing/invalid ' + - 'content'); - } - } else { - warn('Embedded file specification does not have a content'); - } - return content; - }, - get serializable() { - return { - filename: this.filename, - content: this.content - }; - } - }; - return FileSpec; -})(); - -/** - * 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) { - var value; - if (isDict(node) || isStream(node)) { - var map; - if (isDict(node)) { - map = node.map; - } else { - map = node.dict.map; - } - for (var key in map) { - value = map[key]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } else if (isArray(node)) { - for (var i = 0, ii = node.length; i < ii; i++) { - 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; - this.capability = null; - } - - ObjectLoader.prototype = { - load: function ObjectLoader_load() { - var keys = this.keys; - this.capability = createPromiseCapability(); - // 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.capability.resolve(); - return this.capability.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.capability.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).then( - 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), this.capability.reject); - return; - } - // Everything is loaded. - this.refSet = null; - this.capability.resolve(); - } - }; - - return ObjectLoader; -})(); - - -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 DEFAULT_ICON_SIZE = 22; // px - -/** - * @class - * @alias AnnotationFactory - */ -function AnnotationFactory() {} -AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { - /** - * @param {XRef} xref - * @param {Object} ref - * @returns {Annotation} - */ - create: function AnnotationFactory_create(xref, ref) { - var dict = xref.fetchIfRef(ref); - if (!isDict(dict)) { - return; - } - - // Determine the annotation's subtype. - var subtype = dict.get('Subtype'); - subtype = isName(subtype) ? subtype.name : ''; - - // Return the right annotation object based on the subtype and field type. - var parameters = { - dict: dict, - ref: ref - }; - - switch (subtype) { - case 'Link': - return new LinkAnnotation(parameters); - - case 'Text': - return new TextAnnotation(parameters); - - case 'Widget': - var fieldType = Util.getInheritableProperty(dict, 'FT'); - if (isName(fieldType) && fieldType.name === 'Tx') { - return new TextWidgetAnnotation(parameters); - } - return new WidgetAnnotation(parameters); - - default: - warn('Unimplemented annotation type "' + subtype + '", ' + - 'falling back to base annotation'); - return new Annotation(parameters); - } - } -}; - -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); - } - } else { - appearance = appearances; - } - return appearance; - } - - function Annotation(params) { - var dict = params.dict; - - this.setFlags(dict.get('F')); - this.setRectangle(dict.get('Rect')); - this.setColor(dict.get('C')); - this.setBorderStyle(dict); - this.appearance = getDefaultAppearance(dict); - - // Expose public properties using a data object. - this.data = {}; - this.data.id = params.ref.num; - this.data.subtype = dict.get('Subtype').name; - this.data.annotationFlags = this.flags; - this.data.rect = this.rectangle; - this.data.color = this.color; - this.data.borderStyle = this.borderStyle; - this.data.hasAppearance = !!this.appearance; - } - - Annotation.prototype = { - /** - * @return {boolean} - */ - get viewable() { - if (this.flags) { - return !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN) && - !this.hasFlag(AnnotationFlag.NOVIEW); - } - return true; - }, - - /** - * @return {boolean} - */ - get printable() { - if (this.flags) { - return this.hasFlag(AnnotationFlag.PRINT) && - !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN); - } - return false; - }, - - /** - * Set the flags. - * - * @public - * @memberof Annotation - * @param {number} flags - Unsigned 32-bit integer specifying annotation - * characteristics - * @see {@link shared/util.js} - */ - setFlags: function Annotation_setFlags(flags) { - if (isInt(flags)) { - this.flags = flags; - } else { - this.flags = 0; - } - }, - - /** - * Check if a provided flag is set. - * - * @public - * @memberof Annotation - * @param {number} flag - Hexadecimal representation for an annotation - * characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFlag: function Annotation_hasFlag(flag) { - if (this.flags) { - return (this.flags & flag) > 0; - } - return false; - }, - - /** - * Set the rectangle. - * - * @public - * @memberof Annotation - * @param {Array} rectangle - The rectangle array with exactly four entries - */ - setRectangle: function Annotation_setRectangle(rectangle) { - if (isArray(rectangle) && rectangle.length === 4) { - this.rectangle = Util.normalizeRect(rectangle); - } else { - this.rectangle = [0, 0, 0, 0]; - } - }, - - /** - * Set the color and take care of color space conversion. - * - * @public - * @memberof Annotation - * @param {Array} color - The color array containing either 0 - * (transparent), 1 (grayscale), 3 (RGB) or - * 4 (CMYK) elements - */ - setColor: function Annotation_setColor(color) { - var rgbColor = new Uint8Array(3); // Black in RGB color space (default) - if (!isArray(color)) { - this.color = rgbColor; - return; - } - - switch (color.length) { - case 0: // Transparent, which we indicate with a null value - this.color = null; - break; - - case 1: // Convert grayscale to RGB - ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 3: // Convert RGB percentages to RGB - ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 4: // Convert CMYK to RGB - ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - default: - this.color = rgbColor; - break; - } - }, - - /** - * Set the border style (as AnnotationBorderStyle object). - * - * @public - * @memberof Annotation - * @param {Dict} borderStyle - The border style dictionary - */ - setBorderStyle: function Annotation_setBorderStyle(borderStyle) { - this.borderStyle = new AnnotationBorderStyle(); - if (!isDict(borderStyle)) { - return; - } - if (borderStyle.has('BS')) { - var dict = borderStyle.get('BS'); - var dictType; - - if (!dict.has('Type') || (isName(dictType = dict.get('Type')) && - dictType.name === 'Border')) { - this.borderStyle.setWidth(dict.get('W')); - this.borderStyle.setStyle(dict.get('S')); - this.borderStyle.setDashArray(dict.get('D')); - } - } else if (borderStyle.has('Border')) { - var array = borderStyle.get('Border'); - if (isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2]); - - if (array.length === 4) { // Dash array available - this.borderStyle.setDashArray(array[3]); - } - } - } else { - // There are no border entries in the dictionary. According to the - // specification, we should draw a solid border of width 1 in that - // case, but Adobe Reader did not implement that part of the - // specification and instead draws no border at all, so we do the same. - // See also https://github.com/mozilla/pdf.js/issues/6179. - this.borderStyle.setWidth(0); - } - }, - - loadResources: function Annotation_loadResources(keys) { - return new Promise(function (resolve, reject) { - this.appearance.dict.getAsync('Resources').then(function (resources) { - if (!resources) { - resolve(); - return; - } - var objectLoader = new ObjectLoader(resources.map, - keys, - resources.xref); - objectLoader.load().then(function() { - resolve(resources); - }, reject); - }, reject); - }.bind(this)); - }, - - getOperatorList: function Annotation_getOperatorList(evaluator, task) { - if (!this.appearance) { - return Promise.resolve(new OperatorList()); - } - - 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 self = this; - - return resourcesPromise.then(function(resources) { - var opList = new OperatorList(); - opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]); - return evaluator.getOperatorList(self.appearance, task, - resources, opList). - then(function () { - opList.addOp(OPS.endAnnotation, []); - self.appearance.reset(); - return opList; - }); - }); - } - }; - - Annotation.appendToOperatorList = function Annotation_appendToOperatorList( - annotations, opList, partialEvaluator, task, intent) { - var annotationPromises = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if ((intent === 'display' && annotations[i].viewable) || - (intent === 'print' && annotations[i].printable)) { - annotationPromises.push( - annotations[i].getOperatorList(partialEvaluator, task)); - } - } - return Promise.all(annotationPromises).then(function(operatorLists) { - opList.addOp(OPS.beginAnnotations, []); - for (var i = 0, n = operatorLists.length; i < n; ++i) { - opList.addOpList(operatorLists[i]); - } - opList.addOp(OPS.endAnnotations, []); - }); - }; - - return Annotation; -})(); - -/** - * Contains all data regarding an annotation's border style. - * - * @class - */ -var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() { - /** - * @constructor - * @private - */ - function AnnotationBorderStyle() { - this.width = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } - - AnnotationBorderStyle.prototype = { - /** - * Set the width. - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} width - The width - */ - setWidth: function AnnotationBorderStyle_setWidth(width) { - if (width === (width | 0)) { - this.width = width; - } - }, - - /** - * Set the style. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Object} style - The style object - * @see {@link shared/util.js} - */ - setStyle: function AnnotationBorderStyle_setStyle(style) { - if (!style) { - return; - } - switch (style.name) { - case 'S': - this.style = AnnotationBorderStyleType.SOLID; - break; - - case 'D': - this.style = AnnotationBorderStyleType.DASHED; - break; - - case 'B': - this.style = AnnotationBorderStyleType.BEVELED; - break; - - case 'I': - this.style = AnnotationBorderStyleType.INSET; - break; - - case 'U': - this.style = AnnotationBorderStyleType.UNDERLINE; - break; - - default: - break; - } - }, - - /** - * Set the dash array. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Array} dashArray - The dash array with at least one element - */ - setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { - // We validate the dash array, but we do not use it because CSS does not - // allow us to change spacing of dashes. For more information, visit - // http://www.w3.org/TR/css3-background/#the-border-style. - if (isArray(dashArray) && dashArray.length > 0) { - // According to the PDF specification: the elements in a dashArray - // shall be numbers that are nonnegative and not all equal to zero. - var isValid = true; - var allZeros = true; - for (var i = 0, len = dashArray.length; i < len; i++) { - var element = dashArray[i]; - var validNumber = (+element >= 0); - if (!validNumber) { - isValid = false; - break; - } else if (element > 0) { - allZeros = false; - } - } - if (isValid && !allZeros) { - this.dashArray = dashArray; - } else { - this.width = 0; // Adobe behavior when the array is invalid. - } - } else if (dashArray) { - this.width = 0; // Adobe behavior when the array is invalid. - } - }, - - /** - * Set the horizontal corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The horizontal corner radius - */ - setHorizontalCornerRadius: - function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.horizontalCornerRadius = radius; - } - }, - - /** - * Set the vertical corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The vertical corner radius - */ - setVerticalCornerRadius: - function AnnotationBorderStyle_setVerticalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.verticalCornerRadius = radius; - } - } - }; - - return AnnotationBorderStyle; -})(); - -var WidgetAnnotation = (function WidgetAnnotationClosure() { - function WidgetAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - data.annotationType = AnnotationType.WIDGET; - 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') || Dict.empty; - - // Hide unsupported Widget signatures. - if (data.fieldType === 'Sig') { - warn('unimplemented annotation type: Widget signature'); - this.setFlags(AnnotationFlag.HIDDEN); - } - - // 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 if (parent && ref) { - // 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('.'); - } - - Util.inherit(WidgetAnnotation, Annotation, {}); - - return WidgetAnnotation; -})(); - -var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { - function TextWidgetAnnotation(params) { - WidgetAnnotation.call(this, params); - - this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q'); - this.data.hasHtml = !this.data.hasAppearance && !!this.data.fieldValue; - } - - Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { - getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, - task) { - if (this.appearance) { - return Annotation.prototype.getOperatorList.call(this, evaluator, task); - } - - 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. - if (!data.defaultAppearance) { - return Promise.resolve(opList); - } - - var stream = new Stream(stringToBytes(data.defaultAppearance)); - return evaluator.getOperatorList(stream, task, - this.fieldResources, opList). - then(function () { - return opList; - }); - } - }); - - return TextWidgetAnnotation; -})(); - -var TextAnnotation = (function TextAnnotationClosure() { - function TextAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - var content = dict.get('Contents'); - var title = dict.get('T'); - data.annotationType = AnnotationType.TEXT; - data.content = stringToPDFString(content || ''); - data.title = stringToPDFString(title || ''); - data.hasHtml = true; - - if (data.hasAppearance) { - data.name = 'NoIcon'; - } else { - data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE; - data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE; - data.name = dict.has('Name') ? dict.get('Name').name : 'Note'; - } - - if (dict.has('C')) { - data.hasBgColor = true; - } - } - - Util.inherit(TextAnnotation, Annotation, {}); - - return TextAnnotation; -})(); - -var LinkAnnotation = (function LinkAnnotationClosure() { - function LinkAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - data.annotationType = AnnotationType.LINK; - data.hasHtml = true; - - var action = dict.get('A'); - if (action && isDict(action)) { - var linkType = action.get('S').name; - if (linkType === 'URI') { - var url = action.get('URI'); - if (isName(url)) { - // Some bad PDFs do not put parentheses around relative URLs. - url = '/' + url.name; - } else if (url) { - url = addDefaultProtocolToUrl(url); - } - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - if (!isValidUrl(url, false)) { - url = ''; - } - // According to ISO 32000-1:2008, section 12.6.4.7, - // URI should to be encoded in 7-bit ASCII. - // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280. - try { - data.url = stringToUTF8String(url); - } catch (e) { - // Fall back to a simple copy. - 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 if (linkType === 'Named') { - data.action = action.get('N').name; - } else { - warn('unrecognized link type: ' + linkType); - } - } else if (dict.has('Dest')) { - // simple destination link - var dest = dict.get('Dest'); - data.dest = isName(dest) ? dest.name : dest; - } - } - - // Lets URLs beginning with 'www.' default to using the 'http://' protocol. - function addDefaultProtocolToUrl(url) { - if (url && url.indexOf('www.') === 0) { - return ('http://' + url); - } - return url; - } - - Util.inherit(LinkAnnotation, Annotation, {}); - - 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 i, ii; - var length = 1; - for (i = 0, ii = size.length; i < ii; i++) { - length *= size[i]; - } - length *= outputSize; - - var array = new Array(length); - 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 (i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array[i] = (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); - }, - - parseArray: function PDFFunction_parseArray(xref, fnObj) { - if (!isArray(fnObj)) { - // not an array -- parsing as regular function - return this.parse(xref, fnObj); - } - - var fnArray = []; - for (var j = 0, jj = fnObj.length; j < jj; j++) { - var obj = xref.fetchIfRef(fnObj[j]); - fnArray.push(PDFFunction.parse(xref, obj)); - } - return function (src, srcOffset, dest, destOffset) { - for (var i = 0, ii = fnArray.length; i < ii; i++) { - fnArray[i](src, srcOffset, dest, destOffset + i); - } - }; - }, - - constructSampled: function PDFFunction_constructSampled(str, dict) { - function toMultiArray(arr) { - var inputLength = arr.length; - 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 - info('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(src, srcOffset, - dest, destOffset) { - // 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]; - - // 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); - var i, j; - for (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 (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(src[srcOffset +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 (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; - } - - for (j = 0; j < n; ++j) { - // Sum all cube vertices' samples portions - var rj = 0; - for (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) - dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), - range[j][1]); - } - }; - }, - - 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(src, srcOffset, - dest, destOffset) { - var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n); - - for (var j = 0; j < length; ++j) { - dest[destOffset + j] = c0[j] + (x * diff[j]); - } - }; - }, - - 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 = []; - var tmpBuf = new Float32Array(1); - - for (var i = 0, ii = fnsIR.length; i < ii; i++) { - fns.push(PDFFunction.fromIR(fnsIR[i])); - } - - return function constructStichedFromIRResult(src, srcOffset, - dest, destOffset) { - 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(src[srcOffset], 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]; - - // Prevent the value from becoming NaN as a result - // of division by zero (fixes issue6113.pdf). - tmpBuf[0] = dmin === dmax ? rmin : - rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - - // call the appropriate function - fns[i](tmpBuf, 0, dest, destOffset); - }; - }, - - 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 compiled = (new PostScriptCompiler()).compile(code, domain, range); - if (compiled) { - // Compiled function consists of simple expressions such as addition, - // subtraction, Math.max, and also contains 'var' and 'return' - // statements. See the generation in the PostScriptCompiler below. - /*jshint -W054 */ - return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); - } - - info('Unable to compile PS function'); - - var numOutputs = range.length >> 1; - var numInputs = domain.length >> 1; - 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 = {}; - // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values - // seen in our tests. - var MAX_CACHE_SIZE = 2048 * 4; - var cache_available = MAX_CACHE_SIZE; - var tmpBuf = new Float32Array(numInputs); - - return function constructPostScriptFromIRResult(src, srcOffset, - dest, destOffset) { - var i, value; - var key = ''; - var input = tmpBuf; - for (i = 0; i < numInputs; i++) { - value = src[srcOffset + i]; - input[i] = value; - key += value + '_'; - } - - var cachedValue = cache[key]; - if (cachedValue !== undefined) { - dest.set(cachedValue, destOffset); - return; - } - - var output = new Float32Array(numOutputs); - var stack = evaluator.execute(input); - var stackIndex = stack.length - numOutputs; - for (i = 0; i < numOutputs; i++) { - value = stack[stackIndex + i]; - var bound = range[i * 2]; - if (value < bound) { - value = bound; - } else { - bound = range[i * 2 +1]; - if (value > bound) { - value = bound; - } - } - output[i] = value; - } - if (cache_available > 0) { - cache_available--; - cache[key] = output; - } - dest.set(output, destOffset); - }; - } - }; -})(); - -function isPDFFunction(v) { - var fnDict; - if (typeof v !== 'object') { - return false; - } else if (isDict(v)) { - fnDict = v; - } else if (isStream(v)) { - fnDict = v.dict; - } else { - return false; - } - return fnDict.has('FunctionType'); -} - -var PostScriptStack = (function PostScriptStackClosure() { - var MAX_STACK_SIZE = 100; - function PostScriptStack(initialStack) { - this.stack = !initialStack ? [] : - Array.prototype.slice.call(initialStack, 0); - } - - 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) { - this.operators = operators; - } - 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(-a); - break; - case 'not': - a = stack.pop(); - if (isBool(a)) { - stack.push(!a); - } else { - stack.push(~a); - } - 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; -})(); - -// Most of the PDFs functions consist of simple operations such as: -// roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add. -// -// We can compile most of such programs, and at the same moment, we can -// optimize some expressions using basic math properties. Keeping track of -// min/max values will allow us to avoid extra Math.min/Math.max calls. -var PostScriptCompiler = (function PostScriptCompilerClosure() { - function AstNode(type) { - this.type = type; - } - AstNode.prototype.visit = function (visitor) { - throw new Error('abstract method'); - }; - - function AstArgument(index, min, max) { - AstNode.call(this, 'args'); - this.index = index; - this.min = min; - this.max = max; - } - AstArgument.prototype = Object.create(AstNode.prototype); - AstArgument.prototype.visit = function (visitor) { - visitor.visitArgument(this); - }; - - function AstLiteral(number) { - AstNode.call(this, 'literal'); - this.number = number; - this.min = number; - this.max = number; - } - AstLiteral.prototype = Object.create(AstNode.prototype); - AstLiteral.prototype.visit = function (visitor) { - visitor.visitLiteral(this); - }; - - function AstBinaryOperation(op, arg1, arg2, min, max) { - AstNode.call(this, 'binary'); - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - this.min = min; - this.max = max; - } - AstBinaryOperation.prototype = Object.create(AstNode.prototype); - AstBinaryOperation.prototype.visit = function (visitor) { - visitor.visitBinaryOperation(this); - }; - - function AstMin(arg, max) { - AstNode.call(this, 'max'); - this.arg = arg; - this.min = arg.min; - this.max = max; - } - AstMin.prototype = Object.create(AstNode.prototype); - AstMin.prototype.visit = function (visitor) { - visitor.visitMin(this); - }; - - function AstVariable(index, min, max) { - AstNode.call(this, 'var'); - this.index = index; - this.min = min; - this.max = max; - } - AstVariable.prototype = Object.create(AstNode.prototype); - AstVariable.prototype.visit = function (visitor) { - visitor.visitVariable(this); - }; - - function AstVariableDefinition(variable, arg) { - AstNode.call(this, 'definition'); - this.variable = variable; - this.arg = arg; - } - AstVariableDefinition.prototype = Object.create(AstNode.prototype); - AstVariableDefinition.prototype.visit = function (visitor) { - visitor.visitVariableDefinition(this); - }; - - function ExpressionBuilderVisitor() { - this.parts = []; - } - ExpressionBuilderVisitor.prototype = { - visitArgument: function (arg) { - this.parts.push('Math.max(', arg.min, ', Math.min(', - arg.max, ', src[srcOffset + ', arg.index, ']))'); - }, - visitVariable: function (variable) { - this.parts.push('v', variable.index); - }, - visitLiteral: function (literal) { - this.parts.push(literal.number); - }, - visitBinaryOperation: function (operation) { - this.parts.push('('); - operation.arg1.visit(this); - this.parts.push(' ', operation.op, ' '); - operation.arg2.visit(this); - this.parts.push(')'); - }, - visitVariableDefinition: function (definition) { - this.parts.push('var '); - definition.variable.visit(this); - this.parts.push(' = '); - definition.arg.visit(this); - this.parts.push(';'); - }, - visitMin: function (max) { - this.parts.push('Math.min('); - max.arg.visit(this); - this.parts.push(', ', max.max, ')'); - }, - toString: function () { - return this.parts.join(''); - } - }; - - function buildAddOperation(num1, num2) { - if (num2.type === 'literal' && num2.number === 0) { - // optimization: second operand is 0 - return num1; - } - if (num1.type === 'literal' && num1.number === 0) { - // optimization: first operand is 0 - return num2; - } - if (num2.type === 'literal' && num1.type === 'literal') { - // optimization: operands operand are literals - return new AstLiteral(num1.number + num2.number); - } - return new AstBinaryOperation('+', num1, num2, - num1.min + num2.min, num1.max + num2.max); - } - - function buildMulOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num2.number === 1) { - return num1; // and it's 1 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number * num2.number); - } - } - if (num1.type === 'literal') { - // optimization: first operands is a literal... - if (num1.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num1.number === 1) { - return num2; // and it's 1 - } - } - var min = Math.min(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - var max = Math.max(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - return new AstBinaryOperation('*', num1, num2, min, max); - } - - function buildSubOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return num1; // ... and it's 0 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number - num2.number); - } - } - if (num2.type === 'binary' && num2.op === '-' && - num1.type === 'literal' && num1.number === 1 && - num2.arg1.type === 'literal' && num2.arg1.number === 1) { - // optimization for case: 1 - (1 - x) - return num2.arg2; - } - return new AstBinaryOperation('-', num1, num2, - num1.min - num2.max, num1.max - num2.min); - } - - function buildMinOperation(num1, max) { - if (num1.min >= max) { - // optimization: num1 min value is not less than required max - return new AstLiteral(max); // just returning max - } else if (num1.max <= max) { - // optimization: num1 max value is not greater than required max - return num1; // just returning an argument - } - return new AstMin(num1, max); - } - - function PostScriptCompiler() {} - PostScriptCompiler.prototype = { - compile: function PostScriptCompiler_compile(code, domain, range) { - var stack = []; - var i, ii; - var instructions = []; - var inputSize = domain.length >> 1, outputSize = range.length >> 1; - var lastRegister = 0; - var n, j, min, max; - var num1, num2, ast1, ast2, tmpVar, item; - for (i = 0; i < inputSize; i++) { - stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); - } - - for (i = 0, ii = code.length; i < ii; i++) { - item = code[i]; - if (typeof item === 'number') { - stack.push(new AstLiteral(item)); - continue; - } - - switch (item) { - case 'add': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildAddOperation(num1, num2)); - break; - case 'cvr': - if (stack.length < 1) { - return null; - } - break; - case 'mul': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildMulOperation(num1, num2)); - break; - case 'sub': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildSubOperation(num1, num2)); - break; - case 'exch': - if (stack.length < 2) { - return null; - } - ast1 = stack.pop(); ast2 = stack.pop(); - stack.push(ast1, ast2); - break; - case 'pop': - if (stack.length < 1) { - return null; - } - stack.pop(); - break; - case 'index': - if (stack.length < 1) { - return null; - } - num1 = stack.pop(); - if (num1.type !== 'literal') { - return null; - } - n = num1.number; - if (n < 0 || (n|0) !== n || stack.length < n) { - return null; - } - ast1 = stack[stack.length - n - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - n - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'dup': - if (stack.length < 1) { - return null; - } - if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && - code[i + 3] === i + 7 && code[i + 4] === 'jz' && - code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) { - // special case of the commands sequence for the min operation - num1 = stack.pop(); - stack.push(buildMinOperation(num1, code[i + 1])); - i += 6; - break; - } - ast1 = stack[stack.length - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - // we don't have to save into intermediate variable a literal or - // variable. - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'roll': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - if (num2.type !== 'literal' || num1.type !== 'literal') { - // both roll operands must be numbers - return null; - } - j = num2.number; - n = num1.number; - if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) { - // ... and integers - return null; - } - j = ((j % n) + n) % n; - if (j === 0) { - break; // just skipping -- there are nothing to rotate - } - Array.prototype.push.apply(stack, - stack.splice(stack.length - n, n - j)); - break; - default: - return null; // unsupported operator - } - } - - if (stack.length !== outputSize) { - return null; - } - - var result = []; - instructions.forEach(function (instruction) { - var statementBuilder = new ExpressionBuilderVisitor(); - instruction.visit(statementBuilder); - result.push(statementBuilder.toString()); - }); - stack.forEach(function (expr, i) { - var statementBuilder = new ExpressionBuilderVisitor(); - expr.visit(statementBuilder); - var min = range[i * 2], max = range[i * 2 + 1]; - var out = [statementBuilder.toString()]; - if (min > expr.min) { - out.unshift('Math.max(', min, ', '); - out.push(')'); - } - if (max < expr.max) { - out.unshift('Math.min(', max, ', '); - out.push(')'); - } - out.unshift('dest[destOffset + ', i, '] = '); - out.push(';'); - result.push(out.join('')); - }); - return result.join('\n'); - } - }; - - return PostScriptCompiler; -})(); - - -var ColorSpace = (function ColorSpaceClosure() { - // Constructor should define this.numComps, this.defaultColor, this.name - function ColorSpace() { - error('should not call ColorSpace constructor'); - } - - ColorSpace.prototype = { - /** - * Converts the color value to the RGB color. The color components are - * located in the src array starting from the srcOffset. Returns the array - * of the rgb components, each value ranging from [0,255]. - */ - getRgb: function ColorSpace_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - /** - * Converts the color value to the RGB color, similar to the getRgb method. - * The result placed into the dest array starting from the destOffset. - */ - getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, - dest, destOffset) { - error('Should not call ColorSpace.getRgbItem'); - }, - /** - * Converts the specified number of the color values to the RGB colors. - * The colors are located in the src array starting from the srcOffset. - * The result is placed into the dest array starting from the destOffset. - * The src array items shall be in [0,2^bits) range, the dest array items - * will be in [0,255] range. alpha01 indicates how many alpha components - * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA - * array). - */ - getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - error('Should not call ColorSpace.getRgbBuffer'); - }, - /** - * Determines the number of bytes required to store the result of the - * conversion done by the getRgbBuffer method. As in getRgbBuffer, - * |alpha01| is either 0 (RGB output) or 1 (RGBA output). - */ - getOutputLength: function ColorSpace_getOutputLength(inputLength, - alpha01) { - error('Should not call ColorSpace.getOutputLength'); - }, - /** - * Returns true if source data will be equal the result/output data. - */ - isPassthrough: function ColorSpace_isPassthrough(bits) { - return false; - }, - /** - * Fills in the RGB colors in the destination buffer. alpha01 indicates - * how many alpha components there are in the dest array; it will be either - * 0 (RGB array) or 1 (RGBA array). - */ - fillRgb: function ColorSpace_fillRgb(dest, originalWidth, - originalHeight, width, height, - actualHeight, bpc, comps, alpha01) { - var count = originalWidth * originalHeight; - var rgbBuf = null; - var numComponentColors = 1 << bpc; - var needsResizing = originalHeight !== height || originalWidth !== width; - var i, ii; - - if (this.isPassthrough(bpc)) { - rgbBuf = comps; - } else if (this.numComps === 1 && count > numComponentColors && - this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') { - // Optimization: create a color map when there is just one component and - // we are converting more colors than the size of the color map. We - // don't build the map if the colorspace is gray or rgb since those - // methods are faster than building a map. This mainly offers big speed - // ups for indexed and alternate colorspaces. - // - // TODO it may be worth while to cache the color map. While running - // testing I never hit a cache so I will leave that out for now (perhaps - // we are reparsing colorspaces too much?). - var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : - new Uint16Array(numComponentColors); - var key; - for (i = 0; i < numComponentColors; i++) { - allColors[i] = i; - } - var colorMap = new Uint8Array(numComponentColors * 3); - this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, - /* alpha01 = */ 0); - - var destPos, rgbPos; - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - destPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - dest[destPos++] = colorMap[key]; - dest[destPos++] = colorMap[key + 1]; - dest[destPos++] = colorMap[key + 2]; - destPos += alpha01; - } - } else { - rgbBuf = new Uint8Array(count * 3); - rgbPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - rgbBuf[rgbPos++] = colorMap[key]; - rgbBuf[rgbPos++] = colorMap[key + 1]; - rgbBuf[rgbPos++] = colorMap[key + 2]; - } - } - } else { - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, - alpha01); - } else { - rgbBuf = new Uint8Array(count * 3); - this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, - /* alpha01 = */ 0); - } - } - - if (rgbBuf) { - if (needsResizing) { - PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width, - height, dest, alpha01); - } else { - rgbPos = 0; - destPos = 0; - for (i = 0, ii = width * actualHeight; i < ii; i++) { - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - destPos += alpha01; - } - } - } - }, - /** - * True if the colorspace has components in the default range of [0, 1]. - * This should be true for all colorspaces except for lab color spaces - * which are [0,100], [-128, 127], [-128, 127]. - */ - usesZeroToOneRange: true - }; - - ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { - var IR = ColorSpace.parseToIR(cs, xref, res); - if (IR instanceof AlternateCS) { - return IR; - } - return ColorSpace.fromIR(IR); - }; - - ColorSpace.fromIR = function ColorSpace_fromIR(IR) { - var name = isArray(IR) ? IR[0] : IR; - var whitePoint, blackPoint, gamma; - - switch (name) { - case 'DeviceGrayCS': - return this.singletons.gray; - case 'DeviceRgbCS': - return this.singletons.rgb; - case 'DeviceCmykCS': - return this.singletons.cmyk; - case 'CalGrayCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - gamma = IR[1].Gamma; - return new CalGrayCS(whitePoint, blackPoint, gamma); - case 'CalRGBCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - gamma = IR[1].Gamma; - var matrix = IR[1].Matrix; - return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); - case 'PatternCS': - var basePatternCS = IR[1]; - if (basePatternCS) { - basePatternCS = ColorSpace.fromIR(basePatternCS); - } - return new PatternCS(basePatternCS); - case 'IndexedCS': - var baseIndexedCS = IR[1]; - var hiVal = IR[2]; - var lookup = IR[3]; - return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); - case 'AlternateCS': - var numComps = IR[1]; - var alt = IR[2]; - var tintFnIR = IR[3]; - - return new AlternateCS(numComps, ColorSpace.fromIR(alt), - PDFFunction.fromIR(tintFnIR)); - case 'LabCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - var range = IR[1].Range; - return new LabCS(whitePoint, blackPoint, range); - default: - error('Unknown name ' + name); - } - return null; - }; - - ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { - if (isName(cs)) { - var colorSpaces = res.get('ColorSpace'); - if (isDict(colorSpaces)) { - var refcs = colorSpaces.get(cs.name); - if (refcs) { - cs = refcs; - } - } - } - - cs = xref.fetchIfRef(cs); - var mode; - - if (isName(cs)) { - mode = cs.name; - this.mode = mode; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'Pattern': - return ['PatternCS', null]; - default: - error('unrecognized colorspace ' + mode); - } - } else if (isArray(cs)) { - mode = xref.fetchIfRef(cs[0]).name; - this.mode = mode; - var numComps, params, alt; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'CalGray': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['CalGrayCS', params]; - case 'CalRGB': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['CalRGBCS', params]; - case 'ICCBased': - var stream = xref.fetchIfRef(cs[1]); - var dict = stream.dict; - numComps = dict.get('N'); - alt = dict.get('Alternate'); - if (alt) { - var altIR = ColorSpace.parseToIR(alt, xref, res); - // Parse the /Alternate CS to ensure that the number of components - // are correct, and also (indirectly) that it is not a PatternCS. - var altCS = ColorSpace.fromIR(altIR); - if (altCS.numComps === numComps) { - return altIR; - } - warn('ICCBased color space: Ignoring incorrect /Alternate entry.'); - } - if (numComps === 1) { - return 'DeviceGrayCS'; - } else if (numComps === 3) { - return 'DeviceRgbCS'; - } else if (numComps === 4) { - return 'DeviceCmykCS'; - } - break; - case 'Pattern': - var basePatternCS = cs[1] || null; - if (basePatternCS) { - basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); - } - return ['PatternCS', basePatternCS]; - case 'Indexed': - case 'I': - var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); - var hiVal = xref.fetchIfRef(cs[2]) + 1; - var lookup = xref.fetchIfRef(cs[3]); - if (isStream(lookup)) { - lookup = lookup.getBytes(); - } - return ['IndexedCS', baseIndexedCS, hiVal, lookup]; - case 'Separation': - case 'DeviceN': - var name = xref.fetchIfRef(cs[1]); - numComps = 1; - if (isName(name)) { - numComps = 1; - } else if (isArray(name)) { - numComps = name.length; - } - alt = ColorSpace.parseToIR(cs[2], xref, res); - var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); - return ['AlternateCS', numComps, alt, tintFnIR]; - case 'Lab': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['LabCS', params]; - default: - error('unimplemented color space object "' + mode + '"'); - } - } else { - error('unrecognized color space object: "' + cs + '"'); - } - return null; - }; - /** - * Checks if a decode map matches the default decode map for a color space. - * This handles the general decode maps where there are two values per - * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. - * This does not handle Lab, Indexed, or Pattern decode maps since they are - * slightly different. - * @param {Array} decode Decode map (usually from an image). - * @param {Number} n Number of components the color space has. - */ - ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { - if (!isArray(decode)) { - return true; - } - - if (n * 2 !== decode.length) { - warn('The decode map is not the correct length'); - return true; - } - for (var i = 0, ii = decode.length; i < ii; i += 2) { - if (decode[i] !== 0 || decode[i + 1] !== 1) { - return false; - } - } - return true; - }; - - ColorSpace.singletons = { - get gray() { - return shadow(this, 'gray', new DeviceGrayCS()); - }, - get rgb() { - return shadow(this, 'rgb', new DeviceRgbCS()); - }, - get cmyk() { - return shadow(this, 'cmyk', new DeviceCmykCS()); - } - }; - - return ColorSpace; -})(); - -/** - * Alternate color space handles both Separation and DeviceN color spaces. A - * Separation color space is actually just a DeviceN with one color component. - * Both color spaces use a tinting function to convert colors to a base color - * space. - */ -var AlternateCS = (function AlternateCSClosure() { - function AlternateCS(numComps, base, tintFn) { - this.name = 'Alternate'; - this.numComps = numComps; - this.defaultColor = new Float32Array(numComps); - for (var i = 0; i < numComps; ++i) { - this.defaultColor[i] = 1; - } - this.base = base; - this.tintFn = tintFn; - this.tmpBuf = new Float32Array(base.numComps); - } - - AlternateCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var tmpBuf = this.tmpBuf; - this.tintFn(src, srcOffset, tmpBuf, 0); - this.base.getRgbItem(tmpBuf, 0, dest, destOffset); - }, - getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var tintFn = this.tintFn; - var base = this.base; - var scale = 1 / ((1 << bits) - 1); - var baseNumComps = base.numComps; - var usesZeroToOneRange = base.usesZeroToOneRange; - var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && - alpha01 === 0; - var pos = isPassthrough ? destOffset : 0; - var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count); - var numComps = this.numComps; - - var scaled = new Float32Array(numComps); - var tinted = new Float32Array(baseNumComps); - var i, j; - if (usesZeroToOneRange) { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - for (j = 0; j < baseNumComps; j++) { - baseBuf[pos++] = tinted[j] * 255; - } - } - } else { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - base.getRgbItem(tinted, 0, baseBuf, pos); - pos += baseNumComps; - } - } - if (!isPassthrough) { - base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); - } - }, - getOutputLength: function AlternateCS_getOutputLength(inputLength, - alpha01) { - return this.base.getOutputLength(inputLength * - this.base.numComps / this.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return AlternateCS; -})(); - -var PatternCS = (function PatternCSClosure() { - function PatternCS(baseCS) { - this.name = 'Pattern'; - this.base = baseCS; - } - PatternCS.prototype = {}; - - return PatternCS; -})(); - -var IndexedCS = (function IndexedCSClosure() { - function IndexedCS(base, highVal, lookup) { - this.name = 'Indexed'; - this.numComps = 1; - this.defaultColor = new Uint8Array([0]); - this.base = base; - this.highVal = highVal; - - var baseNumComps = base.numComps; - var length = baseNumComps * highVal; - var lookupArray; - - if (isStream(lookup)) { - lookupArray = new Uint8Array(length); - var bytes = lookup.getBytes(length); - lookupArray.set(bytes); - } else if (isString(lookup)) { - lookupArray = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - lookupArray[i] = lookup.charCodeAt(i); - } - } else if (lookup instanceof Uint8Array || lookup instanceof Array) { - lookupArray = lookup; - } else { - error('Unrecognized lookup table: ' + lookup); - } - this.lookup = lookupArray; - } - - IndexedCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var numComps = this.base.numComps; - var start = src[srcOffset] * numComps; - this.base.getRgbItem(this.lookup, start, dest, destOffset); - }, - getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var base = this.base; - var numComps = base.numComps; - var outputDelta = base.getOutputLength(numComps, alpha01); - var lookup = this.lookup; - - for (var i = 0; i < count; ++i) { - var lookupPos = src[srcOffset++] * numComps; - base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); - destOffset += outputDelta; - } - }, - getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) { - return this.base.getOutputLength(inputLength * this.base.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { - // indexed color maps shouldn't be changed - return true; - }, - usesZeroToOneRange: true - }; - return IndexedCS; -})(); - -var DeviceGrayCS = (function DeviceGrayCSClosure() { - function DeviceGrayCS() { - this.name = 'DeviceGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - } - - DeviceGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var c = (src[srcOffset] * 255) | 0; - c = c < 0 ? 0 : c > 255 ? 255 : c; - dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; - }, - getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - var c = (scale * src[j++]) | 0; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; - q += alpha01; - } - }, - getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, - alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceGrayCS; -})(); - -var DeviceRgbCS = (function DeviceRgbCSClosure() { - function DeviceRgbCS() { - this.name = 'DeviceRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - } - DeviceRgbCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var r = (src[srcOffset] * 255) | 0; - var g = (src[srcOffset + 1] * 255) | 0; - var b = (src[srcOffset + 2] * 255) | 0; - dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r; - dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g; - dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b; - }, - getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - if (bits === 8 && alpha01 === 0) { - dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); - return; - } - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - q += alpha01; - } - }, - getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, - alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: function DeviceRgbCS_isPassthrough(bits) { - return bits === 8; - }, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceRgbCS; -})(); - -var DeviceCmykCS = (function DeviceCmykCSClosure() { - // The coefficients below was found using numerical analysis: the method of - // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors, - // where color_value is the tabular value from the table of sampled RGB colors - // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding - // CMYK color conversion using the estimation below: - // f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255 - function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { - var c = src[srcOffset + 0] * srcScale; - var m = src[srcOffset + 1] * srcScale; - var y = src[srcOffset + 2] * srcScale; - var k = src[srcOffset + 3] * srcScale; - - var r = - (c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k + - -285.2331026137004) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y + - -17.873870861415444 * k - 5.497006427196366) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 17.5119270841813) + - k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0; - var g = - (c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k + - -79.2970844816548) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 190.9453302588951) + - y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + - k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0; - var b = - (c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k + - -14.183576799673286) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 112.23884253719248) + - y * (0.03296041114873217 * y + 115.60384449646641 * k + - -193.58209356861505) + - k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0; - - dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r; - dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g; - dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b; - } - - function DeviceCmykCS() { - this.name = 'DeviceCMYK'; - this.numComps = 4; - this.defaultColor = new Float32Array([0, 0, 0, 1]); - } - DeviceCmykCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(src, srcOffset, 1, dest, destOffset); - }, - getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - for (var i = 0; i < count; i++) { - convertToRgb(src, srcOffset, scale, dest, destOffset); - srcOffset += 4; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, - alpha01) { - return (inputLength / 4 * (3 + alpha01)) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return DeviceCmykCS; -})(); - -// -// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245 -// -var CalGrayCS = (function CalGrayCSClosure() { - function CalGrayCS(whitePoint, blackPoint, gamma) { - this.name = 'CalGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalGray'); - } - blackPoint = blackPoint || [0, 0, 0]; - gamma = gamma || 1; - - // Translate arguments to spec variables. - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - this.G = gamma; - - // Validate variables as per spec. - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ', falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + - ', ZB: ' + this.ZB + ', only default values are supported.'); - } - - if (this.G < 1) { - info('Invalid Gamma: ' + this.G + ' for ' + this.name + - ', falling back to default'); - this.G = 1; - } - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A represents a gray component of a calibrated gray space. - // A <---> AG in the spec - var A = src[srcOffset] * scale; - var AG = Math.pow(A, cs.G); - - // Computes L as per spec. ( = cs.YW * AG ) - // Except if other than default BlackPoint values are used. - var L = cs.YW * AG; - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // Convert values to rgb range [0, 255]. - var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; - dest[destOffset] = val; - dest[destOffset + 1] = val; - dest[destOffset + 2] = val; - } - - CalGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 1; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalGrayCS; -})(); - -// -// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247 -// -var CalRGBCS = (function CalRGBCSClosure() { - - // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these - // matrices. - var BRADFORD_SCALE_MATRIX = new Float32Array([ - 0.8951, 0.2664, -0.1614, - -0.7502, 1.7135, 0.0367, - 0.0389, -0.0685, 1.0296]); - - var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ - 0.9869929, -0.1470543, 0.1599627, - 0.4323053, 0.5183603, 0.0492912, - -0.0085287, 0.0400428, 0.9684867]); - - // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html. - var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ - 3.2404542, -1.5371385, -0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434, -0.2040259, 1.0572252]); - - var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); - - var tempNormalizeMatrix = new Float32Array(3); - var tempConvertMatrix1 = new Float32Array(3); - var tempConvertMatrix2 = new Float32Array(3); - - var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0; - - function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { - this.name = 'CalRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array(3); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalRGB'); - } - blackPoint = blackPoint || new Float32Array(3); - gamma = gamma || new Float32Array([1, 1, 1]); - matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - - // Translate arguments to spec variables. - var XW = whitePoint[0]; - var YW = whitePoint[1]; - var ZW = whitePoint[2]; - this.whitePoint = whitePoint; - - var XB = blackPoint[0]; - var YB = blackPoint[1]; - var ZB = blackPoint[2]; - this.blackPoint = blackPoint; - - this.GR = gamma[0]; - this.GG = gamma[1]; - this.GB = gamma[2]; - - this.MXA = matrix[0]; - this.MYA = matrix[1]; - this.MZA = matrix[2]; - this.MXB = matrix[3]; - this.MYB = matrix[4]; - this.MZB = matrix[5]; - this.MXC = matrix[6]; - this.MYC = matrix[7]; - this.MZC = matrix[8]; - - // Validate variables as per spec. - if (XW < 0 || ZW < 0 || YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (XB < 0 || YB < 0 || ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + - ', ' + ZB + '], falling back to default'); - this.blackPoint = new Float32Array(3); - } - - if (this.GR < 0 || this.GG < 0 || this.GB < 0) { - info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + - '] for ' + this.name + ', falling back to default'); - this.GR = this.GG = this.GB = 1; - } - - if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || - this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || - this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { - info('Invalid Matrix for ' + this.name + ' [' + - this.MXA + ', ' + this.MYA + ', ' + this.MZA + - this.MXB + ', ' + this.MYB + ', ' + this.MZB + - this.MXC + ', ' + this.MYC + ', ' + this.MZC + - '], falling back to default'); - this.MXA = this.MYB = this.MZC = 1; - this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; - } - } - - function matrixProduct(a, b, result) { - result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; - result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; - } - - function convertToFlat(sourceWhitePoint, LMS, result) { - result[0] = LMS[0] * 1 / sourceWhitePoint[0]; - result[1] = LMS[1] * 1 / sourceWhitePoint[1]; - result[2] = LMS[2] * 1 / sourceWhitePoint[2]; - } - - function convertToD65(sourceWhitePoint, LMS, result) { - var D65X = 0.95047; - var D65Y = 1; - var D65Z = 1.08883; - - result[0] = LMS[0] * D65X / sourceWhitePoint[0]; - result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; - result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; - } - - function sRGBTransferFunction(color) { - // See http://en.wikipedia.org/wiki/SRGB. - if (color <= 0.0031308){ - return adjustToRange(0, 1, 12.92 * color); - } - - return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); - } - - function adjustToRange(min, max, value) { - return Math.max(min, Math.min(max, value)); - } - - function decodeL(L) { - if (L < 0) { - return -decodeL(-L); - } - - if (L > 8.0) { - return Math.pow(((L + 16) / 116), 3); - } - - return L * DECODE_L_CONSTANT; - } - - function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { - - // In case the blackPoint is already the default blackPoint then there is - // no need to do compensation. - if (sourceBlackPoint[0] === 0 && - sourceBlackPoint[1] === 0 && - sourceBlackPoint[2] === 0) { - result[0] = XYZ_Flat[0]; - result[1] = XYZ_Flat[1]; - result[2] = XYZ_Flat[2]; - return; - } - - // For the blackPoint calculation details, please see - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - // The destination blackPoint is the default blackPoint [0, 0, 0]. - var zeroDecodeL = decodeL(0); - - var X_DST = zeroDecodeL; - var X_SRC = decodeL(sourceBlackPoint[0]); - - var Y_DST = zeroDecodeL; - var Y_SRC = decodeL(sourceBlackPoint[1]); - - var Z_DST = zeroDecodeL; - var Z_SRC = decodeL(sourceBlackPoint[2]); - - var X_Scale = (1 - X_DST) / (1 - X_SRC); - var X_Offset = 1 - X_Scale; - - var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); - var Y_Offset = 1 - Y_Scale; - - var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); - var Z_Offset = 1 - Z_Scale; - - result[0] = XYZ_Flat[0] * X_Scale + X_Offset; - result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; - result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; - } - - function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { - - // In case the whitePoint is already flat then there is no need to do - // normalization. - if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { - result[0] = XYZ_In[0]; - result[1] = XYZ_In[1]; - result[2] = XYZ_In[2]; - return; - } - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_Flat = tempNormalizeMatrix; - convertToFlat(sourceWhitePoint, LMS, LMS_Flat); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); - } - - function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_D65 = tempNormalizeMatrix; - convertToD65(sourceWhitePoint, LMS, LMS_D65); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A, B and C represent a red, green and blue components of a calibrated - // rgb space. - var A = adjustToRange(0, 1, src[srcOffset] * scale); - var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); - var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); - - // A <---> AGR in the spec - // B <---> BGG in the spec - // C <---> CGB in the spec - var AGR = Math.pow(A, cs.GR); - var BGG = Math.pow(B, cs.GG); - var CGB = Math.pow(C, cs.GB); - - // Computes intermediate variables L, M, N as per spec. - // To decode X, Y, Z values map L, M, N directly to them. - var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; - var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; - var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; - - // The following calculations are based on this document: - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - var XYZ = tempConvertMatrix1; - XYZ[0] = X; - XYZ[1] = Y; - XYZ[2] = Z; - var XYZ_Flat = tempConvertMatrix2; - - normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); - - var XYZ_Black = tempConvertMatrix1; - compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); - - var XYZ_D65 = tempConvertMatrix2; - normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); - - var SRGB = tempConvertMatrix1; - matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); - - var sR = sRGBTransferFunction(SRGB[0]); - var sG = sRGBTransferFunction(SRGB[1]); - var sB = sRGBTransferFunction(SRGB[2]); - - // Convert the values to rgb range [0, 255]. - dest[destOffset] = Math.round(sR * 255); - dest[destOffset + 1] = Math.round(sG * 255); - dest[destOffset + 2] = Math.round(sB * 255); - } - - CalRGBCS.prototype = { - getRgb: function CalRGBCS_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalRGBCS; -})(); - -// -// LabCS: Based on "PDF Reference, Sixth Ed", p.250 -// -var LabCS = (function LabCSClosure() { - function LabCS(whitePoint, blackPoint, range) { - this.name = 'Lab'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space Lab'); - } - blackPoint = blackPoint || [0, 0, 0]; - range = range || [-100, 100, -100, 100]; - - // Translate args to spec variables - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - this.amin = range[0]; - this.amax = range[1]; - this.bmin = range[2]; - this.bmax = range[3]; - - // These are here just for completeness - the spec doesn't offer any - // formulas that use BlackPoint in Lab - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - // Validate vars as per spec - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components, no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.amin > this.amax || this.bmin > this.bmax) { - info('Invalid Range, falling back to defaults'); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - } - - // Function g(x) from spec - function fn_g(x) { - if (x >= 6 / 29) { - return x * x * x; - } else { - return (108 / 841) * (x - 4 / 29); - } - } - - function decode(value, high1, low2, high2) { - return low2 + (value) * (high2 - low2) / (high1); - } - - // If decoding is needed maxVal should be 2^bits per component - 1. - function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { - // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax] - // not the usual [0, 1]. If a command like setFillColor is used the src - // values will already be within the correct range. However, if we are - // converting an image we have to map the values to the correct range given - // above. - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = src[srcOffset]; - var as = src[srcOffset + 1]; - var bs = src[srcOffset + 2]; - if (maxVal !== false) { - Ls = decode(Ls, maxVal, 0, 100); - as = decode(as, maxVal, cs.amin, cs.amax); - bs = decode(bs, maxVal, cs.bmin, cs.bmax); - } - - // Adjust limits of 'as' and 'bs' - as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; - bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; - - // Computes intermediate variables X,Y,Z as per spec - var M = (Ls + 16) / 116; - var L = M + (as / 500); - var N = M - (bs / 200); - - var X = cs.XW * fn_g(L); - var Y = cs.YW * fn_g(M); - var Z = cs.ZW * fn_g(N); - - var r, g, b; - // Using different conversions for D50 and D65 white points, - // per http://www.color.org/srgb.pdf - if (cs.ZW < 1) { - // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249) - r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; - g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; - b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; - } else { - // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888) - r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; - g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; - b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; - } - // clamp color values to [0,1] range then convert to [0,255] range. - dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; - dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; - dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; - } - - LabCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { - convertToRgb(this, src, srcOffset, false, dest, destOffset); - }, - getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var maxVal = (1 << bits) - 1; - for (var i = 0; i < count; i++) { - convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // XXX: Decoding is handled with the lab conversion because of the strange - // ranges that are used. - return true; - }, - usesZeroToOneRange: false - }; - return LabCS; -})(); - - -var ARCFourCipher = (function ARCFourCipherClosure() { - function ARCFourCipher(key) { - this.a = 0; - this.b = 0; - var s = new Uint8Array(256); - var i, j = 0, tmp, keyLength = key.length; - for (i = 0; i < 256; ++i) { - s[i] = i; - } - for (i = 0; i < 256; ++i) { - tmp = s[i]; - j = (j + tmp + key[i % keyLength]) & 0xFF; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - - ARCFourCipher.prototype = { - encryptBlock: function ARCFourCipher_encryptBlock(data) { - var i, n = data.length, tmp, tmp2; - var a = this.a, b = this.b, s = this.s; - var output = new Uint8Array(n); - for (i = 0; i < n; ++i) { - a = (a + 1) & 0xFF; - tmp = s[a]; - b = (b + tmp) & 0xFF; - tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; - } - this.a = a; - this.b = b; - return output; - } - }; - ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; - - return ARCFourCipher; -})(); - -var calculateMD5 = (function calculateMD5Closure() { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551]); - - function hash(data, offset, length) { - var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, b = h1, c = h2, d = h3, f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - - return hash; -})(); -var Word64 = (function Word64Closure() { - function Word64(highInteger, lowInteger) { - this.high = highInteger | 0; - this.low = lowInteger | 0; - } - Word64.prototype = { - and: function Word64_and(word) { - this.high &= word.high; - this.low &= word.low; - }, - xor: function Word64_xor(word) { - this.high ^= word.high; - this.low ^= word.low; - }, - - or: function Word64_or(word) { - this.high |= word.high; - this.low |= word.low; - }, - - shiftRight: function Word64_shiftRight(places) { - if (places >= 32) { - this.low = (this.high >>> (places - 32)) | 0; - this.high = 0; - } else { - this.low = (this.low >>> places) | (this.high << (32 - places)); - this.high = (this.high >>> places) | 0; - } - }, - - shiftLeft: function Word64_shiftLeft(places) { - if (places >= 32) { - this.high = this.low << (places - 32); - this.low = 0; - } else { - this.high = (this.high << places) | (this.low >>> (32 - places)); - this.low = this.low << places; - } - }, - - rotateRight: function Word64_rotateRight(places) { - var low, high; - if (places & 32) { - high = this.low; - low = this.high; - } else { - low = this.low; - high = this.high; - } - places &= 31; - this.low = (low >>> places) | (high << (32 - places)); - this.high = (high >>> places) | (low << (32 - places)); - }, - - not: function Word64_not() { - this.high = ~this.high; - this.low = ~this.low; - }, - - add: function Word64_add(word) { - var lowAdd = (this.low >>> 0) + (word.low >>> 0); - var highAdd = (this.high >>> 0) + (word.high >>> 0); - if (lowAdd > 0xFFFFFFFF) { - highAdd += 1; - } - this.low = lowAdd | 0; - this.high = highAdd | 0; - }, - - copyTo: function Word64_copyTo(bytes, offset) { - bytes[offset] = (this.high >>> 24) & 0xFF; - bytes[offset + 1] = (this.high >> 16) & 0xFF; - bytes[offset + 2] = (this.high >> 8) & 0xFF; - bytes[offset + 3] = this.high & 0xFF; - bytes[offset + 4] = (this.low >>> 24) & 0xFF; - bytes[offset + 5] = (this.low >> 16) & 0xFF; - bytes[offset + 6] = (this.low >> 8) & 0xFF; - bytes[offset + 7] = this.low & 0xFF; - }, - - assign: function Word64_assign(word) { - this.high = word.high; - this.low = word.low; - } - }; - return Word64; -})(); - -var calculateSHA256 = (function calculateSHA256Closure() { - function rotr(x, n) { - return (x >>> n) | (x << 32 - n); - } - - function ch(x, y, z) { - return (x & y) ^ (~x & z); - } - - function maj(x, y, z) { - return (x & y) ^ (x & z) ^ (y & z); - } - - function sigma(x) { - return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); - } - - function sigmaPrime(x) { - return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); - } - - function littleSigma(x) { - return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; - } - - function littleSigmaPrime(x) { - return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; - } - - var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; - - function hash(data, offset, length) { - // initial hash values - var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, - h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, - h6 = 0x1f83d9ab, h7 = 0x5be0cd19; - // pre-processing - var paddedLength = Math.ceil((length + 9) / 64) * 64; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - var w = new Uint32Array(64); - // for each 512 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j] = (padded[i] << 24 | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3])); - i += 4; - } - - for (j = 16; j < 64; ++j) { - w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + - littleSigma(w[j - 15]) + w[j - 16] | 0; - } - var a = h0, b = h1, c = h2, d = h3, e = h4, - f = h5, g = h6, h = h7, t1, t2; - for (j = 0; j < 64; ++j) { - t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; - t2 = sigma(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - h4 = (h4 + e) | 0; - h5 = (h5 + f) | 0; - h6 = (h6 + g) | 0; - h7 = (h7 + h) | 0; - } - return new Uint8Array([ - (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF, - (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF, - (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF, - (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF, - (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF, - (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF, - (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF, - (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF - ]); - } - - return hash; -})(); - -var calculateSHA512 = (function calculateSHA512Closure() { - function ch(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.not(); - tmp.and(z); - result.xor(tmp); - } - - function maj(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.and(z); - result.xor(tmp); - tmp.assign(y); - tmp.and(z); - result.xor(tmp); - } - - function sigma(result, x, tmp) { - result.assign(x); - result.rotateRight(28); - tmp.assign(x); - tmp.rotateRight(34); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(39); - result.xor(tmp); - } - - function sigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(14); - tmp.assign(x); - tmp.rotateRight(18); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(41); - result.xor(tmp); - } - - function littleSigma(result, x, tmp) { - result.assign(x); - result.rotateRight(1); - tmp.assign(x); - tmp.rotateRight(8); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(7); - result.xor(tmp); - } - - function littleSigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(19); - tmp.assign(x); - tmp.rotateRight(61); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(6); - result.xor(tmp); - } - - var k = [ - new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), - new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), - new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), - new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), - new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), - new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), - new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), - new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), - new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), - new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), - new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), - new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), - new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), - new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), - new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), - new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), - new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), - new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), - new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), - new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), - new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), - new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), - new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), - new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), - new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), - new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), - new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), - new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), - new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), - new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), - new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), - new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), - new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), - new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), - new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), - new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), - new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), - new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), - new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), - new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; - - function hash(data, offset, length, mode384) { - mode384 = !!mode384; - // initial hash values - var h0, h1, h2, h3, h4, h5, h6, h7; - if (!mode384) { - h0 = new Word64(0x6a09e667, 0xf3bcc908); - h1 = new Word64(0xbb67ae85, 0x84caa73b); - h2 = new Word64(0x3c6ef372, 0xfe94f82b); - h3 = new Word64(0xa54ff53a, 0x5f1d36f1); - h4 = new Word64(0x510e527f, 0xade682d1); - h5 = new Word64(0x9b05688c, 0x2b3e6c1f); - h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); - h7 = new Word64(0x5be0cd19, 0x137e2179); - } - else { - // SHA384 is exactly the same - // except with different starting values and a trimmed result - h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); - h1 = new Word64(0x629a292a, 0x367cd507); - h2 = new Word64(0x9159015a, 0x3070dd17); - h3 = new Word64(0x152fecd8, 0xf70e5939); - h4 = new Word64(0x67332667, 0xffc00b31); - h5 = new Word64(0x8eb44a87, 0x68581511); - h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); - h7 = new Word64(0x47b5481d, 0xbefa4fa4); - } - - // pre-processing - var paddedLength = Math.ceil((length + 17) / 128) * 128; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 16; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - - var w = new Array(80); - for (i = 0; i < 80; i++) { - w[i] = new Word64(0, 0); - } - var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0); - var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0); - var g = new Word64(0, 0), h = new Word64(0, 0); - var t1 = new Word64(0, 0), t2 = new Word64(0, 0); - var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3; - - // for each 1024 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3]); - w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 | - (padded[i + 6]) << 8 | (padded[i + 7]); - i += 8; - } - for (j = 16; j < 80; ++j) { - tmp3 = w[j]; - littleSigmaPrime(tmp3, w[j - 2], tmp2); - tmp3.add(w[j - 7]); - littleSigma(tmp1, w[j - 15], tmp2); - tmp3.add(tmp1); - tmp3.add(w[j - 16]); - } - - a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3); - e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7); - for (j = 0; j < 80; ++j) { - t1.assign(h); - sigmaPrime(tmp1, e, tmp2); - t1.add(tmp1); - ch(tmp1, e, f, g, tmp2); - t1.add(tmp1); - t1.add(k[j]); - t1.add(w[j]); - - sigma(t2, a, tmp2); - maj(tmp1, a, b, c, tmp2); - t2.add(tmp1); - - tmp3 = h; - h = g; - g = f; - f = e; - d.add(t1); - e = d; - d = c; - c = b; - b = a; - tmp3.assign(t1); - tmp3.add(t2); - a = tmp3; - } - h0.add(a); - h1.add(b); - h2.add(c); - h3.add(d); - h4.add(e); - h5.add(f); - h6.add(g); - h7.add(h); - } - - var result; - if (!mode384) { - result = new Uint8Array(64); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - h6.copyTo(result,48); - h7.copyTo(result,56); - } - else { - result = new Uint8Array(48); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - } - return result; - } - - return hash; -})(); -var calculateSHA384 = (function calculateSHA384Closure() { - function hash(data, offset, length) { - return calculateSHA512(data, offset, length, true); - } - - return hash; -})(); -var NullCipher = (function NullCipherClosure() { - function NullCipher() { - } - - NullCipher.prototype = { - decryptBlock: function NullCipher_decryptBlock(data) { - return data; - } - }; - - return NullCipher; -})(); - -var AES128Cipher = (function AES128CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey128(cipherKey) { - var b = 176, result = new Uint8Array(b); - result.set(cipherKey); - for (var j = 16, i = 1; j < b; ++i) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ rcon[i]; - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 16]); - j++; - result[j] = (t2 ^= result[j - 16]); - j++; - result[j] = (t3 ^= result[j - 16]); - j++; - result[j] = (t4 ^= result[j - 16]); - j++; - } - } - return result; - } - - function decrypt128(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 9; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt128(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 10; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - return state; - } - - function AES128Cipher(key) { - this.key = expandKey128(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt128(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - - AES128Cipher.prototype = { - decryptBlock: function AES128Cipher_decryptBlock(data, finalize) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // waiting for IV values -- they are at the start of the stream - for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - // need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data.subarray(16), finalize); - }, - encrypt: function AES128Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt128(buffer, this.key); - iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES128Cipher; -})(); - -var AES256Cipher = (function AES256CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey256(cipherKey) { - var b = 240, result = new Uint8Array(b); - var r = 1; - - result.set(cipherKey); - for (var j = 32, i = 1; j < b; ++i) { - if (j % 32 === 16) { - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - } else if (j % 32 === 0) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ r; - if ((r <<= 1) >= 256) { - r = (r ^ 0x1b) & 0xFF; - } - } - - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 32]); - j++; - result[j] = (t2 ^= result[j - 32]); - j++; - result[j] = (t3 ^= result[j - 32]); - j++; - result[j] = (t4 ^= result[j - 32]); - j++; - } - } - return result; - } - - function decrypt256(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 13; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt256(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 14; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - - return state; - - } - - function AES256Cipher(key) { - this.key = expandKey256(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt256(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - - } - - AES256Cipher.prototype = { - decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // if not supplied an IV wait for IV values - // they are at the start of the stream - if (iv) { - this.iv = iv; - } else { - for (i = 0; bufferLength < 16 && - i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - //need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - data = data.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data, finalize); - }, - encrypt: function AES256Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt256(buffer, this.key); - this.iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES256Cipher; -})(); - -var PDF17 = (function PDF17Closure() { - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - function PDF17() { - } - - PDF17.prototype = { - checkOwnerPassword: function PDF17_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF17_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF17_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF17; -})(); - -var PDF20 = (function PDF20Closure() { - - function concatArrays(array1, array2) { - var t = new Uint8Array(array1.length + array2.length); - t.set(array1, 0); - t.set(array2, array1.length); - return t; - } - - function calculatePDF20Hash(password, input, userBytes) { - //This refers to Algorithm 2.B as defined in ISO 32000-2 - var k = calculateSHA256(input, 0, input.length).subarray(0, 32); - var e = [0]; - var i = 0; - while (i < 64 || e[e.length - 1] > i - 32) { - var arrayLength = password.length + k.length + userBytes.length; - - var k1 = new Uint8Array(arrayLength * 64); - var array = concatArrays(password, k); - array = concatArrays(array, userBytes); - for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) { - k1.set(array, pos); - } - //AES128 CBC NO PADDING with - //first 16 bytes of k as the key and the second 16 as the iv. - var cipher = new AES128Cipher(k.subarray(0, 16)); - e = cipher.encrypt(k1, k.subarray(16, 32)); - //Now we have to take the first 16 bytes of an unsigned - //big endian integer... and compute the remainder - //modulo 3.... That is a fairly large number and - //JavaScript isn't going to handle that well... - //So we're using a trick that allows us to perform - //modulo math byte by byte - var remainder = 0; - for (var z = 0; z < 16; z++) { - remainder *= (256 % 3); - remainder %= 3; - remainder += ((e[z] >>> 0) % 3); - remainder %= 3; - } - if (remainder === 0) { - k = calculateSHA256(e, 0, e.length); - } - else if (remainder === 1) { - k = calculateSHA384(e, 0, e.length); - } - else if (remainder === 2) { - k = calculateSHA512(e, 0, e.length); - } - i++; - } - return k.subarray(0, 32); - } - - function PDF20() { - } - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - PDF20.prototype = { - hash: function PDF20_hash(password, concatBytes, userBytes) { - return calculatePDF20Hash(password, concatBytes, userBytes); - }, - checkOwnerPassword: function PDF20_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculatePDF20Hash(password, hashData, userBytes); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF20_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculatePDF20Hash(password, hashData, []); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculatePDF20Hash(password, hashData, userBytes); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF20_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculatePDF20Hash(password, hashData, []); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF20; -})(); - -var CipherTransform = (function CipherTransformClosure() { - function CipherTransform(stringCipherConstructor, streamCipherConstructor) { - this.stringCipherConstructor = stringCipherConstructor; - this.streamCipherConstructor = streamCipherConstructor; - } - - CipherTransform.prototype = { - createStream: function CipherTransform_createStream(stream, length) { - var cipher = new this.streamCipherConstructor(); - return new DecryptStream(stream, length, - function cipherTransformDecryptStream(data, finalize) { - return cipher.decryptBlock(data, finalize); - } - ); - }, - decryptString: function CipherTransform_decryptString(s) { - var cipher = new this.stringCipherConstructor(); - var data = stringToBytes(s); - data = cipher.decryptBlock(data, true); - return bytesToString(data); - } - }; - return CipherTransform; -})(); - -var CipherTransformFactory = (function CipherTransformFactoryClosure() { - var defaultPasswordBytes = new Uint8Array([ - 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, - 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, - 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, - 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); - - function createEncryptionKey20(revision, password, ownerPassword, - ownerValidationSalt, ownerKeySalt, uBytes, - userPassword, userValidationSalt, userKeySalt, - ownerEncryption, userEncryption, perms) { - if (password) { - var passwordLength = Math.min(127, password.length); - password = password.subarray(0, passwordLength); - } else { - password = []; - } - var pdfAlgorithm; - if (revision === 6) { - pdfAlgorithm = new PDF20(); - } else { - pdfAlgorithm = new PDF17(); - } - - if (pdfAlgorithm) { - if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, - userPassword)) { - return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); - } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, - ownerValidationSalt, - uBytes, - ownerPassword)) { - return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, - ownerEncryption); - } - } - - return null; - } - - function prepareKeyData(fileId, password, ownerPassword, userPassword, - flags, revision, keyLength, encryptMetadata) { - var hashDataSize = 40 + ownerPassword.length + fileId.length; - var hashData = new Uint8Array(hashDataSize), i = 0, j, n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - // as now the padded password in the hashData[0..i] - for (j = 0, n = ownerPassword.length; j < n; ++j) { - hashData[i++] = ownerPassword[j]; - } - hashData[i++] = flags & 0xFF; - hashData[i++] = (flags >> 8) & 0xFF; - hashData[i++] = (flags >> 16) & 0xFF; - hashData[i++] = (flags >>> 24) & 0xFF; - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - if (revision >= 4 && !encryptMetadata) { - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } - } - var encryptionKey = hash.subarray(0, keyLengthInBytes); - var cipher, checkData; - - if (revision >= 3) { - for (i = 0; i < 32; ++i) { - hashData[i] = defaultPasswordBytes[i]; - } - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - var derivedKey = new Uint8Array(n), k; - for (j = 1; j <= 19; ++j) { - for (k = 0; k < n; ++k) { - derivedKey[k] = encryptionKey[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(defaultPasswordBytes); - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } - return encryptionKey; - } - - function decodeUserPassword(password, ownerPassword, revision, keyLength) { - var hashData = new Uint8Array(32), i = 0, j, n; - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); - } - } - - var cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - var derivedKey = new Uint8Array(keyLengthInBytes), k; - for (j = 19; j >= 0; j--) { - for (k = 0; k < keyLengthInBytes; ++k) { - derivedKey[k] = hash[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); - } - } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); - } - return userPassword; - } - - var identityName = Name.get('Identity'); - - function CipherTransformFactory(dict, fileId, password) { - var filter = dict.get('Filter'); - if (!isName(filter) || filter.name !== 'Standard') { - error('unknown encryption method'); - } - this.dict = dict; - var algorithm = dict.get('V'); - if (!isInt(algorithm) || - (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && - algorithm !== 5)) { - error('unsupported encryption algorithm'); - } - this.algorithm = algorithm; - var keyLength = dict.get('Length') || 40; - if (!isInt(keyLength) || - keyLength < 40 || (keyLength % 8) !== 0) { - error('invalid key length'); - } - - // prepare keys - var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32); - var userPassword = stringToBytes(dict.get('U')).subarray(0, 32); - var flags = dict.get('P'); - var revision = dict.get('R'); - // meaningful when V is 4 or 5 - var encryptMetadata = ((algorithm === 4 || algorithm === 5) && - dict.get('EncryptMetadata') !== false); - this.encryptMetadata = encryptMetadata; - - var fileIdBytes = stringToBytes(fileId); - var passwordBytes; - if (password) { - if (revision === 6) { - try { - password = utf8StringToString(password); - } catch (ex) { - warn('CipherTransformFactory: ' + - 'Unable to convert UTF8 encoded password.'); - } - } - passwordBytes = stringToBytes(password); - } - - var encryptionKey; - if (algorithm !== 5) { - encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - else { - var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40); - var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48); - var uBytes = stringToBytes(dict.get('U')).subarray(0, 48); - var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40); - var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48); - var ownerEncryption = stringToBytes(dict.get('OE')); - var userEncryption = stringToBytes(dict.get('UE')); - var perms = stringToBytes(dict.get('Perms')); - encryptionKey = - createEncryptionKey20(revision, passwordBytes, - ownerPassword, ownerValidationSalt, - ownerKeySalt, uBytes, - userPassword, userValidationSalt, - userKeySalt, ownerEncryption, - userEncryption, perms); - } - if (!encryptionKey && !password) { - throw new PasswordException('No password given', - PasswordResponses.NEED_PASSWORD); - } else if (!encryptionKey && password) { - // Attempting use the password as an owner password - var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, - revision, keyLength); - encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - - if (!encryptionKey) { - throw new PasswordException('Incorrect Password', - PasswordResponses.INCORRECT_PASSWORD); - } - - this.encryptionKey = encryptionKey; - - if (algorithm >= 4) { - this.cf = dict.get('CF'); - this.stmf = dict.get('StmF') || identityName; - this.strf = dict.get('StrF') || identityName; - this.eff = dict.get('EFF') || this.stmf; - } - } - - function buildObjectKey(num, gen, encryptionKey, isAes) { - var key = new Uint8Array(encryptionKey.length + 9), i, n; - for (i = 0, n = encryptionKey.length; i < n; ++i) { - key[i] = encryptionKey[i]; - } - key[i++] = num & 0xFF; - key[i++] = (num >> 8) & 0xFF; - key[i++] = (num >> 16) & 0xFF; - key[i++] = gen & 0xFF; - key[i++] = (gen >> 8) & 0xFF; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6C; - key[i++] = 0x54; - } - var hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); - } - - function buildCipherConstructor(cf, name, num, gen, key) { - var cryptFilter = cf.get(name.name); - var cfm; - if (cryptFilter !== null && cryptFilter !== undefined) { - cfm = cryptFilter.get('CFM'); - } - if (!cfm || cfm.name === 'None') { - return function cipherTransformFactoryBuildCipherConstructorNone() { - return new NullCipher(); - }; - } - if ('V2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorV2() { - return new ARCFourCipher(buildObjectKey(num, gen, key, false)); - }; - } - if ('AESV2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV2() { - return new AES128Cipher(buildObjectKey(num, gen, key, true)); - }; - } - if ('AESV3' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV3() { - return new AES256Cipher(key); - }; - } - error('Unknown crypto method'); - } - - CipherTransformFactory.prototype = { - createCipherTransform: - function CipherTransformFactory_createCipherTransform(num, gen) { - if (this.algorithm === 4 || this.algorithm === 5) { - return new CipherTransform( - buildCipherConstructor(this.cf, this.stmf, - num, gen, this.encryptionKey), - buildCipherConstructor(this.cf, this.strf, - num, gen, this.encryptionKey)); - } - // algorithms 1 and 2 - var key = buildObjectKey(num, gen, this.encryptionKey, false); - var cipherConstructor = function buildCipherCipherConstructor() { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); - } - }; - - return CipherTransformFactory; -})(); - - -var ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; - -var Pattern = (function PatternClosure() { - // Constructor should define this.getPattern - function Pattern() { - error('should not call Pattern constructor'); - } - - Pattern.prototype = { - // Input: current Canvas context - // Output: the appropriate fillStyle or strokeStyle - getPattern: function Pattern_getPattern(ctx) { - error('Should not call Pattern.getStyle: ' + ctx); - } - }; - - Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, - res, handler) { - - var dict = isStream(shading) ? shading.dict : shading; - var type = dict.get('ShadingType'); - - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - // Both radial and axial shadings are handled by RadialAxial shading. - return new Shadings.RadialAxial(dict, matrix, xref, res); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new Shadings.Mesh(shading, matrix, xref, res); - default: - throw new Error('Unsupported ShadingType: ' + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.shadingPattern}); - warn(ex); - return new Shadings.Dummy(); - } - }; - return Pattern; -})(); - -var Shadings = {}; - -// A small number to offset the first/last color stops so we can insert ones to -// support extend. Number.MIN_VALUE appears to be too small and breaks the -// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number -// internally so we have to go bigger. -Shadings.SMALL_NUMBER = 1e-2; - -// Radial and axial shading have very similar implementations -// If needed, the implementations can be broken into two classes -Shadings.RadialAxial = (function RadialAxialClosure() { - function RadialAxial(dict, matrix, xref, res) { - this.matrix = matrix; - this.coordsArr = dict.get('Coords'); - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - - var t0 = 0.0, t1 = 1.0; - if (dict.has('Domain')) { - var domainArr = dict.get('Domain'); - t0 = domainArr[0]; - t1 = domainArr[1]; - } - - var extendStart = false, extendEnd = false; - if (dict.has('Extend')) { - var extendArr = dict.get('Extend'); - extendStart = extendArr[0]; - extendEnd = extendArr[1]; - } - - if (this.shadingType === ShadingType.RADIAL && - (!extendStart || !extendEnd)) { - // Radial gradient only currently works if either circle is fully within - // the other circle. - var x1 = this.coordsArr[0]; - var y1 = this.coordsArr[1]; - var r1 = this.coordsArr[2]; - var x2 = this.coordsArr[3]; - var y2 = this.coordsArr[4]; - var r2 = this.coordsArr[5]; - var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - if (r1 <= r2 + distance && - r2 <= r1 + distance) { - warn('Unsupported radial gradient.'); - } - } - - this.extendStart = extendStart; - this.extendEnd = extendEnd; - - var fnObj = dict.get('Function'); - var fn = PDFFunction.parseArray(xref, fnObj); - - // 10 samples seems good enough for now, but probably won't work - // if there are sharp color changes. Ideally, we would implement - // the spec faithfully and add lossless optimizations. - var diff = t1 - t0; - var step = diff / 10; - - var colorStops = this.colorStops = []; - - // Protect against bad domains so we don't end up in an infinte loop below. - if (t0 >= t1 || step <= 0) { - // Acrobat doesn't seem to handle these cases so we'll ignore for - // now. - info('Bad shading domain.'); - return; - } - - var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); - var rgbColor; - for (var i = t0; i <= t1; i += step) { - ratio[0] = i; - fn(ratio, 0, color, 0); - rgbColor = cs.getRgb(color, 0); - var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - colorStops.push([(i - t0) / diff, cssColor]); - } - - var background = 'transparent'; - if (dict.has('Background')) { - rgbColor = cs.getRgb(dict.get('Background'), 0); - background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - } - - if (!extendStart) { - // Insert a color stop at the front and offset the first real color stop - // so it doesn't conflict with the one we insert. - colorStops.unshift([0, background]); - colorStops[1][0] += Shadings.SMALL_NUMBER; - } - if (!extendEnd) { - // Same idea as above in extendStart but for the end. - colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; - colorStops.push([1, background]); - } - - this.colorStops = colorStops; - } - - RadialAxial.prototype = { - getIR: function RadialAxial_getIR() { - var coordsArr = this.coordsArr; - var shadingType = this.shadingType; - var type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = 'axial'; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = 'radial'; - } else { - error('getPattern type unknown: ' + shadingType); - } - - var matrix = this.matrix; - if (matrix) { - p0 = Util.applyTransform(p0, matrix); - p1 = Util.applyTransform(p1, matrix); - if (shadingType === ShadingType.RADIAL) { - var scale = Util.singularValueDecompose2dScale(matrix); - r0 *= scale[0]; - r1 *= scale[1]; - } - } - - return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; - } - }; - - return RadialAxial; -})(); - -// All mesh shading. For now, they will be presented as set of the triangles -// to be drawn on the canvas and rgb color for each vertex. -Shadings.Mesh = (function MeshClosure() { - function MeshStreamReader(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - - var numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - var csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : - this.tmpCompsBuf; - } - MeshStreamReader.prototype = { - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - var nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - }, - readBits: function MeshStreamReader_readBits(n) { - var buffer = this.buffer; - var bufferLength = this.bufferLength; - if (n === 32) { - if (bufferLength === 0) { - return ((this.stream.getByte() << 24) | - (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | - this.stream.getByte()) >>> 0; - } - buffer = (buffer << 24) | (this.stream.getByte() << 16) | - (this.stream.getByte() << 8) | this.stream.getByte(); - var nextByte = this.stream.getByte(); - this.buffer = nextByte & ((1 << bufferLength) - 1); - return ((buffer << (8 - bufferLength)) | - ((nextByte & 0xFF) >> bufferLength)) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return this.stream.getByte(); - } - while (bufferLength < n) { - buffer = (buffer << 8) | this.stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & ((1 << bufferLength) - 1); - return buffer >> bufferLength; - }, - align: function MeshStreamReader_align() { - this.buffer = 0; - this.bufferLength = 0; - }, - readFlag: function MeshStreamReader_readFlag() { - return this.readBits(this.context.bitsPerFlag); - }, - readCoordinate: function MeshStreamReader_readCoordinate() { - var bitsPerCoordinate = this.context.bitsPerCoordinate; - var xi = this.readBits(bitsPerCoordinate); - var yi = this.readBits(bitsPerCoordinate); - var decode = this.context.decode; - var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - return [ - xi * scale * (decode[1] - decode[0]) + decode[0], - yi * scale * (decode[3] - decode[2]) + decode[2] - ]; - }, - readComponents: function MeshStreamReader_readComponents() { - var numComps = this.context.numComps; - var bitsPerComponent = this.context.bitsPerComponent; - var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - var decode = this.context.decode; - var components = this.tmpCompsBuf; - for (var i = 0, j = 4; i < numComps; i++, j += 2) { - var ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - var color = this.tmpCsCompsBuf; - if (this.context.colorFn) { - this.context.colorFn(components, 0, color, 0); - } - return this.context.colorSpace.getRgb(color, 0); - } - }; - - function decodeType4Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var operators = []; - var ps = []; // not maintaining cs since that will match ps - var verticesLeft = 0; // assuming we have all data to start a new triangle - while (reader.hasData) { - var f = reader.readFlag(); - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - if (verticesLeft === 0) { // ignoring flags if we started a triangle - assert(0 <= f && f <= 2, 'Unknown type4 flag'); - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps[ps.length - 2], ps[ps.length - 1]); - verticesLeft = 1; - break; - case 2: - ps.push(ps[ps.length - 3], ps[ps.length - 1]); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - - reader.align(); - } - mesh.figures.push({ - type: 'triangles', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - }); - } - - function decodeType5Shading(mesh, reader, verticesPerRow) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = []; // not maintaining cs since that will match ps - while (reader.hasData) { - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - mesh.figures.push({ - type: 'lattice', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow: verticesPerRow - }); - } - - var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - - var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds - - var getB = (function getBClosure() { - function buildB(count) { - var lut = []; - for (var i = 0; i <= count; i++) { - var t = i / count, t_ = 1 - t; - lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, - 3 * t * t * t_, t * t * t])); - } - return lut; - } - var cache = []; - return function getB(count) { - if (!cache[count]) { - cache[count] = buildB(count); - } - return cache[count]; - }; - })(); - - function buildFigureFromPatch(mesh, index) { - var figure = mesh.figures[index]; - assert(figure.type === 'patch', 'Unexpected patch mesh figure'); - - var coords = mesh.coords, colors = mesh.colors; - var pi = figure.coords; - var ci = figure.colors; - - var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / - (mesh.bounds[2] - mesh.bounds[0])); - splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); - var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / - (mesh.bounds[3] - mesh.bounds[1])); - splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); - - var verticesPerRow = splitXBy + 1; - var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - var k = 0; - var cl = new Uint8Array(3), cr = new Uint8Array(3); - var c0 = colors[ci[0]], c1 = colors[ci[1]], - c2 = colors[ci[2]], c3 = colors[ci[3]]; - var bRow = getB(splitYBy), bCol = getB(splitXBy); - for (var row = 0; row <= splitYBy; row++) { - cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0; - cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0; - cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0; - - cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0; - cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0; - cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0; - - for (var col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && - (col === 0 || col === splitXBy)) { - continue; - } - var x = 0, y = 0; - var q = 0; - for (var i = 0; i <= 3; i++) { - for (var j = 0; j <= 3; j++, q++) { - var m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - var newColor = new Uint8Array(3); - newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0; - newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0; - newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - - mesh.figures[index] = { - type: 'lattice', - coords: figureCoords, - colors: figureColors, - verticesPerRow: verticesPerRow - }; - } - - function decodeType6Shading(mesh, reader) { - // A special case of Type 7. The p11, p12, p21, p22 automatically filled - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type6 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; - ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - // set p11, p12, p21, p22 - ps[5] = coords.length; - coords.push([ - (-4 * coords[ps[0]][0] - coords[ps[15]][0] + - 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, - (-4 * coords[ps[0]][1] - coords[ps[15]][1] + - 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 - ]); - ps[6] = coords.length; - coords.push([ - (-4 * coords[ps[3]][0] - coords[ps[12]][0] + - 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, - (-4 * coords[ps[3]][1] - coords[ps[12]][1] + - 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 - ]); - ps[9] = coords.length; - coords.push([ - (-4 * coords[ps[12]][0] - coords[ps[3]][0] + - 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, - (-4 * coords[ps[12]][1] - coords[ps[3]][1] + - 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 - ]); - ps[10] = coords.length; - coords.push([ - (-4 * coords[ps[15]][0] - coords[ps[0]][0] + - 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, - (-4 * coords[ps[15]][1] - coords[ps[0]][1] + - 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 - ]); - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function decodeType7Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type7 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7; - ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = ps[2]; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function updateBounds(mesh) { - var minX = mesh.coords[0][0], minY = mesh.coords[0][1], - maxX = minX, maxY = minY; - for (var i = 1, ii = mesh.coords.length; i < ii; i++) { - var x = mesh.coords[i][0], y = mesh.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - mesh.bounds = [minX, minY, maxX, maxY]; - } - - function packData(mesh) { - var i, ii, j, jj; - - var coords = mesh.coords; - var coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - var xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - mesh.coords = coordsPacked; - - var colors = mesh.colors; - var colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - var c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - mesh.colors = colorsPacked; - - var figures = mesh.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - - function Mesh(stream, matrix, xref, res) { - assert(isStream(stream), 'Mesh data is not a stream'); - var dict = stream.dict; - this.matrix = matrix; - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - this.bbox = dict.get('BBox'); - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - this.background = dict.has('Background') ? - cs.getRgb(dict.get('Background'), 0) : null; - - var fnObj = dict.get('Function'); - var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; - - this.coords = []; - this.colors = []; - this.figures = []; - - var decodeContext = { - bitsPerCoordinate: dict.get('BitsPerCoordinate'), - bitsPerComponent: dict.get('BitsPerComponent'), - bitsPerFlag: dict.get('BitsPerFlag'), - decode: dict.get('Decode'), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - var reader = new MeshStreamReader(stream, decodeContext); - - var patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - decodeType4Shading(this, reader); - break; - case ShadingType.LATTICE_FORM_MESH: - var verticesPerRow = dict.get('VerticesPerRow') | 0; - assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); - decodeType5Shading(this, reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - decodeType6Shading(this, reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - decodeType7Shading(this, reader); - patchMesh = true; - break; - default: - error('Unsupported mesh type.'); - break; - } - - if (patchMesh) { - // dirty bounds calculation for determining, how dense shall be triangles - updateBounds(this); - for (var i = 0, ii = this.figures.length; i < ii; i++) { - buildFigureFromPatch(this, i); - } - } - // calculate bounds - updateBounds(this); - - packData(this); - } - - Mesh.prototype = { - getIR: function Mesh_getIR() { - return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, - this.bounds, this.matrix, this.bbox, this.background]; - } - }; - - return Mesh; -})(); - -Shadings.Dummy = (function DummyClosure() { - function Dummy() { - this.type = 'Pattern'; - } - - Dummy.prototype = { - getIR: function Dummy_getIR() { - return ['Dummy']; - } - }; - return Dummy; -})(); - -function getTilingPatternIR(operatorList, dict, args) { - var matrix = dict.get('Matrix'); - var bbox = dict.get('BBox'); - var xstep = dict.get('XStep'); - var ystep = dict.get('YStep'); - var paintType = dict.get('PaintType'); - var tilingType = dict.get('TilingType'); - - return [ - 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, - paintType, tilingType - ]; -} - - -var PartialEvaluator = (function PartialEvaluatorClosure() { - function PartialEvaluator(pdfManager, xref, handler, pageIndex, - uniquePrefix, idCounters, fontCache) { - this.pdfManager = pdfManager; - this.xref = xref; - this.handler = handler; - this.pageIndex = pageIndex; - this.uniquePrefix = uniquePrefix; - this.idCounters = idCounters; - this.fontCache = fontCache; - } - - // Trying to minimize Date.now() usage and check every 100 time - var TIME_SLOT_DURATION_MS = 20; - var CHECK_TIME_EVERY = 100; - function TimeSlotManager() { - this.reset(); - } - TimeSlotManager.prototype = { - check: function TimeSlotManager_check() { - if (++this.checked < CHECK_TIME_EVERY) { - return false; - } - this.checked = 0; - return this.endTime <= Date.now(); - }, - reset: function TimeSlotManager_reset() { - this.endTime = Date.now() + TIME_SLOT_DURATION_MS; - this.checked = 0; - } - }; - - var deferred = Promise.resolve(); - - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - PartialEvaluator.prototype = { - hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { - if (!isDict(resources)) { - return false; - } - - var processed = Object.create(null); - if (resources.objId) { - processed[resources.objId] = true; - } - - var nodes = [resources]; - while (nodes.length) { - var key; - var node = nodes.shift(); - // First check the current resources for blend modes. - var graphicStates = node.get('ExtGState'); - if (isDict(graphicStates)) { - graphicStates = graphicStates.getAll(); - for (key in graphicStates) { - var graphicState = graphicStates[key]; - var bm = graphicState['BM']; - if (isName(bm) && bm.name !== 'Normal') { - return true; - } - } - } - // Descend into the XObjects to look for more resources and blend modes. - var xObjects = node.get('XObject'); - if (!isDict(xObjects)) { - continue; - } - xObjects = xObjects.getAll(); - for (key in xObjects) { - var xObject = xObjects[key]; - if (!isStream(xObject)) { - continue; - } - if (xObject.dict.objId) { - if (processed[xObject.dict.objId]) { - // stream has objId and is processed already - continue; - } - processed[xObject.dict.objId] = true; - } - var xResources = xObject.dict.get('Resources'); - // Checking objId to detect an infinite loop. - if (isDict(xResources) && - (!xResources.objId || !processed[xResources.objId])) { - nodes.push(xResources); - if (xResources.objId) { - processed[xResources.objId] = true; - } - } - } - } - return false; - }, - - buildFormXObject: function PartialEvaluator_buildFormXObject(resources, - xobj, smask, - operatorList, - task, - initialState) { - var matrix = xobj.dict.getArray('Matrix'); - var bbox = xobj.dict.getArray('BBox'); - var group = xobj.dict.get('Group'); - if (group) { - var groupOptions = { - matrix: matrix, - bbox: bbox, - smask: smask, - isolated: false, - knockout: false - }; - - var groupSubtype = group.get('S'); - var colorSpace; - if (isName(groupSubtype) && groupSubtype.name === 'Transparency') { - groupOptions.isolated = (group.get('I') || false); - groupOptions.knockout = (group.get('K') || false); - colorSpace = (group.has('CS') ? - ColorSpace.parse(group.get('CS'), this.xref, resources) : null); - } - - if (smask && smask.backdrop) { - colorSpace = colorSpace || ColorSpace.singletons.rgb; - smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); - } - - operatorList.addOp(OPS.beginGroup, [groupOptions]); - } - - operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); - - return this.getOperatorList(xobj, task, - (xobj.dict.get('Resources') || resources), operatorList, initialState). - then(function () { - operatorList.addOp(OPS.paintFormXObjectEnd, []); - - if (group) { - operatorList.addOp(OPS.endGroup, [groupOptions]); - } - }); - }, - - buildPaintImageXObject: - function PartialEvaluator_buildPaintImageXObject(resources, image, - inline, operatorList, - cacheKey, imageCache) { - var self = this; - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - if (!(w && isNum(w)) || !(h && isNum(h))) { - warn('Image dimensions are missing, or not numbers.'); - return; - } - if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) { - warn('Image exceeded maximum allowed size and was removed.'); - return; - } - - var imageMask = (dict.get('ImageMask', 'IM') || false); - var imgData, args; - if (imageMask) { - // This depends on a tmpCanvas being filled with the - // current fillStyle, such that processing the pixel - // data can't be done here. Instead of creating a - // complete PDFImage, only read the information needed - // for later. - - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = (width + 7) >> 3; - var imgArray = image.getBytes(bitStrideLength * height); - var decode = dict.get('Decode', 'D'); - var inverseDecode = (!!decode && decode[0] > 0); - - imgData = PDFImage.createMask(imgArray, width, height, - image instanceof DecodeStream, - inverseDecode); - imgData.cached = true; - args = [imgData]; - operatorList.addOp(OPS.paintImageMaskXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageMaskXObject, - args: args - }; - } - return; - } - - var softMask = (dict.get('SMask', 'SM') || false); - var mask = (dict.get('Mask') || false); - - var SMALL_IMAGE_DIMENSIONS = 200; - // Inlining small images into the queue as RGB data - if (inline && !softMask && !mask && !(image instanceof JpegStream) && - (w + h) < SMALL_IMAGE_DIMENSIONS) { - var imageObj = new PDFImage(this.xref, resources, image, - inline, null, null); - // We force the use of RGBA_32BPP images here, because we can't handle - // any other kind. - imgData = imageObj.createImageData(/* forceRGBA = */ true); - operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var uniquePrefix = (this.uniquePrefix || ''); - var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); - operatorList.addDependency(objId); - args = [objId, w, h]; - - if (!softMask && !mask && image instanceof JpegStream && - image.isNativelySupported(this.xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - operatorList.addOp(OPS.paintJpegXObject, args); - this.handler.send('obj', - [objId, this.pageIndex, 'JpegStream', image.getIR()]); - return; - } - - PDFImage.buildImage(self.handler, self.xref, resources, image, inline). - then(function(imageObj) { - var imgData = imageObj.createImageData(/* forceRGBA = */ false); - self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData], - [imgData.data.buffer]); - }).then(undefined, function (reason) { - warn('Unable to decode image: ' + reason); - self.handler.send('obj', [objId, self.pageIndex, 'Image', null]); - }); - - operatorList.addOp(OPS.paintImageXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageXObject, - args: args - }; - } - }, - - handleSMask: function PartialEvaluator_handleSmask(smask, resources, - operatorList, task, - stateManager) { - var smaskContent = smask.get('G'); - var smaskOptions = { - subtype: smask.get('S').name, - backdrop: smask.get('BC') - }; - - // The SMask might have a alpha/luminosity value transfer function -- - // we will build a map of integer values in range 0..255 to be fast. - var transferObj = smask.get('TR'); - if (isPDFFunction(transferObj)) { - var transferFn = PDFFunction.parse(this.xref, transferObj); - var transferMap = new Uint8Array(256); - var tmp = new Float32Array(1); - for (var i = 0; i < 255; i++) { - tmp[0] = i / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[i] = (tmp[0] * 255) | 0; - } - smaskOptions.transferMap = transferMap; - } - - return this.buildFormXObject(resources, smaskContent, smaskOptions, - operatorList, task, stateManager.state.clone()); - }, - - handleTilingType: - function PartialEvaluator_handleTilingType(fn, args, resources, - pattern, patternDict, - operatorList, task) { - // Create an IR of the pattern code. - var tilingOpList = new OperatorList(); - // Merge the available resources, to prevent issues when the patternDict - // is missing some /Resources entries (fixes issue6541.pdf). - var resourcesArray = [patternDict.get('Resources'), resources]; - var patternResources = Dict.merge(this.xref, resourcesArray); - - return this.getOperatorList(pattern, task, patternResources, - tilingOpList).then(function () { - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - operatorList.addDependencies(tilingOpList.dependencies); - operatorList.addOp(fn, getTilingPatternIR({ - fnArray: tilingOpList.fnArray, - argsArray: tilingOpList.argsArray - }, patternDict, args)); - }); - }, - - handleSetFont: - function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, - operatorList, task, state) { - // TODO(mack): Not needed? - var fontName; - if (fontArgs) { - fontArgs = fontArgs.slice(); - fontName = fontArgs[0].name; - } - - var self = this; - return this.loadFont(fontName, fontRef, this.xref, resources).then( - function (translated) { - if (!translated.font.isType3Font) { - return translated; - } - return translated.loadType3Data(self, resources, operatorList, task). - then(function () { - return translated; - }, function (reason) { - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - return new TranslatedFont('g_font_error', - new ErrorFont('Type3 font load error: ' + reason), translated.font); - }); - }).then(function (translated) { - state.font = translated.font; - translated.send(self.handler); - return translated.loadedName; - }); - }, - - handleText: function PartialEvaluator_handleText(chars, state) { - var font = state.font; - var glyphs = font.charsToGlyphs(chars); - var isAddToPathSet = !!(state.textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) { - var buildPath = function (fontChar) { - if (!font.renderer.hasBuiltPath(fontChar)) { - var path = font.renderer.getPathJs(fontChar); - this.handler.send('commonobj', [ - font.loadedName + '_path_' + fontChar, - 'FontPath', - path - ]); - } - }.bind(this); - - for (var i = 0, ii = glyphs.length; i < ii; i++) { - var glyph = glyphs[i]; - buildPath(glyph.fontChar); - - // If the glyph has an accent we need to build a path for its - // fontChar too, otherwise CanvasGraphics_paintChar will fail. - var accent = glyph.accent; - if (accent && accent.fontChar) { - buildPath(accent.fontChar); - } - } - } - - return glyphs; - }, - - setGState: function PartialEvaluator_setGState(resources, gState, - operatorList, task, - xref, stateManager) { - // This array holds the converted/processed state data. - var gStateObj = []; - var gStateMap = gState.map; - var self = this; - var promise = Promise.resolve(); - for (var key in gStateMap) { - var value = gStateMap[key]; - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gStateObj.push([key, value]); - break; - case 'Font': - promise = promise.then(function () { - return self.handleSetFont(resources, null, value[0], operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - gStateObj.push([key, [loadedName, value[1]]]); - }); - }); - break; - case 'BM': - gStateObj.push([key, value]); - break; - case 'SMask': - if (isName(value) && value.name === 'None') { - gStateObj.push([key, false]); - break; - } - var dict = xref.fetchIfRef(value); - if (isDict(dict)) { - promise = promise.then(function () { - return self.handleSMask(dict, resources, operatorList, - task, stateManager); - }); - gStateObj.push([key, true]); - } else { - warn('Unsupported SMask type'); - } - - break; - // Only generate info log messages for the following since - // they are unlikely to have a big impact on the rendering. - case 'OP': - case 'op': - case 'OPM': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - case 'TR': - case 'TR2': - case 'HT': - case 'SM': - case 'SA': - case 'AIS': - case 'TK': - // TODO implement these operators. - info('graphic state operator ' + key); - break; - default: - info('Unknown graphic state operator ' + key); - break; - } - } - return promise.then(function () { - if (gStateObj.length >= 0) { - operatorList.addOp(OPS.setGState, [gStateObj]); - } - }); - }, - - loadFont: function PartialEvaluator_loadFont(fontName, font, xref, - resources) { - - function errorFont() { - return Promise.resolve(new TranslatedFont('g_font_error', - new ErrorFont('Font ' + fontName + ' is not available'), font)); - } - var fontRef; - if (font) { // Loading by ref. - assert(isRef(font)); - fontRef = font; - } else { // Loading by name. - var fontRes = resources.get('Font'); - if (fontRes) { - fontRef = fontRes.getRaw(fontName); - } else { - warn('fontRes not available'); - return errorFont(); - } - } - if (!fontRef) { - warn('fontRef not available'); - return errorFont(); - } - - if (this.fontCache.has(fontRef)) { - return this.fontCache.get(fontRef); - } - - font = xref.fetchIfRef(fontRef); - if (!isDict(font)) { - return errorFont(); - } - - // We are holding font.translated references just for fontRef that are not - // dictionaries (Dict). See explanation below. - if (font.translated) { - return font.translated; - } - - var fontCapability = createPromiseCapability(); - - var preEvaluatedFont = this.preEvaluateFont(font, xref); - var descriptor = preEvaluatedFont.descriptor; - var fontID = fontRef.num + '_' + fontRef.gen; - if (isDict(descriptor)) { - if (!descriptor.fontAliases) { - descriptor.fontAliases = Object.create(null); - } - - var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; - if (fontAliases[hash]) { - var aliasFontRef = fontAliases[hash].aliasRef; - if (aliasFontRef && this.fontCache.has(aliasFontRef)) { - this.fontCache.putAlias(fontRef, aliasFontRef); - return this.fontCache.get(fontRef); - } - } - - if (!fontAliases[hash]) { - fontAliases[hash] = { - fontID: Font.getFontID() - }; - } - - fontAliases[hash].aliasRef = fontRef; - fontID = fontAliases[hash].fontID; - } - - // Workaround for bad PDF generators that don't reference fonts - // properly, i.e. by not using an object identifier. - // Check if the fontRef is a Dict (as opposed to a standard object), - // in which case we don't cache the font and instead reference it by - // fontName in font.loadedName below. - var fontRefIsDict = isDict(fontRef); - if (!fontRefIsDict) { - this.fontCache.put(fontRef, fontCapability.promise); - } - - // Keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page. - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + (fontRefIsDict ? - fontName.replace(/\W/g, '') : fontID); - - font.translated = fontCapability.promise; - - // TODO move promises into translate font - var translatedPromise; - try { - translatedPromise = Promise.resolve( - this.translateFont(preEvaluatedFont, xref)); - } catch (e) { - translatedPromise = Promise.reject(e); - } - - var self = this; - translatedPromise.then(function (translatedFont) { - if (translatedFont.fontType !== undefined) { - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[translatedFont.fontType] = true; - } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - translatedFont, font)); - }, function (reason) { - // TODO fontCapability.reject? - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - - try { - // error, but it's still nice to have font type reported - var descriptor = preEvaluatedFont.descriptor; - var fontFile3 = descriptor && descriptor.get('FontFile3'); - var subtype = fontFile3 && fontFile3.get('Subtype'); - var fontType = getFontType(preEvaluatedFont.type, - subtype && subtype.name); - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[fontType] = true; - } catch (ex) { } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - new ErrorFont(reason instanceof Error ? reason.message : reason), - font)); - }); - return fontCapability.promise; - }, - - buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { - var lastIndex = operatorList.length - 1; - if (!args) { - args = []; - } - if (lastIndex < 0 || - operatorList.fnArray[lastIndex] !== OPS.constructPath) { - operatorList.addOp(OPS.constructPath, [[fn], args]); - } else { - var opArgs = operatorList.argsArray[lastIndex]; - opArgs[0].push(fn); - Array.prototype.push.apply(opArgs[1], args); - } - }, - - handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, - cs, patterns, resources, task, xref) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - var pattern; - if (isName(patternName) && - (pattern = patterns.get(patternName.name))) { - var dict = (isStream(pattern) ? pattern.dict : pattern); - var typeNum = dict.get('PatternType'); - - if (typeNum === TILING_PATTERN) { - var color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, - dict, operatorList, task); - } else if (typeNum === SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.get('Matrix'); - pattern = Pattern.parseShading(shading, matrix, xref, resources, - this.handler); - operatorList.addOp(fn, pattern.getIR()); - return Promise.resolve(); - } else { - return Promise.reject('Unknown PatternType: ' + typeNum); - } - } - // TODO shall we fail here? - operatorList.addOp(fn, args); - return Promise.resolve(); - }, - - getOperatorList: function PartialEvaluator_getOperatorList(stream, - task, - resources, - operatorList, - initialState) { - - var self = this; - var xref = this.xref; - var imageCache = {}; - - assert(operatorList); - - resources = (resources || Dict.empty); - var xobjs = (resources.get('XObject') || Dict.empty); - var patterns = (resources.get('Pattern') || Dict.empty); - var stateManager = new StateManager(initialState || new EvalState()); - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function next(resolve, reject) { - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, i, ii, cs; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are used beyond this loop, so we - // cannot reuse the same array on each iteration. Therefore we pass - // in |null| as the initial value (see the comment on - // EvaluatorPreprocessor_read() for why). - operation.args = null; - if (!(preprocessor.read(operation))) { - break; - } - var args = operation.args; - var fn = operation.fn; - - switch (fn | 0) { - case OPS.paintXObject: - if (args[0].code) { - break; - } - // eagerly compile XForm objects - var name = args[0].name; - if (!name) { - warn('XObject must be referred to by name.'); - continue; - } - if (imageCache[name] !== undefined) { - operatorList.addOp(imageCache[name].fn, imageCache[name].args); - args = null; - continue; - } - - var xobj = xobjs.get(name); - if (xobj) { - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), - 'XObject should have a Name subtype'); - - if (type.name === 'Form') { - stateManager.save(); - return self.buildFormXObject(resources, xobj, null, - operatorList, task, - stateManager.state.clone()). - then(function () { - stateManager.restore(); - next(resolve, reject); - }, reject); - } else if (type.name === 'Image') { - self.buildPaintImageXObject(resources, xobj, false, - operatorList, name, imageCache); - args = null; - continue; - } else if (type.name === 'PS') { - // PostScript XObjects are unused when viewing documents. - // See section 4.7.1 of Adobe's PDF reference. - info('Ignored XObject subtype PS'); - continue; - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - break; - case OPS.setFont: - var fontSize = args[1]; - // eagerly collect all fonts - return self.handleSetFont(resources, args, null, operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - operatorList.addOp(OPS.setFont, [loadedName, fontSize]); - next(resolve, reject); - }, reject); - case OPS.endInlineImage: - var cacheKey = args[0].cacheKey; - if (cacheKey) { - var cacheEntry = imageCache[cacheKey]; - if (cacheEntry !== undefined) { - operatorList.addOp(cacheEntry.fn, cacheEntry.args); - args = null; - continue; - } - } - self.buildPaintImageXObject(resources, args[0], true, - operatorList, cacheKey, imageCache); - args = null; - continue; - case OPS.showText: - args[0] = self.handleText(args[0], stateManager.state); - break; - case OPS.showSpacedText: - var arr = args[0]; - var combinedGlyphs = []; - var arrLength = arr.length; - var state = stateManager.state; - for (i = 0; i < arrLength; ++i) { - var arrItem = arr[i]; - if (isString(arrItem)) { - Array.prototype.push.apply(combinedGlyphs, - self.handleText(arrItem, state)); - } else if (isNum(arrItem)) { - combinedGlyphs.push(arrItem); - } - } - args[0] = combinedGlyphs; - fn = OPS.showText; - break; - case OPS.nextLineShowText: - operatorList.addOp(OPS.nextLine); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.nextLineSetSpacingShowText: - operatorList.addOp(OPS.nextLine); - operatorList.addOp(OPS.setWordSpacing, [args.shift()]); - operatorList.addOp(OPS.setCharSpacing, [args.shift()]); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.setTextRenderingMode: - stateManager.state.textRenderingMode = args[0]; - break; - - case OPS.setFillColorSpace: - stateManager.state.fillColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setStrokeColorSpace: - stateManager.state.strokeColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setFillColor: - cs = stateManager.state.fillColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColor: - cs = stateManager.state.strokeColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; - if (cs.name === 'Pattern') { - return self.handleColorN(operatorList, OPS.setFillColorN, - args, cs, patterns, resources, task, xref).then(function() { - next(resolve, reject); - }, reject); - } - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; - if (cs.name === 'Pattern') { - return self.handleColorN(operatorList, OPS.setStrokeColorN, - args, cs, patterns, resources, task, xref).then(function() { - next(resolve, reject); - }, reject); - } - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - - case OPS.shadingFill: - var shadingRes = resources.get('Shading'); - if (!shadingRes) { - error('No shading resource found'); - } - - var shading = shadingRes.get(args[0].name); - if (!shading) { - error('No shading object found'); - } - - var shadingFill = Pattern.parseShading(shading, null, xref, - resources, self.handler); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = OPS.shadingFill; - break; - case OPS.setGState: - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gState = extGState.get(dictName.name); - return self.setGState(resources, gState, operatorList, task, - xref, stateManager).then(function() { - next(resolve, reject); - }, reject); - case OPS.moveTo: - case OPS.lineTo: - case OPS.curveTo: - case OPS.curveTo2: - case OPS.curveTo3: - case OPS.closePath: - self.buildPath(operatorList, fn, args); - continue; - case OPS.rectangle: - self.buildPath(operatorList, fn, args); - continue; - case OPS.markPoint: - case OPS.markPointProps: - case OPS.beginMarkedContent: - case OPS.beginMarkedContentProps: - case OPS.endMarkedContent: - case OPS.beginCompat: - case OPS.endCompat: - // Ignore operators where the corresponding handlers are known to - // be no-op in CanvasGraphics (display/canvas.js). This prevents - // serialization errors and is also a bit more efficient. - // We could also try to serialize all objects in a general way, - // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266, - // but doing so is meaningless without knowing the semantics. - continue; - default: - // Note: Let's hope that the ignored operator does not have any - // non-serializable arguments, otherwise postMessage will throw - // "An object could not be cloned.". - } - operatorList.addOp(fn, args); - } - if (stop) { - deferred.then(function () { - next(resolve, reject); - }, reject); - return; - } - // Some PDFs don't close all restores inside object/form. - // Closing those for them. - for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { - operatorList.addOp(OPS.restore, []); - } - resolve(); - }); - }, - - getTextContent: - function PartialEvaluator_getTextContent(stream, task, resources, - stateManager, - normalizeWhitespace) { - - stateManager = (stateManager || new StateManager(new TextState())); - - var WhitespaceRegexp = /\s/g; - - var textContent = { - items: [], - styles: Object.create(null) - }; - var textContentItem = { - initialized: false, - str: [], - width: 0, - height: 0, - vertical: false, - lastAdvanceWidth: 0, - lastAdvanceHeight: 0, - textAdvanceScale: 0, - spaceWidth: 0, - fakeSpaceMin: Infinity, - fakeMultiSpaceMin: Infinity, - fakeMultiSpaceMax: -0, - textRunBreakAllowed: false, - transform: null, - fontName: null - }; - var SPACE_FACTOR = 0.3; - var MULTI_SPACE_FACTOR = 1.5; - var MULTI_SPACE_FACTOR_MAX = 4; - - var self = this; - var xref = this.xref; - - resources = (xref.fetchIfRef(resources) || Dict.empty); - - // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd. - var xobjs = null; - var xobjsCache = {}; - - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - - var textState; - - function ensureTextContentItem() { - if (textContentItem.initialized) { - return textContentItem; - } - var font = textState.font; - if (!(font.loadedName in textContent.styles)) { - textContent.styles[font.loadedName] = { - fontFamily: font.fallbackName, - ascent: font.ascent, - descent: font.descent, - vertical: font.vertical - }; - } - textContentItem.fontName = font.loadedName; - - // 9.4.4 Text Space Details - var tsm = [textState.fontSize * textState.textHScale, 0, - 0, textState.fontSize, - 0, textState.textRise]; - - if (font.isType3Font && - textState.fontMatrix !== FONT_IDENTITY_MATRIX && - textState.fontSize === 1) { - var glyphHeight = font.bbox[3] - font.bbox[1]; - if (glyphHeight > 0) { - glyphHeight = glyphHeight * textState.fontMatrix[3]; - tsm[3] *= glyphHeight; - } - } - - var trm = Util.transform(textState.ctm, - Util.transform(textState.textMatrix, tsm)); - textContentItem.transform = trm; - if (!font.vertical) { - textContentItem.width = 0; - textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); - textContentItem.vertical = false; - } else { - textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); - textContentItem.height = 0; - textContentItem.vertical = true; - } - - var a = textState.textLineMatrix[0]; - var b = textState.textLineMatrix[1]; - var scaleLineX = Math.sqrt(a * a + b * b); - a = textState.ctm[0]; - b = textState.ctm[1]; - var scaleCtmX = Math.sqrt(a * a + b * b); - textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - textContentItem.lastAdvanceWidth = 0; - textContentItem.lastAdvanceHeight = 0; - - var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; - if (spaceWidth) { - textContentItem.spaceWidth = spaceWidth; - textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; - textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; - textContentItem.fakeMultiSpaceMax = - spaceWidth * MULTI_SPACE_FACTOR_MAX; - // It's okay for monospace fonts to fake as much space as needed. - textContentItem.textRunBreakAllowed = !font.isMonospace; - } else { - textContentItem.spaceWidth = 0; - textContentItem.fakeSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMax = 0; - textContentItem.textRunBreakAllowed = false; - } - - - textContentItem.initialized = true; - return textContentItem; - } - - function replaceWhitespace(str) { - // Replaces all whitespaces with standard spaces (0x20), to avoid - // alignment issues between the textLayer and the canvas if the text - // contains e.g. tabs (fixes issue6612.pdf). - var i = 0, ii = str.length, code; - while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { - i++; - } - return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); - } - - function runBidiTransform(textChunk) { - var str = textChunk.str.join(''); - var bidiResult = PDFJS.bidi(str, -1, textChunk.vertical); - return { - str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : - bidiResult.str), - dir: bidiResult.dir, - width: textChunk.width, - height: textChunk.height, - transform: textChunk.transform, - fontName: textChunk.fontName - }; - } - - function handleSetFont(fontName, fontRef) { - return self.loadFont(fontName, fontRef, xref, resources). - then(function (translated) { - textState.font = translated.font; - textState.fontMatrix = translated.font.fontMatrix || - FONT_IDENTITY_MATRIX; - }); - } - - function buildTextContentItem(chars) { - var font = textState.font; - var textChunk = ensureTextContentItem(); - var width = 0; - var height = 0; - var glyphs = font.charsToGlyphs(chars); - var defaultVMetrics = font.defaultVMetrics; - for (var i = 0; i < glyphs.length; i++) { - var glyph = glyphs[i]; - var vMetricX = null; - var vMetricY = null; - var glyphWidth = null; - if (font.vertical) { - if (glyph.vmetric) { - glyphWidth = glyph.vmetric[0]; - vMetricX = glyph.vmetric[1]; - vMetricY = glyph.vmetric[2]; - } else { - glyphWidth = glyph.width; - vMetricX = glyph.width * 0.5; - vMetricY = defaultVMetrics[2]; - } - } else { - glyphWidth = glyph.width; - } - - var glyphUnicode = glyph.unicode; - if (NormalizedUnicodes[glyphUnicode] !== undefined) { - glyphUnicode = NormalizedUnicodes[glyphUnicode]; - } - glyphUnicode = reverseIfRtl(glyphUnicode); - - // The following will calculate the x and y of the individual glyphs. - // if (font.vertical) { - // tsm[4] -= vMetricX * Math.abs(textState.fontSize) * - // textState.fontMatrix[0]; - // tsm[5] -= vMetricY * textState.fontSize * - // textState.fontMatrix[0]; - // } - // var trm = Util.transform(textState.textMatrix, tsm); - // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm); - // var x = pt[0]; - // var y = pt[1]; - - var charSpacing = textState.charSpacing; - if (glyph.isSpace) { - var wordSpacing = textState.wordSpacing; - charSpacing += wordSpacing; - if (wordSpacing > 0) { - addFakeSpaces(wordSpacing, textChunk.str); - } - } - - var tx = 0; - var ty = 0; - if (!font.vertical) { - var w0 = glyphWidth * textState.fontMatrix[0]; - tx = (w0 * textState.fontSize + charSpacing) * - textState.textHScale; - width += tx; - } else { - var w1 = glyphWidth * textState.fontMatrix[0]; - ty = w1 * textState.fontSize + charSpacing; - height += ty; - } - textState.translateTextMatrix(tx, ty); - - textChunk.str.push(glyphUnicode); - } - - if (!font.vertical) { - textChunk.lastAdvanceWidth = width; - textChunk.width += width * textChunk.textAdvanceScale; - } else { - textChunk.lastAdvanceHeight = height; - textChunk.height += Math.abs(height * textChunk.textAdvanceScale); - } - - return textChunk; - } - - function addFakeSpaces(width, strBuf) { - if (width < textContentItem.fakeSpaceMin) { - return; - } - if (width < textContentItem.fakeMultiSpaceMin) { - strBuf.push(' '); - return; - } - var fakeSpaces = Math.round(width / textContentItem.spaceWidth); - while (fakeSpaces-- > 0) { - strBuf.push(' '); - } - } - - function flushTextContentItem() { - if (!textContentItem.initialized) { - return; - } - textContent.items.push(runBidiTransform(textContentItem)); - - textContentItem.initialized = false; - textContentItem.str.length = 0; - } - - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function next(resolve, reject) { - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, args = []; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are not used beyond this loop, so - // we can reuse the same array on every iteration, thus avoiding - // unnecessary allocations. - args.length = 0; - operation.args = args; - if (!(preprocessor.read(operation))) { - break; - } - textState = stateManager.state; - var fn = operation.fn; - args = operation.args; - var advance; - - switch (fn | 0) { - case OPS.setFont: - flushTextContentItem(); - textState.fontSize = args[1]; - return handleSetFont(args[0].name).then(function() { - next(resolve, reject); - }, reject); - case OPS.setTextRise: - flushTextContentItem(); - textState.textRise = args[0]; - break; - case OPS.setHScale: - flushTextContentItem(); - textState.textHScale = args[0] / 100; - break; - case OPS.setLeading: - flushTextContentItem(); - textState.leading = args[0]; - break; - case OPS.moveText: - // Optimization to treat same line movement as advance - var isSameTextLine = !textState.font ? false : - ((textState.font.vertical ? args[0] : args[1]) === 0); - advance = args[0] - args[1]; - if (isSameTextLine && textContentItem.initialized && - advance > 0 && - advance <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(args[0], args[1]); - textContentItem.width += - (args[0] - textContentItem.lastAdvanceWidth); - textContentItem.height += - (args[1] - textContentItem.lastAdvanceHeight); - var diff = (args[0] - textContentItem.lastAdvanceWidth) - - (args[1] - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.setLeadingMoveText: - flushTextContentItem(); - textState.leading = -args[1]; - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.nextLine: - flushTextContentItem(); - textState.carriageReturn(); - break; - case OPS.setTextMatrix: - flushTextContentItem(); - textState.setTextMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - textState.setTextLineMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.setCharSpacing: - textState.charSpacing = args[0]; - break; - case OPS.setWordSpacing: - textState.wordSpacing = args[0]; - break; - case OPS.beginText: - flushTextContentItem(); - textState.textMatrix = IDENTITY_MATRIX.slice(); - textState.textLineMatrix = IDENTITY_MATRIX.slice(); - break; - case OPS.showSpacedText: - var items = args[0]; - var offset; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - buildTextContentItem(items[j]); - } else { - ensureTextContentItem(); - - // PDF Specification 5.3.2 states: - // The number is expressed in thousandths of a unit of text - // space. - // This amount is subtracted from the current horizontal or - // vertical coordinate, depending on the writing mode. - // In the default coordinate system, a positive adjustment - // has the effect of moving the next glyph painted either to - // the left or down by the given amount. - advance = items[j] * textState.fontSize / 1000; - var breakTextRun = false; - if (textState.font.vertical) { - offset = advance * - (textState.textHScale * textState.textMatrix[2] + - textState.textMatrix[3]); - textState.translateTextMatrix(0, advance); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be added to height to paint down. - textContentItem.height += offset; - } - } else { - advance = -advance; - offset = advance * ( - textState.textHScale * textState.textMatrix[0] + - textState.textMatrix[1]); - textState.translateTextMatrix(advance, 0); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be subtracted from width to paint left. - textContentItem.width += offset; - } - } - if (breakTextRun) { - flushTextContentItem(); - } else if (advance > 0) { - addFakeSpaces(advance, textContentItem.str); - } - } - } - break; - case OPS.showText: - buildTextContentItem(args[0]); - break; - case OPS.nextLineShowText: - flushTextContentItem(); - textState.carriageReturn(); - buildTextContentItem(args[0]); - break; - case OPS.nextLineSetSpacingShowText: - flushTextContentItem(); - textState.wordSpacing = args[0]; - textState.charSpacing = args[1]; - textState.carriageReturn(); - buildTextContentItem(args[2]); - break; - case OPS.paintXObject: - flushTextContentItem(); - if (args[0].code) { - break; - } - - if (!xobjs) { - xobjs = (resources.get('XObject') || Dict.empty); - } - - var name = args[0].name; - if (xobjsCache.key === name) { - if (xobjsCache.texts) { - Util.appendToArray(textContent.items, xobjsCache.texts.items); - Util.extendObj(textContent.styles, xobjsCache.texts.styles); - } - break; - } - - var xobj = xobjs.get(name); - if (!xobj) { - break; - } - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), - 'XObject should have a Name subtype'); - - if ('Form' !== type.name) { - xobjsCache.key = name; - xobjsCache.texts = null; - break; - } - - stateManager.save(); - var matrix = xobj.dict.get('Matrix'); - if (isArray(matrix) && matrix.length === 6) { - stateManager.transform(matrix); - } - - return self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager, - normalizeWhitespace).then(function (formTextContent) { - Util.appendToArray(textContent.items, formTextContent.items); - Util.extendObj(textContent.styles, formTextContent.styles); - stateManager.restore(); - - xobjsCache.key = name; - xobjsCache.texts = formTextContent; - - next(resolve, reject); - }, reject); - case OPS.setGState: - flushTextContentItem(); - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gsStateMap = extGState.get(dictName.name); - var gsStateFont = null; - for (var key in gsStateMap) { - if (key === 'Font') { - assert(!gsStateFont); - gsStateFont = gsStateMap[key]; - } - } - if (gsStateFont) { - textState.fontSize = gsStateFont[1]; - return handleSetFont(gsStateFont[0]).then(function() { - next(resolve, reject); - }, reject); - } - break; - } // switch - } // while - if (stop) { - deferred.then(function () { - next(resolve, reject); - }, reject); - return; - } - flushTextContentItem(); - resolve(textContent); - }); - }, - - extractDataStructures: function - partialEvaluatorExtractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); - if (toUnicode) { - properties.toUnicode = this.readToUnicode(toUnicode); - } - if (properties.composite) { - // CIDSystemInfo helps to match CID to glyphs - var cidSystemInfo = dict.get('CIDSystemInfo'); - if (isDict(cidSystemInfo)) { - properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), - supplement: cidSystemInfo.get('Supplement') - }; - } - - var cidToGidMap = dict.get('CIDToGIDMap'); - if (isStream(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); - } - } - - // Based on 9.6.6 of the spec the encoding can come from multiple places - // and depends on the font type. The base encoding and differences are - // read here, but the encoding that is actually used is chosen during - // glyph mapping in the font. - // TODO: Loading the built in encoding in the font would allow the - // differences to be merged in here not require us to hold on to it. - var differences = []; - var baseEncodingName = null; - var encoding; - if (dict.has('Encoding')) { - encoding = dict.get('Encoding'); - if (isDict(encoding)) { - baseEncodingName = encoding.get('BaseEncoding'); - baseEncodingName = (isName(baseEncodingName) ? - baseEncodingName.name : null); - // Load the differences between the base and original - if (encoding.has('Differences')) { - var diffEncoding = encoding.get('Differences'); - var index = 0; - for (var j = 0, jj = diffEncoding.length; j < jj; j++) { - var data = diffEncoding[j]; - if (isNum(data)) { - index = data; - } else if (isName(data)) { - differences[index++] = data.name; - } else if (isRef(data)) { - diffEncoding[j--] = xref.fetch(data); - continue; - } else { - error('Invalid entry in \'Differences\' array: ' + data); - } - } - } - } else if (isName(encoding)) { - baseEncodingName = encoding.name; - } else { - error('Encoding is not a Name nor a Dict'); - } - // According to table 114 if the encoding is a named encoding it must be - // one of these predefined encodings. - if ((baseEncodingName !== 'MacRomanEncoding' && - baseEncodingName !== 'MacExpertEncoding' && - baseEncodingName !== 'WinAnsiEncoding')) { - baseEncodingName = null; - } - } - - if (baseEncodingName) { - properties.defaultEncoding = Encodings[baseEncodingName].slice(); - } else { - encoding = (properties.type === 'TrueType' ? - Encodings.WinAnsiEncoding : Encodings.StandardEncoding); - // The Symbolic attribute can be misused for regular fonts - // Heuristic: we have to check if the font is a standard one also - if (!!(properties.flags & FontFlags.Symbolic)) { - encoding = Encodings.MacRomanEncoding; - if (!properties.file) { - if (/Symbol/i.test(properties.name)) { - encoding = Encodings.SymbolSetEncoding; - } else if (/Dingbats/i.test(properties.name)) { - encoding = Encodings.ZapfDingbatsEncoding; - } - } - } - properties.defaultEncoding = encoding; - } - - properties.differences = differences; - properties.baseEncodingName = baseEncodingName; - properties.dict = dict; - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmap, cmapObj = toUnicode; - if (isName(cmapObj)) { - cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - return new ToUnicodeMap(cmap.getMap()); - } else if (isStream(cmapObj)) { - cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - var map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) - // to iterate over all keys. - cmap.forEach(function(charCode, token) { - var str = []; - for (var k = 0; k < token.length; k += 2) { - var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCharCode.apply(String, str); - }); - return new ToUnicodeMap(map); - } - return null; - }, - - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); - - // Set encoding 0 to later verify the font has an encoding - var result = []; - for (var j = 0, jj = glyphsData.length; j < jj; j++) { - var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID === 0) { - continue; - } - var code = j >> 1; - result[code] = glyphID; - } - return result; - }, - - extractWidths: function PartialEvaluator_extractWidths(dict, xref, - descriptor, - properties) { - var glyphsWidths = []; - var defaultWidth = 0; - var glyphsVMetrics = []; - var defaultVMetrics; - var i, ii, j, jj, start, code, widths; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - widths = dict.get('W'); - if (widths) { - for (i = 0, ii = widths.length; i < ii; i++) { - start = widths[i++]; - code = xref.fetchIfRef(widths[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsWidths[start++] = code[j]; - } - } else { - var width = widths[++i]; - for (j = start; j <= code; j++) { - glyphsWidths[j] = width; - } - } - } - } - - if (properties.vertical) { - var vmetrics = (dict.get('DW2') || [880, -1000]); - defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; - vmetrics = dict.get('W2'); - if (vmetrics) { - for (i = 0, ii = vmetrics.length; i < ii; i++) { - start = vmetrics[i++]; - code = xref.fetchIfRef(vmetrics[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsVMetrics[start++] = [code[j++], code[j++], code[j]]; - } - } else { - var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]]; - for (j = start; j <= code; j++) { - glyphsVMetrics[j] = vmetric; - } - } - } - } - } - } else { - var firstChar = properties.firstChar; - widths = dict.get('Widths'); - if (widths) { - j = firstChar; - for (i = 0, ii = widths.length; i < ii; i++) { - glyphsWidths[j++] = widths[i]; - } - defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0); - } else { - // Trying get the BaseFont metrics (see comment above). - var baseFontName = dict.get('BaseFont'); - if (isName(baseFontName)) { - var metrics = this.getBaseFontMetrics(baseFontName.name); - - glyphsWidths = this.buildCharCodeToWidth(metrics.widths, - properties); - defaultWidth = metrics.defaultWidth; - } - } - } - - // Heuristic: detection of monospace font by checking all non-zero widths - var isMonospace = true; - var firstWidth = defaultWidth; - for (var glyph in glyphsWidths) { - var glyphWidth = glyphsWidths[glyph]; - if (!glyphWidth) { - continue; - } - if (!firstWidth) { - firstWidth = glyphWidth; - continue; - } - if (firstWidth !== glyphWidth) { - isMonospace = false; - break; - } - } - if (isMonospace) { - properties.flags |= FontFlags.FixedPitch; - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - properties.defaultVMetrics = defaultVMetrics; - properties.vmetrics = glyphsVMetrics; - }, - - isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - return (fontNameWoStyle in serifFonts) || - (fontNameWoStyle.search(/serif/gi) !== -1); - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0; - var widths = []; - var monospace = false; - var lookupName = (stdFontMap[name] || name); - - if (!(lookupName in Metrics)) { - // Use default fonts for looking up font metrics if the passed - // font is not a base font - if (this.isSerifFont(name)) { - lookupName = 'Times-Roman'; - } else { - lookupName = 'Helvetica'; - } - } - var glyphWidths = Metrics[lookupName]; - - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - monospace = true; - } else { - widths = glyphWidths; - } - - return { - defaultWidth: defaultWidth, - monospace: monospace, - widths: widths - }; - }, - - buildCharCodeToWidth: - function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, - properties) { - var widths = Object.create(null); - var differences = properties.differences; - var encoding = properties.defaultEncoding; - for (var charCode = 0; charCode < 256; charCode++) { - if (charCode in differences && - widthsByGlyphName[differences[charCode]]) { - widths[charCode] = widthsByGlyphName[differences[charCode]]; - continue; - } - if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { - widths[charCode] = widthsByGlyphName[encoding[charCode]]; - continue; - } - } - return widths; - }, - - preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { - var baseDict = dict; - var type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - - var composite = false; - var uint8array; - if (type.name === 'Type0') { - // If font is a composite - // - get the descendant font - // - set the type according to the descendant font - // - get the FontDescriptor from the descendant font - var df = dict.get('DescendantFonts'); - if (!df) { - error('Descendant fonts are not specified'); - } - dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df); - - type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - composite = true; - } - - var descriptor = dict.get('FontDescriptor'); - if (descriptor) { - var hash = new MurmurHash3_64(); - var encoding = baseDict.getRaw('Encoding'); - if (isName(encoding)) { - hash.update(encoding.name); - } else if (isRef(encoding)) { - hash.update(encoding.num + '_' + encoding.gen); - } else if (isDict(encoding)) { - var keys = encoding.getKeys(); - for (var i = 0, ii = keys.length; i < ii; i++) { - var entry = encoding.getRaw(keys[i]); - if (isName(entry)) { - hash.update(entry.name); - } else if (isRef(entry)) { - hash.update(entry.num + '_' + entry.gen); - } else if (isArray(entry)) { // 'Differences' entry. - // Ideally we should check the contents of the array, but to avoid - // parsing it here and then again in |extractDataStructures|, - // we only use the array length for now (fixes bug1157493.pdf). - hash.update(entry.length.toString()); - } - } - } - - var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); - if (isStream(toUnicode)) { - var stream = toUnicode.str || toUnicode; - uint8array = stream.buffer ? - new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : - new Uint8Array(stream.bytes.buffer, - stream.start, stream.end - stream.start); - hash.update(uint8array); - - } else if (isName(toUnicode)) { - hash.update(toUnicode.name); - } - - var widths = dict.get('Widths') || baseDict.get('Widths'); - if (widths) { - uint8array = new Uint8Array(new Uint32Array(widths).buffer); - hash.update(uint8array); - } - } - - return { - descriptor: descriptor, - dict: dict, - baseDict: baseDict, - composite: composite, - type: type.name, - hash: hash ? hash.hexdigest() : '' - }; - }, - - translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, - xref) { - var baseDict = preEvaluatedFont.baseDict; - var dict = preEvaluatedFont.dict; - var composite = preEvaluatedFont.composite; - var descriptor = preEvaluatedFont.descriptor; - var type = preEvaluatedFont.type; - var maxCharIndex = (composite ? 0xFFFF : 0xFF); - var properties; - - if (!descriptor) { - if (type === 'Type3') { - // FontDescriptor is only required for Type3 fonts when the document - // is a tagged pdf. Create a barbebones one to get by. - descriptor = new Dict(null); - descriptor.set('FontName', Name.get(type)); - descriptor.set('FontBBox', dict.get('FontBBox')); - } else { - // Before PDF 1.5 if the font was one of the base 14 fonts, having a - // FontDescriptor was not required. - // This case is here for compatibility. - var baseFontName = dict.get('BaseFont'); - if (!isName(baseFontName)) { - error('Base font is not specified'); - } - - // Using base font name as a font name. - baseFontName = baseFontName.name.replace(/[,_]/g, '-'); - var metrics = this.getBaseFontMetrics(baseFontName); - - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - var flags = - (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | - (metrics.monospace ? FontFlags.FixedPitch : 0) | - (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - properties = { - type: type, - name: baseFontName, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - this.extractDataStructures(dict, dict, xref, properties); - properties.widths = this.buildCharCodeToWidth(metrics.widths, - properties); - return new Font(baseFontName, null, properties); - } - } - - // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem - // to ignore this rule when a variant of a standart font is used. - // TODO Fill the width array depending on which of the base font this is - // a variant. - var firstChar = (dict.get('FirstChar') || 0); - var lastChar = (dict.get('LastChar') || maxCharIndex); - - var fontName = descriptor.get('FontName'); - var baseFont = dict.get('BaseFont'); - // Some bad PDFs have a string as the font name. - if (isString(fontName)) { - fontName = Name.get(fontName); - } - if (isString(baseFont)) { - baseFont = Name.get(baseFont); - } - - if (type !== 'Type3') { - var fontNameStr = fontName && fontName.name; - var baseFontStr = baseFont && baseFont.name; - if (fontNameStr !== baseFontStr) { - info('The FontDescriptor\'s FontName is "' + fontNameStr + - '" but should be the same as the Font\'s BaseFont "' + - baseFontStr + '"'); - // Workaround for cases where e.g. fontNameStr = 'Arial' and - // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). - if (fontNameStr && baseFontStr && - baseFontStr.indexOf(fontNameStr) === 0) { - fontName = baseFont; - } - } - } - fontName = (fontName || baseFont); - - assert(isName(fontName), 'invalid font name'); - - var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); - if (fontFile) { - if (fontFile.dict) { - var subtype = fontFile.dict.get('Subtype'); - if (subtype) { - subtype = subtype.name; - } - var length1 = fontFile.dict.get('Length1'); - var length2 = fontFile.dict.get('Length2'); - } - } - - properties = { - type: type, - name: fontName.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - loadedName: baseDict.loadedName, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX), - firstChar: firstChar || 0, - lastChar: (lastChar || maxCharIndex), - bbox: descriptor.get('FontBBox'), - ascent: descriptor.get('Ascent'), - descent: descriptor.get('Descent'), - xHeight: descriptor.get('XHeight'), - capHeight: descriptor.get('CapHeight'), - flags: descriptor.get('Flags'), - italicAngle: descriptor.get('ItalicAngle'), - coded: false - }; - - if (composite) { - var cidEncoding = baseDict.get('Encoding'); - if (isName(cidEncoding)) { - properties.cidEncoding = cidEncoding.name; - } - properties.cMap = CMapFactory.create(cidEncoding, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - properties.vertical = properties.cMap.vertical; - } - this.extractDataStructures(dict, baseDict, xref, properties); - this.extractWidths(dict, xref, descriptor, properties); - - if (type === 'Type3') { - properties.isType3Font = true; - } - - return new Font(fontName.name, fontFile, properties); - } - }; - - return PartialEvaluator; -})(); - -var TranslatedFont = (function TranslatedFontClosure() { - function TranslatedFont(loadedName, font, dict) { - this.loadedName = loadedName; - this.font = font; - this.dict = dict; - this.type3Loaded = null; - this.sent = false; - } - TranslatedFont.prototype = { - send: function (handler) { - if (this.sent) { - return; - } - var fontData = this.font.exportData(); - handler.send('commonobj', [ - this.loadedName, - 'Font', - fontData - ]); - this.sent = true; - }, - loadType3Data: function (evaluator, resources, parentOperatorList, task) { - assert(this.font.isType3Font); - - if (this.type3Loaded) { - return this.type3Loaded; - } - - var translatedFont = this.font; - var loadCharProcsPromise = Promise.resolve(); - var charProcs = this.dict.get('CharProcs').getAll(); - var fontResources = this.dict.get('Resources') || resources; - var charProcKeys = Object.keys(charProcs); - var charProcOperatorList = {}; - for (var i = 0, n = charProcKeys.length; i < n; ++i) { - loadCharProcsPromise = loadCharProcsPromise.then(function (key) { - var glyphStream = charProcs[key]; - var operatorList = new OperatorList(); - return evaluator.getOperatorList(glyphStream, task, fontResources, - operatorList).then(function () { - charProcOperatorList[key] = operatorList.getIR(); - - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - parentOperatorList.addDependencies(operatorList.dependencies); - }, function (reason) { - warn('Type3 font resource \"' + key + '\" is not available'); - var operatorList = new OperatorList(); - charProcOperatorList[key] = operatorList.getIR(); - }); - }.bind(this, charProcKeys[i])); - } - this.type3Loaded = loadCharProcsPromise.then(function () { - translatedFont.charProcOperatorList = charProcOperatorList; - }); - return this.type3Loaded; - } - }; - return TranslatedFont; -})(); - -var OperatorList = (function OperatorListClosure() { - var CHUNK_SIZE = 1000; - var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size - - function getTransfers(queue) { - var transfers = []; - var fnArray = queue.fnArray, argsArray = queue.argsArray; - for (var i = 0, ii = queue.length; i < ii; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - var arg = argsArray[i][0]; // first param in imgData - if (!arg.cached) { - transfers.push(arg.data.buffer); - } - break; - } - } - return transfers; - } - - function OperatorList(intent, messageHandler, pageIndex) { - this.messageHandler = messageHandler; - this.fnArray = []; - this.argsArray = []; - this.dependencies = {}; - this._totalLength = 0; - this.pageIndex = pageIndex; - this.intent = intent; - } - - OperatorList.prototype = { - get length() { - return this.argsArray.length; - }, - - /** - * @returns {number} The total length of the entire operator list, - * since `this.length === 0` after flushing. - */ - get totalLength() { - return (this._totalLength + this.length); - }, - - addOp: function(fn, args) { - this.fnArray.push(fn); - this.argsArray.push(args); - if (this.messageHandler) { - if (this.fnArray.length >= CHUNK_SIZE) { - this.flush(); - } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && - (fn === OPS.restore || fn === OPS.endText)) { - // heuristic to flush on boundary of restore or endText - this.flush(); - } - } - }, - - addDependency: function(dependency) { - if (dependency in this.dependencies) { - return; - } - this.dependencies[dependency] = true; - this.addOp(OPS.dependency, [dependency]); - }, - - addDependencies: function(dependencies) { - for (var key in dependencies) { - this.addDependency(key); - } - }, - - addOpList: function(opList) { - Util.extendObj(this.dependencies, opList.dependencies); - for (var i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - }, - - getIR: function() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - }, - - flush: function(lastChunk) { - if (this.intent !== 'oplist') { - new QueueOptimizer().optimize(this); - } - var transfers = getTransfers(this); - var length = this.length; - this._totalLength += length; - - this.messageHandler.send('RenderPageChunk', { - operatorList: { - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk: lastChunk, - length: length - }, - pageIndex: this.pageIndex, - intent: this.intent - }, transfers); - this.dependencies = {}; - this.fnArray.length = 0; - this.argsArray.length = 0; - } - }; - - return OperatorList; -})(); - -var StateManager = (function StateManagerClosure() { - function StateManager(initialState) { - this.state = initialState; - this.stateStack = []; - } - StateManager.prototype = { - save: function () { - var old = this.state; - this.stateStack.push(this.state); - this.state = old.clone(); - }, - restore: function () { - var prev = this.stateStack.pop(); - if (prev) { - this.state = prev; - } - }, - transform: function (args) { - this.state.ctm = Util.transform(this.state.ctm, args); - } - }; - return StateManager; -})(); - -var TextState = (function TextStateClosure() { - function TextState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontSize = 0; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - - TextState.prototype = { - setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textLineMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - translateTextMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textLineMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { - // 9.4.4 Text Space Details - var tsm = [this.fontSize * this.textHScale, 0, - 0, this.fontSize, - 0, this.textRise]; - return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); - }, - carriageReturn: function TextState_carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - }, - clone: function TextState_clone() { - var clone = Object.create(this); - clone.textMatrix = this.textMatrix.slice(); - clone.textLineMatrix = this.textLineMatrix.slice(); - clone.fontMatrix = this.fontMatrix.slice(); - return clone; - } - }; - return TextState; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; - } - EvalState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - }; - return EvalState; -})(); - -var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { - // Specifies properties for each command - // - // If variableArgs === true: [0, `numArgs`] expected - // If variableArgs === false: exactly `numArgs` expected - var OP_MAP = { - // Graphic state - w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }, - J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false }, - j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }, - M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }, - d: { id: OPS.setDash, numArgs: 2, variableArgs: false }, - ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }, - i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false }, - gs: { id: OPS.setGState, numArgs: 1, variableArgs: false }, - q: { id: OPS.save, numArgs: 0, variableArgs: false }, - Q: { id: OPS.restore, numArgs: 0, variableArgs: false }, - cm: { id: OPS.transform, numArgs: 6, variableArgs: false }, - - // Path - m: { id: OPS.moveTo, numArgs: 2, variableArgs: false }, - l: { id: OPS.lineTo, numArgs: 2, variableArgs: false }, - c: { id: OPS.curveTo, numArgs: 6, variableArgs: false }, - v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false }, - y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false }, - h: { id: OPS.closePath, numArgs: 0, variableArgs: false }, - re: { id: OPS.rectangle, numArgs: 4, variableArgs: false }, - S: { id: OPS.stroke, numArgs: 0, variableArgs: false }, - s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false }, - f: { id: OPS.fill, numArgs: 0, variableArgs: false }, - F: { id: OPS.fill, numArgs: 0, variableArgs: false }, - 'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false }, - B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false }, - 'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }, - b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }, - 'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }, - n: { id: OPS.endPath, numArgs: 0, variableArgs: false }, - - // Clipping - W: { id: OPS.clip, numArgs: 0, variableArgs: false }, - 'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false }, - - // Text - BT: { id: OPS.beginText, numArgs: 0, variableArgs: false }, - ET: { id: OPS.endText, numArgs: 0, variableArgs: false }, - Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }, - Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }, - Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false }, - TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false }, - Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false }, - Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }, - Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false }, - Td: { id: OPS.moveText, numArgs: 2, variableArgs: false }, - TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }, - Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }, - 'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false }, - Tj: { id: OPS.showText, numArgs: 1, variableArgs: false }, - TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }, - '\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }, - '"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3, - variableArgs: false }, - - // Type3 fonts - d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }, - d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false }, - - // Color - CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }, - cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }, - SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }, - SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }, - sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true }, - scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }, - G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }, - g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false }, - RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }, - rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }, - K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }, - k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }, - - // Shading - sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false }, - - // Images - BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }, - ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false }, - EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }, - - // XObjects - Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false }, - MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false }, - DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false }, - BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }, - BDC: { id: OPS.beginMarkedContentProps, numArgs: 2, - variableArgs: false }, - EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }, - - // Compatibility - BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false }, - EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false }, - - // (reserved partial commands for the lexer) - BM: null, - BD: null, - 'true': null, - fa: null, - fal: null, - fals: null, - 'false': null, - nu: null, - nul: null, - 'null': null - }; - - function EvaluatorPreprocessor(stream, xref, stateManager) { - // TODO(mduan): pass array of knownCommands rather than OP_MAP - // dictionary - this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref); - this.stateManager = stateManager; - this.nonProcessedArgs = []; - } - - EvaluatorPreprocessor.prototype = { - get savedStatesDepth() { - return this.stateManager.stateStack.length; - }, - - // |operation| is an object with two fields: - // - // - |fn| is an out param. - // - // - |args| is an inout param. On entry, it should have one of two values. - // - // - An empty array. This indicates that the caller is providing the - // array in which the args will be stored in. The caller should use - // this value if it can reuse a single array for each call to read(). - // - // - |null|. This indicates that the caller needs this function to create - // the array in which any args are stored in. If there are zero args, - // this function will leave |operation.args| as |null| (thus avoiding - // allocations that would occur if we used an empty array to represent - // zero arguments). Otherwise, it will replace |null| with a new array - // containing the arguments. The caller should use this value if it - // cannot reuse an array for each call to read(). - // - // These two modes are present because this function is very hot and so - // avoiding allocations where possible is worthwhile. - // - read: function EvaluatorPreprocessor_read(operation) { - var args = operation.args; - while (true) { - var obj = this.parser.getObj(); - if (isCmd(obj)) { - var cmd = obj.cmd; - // Check that the command is valid - var opSpec = OP_MAP[cmd]; - if (!opSpec) { - warn('Unknown command "' + cmd + '"'); - continue; - } - - var fn = opSpec.id; - var numArgs = opSpec.numArgs; - var argsLength = args !== null ? args.length : 0; - - if (!opSpec.variableArgs) { - // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf - if (argsLength !== numArgs) { - var nonProcessedArgs = this.nonProcessedArgs; - while (argsLength > numArgs) { - nonProcessedArgs.push(args.shift()); - argsLength--; - } - while (argsLength < numArgs && nonProcessedArgs.length !== 0) { - if (!args) { - args = []; - } - args.unshift(nonProcessedArgs.pop()); - argsLength++; - } - } - - if (argsLength < numArgs) { - // If we receive too few args, it's not possible to possible - // to execute the command, so skip the command - info('Command ' + fn + ': because expected ' + - numArgs + ' args, but received ' + argsLength + - ' args; skipping'); - args = null; - continue; - } - } else if (argsLength > numArgs) { - info('Command ' + fn + ': expected [0,' + numArgs + - '] args, but received ' + argsLength + ' args'); - } - - // TODO figure out how to type-check vararg functions - this.preprocessCommand(fn, args); - - operation.fn = fn; - operation.args = args; - return true; - } else { - if (isEOF(obj)) { - return false; // no more commands - } - // argument - if (obj !== null) { - if (!args) { - args = []; - } - args.push((obj instanceof Dict ? obj.getAll() : obj)); - assert(args.length <= 33, 'Too many arguments'); - } - } - } - }, - - preprocessCommand: - function EvaluatorPreprocessor_preprocessCommand(fn, args) { - switch (fn | 0) { - case OPS.save: - this.stateManager.save(); - break; - case OPS.restore: - this.stateManager.restore(); - break; - case OPS.transform: - this.stateManager.transform(args); - break; - } - } - }; - return EvaluatorPreprocessor; -})(); - -var QueueOptimizer = (function QueueOptimizerClosure() { - function addState(parentState, pattern, fn) { - var state = parentState; - for (var i = 0, ii = pattern.length - 1; i < ii; i++) { - var item = pattern[i]; - state = (state[item] || (state[item] = [])); - } - state[pattern[pattern.length - 1]] = fn; - } - - function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray) { - // Handles special case of mainly LaTeX documents which use image masks to - // draw lines with the current fill style. - // 'count' groups of (save, transform, paintImageMaskXObject, restore)+ - // have been found at iFirstSave. - var iFirstPIMXO = iFirstSave + 2; - for (var i = 0; i < count; i++) { - var arg = argsArray[iFirstPIMXO + 4 * i]; - var imageMask = arg.length === 1 && arg[0]; - if (imageMask && imageMask.width === 1 && imageMask.height === 1 && - (!imageMask.data.length || - (imageMask.data.length === 1 && imageMask.data[0] === 0))) { - fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; - continue; - } - break; - } - return count - i; - } - - var InitialState = []; - - // This replaces (save, transform, paintInlineImageXObject, restore)+ - // sequences with one |paintInlineImageXObjectGroup| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], - function foundInlineImageGroup(context) { - var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - var MAX_WIDTH = 1000; - var IMAGE_PADDING = 1; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIIXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintInlineImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, - MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i; - } - - // assuming that heights of those image is too small (~1 pixel) - // packing as much as possible by lines - var maxX = 0; - var map = [], maxLineHeight = 0; - var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; - var q; - for (q = 0; q < count; q++) { - var transform = argsArray[iFirstTransform + (q << 2)]; - var img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - // starting new line - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform: transform, - x: currentX, y: currentY, - w: img.width, h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - var imgData = new Uint8Array(imgWidth * imgHeight * 4); - var imgRowSize = imgWidth << 2; - for (q = 0; q < count; q++) { - var data = argsArray[iFirstPIIXO + (q << 2)][0].data; - // Copy image by lines and extends pixels into padding. - var rowSize = map[q].w << 2; - var dataOffset = 0; - var offset = (map[q].x + map[q].y * imgWidth) << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (var k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, - [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP, - data: imgData }, map]); - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageMaskXObject, restore)+ - // sequences with one |paintImageMaskXObjectGroup| or one - // |paintImageMaskXObjectRepeat| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], - function foundImageMaskGroup(context) { - var MIN_IMAGES_IN_MASKS_BLOCK = 10; - var MAX_IMAGES_IN_MASKS_BLOCK = 100; - var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIMXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageMaskXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = (i - iFirstSave) / 4; - count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i; - } - - var q; - var isSameImage = false; - var iTransform, transformArgs; - var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - if (argsArray[iFirstTransform][1] === 0 && - argsArray[iFirstTransform][2] === 0) { - isSameImage = true; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - iTransform = iFirstTransform + 4; - var iPIMXO = iFirstPIMXO + 4; - for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || - transformArgs[0] !== firstTransformArg0 || - transformArgs[1] !== 0 || - transformArgs[2] !== 0 || - transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; // different image or transform - } - } - } - - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - var positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, - [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - var images = []; - for (q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ data: maskParams.data, width: maskParams.width, - height: maskParams.height, - transform: transformArgs }); - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageXObject, restore)+ sequences - // with one paintImageXObjectRepeat operation, if the |transform| and - // |paintImageXObjectRepeat| ops are appropriate. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], - function (context) { - var MIN_IMAGES_IN_BLOCK = 3; - var MAX_IMAGES_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIXO = curr - 1; - var iFirstRestore = curr; - - if (argsArray[iFirstTransform][1] !== 0 || - argsArray[iFirstTransform][2] !== 0) { - return iFirstRestore + 1; // transform has the wrong form - } - - // Look for the quartets. - var firstPIXOArg0 = argsArray[iFirstPIXO][0]; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstTransformArg0 || - argsArray[i + 1][1] !== 0 || - argsArray[i + 1][2] !== 0 || - argsArray[i + 1][3] !== firstTransformArg3) { - break; // transforms don't match - } - if (argsArray[i + 2][0] !== firstPIXOArg0) { - break; // images don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i; - } - - // Extract the (x,y) positions from all of the matching transforms. - var positions = new Float32Array(count * 2); - var iTransform = iFirstTransform; - for (var q = 0; q < count; q++, iTransform += 4) { - var transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, - positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - - return iFirstSave + 1; - }); - - // This replaces (beginText, setFont, setTextMatrix, showText, endText)+ - // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+ - // sequences, if the font for each one is the same. - addState(InitialState, - [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], - function (context) { - var MIN_CHARS_IN_BLOCK = 3; - var MAX_CHARS_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstBeginText = curr - 4; - var iFirstSetFont = curr - 3; - var iFirstSetTextMatrix = curr - 2; - var iFirstShowText = curr - 1; - var iFirstEndText = curr; - - // Look for the quintets. - var firstSetFontArg0 = argsArray[iFirstSetFont][0]; - var firstSetFontArg1 = argsArray[iFirstSetFont][1]; - var i = iFirstBeginText + 5; - var ii = fnArray.length; - while (i + 4 < ii) { - if (fnArray[i] !== OPS.beginText || - fnArray[i + 1] !== OPS.setFont || - fnArray[i + 2] !== OPS.setTextMatrix || - fnArray[i + 3] !== OPS.showText || - fnArray[i + 4] !== OPS.endText) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstSetFontArg0 || - argsArray[i + 1][1] !== firstSetFontArg1) { - break; // fonts don't match - } - i += 5; - } - - // At this point, i is the index of the first op past the last valid - // quintet. - var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i; - } - - // If the preceding quintet is (, setFont, setTextMatrix, - // showText, endText), include that as well. (E.g. might be - // |dependency|.) - var iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && - fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && - fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && - fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && - fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && - argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && - argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - - // Remove (endText, beginText, setFont) trios. - var iEndText = iFirst + 4; - for (var q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - - return iEndText + 1; - }); - - function QueueOptimizer() {} - - QueueOptimizer.prototype = { - optimize: function QueueOptimizer_optimize(queue) { - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var context = { - iCurr: 0, - fnArray: fnArray, - argsArray: argsArray - }; - var state; - var i = 0, ii = fnArray.length; - while (i < ii) { - state = (state || InitialState)[fnArray[i]]; - if (typeof state === 'function') { // we found some handler - context.iCurr = i; - // state() returns the index of the first non-matching op (if we - // didn't match) or the first op past the modified ops (if we did - // match and replace). - i = state(context); - state = undefined; // reset the state machine - ii = context.fnArray.length; - } else { - i++; - } - } - } - }; - return QueueOptimizer; -})(); - - -var BUILT_IN_CMAPS = [ -// << Start unicode maps. -'Adobe-GB1-UCS2', -'Adobe-CNS1-UCS2', -'Adobe-Japan1-UCS2', -'Adobe-Korea1-UCS2', -// >> End unicode maps. -'78-EUC-H', -'78-EUC-V', -'78-H', -'78-RKSJ-H', -'78-RKSJ-V', -'78-V', -'78ms-RKSJ-H', -'78ms-RKSJ-V', -'83pv-RKSJ-H', -'90ms-RKSJ-H', -'90ms-RKSJ-V', -'90msp-RKSJ-H', -'90msp-RKSJ-V', -'90pv-RKSJ-H', -'90pv-RKSJ-V', -'Add-H', -'Add-RKSJ-H', -'Add-RKSJ-V', -'Add-V', -'Adobe-CNS1-0', -'Adobe-CNS1-1', -'Adobe-CNS1-2', -'Adobe-CNS1-3', -'Adobe-CNS1-4', -'Adobe-CNS1-5', -'Adobe-CNS1-6', -'Adobe-GB1-0', -'Adobe-GB1-1', -'Adobe-GB1-2', -'Adobe-GB1-3', -'Adobe-GB1-4', -'Adobe-GB1-5', -'Adobe-Japan1-0', -'Adobe-Japan1-1', -'Adobe-Japan1-2', -'Adobe-Japan1-3', -'Adobe-Japan1-4', -'Adobe-Japan1-5', -'Adobe-Japan1-6', -'Adobe-Korea1-0', -'Adobe-Korea1-1', -'Adobe-Korea1-2', -'B5-H', -'B5-V', -'B5pc-H', -'B5pc-V', -'CNS-EUC-H', -'CNS-EUC-V', -'CNS1-H', -'CNS1-V', -'CNS2-H', -'CNS2-V', -'ETHK-B5-H', -'ETHK-B5-V', -'ETen-B5-H', -'ETen-B5-V', -'ETenms-B5-H', -'ETenms-B5-V', -'EUC-H', -'EUC-V', -'Ext-H', -'Ext-RKSJ-H', -'Ext-RKSJ-V', -'Ext-V', -'GB-EUC-H', -'GB-EUC-V', -'GB-H', -'GB-V', -'GBK-EUC-H', -'GBK-EUC-V', -'GBK2K-H', -'GBK2K-V', -'GBKp-EUC-H', -'GBKp-EUC-V', -'GBT-EUC-H', -'GBT-EUC-V', -'GBT-H', -'GBT-V', -'GBTpc-EUC-H', -'GBTpc-EUC-V', -'GBpc-EUC-H', -'GBpc-EUC-V', -'H', -'HKdla-B5-H', -'HKdla-B5-V', -'HKdlb-B5-H', -'HKdlb-B5-V', -'HKgccs-B5-H', -'HKgccs-B5-V', -'HKm314-B5-H', -'HKm314-B5-V', -'HKm471-B5-H', -'HKm471-B5-V', -'HKscs-B5-H', -'HKscs-B5-V', -'Hankaku', -'Hiragana', -'KSC-EUC-H', -'KSC-EUC-V', -'KSC-H', -'KSC-Johab-H', -'KSC-Johab-V', -'KSC-V', -'KSCms-UHC-H', -'KSCms-UHC-HW-H', -'KSCms-UHC-HW-V', -'KSCms-UHC-V', -'KSCpc-EUC-H', -'KSCpc-EUC-V', -'Katakana', -'NWP-H', -'NWP-V', -'RKSJ-H', -'RKSJ-V', -'Roman', -'UniCNS-UCS2-H', -'UniCNS-UCS2-V', -'UniCNS-UTF16-H', -'UniCNS-UTF16-V', -'UniCNS-UTF32-H', -'UniCNS-UTF32-V', -'UniCNS-UTF8-H', -'UniCNS-UTF8-V', -'UniGB-UCS2-H', -'UniGB-UCS2-V', -'UniGB-UTF16-H', -'UniGB-UTF16-V', -'UniGB-UTF32-H', -'UniGB-UTF32-V', -'UniGB-UTF8-H', -'UniGB-UTF8-V', -'UniJIS-UCS2-H', -'UniJIS-UCS2-HW-H', -'UniJIS-UCS2-HW-V', -'UniJIS-UCS2-V', -'UniJIS-UTF16-H', -'UniJIS-UTF16-V', -'UniJIS-UTF32-H', -'UniJIS-UTF32-V', -'UniJIS-UTF8-H', -'UniJIS-UTF8-V', -'UniJIS2004-UTF16-H', -'UniJIS2004-UTF16-V', -'UniJIS2004-UTF32-H', -'UniJIS2004-UTF32-V', -'UniJIS2004-UTF8-H', -'UniJIS2004-UTF8-V', -'UniJISPro-UCS2-HW-V', -'UniJISPro-UCS2-V', -'UniJISPro-UTF8-V', -'UniJISX0213-UTF32-H', -'UniJISX0213-UTF32-V', -'UniJISX02132004-UTF32-H', -'UniJISX02132004-UTF32-V', -'UniKS-UCS2-H', -'UniKS-UCS2-V', -'UniKS-UTF16-H', -'UniKS-UTF16-V', -'UniKS-UTF32-H', -'UniKS-UTF32-V', -'UniKS-UTF8-H', -'UniKS-UTF8-V', -'V', -'WP-Symbol']; - -// CMap, not to be confused with TrueType's cmap. -var CMap = (function CMapClosure() { - function CMap(builtInCMap) { - // Codespace ranges are stored as follows: - // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]] - // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] - this.codespaceRanges = [[], [], [], []]; - this.numCodespaceRanges = 0; - // Map entries have one of two forms. - // - cid chars are 16-bit unsigned integers, stored as integers. - // - bf chars are variable-length byte sequences, stored as strings, with - // one byte per character. - this._map = []; - this.name = ''; - this.vertical = false; - this.useCMap = null; - this.builtInCMap = builtInCMap; - } - CMap.prototype = { - addCodespaceRange: function(n, low, high) { - this.codespaceRanges[n - 1].push(low, high); - this.numCodespaceRanges++; - }, - - mapCidRange: function(low, high, dstLow) { - while (low <= high) { - this._map[low++] = dstLow++; - } - }, - - mapBfRange: function(low, high, dstLow) { - var lastByte = dstLow.length - 1; - while (low <= high) { - this._map[low++] = dstLow; - // Only the last byte has to be incremented. - dstLow = dstLow.substr(0, lastByte) + - String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); - } - }, - - mapBfRangeToArray: function(low, high, array) { - var i = 0, ii = array.length; - while (low <= high && i < ii) { - this._map[low] = array[i++]; - ++low; - } - }, - - // This is used for both bf and cid chars. - mapOne: function(src, dst) { - this._map[src] = dst; - }, - - lookup: function(code) { - return this._map[code]; - }, - - contains: function(code) { - return this._map[code] !== undefined; - }, - - forEach: function(callback) { - // Most maps have fewer than 65536 entries, and for those we use normal - // array iteration. But really sparse tables are possible -- e.g. with - // indices in the *billions*. For such tables we use for..in, which isn't - // ideal because it stringifies the indices for all present elements, but - // it does avoid iterating over every undefined entry. - var map = this._map; - var length = map.length; - var i; - if (length <= 0x10000) { - for (i = 0; i < length; i++) { - if (map[i] !== undefined) { - callback(i, map[i]); - } - } - } else { - for (i in this._map) { - callback(i, map[i]); - } - } - }, - - charCodeOf: function(value) { - return this._map.indexOf(value); - }, - - getMap: function() { - return this._map; - }, - - readCharCode: function(str, offset, out) { - var c = 0; - var codespaceRanges = this.codespaceRanges; - var codespaceRangesLen = this.codespaceRanges.length; - // 9.7.6.2 CMap Mapping - // The code length is at most 4. - for (var n = 0; n < codespaceRangesLen; n++) { - c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0; - // Check each codespace range to see if it falls within. - var codespaceRange = codespaceRanges[n]; - for (var k = 0, kk = codespaceRange.length; k < kk;) { - var low = codespaceRange[k++]; - var high = codespaceRange[k++]; - if (c >= low && c <= high) { - out.charcode = c; - out.length = n + 1; - return; - } - } - } - out.charcode = 0; - out.length = 1; - }, - - get length() { - return this._map.length; - }, - - get isIdentityCMap() { - if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) { - return false; - } - if (this._map.length !== 0x10000) { - return false; - } - for (var i = 0; i < 0x10000; i++) { - if (this._map[i] !== i) { - return false; - } - } - return true; - } - }; - return CMap; -})(); - -// A special case of CMap, where the _map array implicitly has a length of -// 65536 and each element is equal to its index. -var IdentityCMap = (function IdentityCMapClosure() { - function IdentityCMap(vertical, n) { - CMap.call(this); - this.vertical = vertical; - this.addCodespaceRange(n, 0, 0xffff); - } - Util.inherit(IdentityCMap, CMap, {}); - - IdentityCMap.prototype = { - addCodespaceRange: CMap.prototype.addCodespaceRange, - - mapCidRange: function(low, high, dstLow) { - error('should not call mapCidRange'); - }, - - mapBfRange: function(low, high, dstLow) { - error('should not call mapBfRange'); - }, - - mapBfRangeToArray: function(low, high, array) { - error('should not call mapBfRangeToArray'); - }, - - mapOne: function(src, dst) { - error('should not call mapCidOne'); - }, - - lookup: function(code) { - return (isInt(code) && code <= 0xffff) ? code : undefined; - }, - - contains: function(code) { - return isInt(code) && code <= 0xffff; - }, - - forEach: function(callback) { - for (var i = 0; i <= 0xffff; i++) { - callback(i, i); - } - }, - - charCodeOf: function(value) { - return (isInt(value) && value <= 0xffff) ? value : -1; - }, - - getMap: function() { - // Sometimes identity maps must be instantiated, but it's rare. - var map = new Array(0x10000); - for (var i = 0; i <= 0xffff; i++) { - map[i] = i; - } - return map; - }, - - readCharCode: CMap.prototype.readCharCode, - - get length() { - return 0x10000; - }, - - get isIdentityCMap() { - error('should not access .isIdentityCMap'); - } - }; - - return IdentityCMap; -})(); - -var BinaryCMapReader = (function BinaryCMapReaderClosure() { - function fetchBinaryData(url) { - var nonBinaryRequest = PDFJS.disableWorker; - var request = new XMLHttpRequest(); - request.open('GET', url, false); - if (!nonBinaryRequest) { - try { - request.responseType = 'arraybuffer'; - nonBinaryRequest = request.responseType !== 'arraybuffer'; - } catch (e) { - nonBinaryRequest = true; - } - } - if (nonBinaryRequest && request.overrideMimeType) { - request.overrideMimeType('text/plain; charset=x-user-defined'); - } - request.send(null); - if (nonBinaryRequest ? !request.responseText : !request.response) { - error('Unable to get binary cMap at: ' + url); - } - if (nonBinaryRequest) { - var data = Array.prototype.map.call(request.responseText, function (ch) { - return ch.charCodeAt(0) & 255; - }); - return new Uint8Array(data); - } - return new Uint8Array(request.response); - } - - function hexToInt(a, size) { - var n = 0; - for (var i = 0; i <= size; i++) { - n = (n << 8) | a[i]; - } - return n >>> 0; - } - - function hexToStr(a, size) { - // This code is hot. Special-case some common values to avoid creating an - // object with subarray(). - if (size === 1) { - return String.fromCharCode(a[0], a[1]); - } - if (size === 3) { - return String.fromCharCode(a[0], a[1], a[2], a[3]); - } - return String.fromCharCode.apply(null, a.subarray(0, size + 1)); - } - - function addHex(a, b, size) { - var c = 0; - for (var i = size; i >= 0; i--) { - c += a[i] + b[i]; - a[i] = c & 255; - c >>= 8; - } - } - - function incHex(a, size) { - var c = 1; - for (var i = size; i >= 0 && c > 0; i--) { - c += a[i]; - a[i] = c & 255; - c >>= 8; - } - } - - var MAX_NUM_SIZE = 16; - var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8) - - function BinaryCMapStream(data) { - this.buffer = data; - this.pos = 0; - this.end = data.length; - this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); - } - - BinaryCMapStream.prototype = { - readByte: function () { - if (this.pos >= this.end) { - return -1; - } - return this.buffer[this.pos++]; - }, - readNumber: function () { - var n = 0; - var last; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - n = (n << 7) | (b & 0x7F); - } while (!last); - return n; - }, - readSigned: function () { - var n = this.readNumber(); - return (n & 1) ? ~(n >>> 1) : n >>> 1; - }, - readHex: function (num, size) { - num.set(this.buffer.subarray(this.pos, - this.pos + size + 1)); - this.pos += size + 1; - }, - readHexNumber: function (num, size) { - var last; - var stack = this.tmpBuf, sp = 0; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - stack[sp++] = b & 0x7F; - } while (!last); - var i = size, buffer = 0, bufferSize = 0; - while (i >= 0) { - while (bufferSize < 8 && stack.length > 0) { - buffer = (stack[--sp] << bufferSize) | buffer; - bufferSize += 7; - } - num[i] = buffer & 255; - i--; - buffer >>= 8; - bufferSize -= 8; - } - }, - readHexSigned: function (num, size) { - this.readHexNumber(num, size); - var sign = num[size] & 1 ? 255 : 0; - var c = 0; - for (var i = 0; i <= size; i++) { - c = ((c & 1) << 8) | num[i]; - num[i] = (c >> 1) ^ sign; - } - }, - readString: function () { - var len = this.readNumber(); - var s = ''; - for (var i = 0; i < len; i++) { - s += String.fromCharCode(this.readNumber()); - } - return s; - } - }; - - function processBinaryCMap(url, cMap, extend) { - var data = fetchBinaryData(url); - var stream = new BinaryCMapStream(data); - - var header = stream.readByte(); - cMap.vertical = !!(header & 1); - - var useCMap = null; - var start = new Uint8Array(MAX_NUM_SIZE); - var end = new Uint8Array(MAX_NUM_SIZE); - var char = new Uint8Array(MAX_NUM_SIZE); - var charCode = new Uint8Array(MAX_NUM_SIZE); - var tmp = new Uint8Array(MAX_NUM_SIZE); - var code; - - var b; - while ((b = stream.readByte()) >= 0) { - var type = b >> 5; - if (type === 7) { // metadata, e.g. comment or usecmap - switch (b & 0x1F) { - case 0: - stream.readString(); // skipping comment - break; - case 1: - useCMap = stream.readString(); - break; - } - continue; - } - var sequence = !!(b & 0x10); - var dataSize = b & 15; - - assert(dataSize + 1 <= MAX_NUM_SIZE); - - var ucs2DataSize = 1; - var subitemsCount = stream.readNumber(); - var i; - switch (type) { - case 0: // codespacerange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - } - break; - case 1: // notdefrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // undefined range, skipping - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // nop - } - break; - case 2: // cidchar - stream.readHex(char, dataSize); - code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); - for (i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); - if (!sequence) { - stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); - } - code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); - } - break; - case 3: // cidrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - if (!sequence) { - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - } - break; - case 4: // bfchar - stream.readHex(char, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); - } - incHex(charCode, dataSize); - stream.readHexSigned(tmp, dataSize); - addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - case 5: // bfrange - stream.readHex(start, ucs2DataSize); - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(start, ucs2DataSize); - addHex(start, end, ucs2DataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - default: - error('Unknown type: ' + type); - break; - } - } - - if (useCMap) { - extend(useCMap); - } - return cMap; - } - - function BinaryCMapReader() {} - - BinaryCMapReader.prototype = { - read: processBinaryCMap - }; - - return BinaryCMapReader; -})(); - -var CMapFactory = (function CMapFactoryClosure() { - function strToInt(str) { - var a = 0; - for (var i = 0; i < str.length; i++) { - a = (a << 8) | str.charCodeAt(i); - } - return a >>> 0; - } - - function expectString(obj) { - if (!isString(obj)) { - error('Malformed CMap: expected string.'); - } - } - - function expectInt(obj) { - if (!isInt(obj)) { - error('Malformed CMap: expected int.'); - } - } - - function parseBfChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - // TODO are /dstName used? - expectString(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseBfRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - if (isInt(obj) || isString(obj)) { - var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj; - cMap.mapBfRange(low, high, dstLow); - } else if (isCmd(obj, '[')) { - obj = lexer.getObj(); - var array = []; - while (!isCmd(obj, ']') && !isEOF(obj)) { - array.push(obj); - obj = lexer.getObj(); - } - cMap.mapBfRangeToArray(low, high, array); - } else { - break; - } - } - error('Invalid bf range.'); - } - - function parseCidChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseCidRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dstLow = obj; - cMap.mapCidRange(low, high, dstLow); - } - } - - function parseCodespaceRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcodespacerange')) { - return; - } - if (!isString(obj)) { - break; - } - var low = strToInt(obj); - obj = lexer.getObj(); - if (!isString(obj)) { - break; - } - var high = strToInt(obj); - cMap.addCodespaceRange(obj.length, low, high); - } - error('Invalid codespace range.'); - } - - function parseWMode(cMap, lexer) { - var obj = lexer.getObj(); - if (isInt(obj)) { - cMap.vertical = !!obj; - } - } - - function parseCMapName(cMap, lexer) { - var obj = lexer.getObj(); - if (isName(obj) && isString(obj.name)) { - cMap.name = obj.name; - } - } - - function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { - var previous; - var embededUseCMap; - objLoop: while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } else if (isName(obj)) { - if (obj.name === 'WMode') { - parseWMode(cMap, lexer); - } else if (obj.name === 'CMapName') { - parseCMapName(cMap, lexer); - } - previous = obj; - } else if (isCmd(obj)) { - switch (obj.cmd) { - case 'endcmap': - break objLoop; - case 'usecmap': - if (isName(previous)) { - embededUseCMap = previous.name; - } - break; - case 'begincodespacerange': - parseCodespaceRange(cMap, lexer); - break; - case 'beginbfchar': - parseBfChar(cMap, lexer); - break; - case 'begincidchar': - parseCidChar(cMap, lexer); - break; - case 'beginbfrange': - parseBfRange(cMap, lexer); - break; - case 'begincidrange': - parseCidRange(cMap, lexer); - break; - } - } - } - - if (!useCMap && embededUseCMap) { - // Load the usecmap definition from the file only if there wasn't one - // specified. - useCMap = embededUseCMap; - } - if (useCMap) { - extendCMap(cMap, builtInCMapParams, useCMap); - } - } - - function extendCMap(cMap, builtInCMapParams, useCMap) { - cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams); - // If there aren't any code space ranges defined clone all the parent ones - // into this cMap. - if (cMap.numCodespaceRanges === 0) { - var useCodespaceRanges = cMap.useCMap.codespaceRanges; - for (var i = 0; i < useCodespaceRanges.length; i++) { - cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); - } - cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; - } - // Merge the map into the current one, making sure not to override - // any previously defined entries. - cMap.useCMap.forEach(function(key, value) { - if (!cMap.contains(key)) { - cMap.mapOne(key, cMap.useCMap.lookup(key)); - } - }); - } - - function parseBinaryCMap(name, builtInCMapParams) { - var url = builtInCMapParams.url + name + '.bcmap'; - var cMap = new CMap(true); - new BinaryCMapReader().read(url, cMap, function (useCMap) { - extendCMap(cMap, builtInCMapParams, useCMap); - }); - return cMap; - } - - function createBuiltInCMap(name, builtInCMapParams) { - if (name === 'Identity-H') { - return new IdentityCMap(false, 2); - } else if (name === 'Identity-V') { - return new IdentityCMap(true, 2); - } - if (BUILT_IN_CMAPS.indexOf(name) === -1) { - error('Unknown cMap name: ' + name); - } - assert(builtInCMapParams, 'built-in cMap parameters are not provided'); - - if (builtInCMapParams.packed) { - return parseBinaryCMap(name, builtInCMapParams); - } - - var request = new XMLHttpRequest(); - var url = builtInCMapParams.url + name; - request.open('GET', url, false); - request.send(null); - if (!request.responseText) { - error('Unable to get cMap at: ' + url); - } - var cMap = new CMap(true); - var lexer = new Lexer(new StringStream(request.responseText)); - parseCMap(cMap, lexer, builtInCMapParams, null); - return cMap; - } - - return { - create: function (encoding, builtInCMapParams, useCMap) { - if (isName(encoding)) { - return createBuiltInCMap(encoding.name, builtInCMapParams); - } else if (isStream(encoding)) { - var cMap = new CMap(); - var lexer = new Lexer(encoding); - try { - parseCMap(cMap, lexer, builtInCMapParams, useCMap); - } catch (e) { - warn('Invalid CMap data. ' + e); - } - if (cMap.isIdentityCMap) { - return createBuiltInCMap(cMap.name, builtInCMapParams); - } - return cMap; - } - error('Encoding required.'); - } - }; -})(); - - -// Unicode Private Use Area -var PRIVATE_USE_OFFSET_START = 0xE000; -var PRIVATE_USE_OFFSET_END = 0xF8FF; -var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false; - -// PDF Glyph Space Units are one Thousandth of a TextSpace Unit -// except for Type 3 fonts -var PDF_GLYPH_SPACE_UNITS = 1000; - -// Hinting is currently disabled due to unknown problems on windows -// in tracemonkey and various other pdfs with type1 fonts. -var HINTING_ENABLED = false; - -// Accented charactars are not displayed properly on windows, using this flag -// to control analysis of seac charstrings. -var SEAC_ANALYSIS_ENABLED = false; - -var FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; - -var Encodings = { - ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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'], - MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', - 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', - 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', - 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', - 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', - 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', - 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', - 'Circumflexsmall', 'hypheninferior', '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', '', '', 'asuperior', 'centsuperior', '', '', '', '', - 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', - 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', - 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', - 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', - 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', - 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', - 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', - 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', - 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', - 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', - 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', - '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', - 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', - 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', - 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', - 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', - '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', - 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', - 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'], - MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', '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', 'grave', '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', '', - 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', - 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', - 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', - 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', - 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', - 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', - 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', - 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', - 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', - 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', - 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', - 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', - 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', - 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', - 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', - 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', - 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', - 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', - 'ogonek', 'caron'], - StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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'], - WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', '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', 'grave', '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', - 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', - 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', - 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', - 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', - 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', - 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', - 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', - 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', - 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', - 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', - 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', - 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', - 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', - 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', - 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', - 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', - 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', - 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', - 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', - 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', - 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', - 'ydieresis'], - SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', - 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', - 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', - 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', - 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', - 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', - 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', - 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', - 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', - 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', - 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', - 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', - 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', - 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', - 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', - 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', - 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', - 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', - 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', - 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', - 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', - 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', - 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', - 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', - 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', - 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', - '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', - 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', - 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', - 'bracerightbt'], - ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', - 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', - 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', - 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', - 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', - 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', - 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', - 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', - 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', - 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', - 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', - 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', - 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', - 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', - 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', - 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', - 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', - 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', - 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', - 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', - 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191'] -}; - -/** - * Hold a map of decoded fonts and of the standard fourteen Type1 - * fonts and their acronyms. - */ -var stdFontMap = { - 'ArialNarrow': 'Helvetica', - 'ArialNarrow-Bold': 'Helvetica-Bold', - 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique', - 'ArialNarrow-Italic': 'Helvetica-Oblique', - 'ArialBlack': 'Helvetica', - 'ArialBlack-Bold': 'Helvetica-Bold', - 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique', - 'ArialBlack-Italic': 'Helvetica-Oblique', - 'Arial': 'Helvetica', - 'Arial-Bold': 'Helvetica-Bold', - 'Arial-BoldItalic': 'Helvetica-BoldOblique', - 'Arial-Italic': 'Helvetica-Oblique', - 'Arial-BoldItalicMT': 'Helvetica-BoldOblique', - 'Arial-BoldMT': 'Helvetica-Bold', - 'Arial-ItalicMT': 'Helvetica-Oblique', - 'ArialMT': 'Helvetica', - 'Courier-Bold': 'Courier-Bold', - 'Courier-BoldItalic': 'Courier-BoldOblique', - 'Courier-Italic': 'Courier-Oblique', - 'CourierNew': 'Courier', - 'CourierNew-Bold': 'Courier-Bold', - 'CourierNew-BoldItalic': 'Courier-BoldOblique', - 'CourierNew-Italic': 'Courier-Oblique', - 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique', - 'CourierNewPS-BoldMT': 'Courier-Bold', - 'CourierNewPS-ItalicMT': 'Courier-Oblique', - 'CourierNewPSMT': 'Courier', - 'Helvetica': 'Helvetica', - 'Helvetica-Bold': 'Helvetica-Bold', - 'Helvetica-BoldItalic': 'Helvetica-BoldOblique', - 'Helvetica-BoldOblique': 'Helvetica-BoldOblique', - 'Helvetica-Italic': 'Helvetica-Oblique', - 'Helvetica-Oblique':'Helvetica-Oblique', - 'Symbol-Bold': 'Symbol', - 'Symbol-BoldItalic': 'Symbol', - 'Symbol-Italic': 'Symbol', - 'TimesNewRoman': 'Times-Roman', - 'TimesNewRoman-Bold': 'Times-Bold', - 'TimesNewRoman-BoldItalic': 'Times-BoldItalic', - 'TimesNewRoman-Italic': 'Times-Italic', - 'TimesNewRomanPS': 'Times-Roman', - 'TimesNewRomanPS-Bold': 'Times-Bold', - 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldMT': 'Times-Bold', - 'TimesNewRomanPS-Italic': 'Times-Italic', - 'TimesNewRomanPS-ItalicMT': 'Times-Italic', - 'TimesNewRomanPSMT': 'Times-Roman', - 'TimesNewRomanPSMT-Bold': 'Times-Bold', - 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPSMT-Italic': 'Times-Italic' -}; - -/** - * Holds the map of the non-standard fonts that might be included as a standard - * fonts without glyph data. - */ -var nonStdFontMap = { - 'CenturyGothic': 'Helvetica', - 'CenturyGothic-Bold': 'Helvetica-Bold', - 'CenturyGothic-BoldItalic': 'Helvetica-BoldOblique', - 'CenturyGothic-Italic': 'Helvetica-Oblique', - 'ComicSansMS': 'Comic Sans MS', - 'ComicSansMS-Bold': 'Comic Sans MS-Bold', - 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic', - 'ComicSansMS-Italic': 'Comic Sans MS-Italic', - 'LucidaConsole': 'Courier', - 'LucidaConsole-Bold': 'Courier-Bold', - 'LucidaConsole-BoldItalic': 'Courier-BoldOblique', - 'LucidaConsole-Italic': 'Courier-Oblique', - 'MS-Gothic': 'MS Gothic', - 'MS-Gothic-Bold': 'MS Gothic-Bold', - 'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic', - 'MS-Gothic-Italic': 'MS Gothic-Italic', - 'MS-Mincho': 'MS Mincho', - 'MS-Mincho-Bold': 'MS Mincho-Bold', - 'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic', - 'MS-Mincho-Italic': 'MS Mincho-Italic', - 'MS-PGothic': 'MS PGothic', - 'MS-PGothic-Bold': 'MS PGothic-Bold', - 'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic', - 'MS-PGothic-Italic': 'MS PGothic-Italic', - 'MS-PMincho': 'MS PMincho', - 'MS-PMincho-Bold': 'MS PMincho-Bold', - 'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic', - 'MS-PMincho-Italic': 'MS PMincho-Italic', - 'Wingdings': 'ZapfDingbats' -}; - -var serifFonts = { - 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true, - 'Aldus': true, 'Alexandria': true, 'Algerian': true, - 'American Typewriter': true, 'Antiqua': true, 'Apex': true, - 'Arno': true, 'Aster': true, 'Aurora': true, - 'Baskerville': true, 'Bell': true, 'Bembo': true, - 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true, - 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true, - 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true, - 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true, - 'Calvert': true, 'Capitals': true, 'Cambria': true, - 'Cartier': true, 'Caslon': true, 'Catull': true, - 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true, - 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true, - 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true, - 'Cochin': true, 'Colonna': true, 'Computer Modern': true, - 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true, - 'Corona': true, 'Ecotype': true, 'Egyptienne': true, - 'Elephant': true, 'Excelsior': true, 'Fairfield': true, - 'FF Scala': true, 'Folkard': true, 'Footlight': true, - 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true, - 'Gentium': true, 'Georgia': true, 'Gloucester': true, - 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true, - 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true, - 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true, - 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true, - 'Ionic No. 5': true, 'Janson': true, 'Joanna': true, - 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true, - 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true, - 'Lucida Bright': true, 'Melior': true, 'Memphis': true, - 'Miller': true, 'Minion': true, 'Modern': true, - 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true, - 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true, - 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true, - 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true, - 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true, - 'Requiem': true, 'Rockwell': true, 'Roman': true, - 'Rotis Serif': true, 'Sabon': true, 'Scala': true, - 'Seagull': true, 'Sistina': true, 'Souvenir': true, - 'STIX': true, 'Stone Informal': true, 'Stone Serif': true, - 'Sylfaen': true, 'Times': true, 'Trajan': true, - 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true, - 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true, - 'Versailles': true, 'Wanted': true, 'Weiss': true, - 'Wide Latin': true, 'Windsor': true, 'XITS': true -}; - -var symbolsFonts = { - 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true -}; - -// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts -// but does not embed the CID to GID mapping. The mapping is incomplete for all -// glyphs, but common for some set of the standard fonts. -var GlyphMapForStandardFonts = { - '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38, - '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 45, - '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52, - '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894, - '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66, - '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73, - '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80, - '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87, - '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94, - '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101, - '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108, - '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115, - '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122, - '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199, - '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224, - '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233, - '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238, - '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246, - '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224, - '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182, - '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168, - '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804, - '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719, - '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248, - '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776, - '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '223': 711, - '224': 321, '225': 322, '227': 353, '229': 382, '234': 253, '252': 263, - '253': 268, '254': 269, '258': 258, '260': 260, '261': 261, '265': 280, - '266': 281, '268': 283, '269': 313, '275': 323, '276': 324, '278': 328, - '284': 345, '285': 346, '286': 347, '292': 367, '295': 377, '296': 378, - '298': 380, '305': 963, - '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359, - '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524, - '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776, - '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782, - '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769, - '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342, - '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363, - '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824, - '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045, - '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753, - '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849, - '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460, - '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467, - '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474, - '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480, - '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487, - '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494, - '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502, - '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509, - '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516, - '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522, - '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529, - '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549, - '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556, - '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290, - '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296, - '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533, - '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595, - '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606, - '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615, - '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884, - '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887, - '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889, - '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892, - '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588, - '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275, - '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799, - '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377 -}; - -// The glyph map for ArialBlack differs slightly from the glyph map used for -// other well-known standard fonts. Hence we use this (incomplete) CID to GID -// mapping to adjust the glyph map for non-embedded ArialBlack fonts. -var SupplementalGlyphMapForArialBlack = { - '227': 322, '264': 261, '291': 346, -}; - -// Some characters, e.g. copyrightserif, are mapped to the private use area and -// might not be displayed using standard fonts. Mapping/hacking well-known chars -// to the similar equivalents in the normal characters range. -var SpecialPUASymbols = { - '63721': 0x00A9, // copyrightsans (0xF8E9) => copyright - '63193': 0x00A9, // copyrightserif (0xF6D9) => copyright - '63720': 0x00AE, // registersans (0xF8E8) => registered - '63194': 0x00AE, // registerserif (0xF6DA) => registered - '63722': 0x2122, // trademarksans (0xF8EA) => trademark - '63195': 0x2122, // trademarkserif (0xF6DB) => trademark - '63729': 0x23A7, // bracelefttp (0xF8F1) - '63730': 0x23A8, // braceleftmid (0xF8F2) - '63731': 0x23A9, // braceleftbt (0xF8F3) - '63740': 0x23AB, // bracerighttp (0xF8FC) - '63741': 0x23AC, // bracerightmid (0xF8FD) - '63742': 0x23AD, // bracerightbt (0xF8FE) - '63726': 0x23A1, // bracketlefttp (0xF8EE) - '63727': 0x23A2, // bracketleftex (0xF8EF) - '63728': 0x23A3, // bracketleftbt (0xF8F0) - '63737': 0x23A4, // bracketrighttp (0xF8F9) - '63738': 0x23A5, // bracketrightex (0xF8FA) - '63739': 0x23A6, // bracketrightbt (0xF8FB) - '63723': 0x239B, // parenlefttp (0xF8EB) - '63724': 0x239C, // parenleftex (0xF8EC) - '63725': 0x239D, // parenleftbt (0xF8ED) - '63734': 0x239E, // parenrighttp (0xF8F6) - '63735': 0x239F, // parenrightex (0xF8F7) - '63736': 0x23A0, // parenrightbt (0xF8F8) -}; -function mapSpecialUnicodeValues(code) { - if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block. - return 0; - } else if (code >= 0xF600 && code <= 0xF8FF) { - return (SpecialPUASymbols[code] || code); - } - return code; -} - -var UnicodeRanges = [ - { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin - { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement - { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A - { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B - { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions - { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters - { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks - { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic - { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic - { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic - { 'begin': 0x0530, 'end': 0x058F }, // Armenian - { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew - { 'begin': 0xA500, 'end': 0xA63F }, // Vai - { 'begin': 0x0600, 'end': 0x06FF }, // Arabic - { 'begin': 0x07C0, 'end': 0x07FF }, // NKo - { 'begin': 0x0900, 'end': 0x097F }, // Devanagari - { 'begin': 0x0980, 'end': 0x09FF }, // Bengali - { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi - { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati - { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya - { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil - { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu - { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada - { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam - { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai - { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao - { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian - { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese - { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo - { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional - { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended - { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation - { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts - { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol - { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols - { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols - { 'begin': 0x2150, 'end': 0x218F }, // Number Forms - { 'begin': 0x2190, 'end': 0x21FF }, // Arrows - { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators - { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical - { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures - { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition - { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics - { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing - { 'begin': 0x2580, 'end': 0x259F }, // Block Elements - { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes - { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols - { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats - { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation - { 'begin': 0x3040, 'end': 0x309F }, // Hiragana - { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana - { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo - { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo - { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa - { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months - { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility - { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables - { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 * - { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia - { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs - { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0) - { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes - { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms - { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A - { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks - { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms - { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants - { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B - { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms - { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials - { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan - { 'begin': 0x0700, 'end': 0x074F }, // Syriac - { 'begin': 0x0780, 'end': 0x07BF }, // Thaana - { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala - { 'begin': 0x1000, 'end': 0x109F }, // Myanmar - { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic - { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee - { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics - { 'begin': 0x1680, 'end': 0x169F }, // Ogham - { 'begin': 0x16A0, 'end': 0x16FF }, // Runic - { 'begin': 0x1780, 'end': 0x17FF }, // Khmer - { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian - { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns - { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables - { 'begin': 0x1700, 'end': 0x171F }, // Tagalog - { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic - { 'begin': 0x10330, 'end': 0x1034F }, // Gothic - { 'begin': 0x10400, 'end': 0x1044F }, // Deseret - { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols - { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols - { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15) - { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors - { 'begin': 0xE0000, 'end': 0xE007F }, // Tags - { 'begin': 0x1900, 'end': 0x194F }, // Limbu - { 'begin': 0x1950, 'end': 0x197F }, // Tai Le - { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue - { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese - { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic - { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh - { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols - { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri - { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary - { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers - { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic - { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian - { 'begin': 0x10450, 'end': 0x1047F }, // Shavian - { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya - { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary - { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi - { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols - { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform - { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals - { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese - { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha - { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki - { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra - { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li - { 'begin': 0xA930, 'end': 0xA95F }, // Rejang - { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham - { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols - { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc - { 'begin': 0x102A0, 'end': 0x102DF }, // Carian - { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles -]; - -var MacStandardGlyphOrdering = [ - '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', - 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', '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', 'grave', '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', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', - 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', - 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', - 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', - 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', - 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', - 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', - 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', - 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', - 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', - 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', - 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', - 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', - 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', - 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', - 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', - 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', - 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', - 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', - 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', - 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', - 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', - 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', - 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', - 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; - -function getUnicodeRangeFor(value) { - for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { - var range = UnicodeRanges[i]; - if (value >= range.begin && value < range.end) { - return i; - } - } - return -1; -} - -function isRTLRangeFor(value) { - var range = UnicodeRanges[13]; - if (value >= range.begin && value < range.end) { - return true; - } - range = UnicodeRanges[11]; - if (value >= range.begin && value < range.end) { - return true; - } - return false; -} - -// The normalization table is obtained by filtering the Unicode characters -// database with entries. -var NormalizedUnicodes = { - '\u00A8': '\u0020\u0308', - '\u00AF': '\u0020\u0304', - '\u00B4': '\u0020\u0301', - '\u00B5': '\u03BC', - '\u00B8': '\u0020\u0327', - '\u0132': '\u0049\u004A', - '\u0133': '\u0069\u006A', - '\u013F': '\u004C\u00B7', - '\u0140': '\u006C\u00B7', - '\u0149': '\u02BC\u006E', - '\u017F': '\u0073', - '\u01C4': '\u0044\u017D', - '\u01C5': '\u0044\u017E', - '\u01C6': '\u0064\u017E', - '\u01C7': '\u004C\u004A', - '\u01C8': '\u004C\u006A', - '\u01C9': '\u006C\u006A', - '\u01CA': '\u004E\u004A', - '\u01CB': '\u004E\u006A', - '\u01CC': '\u006E\u006A', - '\u01F1': '\u0044\u005A', - '\u01F2': '\u0044\u007A', - '\u01F3': '\u0064\u007A', - '\u02D8': '\u0020\u0306', - '\u02D9': '\u0020\u0307', - '\u02DA': '\u0020\u030A', - '\u02DB': '\u0020\u0328', - '\u02DC': '\u0020\u0303', - '\u02DD': '\u0020\u030B', - '\u037A': '\u0020\u0345', - '\u0384': '\u0020\u0301', - '\u03D0': '\u03B2', - '\u03D1': '\u03B8', - '\u03D2': '\u03A5', - '\u03D5': '\u03C6', - '\u03D6': '\u03C0', - '\u03F0': '\u03BA', - '\u03F1': '\u03C1', - '\u03F2': '\u03C2', - '\u03F4': '\u0398', - '\u03F5': '\u03B5', - '\u03F9': '\u03A3', - '\u0587': '\u0565\u0582', - '\u0675': '\u0627\u0674', - '\u0676': '\u0648\u0674', - '\u0677': '\u06C7\u0674', - '\u0678': '\u064A\u0674', - '\u0E33': '\u0E4D\u0E32', - '\u0EB3': '\u0ECD\u0EB2', - '\u0EDC': '\u0EAB\u0E99', - '\u0EDD': '\u0EAB\u0EA1', - '\u0F77': '\u0FB2\u0F81', - '\u0F79': '\u0FB3\u0F81', - '\u1E9A': '\u0061\u02BE', - '\u1FBD': '\u0020\u0313', - '\u1FBF': '\u0020\u0313', - '\u1FC0': '\u0020\u0342', - '\u1FFE': '\u0020\u0314', - '\u2002': '\u0020', - '\u2003': '\u0020', - '\u2004': '\u0020', - '\u2005': '\u0020', - '\u2006': '\u0020', - '\u2008': '\u0020', - '\u2009': '\u0020', - '\u200A': '\u0020', - '\u2017': '\u0020\u0333', - '\u2024': '\u002E', - '\u2025': '\u002E\u002E', - '\u2026': '\u002E\u002E\u002E', - '\u2033': '\u2032\u2032', - '\u2034': '\u2032\u2032\u2032', - '\u2036': '\u2035\u2035', - '\u2037': '\u2035\u2035\u2035', - '\u203C': '\u0021\u0021', - '\u203E': '\u0020\u0305', - '\u2047': '\u003F\u003F', - '\u2048': '\u003F\u0021', - '\u2049': '\u0021\u003F', - '\u2057': '\u2032\u2032\u2032\u2032', - '\u205F': '\u0020', - '\u20A8': '\u0052\u0073', - '\u2100': '\u0061\u002F\u0063', - '\u2101': '\u0061\u002F\u0073', - '\u2103': '\u00B0\u0043', - '\u2105': '\u0063\u002F\u006F', - '\u2106': '\u0063\u002F\u0075', - '\u2107': '\u0190', - '\u2109': '\u00B0\u0046', - '\u2116': '\u004E\u006F', - '\u2121': '\u0054\u0045\u004C', - '\u2135': '\u05D0', - '\u2136': '\u05D1', - '\u2137': '\u05D2', - '\u2138': '\u05D3', - '\u213B': '\u0046\u0041\u0058', - '\u2160': '\u0049', - '\u2161': '\u0049\u0049', - '\u2162': '\u0049\u0049\u0049', - '\u2163': '\u0049\u0056', - '\u2164': '\u0056', - '\u2165': '\u0056\u0049', - '\u2166': '\u0056\u0049\u0049', - '\u2167': '\u0056\u0049\u0049\u0049', - '\u2168': '\u0049\u0058', - '\u2169': '\u0058', - '\u216A': '\u0058\u0049', - '\u216B': '\u0058\u0049\u0049', - '\u216C': '\u004C', - '\u216D': '\u0043', - '\u216E': '\u0044', - '\u216F': '\u004D', - '\u2170': '\u0069', - '\u2171': '\u0069\u0069', - '\u2172': '\u0069\u0069\u0069', - '\u2173': '\u0069\u0076', - '\u2174': '\u0076', - '\u2175': '\u0076\u0069', - '\u2176': '\u0076\u0069\u0069', - '\u2177': '\u0076\u0069\u0069\u0069', - '\u2178': '\u0069\u0078', - '\u2179': '\u0078', - '\u217A': '\u0078\u0069', - '\u217B': '\u0078\u0069\u0069', - '\u217C': '\u006C', - '\u217D': '\u0063', - '\u217E': '\u0064', - '\u217F': '\u006D', - '\u222C': '\u222B\u222B', - '\u222D': '\u222B\u222B\u222B', - '\u222F': '\u222E\u222E', - '\u2230': '\u222E\u222E\u222E', - '\u2474': '\u0028\u0031\u0029', - '\u2475': '\u0028\u0032\u0029', - '\u2476': '\u0028\u0033\u0029', - '\u2477': '\u0028\u0034\u0029', - '\u2478': '\u0028\u0035\u0029', - '\u2479': '\u0028\u0036\u0029', - '\u247A': '\u0028\u0037\u0029', - '\u247B': '\u0028\u0038\u0029', - '\u247C': '\u0028\u0039\u0029', - '\u247D': '\u0028\u0031\u0030\u0029', - '\u247E': '\u0028\u0031\u0031\u0029', - '\u247F': '\u0028\u0031\u0032\u0029', - '\u2480': '\u0028\u0031\u0033\u0029', - '\u2481': '\u0028\u0031\u0034\u0029', - '\u2482': '\u0028\u0031\u0035\u0029', - '\u2483': '\u0028\u0031\u0036\u0029', - '\u2484': '\u0028\u0031\u0037\u0029', - '\u2485': '\u0028\u0031\u0038\u0029', - '\u2486': '\u0028\u0031\u0039\u0029', - '\u2487': '\u0028\u0032\u0030\u0029', - '\u2488': '\u0031\u002E', - '\u2489': '\u0032\u002E', - '\u248A': '\u0033\u002E', - '\u248B': '\u0034\u002E', - '\u248C': '\u0035\u002E', - '\u248D': '\u0036\u002E', - '\u248E': '\u0037\u002E', - '\u248F': '\u0038\u002E', - '\u2490': '\u0039\u002E', - '\u2491': '\u0031\u0030\u002E', - '\u2492': '\u0031\u0031\u002E', - '\u2493': '\u0031\u0032\u002E', - '\u2494': '\u0031\u0033\u002E', - '\u2495': '\u0031\u0034\u002E', - '\u2496': '\u0031\u0035\u002E', - '\u2497': '\u0031\u0036\u002E', - '\u2498': '\u0031\u0037\u002E', - '\u2499': '\u0031\u0038\u002E', - '\u249A': '\u0031\u0039\u002E', - '\u249B': '\u0032\u0030\u002E', - '\u249C': '\u0028\u0061\u0029', - '\u249D': '\u0028\u0062\u0029', - '\u249E': '\u0028\u0063\u0029', - '\u249F': '\u0028\u0064\u0029', - '\u24A0': '\u0028\u0065\u0029', - '\u24A1': '\u0028\u0066\u0029', - '\u24A2': '\u0028\u0067\u0029', - '\u24A3': '\u0028\u0068\u0029', - '\u24A4': '\u0028\u0069\u0029', - '\u24A5': '\u0028\u006A\u0029', - '\u24A6': '\u0028\u006B\u0029', - '\u24A7': '\u0028\u006C\u0029', - '\u24A8': '\u0028\u006D\u0029', - '\u24A9': '\u0028\u006E\u0029', - '\u24AA': '\u0028\u006F\u0029', - '\u24AB': '\u0028\u0070\u0029', - '\u24AC': '\u0028\u0071\u0029', - '\u24AD': '\u0028\u0072\u0029', - '\u24AE': '\u0028\u0073\u0029', - '\u24AF': '\u0028\u0074\u0029', - '\u24B0': '\u0028\u0075\u0029', - '\u24B1': '\u0028\u0076\u0029', - '\u24B2': '\u0028\u0077\u0029', - '\u24B3': '\u0028\u0078\u0029', - '\u24B4': '\u0028\u0079\u0029', - '\u24B5': '\u0028\u007A\u0029', - '\u2A0C': '\u222B\u222B\u222B\u222B', - '\u2A74': '\u003A\u003A\u003D', - '\u2A75': '\u003D\u003D', - '\u2A76': '\u003D\u003D\u003D', - '\u2E9F': '\u6BCD', - '\u2EF3': '\u9F9F', - '\u2F00': '\u4E00', - '\u2F01': '\u4E28', - '\u2F02': '\u4E36', - '\u2F03': '\u4E3F', - '\u2F04': '\u4E59', - '\u2F05': '\u4E85', - '\u2F06': '\u4E8C', - '\u2F07': '\u4EA0', - '\u2F08': '\u4EBA', - '\u2F09': '\u513F', - '\u2F0A': '\u5165', - '\u2F0B': '\u516B', - '\u2F0C': '\u5182', - '\u2F0D': '\u5196', - '\u2F0E': '\u51AB', - '\u2F0F': '\u51E0', - '\u2F10': '\u51F5', - '\u2F11': '\u5200', - '\u2F12': '\u529B', - '\u2F13': '\u52F9', - '\u2F14': '\u5315', - '\u2F15': '\u531A', - '\u2F16': '\u5338', - '\u2F17': '\u5341', - '\u2F18': '\u535C', - '\u2F19': '\u5369', - '\u2F1A': '\u5382', - '\u2F1B': '\u53B6', - '\u2F1C': '\u53C8', - '\u2F1D': '\u53E3', - '\u2F1E': '\u56D7', - '\u2F1F': '\u571F', - '\u2F20': '\u58EB', - '\u2F21': '\u5902', - '\u2F22': '\u590A', - '\u2F23': '\u5915', - '\u2F24': '\u5927', - '\u2F25': '\u5973', - '\u2F26': '\u5B50', - '\u2F27': '\u5B80', - '\u2F28': '\u5BF8', - '\u2F29': '\u5C0F', - '\u2F2A': '\u5C22', - '\u2F2B': '\u5C38', - '\u2F2C': '\u5C6E', - '\u2F2D': '\u5C71', - '\u2F2E': '\u5DDB', - '\u2F2F': '\u5DE5', - '\u2F30': '\u5DF1', - '\u2F31': '\u5DFE', - '\u2F32': '\u5E72', - '\u2F33': '\u5E7A', - '\u2F34': '\u5E7F', - '\u2F35': '\u5EF4', - '\u2F36': '\u5EFE', - '\u2F37': '\u5F0B', - '\u2F38': '\u5F13', - '\u2F39': '\u5F50', - '\u2F3A': '\u5F61', - '\u2F3B': '\u5F73', - '\u2F3C': '\u5FC3', - '\u2F3D': '\u6208', - '\u2F3E': '\u6236', - '\u2F3F': '\u624B', - '\u2F40': '\u652F', - '\u2F41': '\u6534', - '\u2F42': '\u6587', - '\u2F43': '\u6597', - '\u2F44': '\u65A4', - '\u2F45': '\u65B9', - '\u2F46': '\u65E0', - '\u2F47': '\u65E5', - '\u2F48': '\u66F0', - '\u2F49': '\u6708', - '\u2F4A': '\u6728', - '\u2F4B': '\u6B20', - '\u2F4C': '\u6B62', - '\u2F4D': '\u6B79', - '\u2F4E': '\u6BB3', - '\u2F4F': '\u6BCB', - '\u2F50': '\u6BD4', - '\u2F51': '\u6BDB', - '\u2F52': '\u6C0F', - '\u2F53': '\u6C14', - '\u2F54': '\u6C34', - '\u2F55': '\u706B', - '\u2F56': '\u722A', - '\u2F57': '\u7236', - '\u2F58': '\u723B', - '\u2F59': '\u723F', - '\u2F5A': '\u7247', - '\u2F5B': '\u7259', - '\u2F5C': '\u725B', - '\u2F5D': '\u72AC', - '\u2F5E': '\u7384', - '\u2F5F': '\u7389', - '\u2F60': '\u74DC', - '\u2F61': '\u74E6', - '\u2F62': '\u7518', - '\u2F63': '\u751F', - '\u2F64': '\u7528', - '\u2F65': '\u7530', - '\u2F66': '\u758B', - '\u2F67': '\u7592', - '\u2F68': '\u7676', - '\u2F69': '\u767D', - '\u2F6A': '\u76AE', - '\u2F6B': '\u76BF', - '\u2F6C': '\u76EE', - '\u2F6D': '\u77DB', - '\u2F6E': '\u77E2', - '\u2F6F': '\u77F3', - '\u2F70': '\u793A', - '\u2F71': '\u79B8', - '\u2F72': '\u79BE', - '\u2F73': '\u7A74', - '\u2F74': '\u7ACB', - '\u2F75': '\u7AF9', - '\u2F76': '\u7C73', - '\u2F77': '\u7CF8', - '\u2F78': '\u7F36', - '\u2F79': '\u7F51', - '\u2F7A': '\u7F8A', - '\u2F7B': '\u7FBD', - '\u2F7C': '\u8001', - '\u2F7D': '\u800C', - '\u2F7E': '\u8012', - '\u2F7F': '\u8033', - '\u2F80': '\u807F', - '\u2F81': '\u8089', - '\u2F82': '\u81E3', - '\u2F83': '\u81EA', - '\u2F84': '\u81F3', - '\u2F85': '\u81FC', - '\u2F86': '\u820C', - '\u2F87': '\u821B', - '\u2F88': '\u821F', - '\u2F89': '\u826E', - '\u2F8A': '\u8272', - '\u2F8B': '\u8278', - '\u2F8C': '\u864D', - '\u2F8D': '\u866B', - '\u2F8E': '\u8840', - '\u2F8F': '\u884C', - '\u2F90': '\u8863', - '\u2F91': '\u897E', - '\u2F92': '\u898B', - '\u2F93': '\u89D2', - '\u2F94': '\u8A00', - '\u2F95': '\u8C37', - '\u2F96': '\u8C46', - '\u2F97': '\u8C55', - '\u2F98': '\u8C78', - '\u2F99': '\u8C9D', - '\u2F9A': '\u8D64', - '\u2F9B': '\u8D70', - '\u2F9C': '\u8DB3', - '\u2F9D': '\u8EAB', - '\u2F9E': '\u8ECA', - '\u2F9F': '\u8F9B', - '\u2FA0': '\u8FB0', - '\u2FA1': '\u8FB5', - '\u2FA2': '\u9091', - '\u2FA3': '\u9149', - '\u2FA4': '\u91C6', - '\u2FA5': '\u91CC', - '\u2FA6': '\u91D1', - '\u2FA7': '\u9577', - '\u2FA8': '\u9580', - '\u2FA9': '\u961C', - '\u2FAA': '\u96B6', - '\u2FAB': '\u96B9', - '\u2FAC': '\u96E8', - '\u2FAD': '\u9751', - '\u2FAE': '\u975E', - '\u2FAF': '\u9762', - '\u2FB0': '\u9769', - '\u2FB1': '\u97CB', - '\u2FB2': '\u97ED', - '\u2FB3': '\u97F3', - '\u2FB4': '\u9801', - '\u2FB5': '\u98A8', - '\u2FB6': '\u98DB', - '\u2FB7': '\u98DF', - '\u2FB8': '\u9996', - '\u2FB9': '\u9999', - '\u2FBA': '\u99AC', - '\u2FBB': '\u9AA8', - '\u2FBC': '\u9AD8', - '\u2FBD': '\u9ADF', - '\u2FBE': '\u9B25', - '\u2FBF': '\u9B2F', - '\u2FC0': '\u9B32', - '\u2FC1': '\u9B3C', - '\u2FC2': '\u9B5A', - '\u2FC3': '\u9CE5', - '\u2FC4': '\u9E75', - '\u2FC5': '\u9E7F', - '\u2FC6': '\u9EA5', - '\u2FC7': '\u9EBB', - '\u2FC8': '\u9EC3', - '\u2FC9': '\u9ECD', - '\u2FCA': '\u9ED1', - '\u2FCB': '\u9EF9', - '\u2FCC': '\u9EFD', - '\u2FCD': '\u9F0E', - '\u2FCE': '\u9F13', - '\u2FCF': '\u9F20', - '\u2FD0': '\u9F3B', - '\u2FD1': '\u9F4A', - '\u2FD2': '\u9F52', - '\u2FD3': '\u9F8D', - '\u2FD4': '\u9F9C', - '\u2FD5': '\u9FA0', - '\u3036': '\u3012', - '\u3038': '\u5341', - '\u3039': '\u5344', - '\u303A': '\u5345', - '\u309B': '\u0020\u3099', - '\u309C': '\u0020\u309A', - '\u3131': '\u1100', - '\u3132': '\u1101', - '\u3133': '\u11AA', - '\u3134': '\u1102', - '\u3135': '\u11AC', - '\u3136': '\u11AD', - '\u3137': '\u1103', - '\u3138': '\u1104', - '\u3139': '\u1105', - '\u313A': '\u11B0', - '\u313B': '\u11B1', - '\u313C': '\u11B2', - '\u313D': '\u11B3', - '\u313E': '\u11B4', - '\u313F': '\u11B5', - '\u3140': '\u111A', - '\u3141': '\u1106', - '\u3142': '\u1107', - '\u3143': '\u1108', - '\u3144': '\u1121', - '\u3145': '\u1109', - '\u3146': '\u110A', - '\u3147': '\u110B', - '\u3148': '\u110C', - '\u3149': '\u110D', - '\u314A': '\u110E', - '\u314B': '\u110F', - '\u314C': '\u1110', - '\u314D': '\u1111', - '\u314E': '\u1112', - '\u314F': '\u1161', - '\u3150': '\u1162', - '\u3151': '\u1163', - '\u3152': '\u1164', - '\u3153': '\u1165', - '\u3154': '\u1166', - '\u3155': '\u1167', - '\u3156': '\u1168', - '\u3157': '\u1169', - '\u3158': '\u116A', - '\u3159': '\u116B', - '\u315A': '\u116C', - '\u315B': '\u116D', - '\u315C': '\u116E', - '\u315D': '\u116F', - '\u315E': '\u1170', - '\u315F': '\u1171', - '\u3160': '\u1172', - '\u3161': '\u1173', - '\u3162': '\u1174', - '\u3163': '\u1175', - '\u3164': '\u1160', - '\u3165': '\u1114', - '\u3166': '\u1115', - '\u3167': '\u11C7', - '\u3168': '\u11C8', - '\u3169': '\u11CC', - '\u316A': '\u11CE', - '\u316B': '\u11D3', - '\u316C': '\u11D7', - '\u316D': '\u11D9', - '\u316E': '\u111C', - '\u316F': '\u11DD', - '\u3170': '\u11DF', - '\u3171': '\u111D', - '\u3172': '\u111E', - '\u3173': '\u1120', - '\u3174': '\u1122', - '\u3175': '\u1123', - '\u3176': '\u1127', - '\u3177': '\u1129', - '\u3178': '\u112B', - '\u3179': '\u112C', - '\u317A': '\u112D', - '\u317B': '\u112E', - '\u317C': '\u112F', - '\u317D': '\u1132', - '\u317E': '\u1136', - '\u317F': '\u1140', - '\u3180': '\u1147', - '\u3181': '\u114C', - '\u3182': '\u11F1', - '\u3183': '\u11F2', - '\u3184': '\u1157', - '\u3185': '\u1158', - '\u3186': '\u1159', - '\u3187': '\u1184', - '\u3188': '\u1185', - '\u3189': '\u1188', - '\u318A': '\u1191', - '\u318B': '\u1192', - '\u318C': '\u1194', - '\u318D': '\u119E', - '\u318E': '\u11A1', - '\u3200': '\u0028\u1100\u0029', - '\u3201': '\u0028\u1102\u0029', - '\u3202': '\u0028\u1103\u0029', - '\u3203': '\u0028\u1105\u0029', - '\u3204': '\u0028\u1106\u0029', - '\u3205': '\u0028\u1107\u0029', - '\u3206': '\u0028\u1109\u0029', - '\u3207': '\u0028\u110B\u0029', - '\u3208': '\u0028\u110C\u0029', - '\u3209': '\u0028\u110E\u0029', - '\u320A': '\u0028\u110F\u0029', - '\u320B': '\u0028\u1110\u0029', - '\u320C': '\u0028\u1111\u0029', - '\u320D': '\u0028\u1112\u0029', - '\u320E': '\u0028\u1100\u1161\u0029', - '\u320F': '\u0028\u1102\u1161\u0029', - '\u3210': '\u0028\u1103\u1161\u0029', - '\u3211': '\u0028\u1105\u1161\u0029', - '\u3212': '\u0028\u1106\u1161\u0029', - '\u3213': '\u0028\u1107\u1161\u0029', - '\u3214': '\u0028\u1109\u1161\u0029', - '\u3215': '\u0028\u110B\u1161\u0029', - '\u3216': '\u0028\u110C\u1161\u0029', - '\u3217': '\u0028\u110E\u1161\u0029', - '\u3218': '\u0028\u110F\u1161\u0029', - '\u3219': '\u0028\u1110\u1161\u0029', - '\u321A': '\u0028\u1111\u1161\u0029', - '\u321B': '\u0028\u1112\u1161\u0029', - '\u321C': '\u0028\u110C\u116E\u0029', - '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029', - '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029', - '\u3220': '\u0028\u4E00\u0029', - '\u3221': '\u0028\u4E8C\u0029', - '\u3222': '\u0028\u4E09\u0029', - '\u3223': '\u0028\u56DB\u0029', - '\u3224': '\u0028\u4E94\u0029', - '\u3225': '\u0028\u516D\u0029', - '\u3226': '\u0028\u4E03\u0029', - '\u3227': '\u0028\u516B\u0029', - '\u3228': '\u0028\u4E5D\u0029', - '\u3229': '\u0028\u5341\u0029', - '\u322A': '\u0028\u6708\u0029', - '\u322B': '\u0028\u706B\u0029', - '\u322C': '\u0028\u6C34\u0029', - '\u322D': '\u0028\u6728\u0029', - '\u322E': '\u0028\u91D1\u0029', - '\u322F': '\u0028\u571F\u0029', - '\u3230': '\u0028\u65E5\u0029', - '\u3231': '\u0028\u682A\u0029', - '\u3232': '\u0028\u6709\u0029', - '\u3233': '\u0028\u793E\u0029', - '\u3234': '\u0028\u540D\u0029', - '\u3235': '\u0028\u7279\u0029', - '\u3236': '\u0028\u8CA1\u0029', - '\u3237': '\u0028\u795D\u0029', - '\u3238': '\u0028\u52B4\u0029', - '\u3239': '\u0028\u4EE3\u0029', - '\u323A': '\u0028\u547C\u0029', - '\u323B': '\u0028\u5B66\u0029', - '\u323C': '\u0028\u76E3\u0029', - '\u323D': '\u0028\u4F01\u0029', - '\u323E': '\u0028\u8CC7\u0029', - '\u323F': '\u0028\u5354\u0029', - '\u3240': '\u0028\u796D\u0029', - '\u3241': '\u0028\u4F11\u0029', - '\u3242': '\u0028\u81EA\u0029', - '\u3243': '\u0028\u81F3\u0029', - '\u32C0': '\u0031\u6708', - '\u32C1': '\u0032\u6708', - '\u32C2': '\u0033\u6708', - '\u32C3': '\u0034\u6708', - '\u32C4': '\u0035\u6708', - '\u32C5': '\u0036\u6708', - '\u32C6': '\u0037\u6708', - '\u32C7': '\u0038\u6708', - '\u32C8': '\u0039\u6708', - '\u32C9': '\u0031\u0030\u6708', - '\u32CA': '\u0031\u0031\u6708', - '\u32CB': '\u0031\u0032\u6708', - '\u3358': '\u0030\u70B9', - '\u3359': '\u0031\u70B9', - '\u335A': '\u0032\u70B9', - '\u335B': '\u0033\u70B9', - '\u335C': '\u0034\u70B9', - '\u335D': '\u0035\u70B9', - '\u335E': '\u0036\u70B9', - '\u335F': '\u0037\u70B9', - '\u3360': '\u0038\u70B9', - '\u3361': '\u0039\u70B9', - '\u3362': '\u0031\u0030\u70B9', - '\u3363': '\u0031\u0031\u70B9', - '\u3364': '\u0031\u0032\u70B9', - '\u3365': '\u0031\u0033\u70B9', - '\u3366': '\u0031\u0034\u70B9', - '\u3367': '\u0031\u0035\u70B9', - '\u3368': '\u0031\u0036\u70B9', - '\u3369': '\u0031\u0037\u70B9', - '\u336A': '\u0031\u0038\u70B9', - '\u336B': '\u0031\u0039\u70B9', - '\u336C': '\u0032\u0030\u70B9', - '\u336D': '\u0032\u0031\u70B9', - '\u336E': '\u0032\u0032\u70B9', - '\u336F': '\u0032\u0033\u70B9', - '\u3370': '\u0032\u0034\u70B9', - '\u33E0': '\u0031\u65E5', - '\u33E1': '\u0032\u65E5', - '\u33E2': '\u0033\u65E5', - '\u33E3': '\u0034\u65E5', - '\u33E4': '\u0035\u65E5', - '\u33E5': '\u0036\u65E5', - '\u33E6': '\u0037\u65E5', - '\u33E7': '\u0038\u65E5', - '\u33E8': '\u0039\u65E5', - '\u33E9': '\u0031\u0030\u65E5', - '\u33EA': '\u0031\u0031\u65E5', - '\u33EB': '\u0031\u0032\u65E5', - '\u33EC': '\u0031\u0033\u65E5', - '\u33ED': '\u0031\u0034\u65E5', - '\u33EE': '\u0031\u0035\u65E5', - '\u33EF': '\u0031\u0036\u65E5', - '\u33F0': '\u0031\u0037\u65E5', - '\u33F1': '\u0031\u0038\u65E5', - '\u33F2': '\u0031\u0039\u65E5', - '\u33F3': '\u0032\u0030\u65E5', - '\u33F4': '\u0032\u0031\u65E5', - '\u33F5': '\u0032\u0032\u65E5', - '\u33F6': '\u0032\u0033\u65E5', - '\u33F7': '\u0032\u0034\u65E5', - '\u33F8': '\u0032\u0035\u65E5', - '\u33F9': '\u0032\u0036\u65E5', - '\u33FA': '\u0032\u0037\u65E5', - '\u33FB': '\u0032\u0038\u65E5', - '\u33FC': '\u0032\u0039\u65E5', - '\u33FD': '\u0033\u0030\u65E5', - '\u33FE': '\u0033\u0031\u65E5', - '\uFB00': '\u0066\u0066', - '\uFB01': '\u0066\u0069', - '\uFB02': '\u0066\u006C', - '\uFB03': '\u0066\u0066\u0069', - '\uFB04': '\u0066\u0066\u006C', - '\uFB05': '\u017F\u0074', - '\uFB06': '\u0073\u0074', - '\uFB13': '\u0574\u0576', - '\uFB14': '\u0574\u0565', - '\uFB15': '\u0574\u056B', - '\uFB16': '\u057E\u0576', - '\uFB17': '\u0574\u056D', - '\uFB4F': '\u05D0\u05DC', - '\uFB50': '\u0671', - '\uFB51': '\u0671', - '\uFB52': '\u067B', - '\uFB53': '\u067B', - '\uFB54': '\u067B', - '\uFB55': '\u067B', - '\uFB56': '\u067E', - '\uFB57': '\u067E', - '\uFB58': '\u067E', - '\uFB59': '\u067E', - '\uFB5A': '\u0680', - '\uFB5B': '\u0680', - '\uFB5C': '\u0680', - '\uFB5D': '\u0680', - '\uFB5E': '\u067A', - '\uFB5F': '\u067A', - '\uFB60': '\u067A', - '\uFB61': '\u067A', - '\uFB62': '\u067F', - '\uFB63': '\u067F', - '\uFB64': '\u067F', - '\uFB65': '\u067F', - '\uFB66': '\u0679', - '\uFB67': '\u0679', - '\uFB68': '\u0679', - '\uFB69': '\u0679', - '\uFB6A': '\u06A4', - '\uFB6B': '\u06A4', - '\uFB6C': '\u06A4', - '\uFB6D': '\u06A4', - '\uFB6E': '\u06A6', - '\uFB6F': '\u06A6', - '\uFB70': '\u06A6', - '\uFB71': '\u06A6', - '\uFB72': '\u0684', - '\uFB73': '\u0684', - '\uFB74': '\u0684', - '\uFB75': '\u0684', - '\uFB76': '\u0683', - '\uFB77': '\u0683', - '\uFB78': '\u0683', - '\uFB79': '\u0683', - '\uFB7A': '\u0686', - '\uFB7B': '\u0686', - '\uFB7C': '\u0686', - '\uFB7D': '\u0686', - '\uFB7E': '\u0687', - '\uFB7F': '\u0687', - '\uFB80': '\u0687', - '\uFB81': '\u0687', - '\uFB82': '\u068D', - '\uFB83': '\u068D', - '\uFB84': '\u068C', - '\uFB85': '\u068C', - '\uFB86': '\u068E', - '\uFB87': '\u068E', - '\uFB88': '\u0688', - '\uFB89': '\u0688', - '\uFB8A': '\u0698', - '\uFB8B': '\u0698', - '\uFB8C': '\u0691', - '\uFB8D': '\u0691', - '\uFB8E': '\u06A9', - '\uFB8F': '\u06A9', - '\uFB90': '\u06A9', - '\uFB91': '\u06A9', - '\uFB92': '\u06AF', - '\uFB93': '\u06AF', - '\uFB94': '\u06AF', - '\uFB95': '\u06AF', - '\uFB96': '\u06B3', - '\uFB97': '\u06B3', - '\uFB98': '\u06B3', - '\uFB99': '\u06B3', - '\uFB9A': '\u06B1', - '\uFB9B': '\u06B1', - '\uFB9C': '\u06B1', - '\uFB9D': '\u06B1', - '\uFB9E': '\u06BA', - '\uFB9F': '\u06BA', - '\uFBA0': '\u06BB', - '\uFBA1': '\u06BB', - '\uFBA2': '\u06BB', - '\uFBA3': '\u06BB', - '\uFBA4': '\u06C0', - '\uFBA5': '\u06C0', - '\uFBA6': '\u06C1', - '\uFBA7': '\u06C1', - '\uFBA8': '\u06C1', - '\uFBA9': '\u06C1', - '\uFBAA': '\u06BE', - '\uFBAB': '\u06BE', - '\uFBAC': '\u06BE', - '\uFBAD': '\u06BE', - '\uFBAE': '\u06D2', - '\uFBAF': '\u06D2', - '\uFBB0': '\u06D3', - '\uFBB1': '\u06D3', - '\uFBD3': '\u06AD', - '\uFBD4': '\u06AD', - '\uFBD5': '\u06AD', - '\uFBD6': '\u06AD', - '\uFBD7': '\u06C7', - '\uFBD8': '\u06C7', - '\uFBD9': '\u06C6', - '\uFBDA': '\u06C6', - '\uFBDB': '\u06C8', - '\uFBDC': '\u06C8', - '\uFBDD': '\u0677', - '\uFBDE': '\u06CB', - '\uFBDF': '\u06CB', - '\uFBE0': '\u06C5', - '\uFBE1': '\u06C5', - '\uFBE2': '\u06C9', - '\uFBE3': '\u06C9', - '\uFBE4': '\u06D0', - '\uFBE5': '\u06D0', - '\uFBE6': '\u06D0', - '\uFBE7': '\u06D0', - '\uFBE8': '\u0649', - '\uFBE9': '\u0649', - '\uFBEA': '\u0626\u0627', - '\uFBEB': '\u0626\u0627', - '\uFBEC': '\u0626\u06D5', - '\uFBED': '\u0626\u06D5', - '\uFBEE': '\u0626\u0648', - '\uFBEF': '\u0626\u0648', - '\uFBF0': '\u0626\u06C7', - '\uFBF1': '\u0626\u06C7', - '\uFBF2': '\u0626\u06C6', - '\uFBF3': '\u0626\u06C6', - '\uFBF4': '\u0626\u06C8', - '\uFBF5': '\u0626\u06C8', - '\uFBF6': '\u0626\u06D0', - '\uFBF7': '\u0626\u06D0', - '\uFBF8': '\u0626\u06D0', - '\uFBF9': '\u0626\u0649', - '\uFBFA': '\u0626\u0649', - '\uFBFB': '\u0626\u0649', - '\uFBFC': '\u06CC', - '\uFBFD': '\u06CC', - '\uFBFE': '\u06CC', - '\uFBFF': '\u06CC', - '\uFC00': '\u0626\u062C', - '\uFC01': '\u0626\u062D', - '\uFC02': '\u0626\u0645', - '\uFC03': '\u0626\u0649', - '\uFC04': '\u0626\u064A', - '\uFC05': '\u0628\u062C', - '\uFC06': '\u0628\u062D', - '\uFC07': '\u0628\u062E', - '\uFC08': '\u0628\u0645', - '\uFC09': '\u0628\u0649', - '\uFC0A': '\u0628\u064A', - '\uFC0B': '\u062A\u062C', - '\uFC0C': '\u062A\u062D', - '\uFC0D': '\u062A\u062E', - '\uFC0E': '\u062A\u0645', - '\uFC0F': '\u062A\u0649', - '\uFC10': '\u062A\u064A', - '\uFC11': '\u062B\u062C', - '\uFC12': '\u062B\u0645', - '\uFC13': '\u062B\u0649', - '\uFC14': '\u062B\u064A', - '\uFC15': '\u062C\u062D', - '\uFC16': '\u062C\u0645', - '\uFC17': '\u062D\u062C', - '\uFC18': '\u062D\u0645', - '\uFC19': '\u062E\u062C', - '\uFC1A': '\u062E\u062D', - '\uFC1B': '\u062E\u0645', - '\uFC1C': '\u0633\u062C', - '\uFC1D': '\u0633\u062D', - '\uFC1E': '\u0633\u062E', - '\uFC1F': '\u0633\u0645', - '\uFC20': '\u0635\u062D', - '\uFC21': '\u0635\u0645', - '\uFC22': '\u0636\u062C', - '\uFC23': '\u0636\u062D', - '\uFC24': '\u0636\u062E', - '\uFC25': '\u0636\u0645', - '\uFC26': '\u0637\u062D', - '\uFC27': '\u0637\u0645', - '\uFC28': '\u0638\u0645', - '\uFC29': '\u0639\u062C', - '\uFC2A': '\u0639\u0645', - '\uFC2B': '\u063A\u062C', - '\uFC2C': '\u063A\u0645', - '\uFC2D': '\u0641\u062C', - '\uFC2E': '\u0641\u062D', - '\uFC2F': '\u0641\u062E', - '\uFC30': '\u0641\u0645', - '\uFC31': '\u0641\u0649', - '\uFC32': '\u0641\u064A', - '\uFC33': '\u0642\u062D', - '\uFC34': '\u0642\u0645', - '\uFC35': '\u0642\u0649', - '\uFC36': '\u0642\u064A', - '\uFC37': '\u0643\u0627', - '\uFC38': '\u0643\u062C', - '\uFC39': '\u0643\u062D', - '\uFC3A': '\u0643\u062E', - '\uFC3B': '\u0643\u0644', - '\uFC3C': '\u0643\u0645', - '\uFC3D': '\u0643\u0649', - '\uFC3E': '\u0643\u064A', - '\uFC3F': '\u0644\u062C', - '\uFC40': '\u0644\u062D', - '\uFC41': '\u0644\u062E', - '\uFC42': '\u0644\u0645', - '\uFC43': '\u0644\u0649', - '\uFC44': '\u0644\u064A', - '\uFC45': '\u0645\u062C', - '\uFC46': '\u0645\u062D', - '\uFC47': '\u0645\u062E', - '\uFC48': '\u0645\u0645', - '\uFC49': '\u0645\u0649', - '\uFC4A': '\u0645\u064A', - '\uFC4B': '\u0646\u062C', - '\uFC4C': '\u0646\u062D', - '\uFC4D': '\u0646\u062E', - '\uFC4E': '\u0646\u0645', - '\uFC4F': '\u0646\u0649', - '\uFC50': '\u0646\u064A', - '\uFC51': '\u0647\u062C', - '\uFC52': '\u0647\u0645', - '\uFC53': '\u0647\u0649', - '\uFC54': '\u0647\u064A', - '\uFC55': '\u064A\u062C', - '\uFC56': '\u064A\u062D', - '\uFC57': '\u064A\u062E', - '\uFC58': '\u064A\u0645', - '\uFC59': '\u064A\u0649', - '\uFC5A': '\u064A\u064A', - '\uFC5B': '\u0630\u0670', - '\uFC5C': '\u0631\u0670', - '\uFC5D': '\u0649\u0670', - '\uFC5E': '\u0020\u064C\u0651', - '\uFC5F': '\u0020\u064D\u0651', - '\uFC60': '\u0020\u064E\u0651', - '\uFC61': '\u0020\u064F\u0651', - '\uFC62': '\u0020\u0650\u0651', - '\uFC63': '\u0020\u0651\u0670', - '\uFC64': '\u0626\u0631', - '\uFC65': '\u0626\u0632', - '\uFC66': '\u0626\u0645', - '\uFC67': '\u0626\u0646', - '\uFC68': '\u0626\u0649', - '\uFC69': '\u0626\u064A', - '\uFC6A': '\u0628\u0631', - '\uFC6B': '\u0628\u0632', - '\uFC6C': '\u0628\u0645', - '\uFC6D': '\u0628\u0646', - '\uFC6E': '\u0628\u0649', - '\uFC6F': '\u0628\u064A', - '\uFC70': '\u062A\u0631', - '\uFC71': '\u062A\u0632', - '\uFC72': '\u062A\u0645', - '\uFC73': '\u062A\u0646', - '\uFC74': '\u062A\u0649', - '\uFC75': '\u062A\u064A', - '\uFC76': '\u062B\u0631', - '\uFC77': '\u062B\u0632', - '\uFC78': '\u062B\u0645', - '\uFC79': '\u062B\u0646', - '\uFC7A': '\u062B\u0649', - '\uFC7B': '\u062B\u064A', - '\uFC7C': '\u0641\u0649', - '\uFC7D': '\u0641\u064A', - '\uFC7E': '\u0642\u0649', - '\uFC7F': '\u0642\u064A', - '\uFC80': '\u0643\u0627', - '\uFC81': '\u0643\u0644', - '\uFC82': '\u0643\u0645', - '\uFC83': '\u0643\u0649', - '\uFC84': '\u0643\u064A', - '\uFC85': '\u0644\u0645', - '\uFC86': '\u0644\u0649', - '\uFC87': '\u0644\u064A', - '\uFC88': '\u0645\u0627', - '\uFC89': '\u0645\u0645', - '\uFC8A': '\u0646\u0631', - '\uFC8B': '\u0646\u0632', - '\uFC8C': '\u0646\u0645', - '\uFC8D': '\u0646\u0646', - '\uFC8E': '\u0646\u0649', - '\uFC8F': '\u0646\u064A', - '\uFC90': '\u0649\u0670', - '\uFC91': '\u064A\u0631', - '\uFC92': '\u064A\u0632', - '\uFC93': '\u064A\u0645', - '\uFC94': '\u064A\u0646', - '\uFC95': '\u064A\u0649', - '\uFC96': '\u064A\u064A', - '\uFC97': '\u0626\u062C', - '\uFC98': '\u0626\u062D', - '\uFC99': '\u0626\u062E', - '\uFC9A': '\u0626\u0645', - '\uFC9B': '\u0626\u0647', - '\uFC9C': '\u0628\u062C', - '\uFC9D': '\u0628\u062D', - '\uFC9E': '\u0628\u062E', - '\uFC9F': '\u0628\u0645', - '\uFCA0': '\u0628\u0647', - '\uFCA1': '\u062A\u062C', - '\uFCA2': '\u062A\u062D', - '\uFCA3': '\u062A\u062E', - '\uFCA4': '\u062A\u0645', - '\uFCA5': '\u062A\u0647', - '\uFCA6': '\u062B\u0645', - '\uFCA7': '\u062C\u062D', - '\uFCA8': '\u062C\u0645', - '\uFCA9': '\u062D\u062C', - '\uFCAA': '\u062D\u0645', - '\uFCAB': '\u062E\u062C', - '\uFCAC': '\u062E\u0645', - '\uFCAD': '\u0633\u062C', - '\uFCAE': '\u0633\u062D', - '\uFCAF': '\u0633\u062E', - '\uFCB0': '\u0633\u0645', - '\uFCB1': '\u0635\u062D', - '\uFCB2': '\u0635\u062E', - '\uFCB3': '\u0635\u0645', - '\uFCB4': '\u0636\u062C', - '\uFCB5': '\u0636\u062D', - '\uFCB6': '\u0636\u062E', - '\uFCB7': '\u0636\u0645', - '\uFCB8': '\u0637\u062D', - '\uFCB9': '\u0638\u0645', - '\uFCBA': '\u0639\u062C', - '\uFCBB': '\u0639\u0645', - '\uFCBC': '\u063A\u062C', - '\uFCBD': '\u063A\u0645', - '\uFCBE': '\u0641\u062C', - '\uFCBF': '\u0641\u062D', - '\uFCC0': '\u0641\u062E', - '\uFCC1': '\u0641\u0645', - '\uFCC2': '\u0642\u062D', - '\uFCC3': '\u0642\u0645', - '\uFCC4': '\u0643\u062C', - '\uFCC5': '\u0643\u062D', - '\uFCC6': '\u0643\u062E', - '\uFCC7': '\u0643\u0644', - '\uFCC8': '\u0643\u0645', - '\uFCC9': '\u0644\u062C', - '\uFCCA': '\u0644\u062D', - '\uFCCB': '\u0644\u062E', - '\uFCCC': '\u0644\u0645', - '\uFCCD': '\u0644\u0647', - '\uFCCE': '\u0645\u062C', - '\uFCCF': '\u0645\u062D', - '\uFCD0': '\u0645\u062E', - '\uFCD1': '\u0645\u0645', - '\uFCD2': '\u0646\u062C', - '\uFCD3': '\u0646\u062D', - '\uFCD4': '\u0646\u062E', - '\uFCD5': '\u0646\u0645', - '\uFCD6': '\u0646\u0647', - '\uFCD7': '\u0647\u062C', - '\uFCD8': '\u0647\u0645', - '\uFCD9': '\u0647\u0670', - '\uFCDA': '\u064A\u062C', - '\uFCDB': '\u064A\u062D', - '\uFCDC': '\u064A\u062E', - '\uFCDD': '\u064A\u0645', - '\uFCDE': '\u064A\u0647', - '\uFCDF': '\u0626\u0645', - '\uFCE0': '\u0626\u0647', - '\uFCE1': '\u0628\u0645', - '\uFCE2': '\u0628\u0647', - '\uFCE3': '\u062A\u0645', - '\uFCE4': '\u062A\u0647', - '\uFCE5': '\u062B\u0645', - '\uFCE6': '\u062B\u0647', - '\uFCE7': '\u0633\u0645', - '\uFCE8': '\u0633\u0647', - '\uFCE9': '\u0634\u0645', - '\uFCEA': '\u0634\u0647', - '\uFCEB': '\u0643\u0644', - '\uFCEC': '\u0643\u0645', - '\uFCED': '\u0644\u0645', - '\uFCEE': '\u0646\u0645', - '\uFCEF': '\u0646\u0647', - '\uFCF0': '\u064A\u0645', - '\uFCF1': '\u064A\u0647', - '\uFCF2': '\u0640\u064E\u0651', - '\uFCF3': '\u0640\u064F\u0651', - '\uFCF4': '\u0640\u0650\u0651', - '\uFCF5': '\u0637\u0649', - '\uFCF6': '\u0637\u064A', - '\uFCF7': '\u0639\u0649', - '\uFCF8': '\u0639\u064A', - '\uFCF9': '\u063A\u0649', - '\uFCFA': '\u063A\u064A', - '\uFCFB': '\u0633\u0649', - '\uFCFC': '\u0633\u064A', - '\uFCFD': '\u0634\u0649', - '\uFCFE': '\u0634\u064A', - '\uFCFF': '\u062D\u0649', - '\uFD00': '\u062D\u064A', - '\uFD01': '\u062C\u0649', - '\uFD02': '\u062C\u064A', - '\uFD03': '\u062E\u0649', - '\uFD04': '\u062E\u064A', - '\uFD05': '\u0635\u0649', - '\uFD06': '\u0635\u064A', - '\uFD07': '\u0636\u0649', - '\uFD08': '\u0636\u064A', - '\uFD09': '\u0634\u062C', - '\uFD0A': '\u0634\u062D', - '\uFD0B': '\u0634\u062E', - '\uFD0C': '\u0634\u0645', - '\uFD0D': '\u0634\u0631', - '\uFD0E': '\u0633\u0631', - '\uFD0F': '\u0635\u0631', - '\uFD10': '\u0636\u0631', - '\uFD11': '\u0637\u0649', - '\uFD12': '\u0637\u064A', - '\uFD13': '\u0639\u0649', - '\uFD14': '\u0639\u064A', - '\uFD15': '\u063A\u0649', - '\uFD16': '\u063A\u064A', - '\uFD17': '\u0633\u0649', - '\uFD18': '\u0633\u064A', - '\uFD19': '\u0634\u0649', - '\uFD1A': '\u0634\u064A', - '\uFD1B': '\u062D\u0649', - '\uFD1C': '\u062D\u064A', - '\uFD1D': '\u062C\u0649', - '\uFD1E': '\u062C\u064A', - '\uFD1F': '\u062E\u0649', - '\uFD20': '\u062E\u064A', - '\uFD21': '\u0635\u0649', - '\uFD22': '\u0635\u064A', - '\uFD23': '\u0636\u0649', - '\uFD24': '\u0636\u064A', - '\uFD25': '\u0634\u062C', - '\uFD26': '\u0634\u062D', - '\uFD27': '\u0634\u062E', - '\uFD28': '\u0634\u0645', - '\uFD29': '\u0634\u0631', - '\uFD2A': '\u0633\u0631', - '\uFD2B': '\u0635\u0631', - '\uFD2C': '\u0636\u0631', - '\uFD2D': '\u0634\u062C', - '\uFD2E': '\u0634\u062D', - '\uFD2F': '\u0634\u062E', - '\uFD30': '\u0634\u0645', - '\uFD31': '\u0633\u0647', - '\uFD32': '\u0634\u0647', - '\uFD33': '\u0637\u0645', - '\uFD34': '\u0633\u062C', - '\uFD35': '\u0633\u062D', - '\uFD36': '\u0633\u062E', - '\uFD37': '\u0634\u062C', - '\uFD38': '\u0634\u062D', - '\uFD39': '\u0634\u062E', - '\uFD3A': '\u0637\u0645', - '\uFD3B': '\u0638\u0645', - '\uFD3C': '\u0627\u064B', - '\uFD3D': '\u0627\u064B', - '\uFD50': '\u062A\u062C\u0645', - '\uFD51': '\u062A\u062D\u062C', - '\uFD52': '\u062A\u062D\u062C', - '\uFD53': '\u062A\u062D\u0645', - '\uFD54': '\u062A\u062E\u0645', - '\uFD55': '\u062A\u0645\u062C', - '\uFD56': '\u062A\u0645\u062D', - '\uFD57': '\u062A\u0645\u062E', - '\uFD58': '\u062C\u0645\u062D', - '\uFD59': '\u062C\u0645\u062D', - '\uFD5A': '\u062D\u0645\u064A', - '\uFD5B': '\u062D\u0645\u0649', - '\uFD5C': '\u0633\u062D\u062C', - '\uFD5D': '\u0633\u062C\u062D', - '\uFD5E': '\u0633\u062C\u0649', - '\uFD5F': '\u0633\u0645\u062D', - '\uFD60': '\u0633\u0645\u062D', - '\uFD61': '\u0633\u0645\u062C', - '\uFD62': '\u0633\u0645\u0645', - '\uFD63': '\u0633\u0645\u0645', - '\uFD64': '\u0635\u062D\u062D', - '\uFD65': '\u0635\u062D\u062D', - '\uFD66': '\u0635\u0645\u0645', - '\uFD67': '\u0634\u062D\u0645', - '\uFD68': '\u0634\u062D\u0645', - '\uFD69': '\u0634\u062C\u064A', - '\uFD6A': '\u0634\u0645\u062E', - '\uFD6B': '\u0634\u0645\u062E', - '\uFD6C': '\u0634\u0645\u0645', - '\uFD6D': '\u0634\u0645\u0645', - '\uFD6E': '\u0636\u062D\u0649', - '\uFD6F': '\u0636\u062E\u0645', - '\uFD70': '\u0636\u062E\u0645', - '\uFD71': '\u0637\u0645\u062D', - '\uFD72': '\u0637\u0645\u062D', - '\uFD73': '\u0637\u0645\u0645', - '\uFD74': '\u0637\u0645\u064A', - '\uFD75': '\u0639\u062C\u0645', - '\uFD76': '\u0639\u0645\u0645', - '\uFD77': '\u0639\u0645\u0645', - '\uFD78': '\u0639\u0645\u0649', - '\uFD79': '\u063A\u0645\u0645', - '\uFD7A': '\u063A\u0645\u064A', - '\uFD7B': '\u063A\u0645\u0649', - '\uFD7C': '\u0641\u062E\u0645', - '\uFD7D': '\u0641\u062E\u0645', - '\uFD7E': '\u0642\u0645\u062D', - '\uFD7F': '\u0642\u0645\u0645', - '\uFD80': '\u0644\u062D\u0645', - '\uFD81': '\u0644\u062D\u064A', - '\uFD82': '\u0644\u062D\u0649', - '\uFD83': '\u0644\u062C\u062C', - '\uFD84': '\u0644\u062C\u062C', - '\uFD85': '\u0644\u062E\u0645', - '\uFD86': '\u0644\u062E\u0645', - '\uFD87': '\u0644\u0645\u062D', - '\uFD88': '\u0644\u0645\u062D', - '\uFD89': '\u0645\u062D\u062C', - '\uFD8A': '\u0645\u062D\u0645', - '\uFD8B': '\u0645\u062D\u064A', - '\uFD8C': '\u0645\u062C\u062D', - '\uFD8D': '\u0645\u062C\u0645', - '\uFD8E': '\u0645\u062E\u062C', - '\uFD8F': '\u0645\u062E\u0645', - '\uFD92': '\u0645\u062C\u062E', - '\uFD93': '\u0647\u0645\u062C', - '\uFD94': '\u0647\u0645\u0645', - '\uFD95': '\u0646\u062D\u0645', - '\uFD96': '\u0646\u062D\u0649', - '\uFD97': '\u0646\u062C\u0645', - '\uFD98': '\u0646\u062C\u0645', - '\uFD99': '\u0646\u062C\u0649', - '\uFD9A': '\u0646\u0645\u064A', - '\uFD9B': '\u0646\u0645\u0649', - '\uFD9C': '\u064A\u0645\u0645', - '\uFD9D': '\u064A\u0645\u0645', - '\uFD9E': '\u0628\u062E\u064A', - '\uFD9F': '\u062A\u062C\u064A', - '\uFDA0': '\u062A\u062C\u0649', - '\uFDA1': '\u062A\u062E\u064A', - '\uFDA2': '\u062A\u062E\u0649', - '\uFDA3': '\u062A\u0645\u064A', - '\uFDA4': '\u062A\u0645\u0649', - '\uFDA5': '\u062C\u0645\u064A', - '\uFDA6': '\u062C\u062D\u0649', - '\uFDA7': '\u062C\u0645\u0649', - '\uFDA8': '\u0633\u062E\u0649', - '\uFDA9': '\u0635\u062D\u064A', - '\uFDAA': '\u0634\u062D\u064A', - '\uFDAB': '\u0636\u062D\u064A', - '\uFDAC': '\u0644\u062C\u064A', - '\uFDAD': '\u0644\u0645\u064A', - '\uFDAE': '\u064A\u062D\u064A', - '\uFDAF': '\u064A\u062C\u064A', - '\uFDB0': '\u064A\u0645\u064A', - '\uFDB1': '\u0645\u0645\u064A', - '\uFDB2': '\u0642\u0645\u064A', - '\uFDB3': '\u0646\u062D\u064A', - '\uFDB4': '\u0642\u0645\u062D', - '\uFDB5': '\u0644\u062D\u0645', - '\uFDB6': '\u0639\u0645\u064A', - '\uFDB7': '\u0643\u0645\u064A', - '\uFDB8': '\u0646\u062C\u062D', - '\uFDB9': '\u0645\u062E\u064A', - '\uFDBA': '\u0644\u062C\u0645', - '\uFDBB': '\u0643\u0645\u0645', - '\uFDBC': '\u0644\u062C\u0645', - '\uFDBD': '\u0646\u062C\u062D', - '\uFDBE': '\u062C\u062D\u064A', - '\uFDBF': '\u062D\u062C\u064A', - '\uFDC0': '\u0645\u062C\u064A', - '\uFDC1': '\u0641\u0645\u064A', - '\uFDC2': '\u0628\u062D\u064A', - '\uFDC3': '\u0643\u0645\u0645', - '\uFDC4': '\u0639\u062C\u0645', - '\uFDC5': '\u0635\u0645\u0645', - '\uFDC6': '\u0633\u062E\u064A', - '\uFDC7': '\u0646\u062C\u064A', - '\uFE49': '\u203E', - '\uFE4A': '\u203E', - '\uFE4B': '\u203E', - '\uFE4C': '\u203E', - '\uFE4D': '\u005F', - '\uFE4E': '\u005F', - '\uFE4F': '\u005F', - '\uFE80': '\u0621', - '\uFE81': '\u0622', - '\uFE82': '\u0622', - '\uFE83': '\u0623', - '\uFE84': '\u0623', - '\uFE85': '\u0624', - '\uFE86': '\u0624', - '\uFE87': '\u0625', - '\uFE88': '\u0625', - '\uFE89': '\u0626', - '\uFE8A': '\u0626', - '\uFE8B': '\u0626', - '\uFE8C': '\u0626', - '\uFE8D': '\u0627', - '\uFE8E': '\u0627', - '\uFE8F': '\u0628', - '\uFE90': '\u0628', - '\uFE91': '\u0628', - '\uFE92': '\u0628', - '\uFE93': '\u0629', - '\uFE94': '\u0629', - '\uFE95': '\u062A', - '\uFE96': '\u062A', - '\uFE97': '\u062A', - '\uFE98': '\u062A', - '\uFE99': '\u062B', - '\uFE9A': '\u062B', - '\uFE9B': '\u062B', - '\uFE9C': '\u062B', - '\uFE9D': '\u062C', - '\uFE9E': '\u062C', - '\uFE9F': '\u062C', - '\uFEA0': '\u062C', - '\uFEA1': '\u062D', - '\uFEA2': '\u062D', - '\uFEA3': '\u062D', - '\uFEA4': '\u062D', - '\uFEA5': '\u062E', - '\uFEA6': '\u062E', - '\uFEA7': '\u062E', - '\uFEA8': '\u062E', - '\uFEA9': '\u062F', - '\uFEAA': '\u062F', - '\uFEAB': '\u0630', - '\uFEAC': '\u0630', - '\uFEAD': '\u0631', - '\uFEAE': '\u0631', - '\uFEAF': '\u0632', - '\uFEB0': '\u0632', - '\uFEB1': '\u0633', - '\uFEB2': '\u0633', - '\uFEB3': '\u0633', - '\uFEB4': '\u0633', - '\uFEB5': '\u0634', - '\uFEB6': '\u0634', - '\uFEB7': '\u0634', - '\uFEB8': '\u0634', - '\uFEB9': '\u0635', - '\uFEBA': '\u0635', - '\uFEBB': '\u0635', - '\uFEBC': '\u0635', - '\uFEBD': '\u0636', - '\uFEBE': '\u0636', - '\uFEBF': '\u0636', - '\uFEC0': '\u0636', - '\uFEC1': '\u0637', - '\uFEC2': '\u0637', - '\uFEC3': '\u0637', - '\uFEC4': '\u0637', - '\uFEC5': '\u0638', - '\uFEC6': '\u0638', - '\uFEC7': '\u0638', - '\uFEC8': '\u0638', - '\uFEC9': '\u0639', - '\uFECA': '\u0639', - '\uFECB': '\u0639', - '\uFECC': '\u0639', - '\uFECD': '\u063A', - '\uFECE': '\u063A', - '\uFECF': '\u063A', - '\uFED0': '\u063A', - '\uFED1': '\u0641', - '\uFED2': '\u0641', - '\uFED3': '\u0641', - '\uFED4': '\u0641', - '\uFED5': '\u0642', - '\uFED6': '\u0642', - '\uFED7': '\u0642', - '\uFED8': '\u0642', - '\uFED9': '\u0643', - '\uFEDA': '\u0643', - '\uFEDB': '\u0643', - '\uFEDC': '\u0643', - '\uFEDD': '\u0644', - '\uFEDE': '\u0644', - '\uFEDF': '\u0644', - '\uFEE0': '\u0644', - '\uFEE1': '\u0645', - '\uFEE2': '\u0645', - '\uFEE3': '\u0645', - '\uFEE4': '\u0645', - '\uFEE5': '\u0646', - '\uFEE6': '\u0646', - '\uFEE7': '\u0646', - '\uFEE8': '\u0646', - '\uFEE9': '\u0647', - '\uFEEA': '\u0647', - '\uFEEB': '\u0647', - '\uFEEC': '\u0647', - '\uFEED': '\u0648', - '\uFEEE': '\u0648', - '\uFEEF': '\u0649', - '\uFEF0': '\u0649', - '\uFEF1': '\u064A', - '\uFEF2': '\u064A', - '\uFEF3': '\u064A', - '\uFEF4': '\u064A', - '\uFEF5': '\u0644\u0622', - '\uFEF6': '\u0644\u0622', - '\uFEF7': '\u0644\u0623', - '\uFEF8': '\u0644\u0623', - '\uFEF9': '\u0644\u0625', - '\uFEFA': '\u0644\u0625', - '\uFEFB': '\u0644\u0627', - '\uFEFC': '\u0644\u0627' -}; - -function reverseIfRtl(chars) { - var charsLength = chars.length; - //reverse an arabic ligature - if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { - return chars; - } - var s = ''; - for (var ii = charsLength - 1; ii >= 0; ii--) { - s += chars[ii]; - } - return s; -} - -function adjustWidths(properties) { - if (!properties.fontMatrix) { - return; - } - if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { - return; - } - // adjusting width to fontMatrix scale - var scale = 0.001 / properties.fontMatrix[0]; - var glyphsWidths = properties.widths; - for (var glyph in glyphsWidths) { - glyphsWidths[glyph] *= scale; - } - properties.defaultWidth *= scale; -} - -function getFontType(type, subtype) { - switch (type) { - case 'Type1': - return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1; - case 'CIDFontType0': - return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C : - FontType.CIDFONTTYPE0; - case 'OpenType': - return FontType.OPENTYPE; - case 'TrueType': - return FontType.TRUETYPE; - case 'CIDFontType2': - return FontType.CIDFONTTYPE2; - case 'MMType1': - return FontType.MMTYPE1; - case 'Type0': - return FontType.TYPE0; - default: - return FontType.UNKNOWN; - } -} - -var Glyph = (function GlyphClosure() { - function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, - isSpace) { - this.fontChar = fontChar; - this.unicode = unicode; - this.accent = accent; - this.width = width; - this.vmetric = vmetric; - this.operatorListId = operatorListId; - this.isSpace = isSpace; - } - - Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, - vmetric, operatorListId, isSpace) { - return this.fontChar === fontChar && - this.unicode === unicode && - this.accent === accent && - this.width === width && - this.vmetric === vmetric && - this.operatorListId === operatorListId && - this.isSpace === isSpace; - }; - - return Glyph; -})(); - -var ToUnicodeMap = (function ToUnicodeMapClosure() { - function ToUnicodeMap(cmap) { - // The elements of this._map can be integers or strings, depending on how - // |cmap| was created. - this._map = cmap; - } - - ToUnicodeMap.prototype = { - get length() { - return this._map.length; - }, - - forEach: function(callback) { - for (var charCode in this._map) { - callback(charCode, this._map[charCode].charCodeAt(0)); - } - }, - - has: function(i) { - return this._map[i] !== undefined; - }, - - get: function(i) { - return this._map[i]; - }, - - charCodeOf: function(v) { - return this._map.indexOf(v); - } - }; - - return ToUnicodeMap; -})(); - -var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { - function IdentityToUnicodeMap(firstChar, lastChar) { - this.firstChar = firstChar; - this.lastChar = lastChar; - } - - IdentityToUnicodeMap.prototype = { - get length() { - return (this.lastChar + 1) - this.firstChar; - }, - - forEach: function (callback) { - for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { - callback(i, i); - } - }, - - has: function (i) { - return this.firstChar <= i && i <= this.lastChar; - }, - - get: function (i) { - if (this.firstChar <= i && i <= this.lastChar) { - return String.fromCharCode(i); - } - return undefined; - }, - - charCodeOf: function (v) { - return (isInt(v) && v >= this.firstChar && v <= this.lastChar) ? v : -1; - } - }; - - return IdentityToUnicodeMap; -})(); - -var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { - function writeInt16(dest, offset, num) { - dest[offset] = (num >> 8) & 0xFF; - dest[offset + 1] = num & 0xFF; - } - - function writeInt32(dest, offset, num) { - dest[offset] = (num >> 24) & 0xFF; - dest[offset + 1] = (num >> 16) & 0xFF; - dest[offset + 2] = (num >> 8) & 0xFF; - dest[offset + 3] = num & 0xFF; - } - - function writeData(dest, offset, data) { - var i, ii; - if (data instanceof Uint8Array) { - dest.set(data, offset); - } else if (typeof data === 'string') { - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data.charCodeAt(i) & 0xFF; - } - } else { - // treating everything else as array - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data[i] & 0xFF; - } - } - } - - function OpenTypeFileBuilder(sfnt) { - this.sfnt = sfnt; - this.tables = Object.create(null); - } - - OpenTypeFileBuilder.getSearchParams = - function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) { - var maxPower2 = 1, log2 = 0; - while ((maxPower2 ^ entriesCount) > maxPower2) { - maxPower2 <<= 1; - log2++; - } - var searchRange = maxPower2 * entrySize; - return { - range: searchRange, - entry: log2, - rangeShift: entrySize * entriesCount - searchRange - }; - }; - - var OTF_HEADER_SIZE = 12; - var OTF_TABLE_ENTRY_SIZE = 16; - - OpenTypeFileBuilder.prototype = { - toArray: function OpenTypeFileBuilder_toArray() { - var sfnt = this.sfnt; - - // Tables needs to be written by ascendant alphabetic order - var tables = this.tables; - var tablesNames = Object.keys(tables); - tablesNames.sort(); - var numTables = tablesNames.length; - - var i, j, jj, table, tableName; - // layout the tables data - var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; - var tableOffsets = [offset]; - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - var paddedLength = ((table.length + 3) & ~3) >>> 0; - offset += paddedLength; - tableOffsets.push(offset); - } - - var file = new Uint8Array(offset); - // write the table data first (mostly for checksum) - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - writeData(file, tableOffsets[i], table); - } - - // sfnt version (4 bytes) - if (sfnt === 'true') { - // Windows hates the Mac TrueType sfnt version number - sfnt = string32(0x00010000); - } - file[0] = sfnt.charCodeAt(0) & 0xFF; - file[1] = sfnt.charCodeAt(1) & 0xFF; - file[2] = sfnt.charCodeAt(2) & 0xFF; - file[3] = sfnt.charCodeAt(3) & 0xFF; - - // numTables (2 bytes) - writeInt16(file, 4, numTables); - - var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); - - // searchRange (2 bytes) - writeInt16(file, 6, searchParams.range); - // entrySelector (2 bytes) - writeInt16(file, 8, searchParams.entry); - // rangeShift (2 bytes) - writeInt16(file, 10, searchParams.rangeShift); - - offset = OTF_HEADER_SIZE; - // writing table entries - for (i = 0; i < numTables; i++) { - tableName = tablesNames[i]; - file[offset] = tableName.charCodeAt(0) & 0xFF; - file[offset + 1] = tableName.charCodeAt(1) & 0xFF; - file[offset + 2] = tableName.charCodeAt(2) & 0xFF; - file[offset + 3] = tableName.charCodeAt(3) & 0xFF; - - // checksum - var checksum = 0; - for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { - var quad = (file[j] << 24) + (file[j + 1] << 16) + - (file[j + 2] << 8) + file[j + 3]; - checksum = (checksum + quad) | 0; - } - writeInt32(file, offset + 4, checksum); - - // offset - writeInt32(file, offset + 8, tableOffsets[i]); - // length - writeInt32(file, offset + 12, tables[tableName].length); - - offset += OTF_TABLE_ENTRY_SIZE; - } - return file; - }, - - addTable: function OpenTypeFileBuilder_addTable(tag, data) { - if (tag in this.tables) { - throw new Error('Table ' + tag + ' already exists'); - } - this.tables[tag] = data; - } - }; - - return OpenTypeFileBuilder; -})(); - -// Problematic Unicode characters in the fonts that needs to be moved to avoid -// issues when they are painted on the canvas, e.g. complex-script shaping or -// control/whitespace characters. The ranges are listed in pairs: the first item -// is a code of the first problematic code, the second one is the next -// non-problematic code. The ranges must be in sorted order. -var ProblematicCharRanges = new Int32Array([ - // Control characters. - 0x0000, 0x0020, - 0x007F, 0x00A1, - 0x00AD, 0x00AE, - // Chars that is used in complex-script shaping. - 0x0600, 0x0780, - 0x08A0, 0x10A0, - 0x1780, 0x1800, - // General punctuation chars. - 0x2000, 0x2010, - 0x2011, 0x2012, - 0x2028, 0x2030, - 0x205F, 0x2070, - 0x25CC, 0x25CD, - // Chars that is used in complex-script shaping. - 0xAA60, 0xAA80, - // Specials Unicode block. - 0xFFF0, 0x10000 -]); - -/** - * 'Font' is the class the outside world should use, it encapsulate all the font - * decoding logics whatever type it is (assuming the font type is supported). - * - * For example to read a Type1 font and to attach it to the document: - * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); - * type1Font.bind(); - */ -var Font = (function FontClosure() { - function Font(name, file, properties) { - var charCode, glyphName, fontChar; - - this.name = name; - this.loadedName = properties.loadedName; - this.isType3Font = properties.isType3Font; - this.sizes = []; - - this.glyphCache = {}; - - var names = name.split('+'); - names = names.length > 1 ? names[1] : names[0]; - names = names.split(/[-,_]/g)[0]; - this.isSerifFont = !!(properties.flags & FontFlags.Serif); - this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); - - var type = properties.type; - var subtype = properties.subtype; - this.type = type; - - this.fallbackName = (this.isMonospace ? 'monospace' : - (this.isSerifFont ? 'serif' : 'sans-serif')); - - this.differences = properties.differences; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.composite = properties.composite; - this.wideChars = properties.wideChars; - this.cMap = properties.cMap; - this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; - this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; - this.fontMatrix = properties.fontMatrix; - this.bbox = properties.bbox; - - this.toUnicode = properties.toUnicode = this.buildToUnicode(properties); - - this.toFontChar = []; - - if (properties.type === 'Type3') { - for (charCode = 0; charCode < 256; charCode++) { - this.toFontChar[charCode] = (this.differences[charCode] || - properties.defaultEncoding[charCode]); - } - this.fontType = FontType.TYPE3; - return; - } - - this.cidEncoding = properties.cidEncoding; - this.vertical = properties.vertical; - if (this.vertical) { - this.vmetrics = properties.vmetrics; - this.defaultVMetrics = properties.defaultVMetrics; - } - - if (!file || file.isEmpty) { - if (file) { - // Some bad PDF generators will include empty font files, - // attempting to recover by assuming that no file exists. - warn('Font file is empty in "' + name + '" (' + this.loadedName + ')'); - } - - this.missingFile = true; - // The file data is not specified. Trying to fix the font name - // to be used with the canvas.font. - var fontName = name.replace(/[,_]/g, '-'); - var isStandardFont = !!stdFontMap[fontName] || - !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); - fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; - - this.bold = (fontName.search(/bold/gi) !== -1); - this.italic = ((fontName.search(/oblique/gi) !== -1) || - (fontName.search(/italic/gi) !== -1)); - - // Use 'name' instead of 'fontName' here because the original - // name ArialBlack for example will be replaced by Helvetica. - this.black = (name.search(/Black/g) !== -1); - - // if at least one width is present, remeasure all chars when exists - this.remeasure = Object.keys(this.widths).length > 0; - if (isStandardFont && type === 'CIDFontType2' && - properties.cidEncoding.indexOf('Identity-') === 0) { - // Standard fonts might be embedded as CID font without glyph mapping. - // Building one based on GlyphMapForStandardFonts. - var map = []; - for (charCode in GlyphMapForStandardFonts) { - map[+charCode] = GlyphMapForStandardFonts[charCode]; - } - if (/ArialBlack/i.test(name)) { - for (charCode in SupplementalGlyphMapForArialBlack) { - map[+charCode] = SupplementalGlyphMapForArialBlack[charCode]; - } - } - var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap; - if (!isIdentityUnicode) { - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - map[+charCode] = unicodeCharCode; - }); - } - this.toFontChar = map; - this.toUnicode = new ToUnicodeMap(map); - } else if (/Symbol/i.test(fontName)) { - var symbols = Encodings.SymbolSetEncoding; - for (charCode in symbols) { - fontChar = GlyphsUnicode[symbols[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - for (charCode in properties.differences) { - fontChar = GlyphsUnicode[properties.differences[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - } else if (/Dingbats/i.test(fontName)) { - if (/Wingdings/i.test(name)) { - warn('Wingdings font without embedded font file, ' + - 'falling back to the ZapfDingbats encoding.'); - } - var dingbats = Encodings.ZapfDingbatsEncoding; - for (charCode in dingbats) { - fontChar = DingbatsGlyphsUnicode[dingbats[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - for (charCode in properties.differences) { - fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - } else if (isStandardFont) { - this.toFontChar = []; - for (charCode in properties.defaultEncoding) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - this.toFontChar[charCode] = GlyphsUnicode[glyphName]; - } - } else { - var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1); - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - if (notCidFont) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode); - } - this.toFontChar[charCode] = unicodeCharCode; - }.bind(this)); - } - this.loadedName = fontName.split('-')[0]; - this.loading = false; - this.fontType = getFontType(type, subtype); - return; - } - - // Some fonts might use wrong font types for Type1C or CIDFontType0C - if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) { - // Some TrueType fonts by mistake claim Type1C - if (isTrueTypeFile(file)) { - subtype = 'TrueType'; - } else { - type = 'Type1'; - } - } - if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') { - type = 'CIDFontType0'; - } - if (subtype === 'OpenType') { - type = 'OpenType'; - } - // Some CIDFontType0C fonts by mistake claim CIDFontType0. - if (type === 'CIDFontType0') { - subtype = isType1File(file) ? 'CIDFontType0' : 'CIDFontType0C'; - } - - var data; - switch (type) { - case 'MMType1': - info('MMType1 font (' + name + '), falling back to Type1.'); - /* falls through */ - case 'Type1': - case 'CIDFontType0': - this.mimetype = 'font/opentype'; - - var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ? - new CFFFont(file, properties) : new Type1Font(name, file, properties); - - adjustWidths(properties); - - // Wrap the CFF data inside an OTF font file - data = this.convert(name, cff, properties); - break; - - case 'OpenType': - case 'TrueType': - case 'CIDFontType2': - this.mimetype = 'font/opentype'; - - // Repair the TrueType file. It is can be damaged in the point of - // view of the sanitizer - data = this.checkAndRepair(name, file, properties); - if (this.isOpenType) { - adjustWidths(properties); - - type = 'OpenType'; - } - break; - - default: - error('Font ' + type + ' is not supported'); - break; - } - - this.data = data; - this.fontType = getFontType(type, subtype); - - // Transfer some properties again that could change during font conversion - this.fontMatrix = properties.fontMatrix; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.encoding = properties.baseEncoding; - this.seacMap = properties.seacMap; - - this.loading = true; - } - - Font.getFontID = (function () { - var ID = 1; - return function Font_getFontID() { - return String(ID++); - }; - })(); - - function int16(b0, b1) { - return (b0 << 8) + b1; - } - - function int32(b0, b1, b2, b3) { - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - } - - function string16(value) { - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function safeString16(value) { - // clamp value to the 16-bit int range - value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value)); - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function isTrueTypeFile(file) { - var header = file.peekBytes(4); - return readUint32(header, 0) === 0x00010000; - } - - function isType1File(file) { - var header = file.peekBytes(2); - // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21). - if (header[0] === 0x25 && header[1] === 0x21) { - return true; - } - // ... obviously some fonts violate that part of the specification, - // please refer to the comment in |Type1Font| below. - if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header. - return true; - } - return false; - } - - /** - * Helper function for |adjustMapping|. - * @return {boolean} - */ - function isProblematicUnicodeLocation(code) { - // Using binary search to find a range start. - var i = 0, j = ProblematicCharRanges.length - 1; - while (i < j) { - var c = (i + j + 1) >> 1; - if (code < ProblematicCharRanges[c]) { - j = c - 1; - } else { - i = c; - } - } - // Even index means code in problematic range. - return !(i & 1); - } - - /** - * Rebuilds the char code to glyph ID map by trying to replace the char codes - * with their unicode value. It also moves char codes that are in known - * problematic locations. - * @return {Object} Two properties: - * 'toFontChar' - maps original char codes(the value that will be read - * from commands such as show text) to the char codes that will be used in the - * font that we build - * 'charCodeToGlyphId' - maps the new font char codes to glyph ids - */ - function adjustMapping(charCodeToGlyphId, properties) { - var toUnicode = properties.toUnicode; - var isSymbolic = !!(properties.flags & FontFlags.Symbolic); - var isIdentityUnicode = - properties.toUnicode instanceof IdentityToUnicodeMap; - var newMap = Object.create(null); - var toFontChar = []; - var usedFontCharCodes = []; - var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START; - for (var originalCharCode in charCodeToGlyphId) { - originalCharCode |= 0; - var glyphId = charCodeToGlyphId[originalCharCode]; - var fontCharCode = originalCharCode; - // First try to map the value to a unicode position if a non identity map - // was created. - if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { - var unicode = toUnicode.get(fontCharCode); - // TODO: Try to map ligatures to the correct spot. - if (unicode.length === 1) { - fontCharCode = unicode.charCodeAt(0); - } - } - // Try to move control characters, special characters and already mapped - // characters to the private use area since they will not be drawn by - // canvas if left in their current position. Also, move characters if the - // font was symbolic and there is only an identity unicode map since the - // characters probably aren't in the correct position (fixes an issue - // with firefox and thuluthfont). - if ((usedFontCharCodes[fontCharCode] !== undefined || - isProblematicUnicodeLocation(fontCharCode) || - (isSymbolic && isIdentityUnicode)) && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left. - // Loop to try and find a free spot in the private use area. - do { - fontCharCode = nextAvailableFontCharCode++; - - if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) { - fontCharCode = 0xF020; - nextAvailableFontCharCode = fontCharCode + 1; - } - - } while (usedFontCharCodes[fontCharCode] !== undefined && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END); - } - - newMap[fontCharCode] = glyphId; - toFontChar[originalCharCode] = fontCharCode; - usedFontCharCodes[fontCharCode] = true; - } - return { - toFontChar: toFontChar, - charCodeToGlyphId: newMap, - nextAvailableFontCharCode: nextAvailableFontCharCode - }; - } - - function getRanges(glyphs, numGlyphs) { - // Array.sort() sorts by characters, not numerically, so convert to an - // array of characters. - var codes = []; - for (var charCode in glyphs) { - // Remove an invalid glyph ID mappings to make OTS happy. - if (glyphs[charCode] >= numGlyphs) { - continue; - } - codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] }); - } - codes.sort(function fontGetRangesSort(a, b) { - return a.fontCharCode - b.fontCharCode; - }); - - // Split the sorted codes into ranges. - var ranges = []; - var length = codes.length; - for (var n = 0; n < length; ) { - var start = codes[n].fontCharCode; - var codeIndices = [codes[n].glyphId]; - ++n; - var end = start; - while (n < length && end + 1 === codes[n].fontCharCode) { - codeIndices.push(codes[n].glyphId); - ++end; - ++n; - if (end === 0xFFFF) { - break; - } - } - ranges.push([start, end, codeIndices]); - } - - return ranges; - } - - function createCmapTable(glyphs, numGlyphs) { - var ranges = getRanges(glyphs, numGlyphs); - var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; - var cmap = '\x00\x00' + // version - string16(numTables) + // numTables - '\x00\x03' + // platformID - '\x00\x01' + // encodingID - string32(4 + numTables * 8); // start of the table record - - var i, ii, j, jj; - for (i = ranges.length - 1; i >= 0; --i) { - if (ranges[i][0] <= 0xFFFF) { break; } - } - var bmpLength = i + 1; - - if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) { - ranges[i][1] = 0xFFFE; - } - var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0; - var segCount = bmpLength + trailingRangesCount; - var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); - - // Fill up the 4 parallel arrays describing the segments. - var startCount = ''; - var endCount = ''; - var idDeltas = ''; - var idRangeOffsets = ''; - var glyphsIds = ''; - var bias = 0; - - var range, start, end, codes; - for (i = 0, ii = bmpLength; i < ii; i++) { - range = ranges[i]; - start = range[0]; - end = range[1]; - startCount += string16(start); - endCount += string16(end); - codes = range[2]; - var contiguous = true; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - contiguous = false; - break; - } - } - if (!contiguous) { - var offset = (segCount - i) * 2 + bias * 2; - bias += (end - start + 1); - - idDeltas += string16(0); - idRangeOffsets += string16(offset); - - for (j = 0, jj = codes.length; j < jj; ++j) { - glyphsIds += string16(codes[j]); - } - } else { - var startCode = codes[0]; - - idDeltas += string16((startCode - start) & 0xFFFF); - idRangeOffsets += string16(0); - } - } - - if (trailingRangesCount > 0) { - endCount += '\xFF\xFF'; - startCount += '\xFF\xFF'; - idDeltas += '\x00\x01'; - idRangeOffsets += '\x00\x00'; - } - - var format314 = '\x00\x00' + // language - string16(2 * segCount) + - string16(searchParams.range) + - string16(searchParams.entry) + - string16(searchParams.rangeShift) + - endCount + '\x00\x00' + startCount + - idDeltas + idRangeOffsets + glyphsIds; - - var format31012 = ''; - var header31012 = ''; - if (numTables > 1) { - cmap += '\x00\x03' + // platformID - '\x00\x0A' + // encodingID - string32(4 + numTables * 8 + - 4 + format314.length); // start of the table record - format31012 = ''; - for (i = 0, ii = ranges.length; i < ii; i++) { - range = ranges[i]; - start = range[0]; - codes = range[2]; - var code = codes[0]; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - end = range[0] + j - 1; - format31012 += string32(start) + // startCharCode - string32(end) + // endCharCode - string32(code); // startGlyphID - start = end + 1; - code = codes[j]; - } - } - format31012 += string32(start) + // startCharCode - string32(range[1]) + // endCharCode - string32(code); // startGlyphID - } - header31012 = '\x00\x0C' + // format - '\x00\x00' + // reserved - string32(format31012.length + 16) + // length - '\x00\x00\x00\x00' + // language - string32(format31012.length / 12); // nGroups - } - - return cmap + '\x00\x04' + // format - string16(format314.length + 4) + // length - format314 + header31012 + format31012; - } - - function validateOS2Table(os2) { - var stream = new Stream(os2.data); - var version = stream.getUint16(); - // TODO verify all OS/2 tables fields, but currently we validate only those - // that give us issues - stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges - var selection = stream.getUint16(); - if (version < 4 && (selection & 0x0300)) { - return false; - } - var firstChar = stream.getUint16(); - var lastChar = stream.getUint16(); - if (firstChar > lastChar) { - return false; - } - stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap - var usWinAscent = stream.getUint16(); - if (usWinAscent === 0) { // makes font unreadable by windows - return false; - } - - // OS/2 appears to be valid, resetting some fields - os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0 - return true; - } - - function createOS2Table(properties, charstrings, override) { - override = override || { - unitsPerEm: 0, - yMax: 0, - yMin: 0, - ascent: 0, - descent: 0 - }; - - var ulUnicodeRange1 = 0; - var ulUnicodeRange2 = 0; - var ulUnicodeRange3 = 0; - var ulUnicodeRange4 = 0; - - var firstCharIndex = null; - var lastCharIndex = 0; - - if (charstrings) { - for (var code in charstrings) { - code |= 0; - if (firstCharIndex > code || !firstCharIndex) { - firstCharIndex = code; - } - if (lastCharIndex < code) { - lastCharIndex = code; - } - - var position = getUnicodeRangeFor(code); - if (position < 32) { - ulUnicodeRange1 |= 1 << position; - } else if (position < 64) { - ulUnicodeRange2 |= 1 << position - 32; - } else if (position < 96) { - ulUnicodeRange3 |= 1 << position - 64; - } else if (position < 123) { - ulUnicodeRange4 |= 1 << position - 96; - } else { - error('Unicode ranges Bits > 123 are reserved for internal usage'); - } - } - } else { - // TODO - firstCharIndex = 0; - lastCharIndex = 255; - } - - var bbox = properties.bbox || [0, 0, 0, 0]; - var unitsPerEm = (override.unitsPerEm || - 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]); - - // if the font units differ to the PDF glyph space units - // then scale up the values - var scale = (properties.ascentScaled ? 1.0 : - unitsPerEm / PDF_GLYPH_SPACE_UNITS); - - var typoAscent = (override.ascent || - Math.round(scale * (properties.ascent || bbox[3]))); - var typoDescent = (override.descent || - Math.round(scale * (properties.descent || bbox[1]))); - if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { - typoDescent = -typoDescent; // fixing incorrect descent - } - var winAscent = override.yMax || typoAscent; - var winDescent = -override.yMin || -typoDescent; - - return '\x00\x03' + // version - '\x02\x24' + // xAvgCharWidth - '\x01\xF4' + // usWeightClass - '\x00\x05' + // usWidthClass - '\x00\x00' + // fstype (0 to let the font loads via font-face on IE) - '\x02\x8A' + // ySubscriptXSize - '\x02\xBB' + // ySubscriptYSize - '\x00\x00' + // ySubscriptXOffset - '\x00\x8C' + // ySubscriptYOffset - '\x02\x8A' + // ySuperScriptXSize - '\x02\xBB' + // ySuperScriptYSize - '\x00\x00' + // ySuperScriptXOffset - '\x01\xDF' + // ySuperScriptYOffset - '\x00\x31' + // yStrikeOutSize - '\x01\x02' + // yStrikeOutPosition - '\x00\x00' + // sFamilyClass - '\x00\x00\x06' + - String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + - '\x00\x00\x00\x00\x00\x00' + // Panose - string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31) - string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63) - string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95) - string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127) - '\x2A\x32\x31\x2A' + // achVendID - string16(properties.italicAngle ? 1 : 0) + // fsSelection - string16(firstCharIndex || - properties.firstChar) + // usFirstCharIndex - string16(lastCharIndex || properties.lastChar) + // usLastCharIndex - string16(typoAscent) + // sTypoAscender - string16(typoDescent) + // sTypoDescender - '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value) - string16(winAscent) + // usWinAscent - string16(winDescent) + // usWinDescent - '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31) - '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63) - string16(properties.xHeight) + // sxHeight - string16(properties.capHeight) + // sCapHeight - string16(0) + // usDefaultChar - string16(firstCharIndex || properties.firstChar) + // usBreakChar - '\x00\x03'; // usMaxContext - } - - function createPostTable(properties) { - var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16))); - return ('\x00\x03\x00\x00' + // Version number - string32(angle) + // italicAngle - '\x00\x00' + // underlinePosition - '\x00\x00' + // underlineThickness - string32(properties.fixedPitch) + // isFixedPitch - '\x00\x00\x00\x00' + // minMemType42 - '\x00\x00\x00\x00' + // maxMemType42 - '\x00\x00\x00\x00' + // minMemType1 - '\x00\x00\x00\x00'); // maxMemType1 - } - - function createNameTable(name, proto) { - if (!proto) { - proto = [[], []]; // no strings and unicode strings - } - - var strings = [ - proto[0][0] || 'Original licence', // 0.Copyright - proto[0][1] || name, // 1.Font family - proto[0][2] || 'Unknown', // 2.Font subfamily (font weight) - proto[0][3] || 'uniqueID', // 3.Unique ID - proto[0][4] || name, // 4.Full font name - proto[0][5] || 'Version 0.11', // 5.Version - proto[0][6] || '', // 6.Postscript name - proto[0][7] || 'Unknown', // 7.Trademark - proto[0][8] || 'Unknown', // 8.Manufacturer - proto[0][9] || 'Unknown' // 9.Designer - ]; - - // Mac want 1-byte per character strings while Windows want - // 2-bytes per character, so duplicate the names table - var stringsUnicode = []; - var i, ii, j, jj, str; - for (i = 0, ii = strings.length; i < ii; i++) { - str = proto[1][i] || strings[i]; - - var strBufUnicode = []; - for (j = 0, jj = str.length; j < jj; j++) { - strBufUnicode.push(string16(str.charCodeAt(j))); - } - stringsUnicode.push(strBufUnicode.join('')); - } - - var names = [strings, stringsUnicode]; - var platforms = ['\x00\x01', '\x00\x03']; - var encodings = ['\x00\x00', '\x00\x01']; - var languages = ['\x00\x00', '\x04\x09']; - - var namesRecordCount = strings.length * platforms.length; - var nameTable = - '\x00\x00' + // format - string16(namesRecordCount) + // Number of names Record - string16(namesRecordCount * 12 + 6); // Storage - - // Build the name records field - var strOffset = 0; - for (i = 0, ii = platforms.length; i < ii; i++) { - var strs = names[i]; - for (j = 0, jj = strs.length; j < jj; j++) { - str = strs[j]; - var nameRecord = - platforms[i] + // platform ID - encodings[i] + // encoding ID - languages[i] + // language ID - string16(j) + // name ID - string16(str.length) + - string16(strOffset); - nameTable += nameRecord; - strOffset += str.length; - } - } - - nameTable += strings.join('') + stringsUnicode.join(''); - return nameTable; - } - - Font.prototype = { - name: null, - font: null, - mimetype: null, - encoding: null, - get renderer() { - var renderer = FontRendererFactory.create(this); - return shadow(this, 'renderer', renderer); - }, - - exportData: function Font_exportData() { - var data = {}; - for (var i in this) { - if (this.hasOwnProperty(i)) { - data[i] = this[i]; - } - } - return data; - }, - - checkAndRepair: function Font_checkAndRepair(name, font, properties) { - function readTableEntry(file) { - var tag = bytesToString(file.getBytes(4)); - - var checksum = file.getInt32(); - var offset = file.getInt32() >>> 0; - var length = file.getInt32() >>> 0; - - // Read the table associated data - var previousPosition = file.pos; - file.pos = file.start ? file.start : 0; - file.skip(offset); - var data = file.getBytes(length); - file.pos = previousPosition; - - if (tag === 'head') { - // clearing checksum adjustment - data[8] = data[9] = data[10] = data[11] = 0; - data[17] |= 0x20; //Set font optimized for cleartype flag - } - - return { - tag: tag, - checksum: checksum, - length: length, - offset: offset, - data: data - }; - } - - function readOpenTypeHeader(ttf) { - return { - version: bytesToString(ttf.getBytes(4)), - numTables: ttf.getUint16(), - searchRange: ttf.getUint16(), - entrySelector: ttf.getUint16(), - rangeShift: ttf.getUint16() - }; - } - - /** - * Read the appropriate subtable from the cmap according to 9.6.6.4 from - * PDF spec - */ - function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) { - if (!cmap) { - warn('No cmap table available.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - var segment; - var start = (font.start ? font.start : 0) + cmap.offset; - font.pos = start; - - var version = font.getUint16(); - var numTables = font.getUint16(); - - var potentialTable; - var canBreak = false; - // There's an order of preference in terms of which cmap subtable to - // use: - // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table - // - symbolic fonts the preference is a 3,0 table then a 1,0 table - // The following takes advantage of the fact that the tables are sorted - // to work. - for (var i = 0; i < numTables; i++) { - var platformId = font.getUint16(); - var encodingId = font.getUint16(); - var offset = font.getInt32() >>> 0; - var useTable = false; - - if (platformId === 0 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 1 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 3 && encodingId === 1 && - ((!isSymbolicFont && hasEncoding) || !potentialTable)) { - useTable = true; - if (!isSymbolicFont) { - canBreak = true; - } - } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { - useTable = true; - canBreak = true; - } - - if (useTable) { - potentialTable = { - platformId: platformId, - encodingId: encodingId, - offset: offset - }; - } - if (canBreak) { - break; - } - } - - if (potentialTable) { - font.pos = start + potentialTable.offset; - } - if (!potentialTable || font.peekByte() === -1) { - warn('Could not find a preferred cmap table.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - var format = font.getUint16(); - var length = font.getUint16(); - var language = font.getUint16(); - - var hasShortCmap = false; - var mappings = []; - var j, glyphId; - - // TODO(mack): refactor this cmap subtable reading logic out - if (format === 0) { - for (j = 0; j < 256; j++) { - var index = font.getByte(); - if (!index) { - continue; - } - mappings.push({ - charCode: j, - glyphId: index - }); - } - hasShortCmap = true; - } else if (format === 4) { - // re-creating the table in format 4 since the encoding - // might be changed - var segCount = (font.getUint16() >> 1); - font.getBytes(6); // skipping range fields - var segIndex, segments = []; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments.push({ end: font.getUint16() }); - } - font.getUint16(); - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].start = font.getUint16(); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].delta = font.getUint16(); - } - - var offsetsCount = 0; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - var rangeOffset = font.getUint16(); - if (!rangeOffset) { - segment.offsetIndex = -1; - continue; - } - - var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); - segment.offsetIndex = offsetIndex; - offsetsCount = Math.max(offsetsCount, offsetIndex + - segment.end - segment.start + 1); - } - - var offsets = []; - for (j = 0; j < offsetsCount; j++) { - offsets.push(font.getUint16()); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - start = segment.start; - var end = segment.end; - var delta = segment.delta; - offsetIndex = segment.offsetIndex; - - for (j = start; j <= end; j++) { - if (j === 0xFFFF) { - continue; - } - - glyphId = (offsetIndex < 0 ? - j : offsets[offsetIndex + j - start]); - glyphId = (glyphId + delta) & 0xFFFF; - if (glyphId === 0) { - continue; - } - mappings.push({ - charCode: j, - glyphId: glyphId - }); - } - } - } else if (format === 6) { - // Format 6 is a 2-bytes dense mapping, which means the font data - // lives glue together even if they are pretty far in the unicode - // table. (This looks weird, so I can have missed something), this - // works on Linux but seems to fails on Mac so let's rewrite the - // cmap table to a 3-1-4 style - var firstCode = font.getUint16(); - var entryCount = font.getUint16(); - - for (j = 0; j < entryCount; j++) { - glyphId = font.getUint16(); - var charCode = firstCode + j; - - mappings.push({ - charCode: charCode, - glyphId: glyphId - }); - } - } else { - warn('cmap table has unsupported format: ' + format); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - // removing duplicate entries - mappings.sort(function (a, b) { - return a.charCode - b.charCode; - }); - for (i = 1; i < mappings.length; i++) { - if (mappings[i - 1].charCode === mappings[i].charCode) { - mappings.splice(i, 1); - i--; - } - } - - return { - platformId: potentialTable.platformId, - encodingId: potentialTable.encodingId, - mappings: mappings, - hasShortCmap: hasShortCmap - }; - } - - function sanitizeMetrics(font, header, metrics, numGlyphs) { - if (!header) { - if (metrics) { - metrics.data = null; - } - return; - } - - font.pos = (font.start ? font.start : 0) + header.offset; - font.pos += header.length - 2; - var numOfMetrics = font.getUint16(); - - if (numOfMetrics > numGlyphs) { - info('The numOfMetrics (' + numOfMetrics + ') should not be ' + - 'greater than the numGlyphs (' + numGlyphs + ')'); - // Reduce numOfMetrics if it is greater than numGlyphs - numOfMetrics = numGlyphs; - header.data[34] = (numOfMetrics & 0xff00) >> 8; - header.data[35] = numOfMetrics & 0x00ff; - } - - var numOfSidebearings = numGlyphs - numOfMetrics; - var numMissing = numOfSidebearings - - ((metrics.length - numOfMetrics * 4) >> 1); - - if (numMissing > 0) { - // For each missing glyph, we set both the width and lsb to 0 (zero). - // Since we need to add two properties for each glyph, this explains - // the use of |numMissing * 2| when initializing the typed array. - var entries = new Uint8Array(metrics.length + numMissing * 2); - entries.set(metrics.data); - metrics.data = entries; - } - } - - function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, - hintsValid) { - if (sourceEnd - sourceStart <= 12) { - // glyph with data less than 12 is invalid one - return 0; - } - var glyf = source.subarray(sourceStart, sourceEnd); - var contoursCount = (glyf[0] << 8) | glyf[1]; - if (contoursCount & 0x8000) { - // complex glyph, writing as is - dest.set(glyf, destStart); - return glyf.length; - } - - var i, j = 10, flagsCount = 0; - for (i = 0; i < contoursCount; i++) { - var endPoint = (glyf[j] << 8) | glyf[j + 1]; - flagsCount = endPoint + 1; - j += 2; - } - // skipping instructions - var instructionsStart = j; - var instructionsLength = (glyf[j] << 8) | glyf[j + 1]; - j += 2 + instructionsLength; - var instructionsEnd = j; - // validating flags - var coordinatesLength = 0; - for (i = 0; i < flagsCount; i++) { - var flag = glyf[j++]; - if (flag & 0xC0) { - // reserved flags must be zero, cleaning up - glyf[j - 1] = flag & 0x3F; - } - var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) + - ((flag & 4) ? 1 : (flag & 32) ? 0 : 2); - coordinatesLength += xyLength; - if (flag & 8) { - var repeat = glyf[j++]; - i += repeat; - coordinatesLength += repeat * xyLength; - } - } - // glyph without coordinates will be rejected - if (coordinatesLength === 0) { - return 0; - } - var glyphDataLength = j + coordinatesLength; - if (glyphDataLength > glyf.length) { - // not enough data for coordinates - return 0; - } - if (!hintsValid && instructionsLength > 0) { - dest.set(glyf.subarray(0, instructionsStart), destStart); - dest.set([0, 0], destStart + instructionsStart); - dest.set(glyf.subarray(instructionsEnd, glyphDataLength), - destStart + instructionsStart + 2); - glyphDataLength -= instructionsLength; - if (glyf.length - glyphDataLength > 3) { - glyphDataLength = (glyphDataLength + 3) & ~3; - } - return glyphDataLength; - } - if (glyf.length - glyphDataLength > 3) { - // truncating and aligning to 4 bytes the long glyph data - glyphDataLength = (glyphDataLength + 3) & ~3; - dest.set(glyf.subarray(0, glyphDataLength), destStart); - return glyphDataLength; - } - // glyph data is fine - dest.set(glyf, destStart); - return glyf.length; - } - - function sanitizeHead(head, numGlyphs, locaLength) { - var data = head.data; - - // Validate version: - // Should always be 0x00010000 - var version = int32(data[0], data[1], data[2], data[3]); - if (version >> 16 !== 1) { - info('Attempting to fix invalid version in head table: ' + version); - data[0] = 0; - data[1] = 1; - data[2] = 0; - data[3] = 0; - } - - var indexToLocFormat = int16(data[50], data[51]); - if (indexToLocFormat < 0 || indexToLocFormat > 1) { - info('Attempting to fix invalid indexToLocFormat in head table: ' + - indexToLocFormat); - - // The value of indexToLocFormat should be 0 if the loca table - // consists of short offsets, and should be 1 if the loca table - // consists of long offsets. - // - // The number of entries in the loca table should be numGlyphs + 1. - // - // Using this information, we can work backwards to deduce if the - // size of each offset in the loca table, and thus figure out the - // appropriate value for indexToLocFormat. - - var numGlyphsPlusOne = numGlyphs + 1; - if (locaLength === numGlyphsPlusOne << 1) { - // 0x0000 indicates the loca table consists of short offsets - data[50] = 0; - data[51] = 0; - } else if (locaLength === numGlyphsPlusOne << 2) { - // 0x0001 indicates the loca table consists of long offsets - data[50] = 0; - data[51] = 1; - } else { - warn('Could not fix indexToLocFormat: ' + indexToLocFormat); - } - } - } - - function sanitizeGlyphLocations(loca, glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, - dupFirstEntry) { - var itemSize, itemDecode, itemEncode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - itemEncode = function fontItemEncodeLong(data, offset, value) { - data[offset] = (value >>> 24) & 0xFF; - data[offset + 1] = (value >> 16) & 0xFF; - data[offset + 2] = (value >> 8) & 0xFF; - data[offset + 3] = value & 0xFF; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - itemEncode = function fontItemEncode(data, offset, value) { - data[offset] = (value >> 9) & 0xFF; - data[offset + 1] = (value >> 1) & 0xFF; - }; - } - var locaData = loca.data; - var locaDataSize = itemSize * (1 + numGlyphs); - // is loca.data too short or long? - if (locaData.length !== locaDataSize) { - locaData = new Uint8Array(locaDataSize); - locaData.set(loca.data.subarray(0, locaDataSize)); - loca.data = locaData; - } - // removing the invalid glyphs - var oldGlyfData = glyf.data; - var oldGlyfDataLength = oldGlyfData.length; - var newGlyfData = new Uint8Array(oldGlyfDataLength); - var startOffset = itemDecode(locaData, 0); - var writeOffset = 0; - var missingGlyphData = {}; - itemEncode(locaData, 0, writeOffset); - var i, j; - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - var endOffset = itemDecode(locaData, j); - if (endOffset > oldGlyfDataLength && - ((oldGlyfDataLength + 3) & ~3) === endOffset) { - // Aspose breaks fonts by aligning the glyphs to the qword, but not - // the glyf table size, which makes last glyph out of range. - endOffset = oldGlyfDataLength; - } - if (endOffset > oldGlyfDataLength) { - // glyph end offset points outside glyf data, rejecting the glyph - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - continue; - } - - if (startOffset === endOffset) { - missingGlyphData[i] = true; - } - - var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, - newGlyfData, writeOffset, hintsValid); - writeOffset += newLength; - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - } - - if (writeOffset === 0) { - // glyf table cannot be empty -- redoing the glyf and loca tables - // to have single glyph with one point - var simpleGlyph = new Uint8Array( - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - itemEncode(locaData, j, simpleGlyph.length); - } - glyf.data = simpleGlyph; - return missingGlyphData; - } - - if (dupFirstEntry) { - var firstEntryLength = itemDecode(locaData, itemSize); - if (newGlyfData.length > firstEntryLength + writeOffset) { - glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); - } else { - glyf.data = new Uint8Array(firstEntryLength + writeOffset); - glyf.data.set(newGlyfData.subarray(0, writeOffset)); - } - glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); - itemEncode(loca.data, locaData.length - itemSize, - writeOffset + firstEntryLength); - } else { - glyf.data = newGlyfData.subarray(0, writeOffset); - } - return missingGlyphData; - } - - function readPostScriptTable(post, properties, maxpNumGlyphs) { - var start = (font.start ? font.start : 0) + post.offset; - font.pos = start; - - var length = post.length, end = start + length; - var version = font.getInt32(); - // skip rest to the tables - font.getBytes(28); - - var glyphNames; - var valid = true; - var i; - - switch (version) { - case 0x00010000: - glyphNames = MacStandardGlyphOrdering; - break; - case 0x00020000: - var numGlyphs = font.getUint16(); - if (numGlyphs !== maxpNumGlyphs) { - valid = false; - break; - } - var glyphNameIndexes = []; - for (i = 0; i < numGlyphs; ++i) { - var index = font.getUint16(); - if (index >= 32768) { - valid = false; - break; - } - glyphNameIndexes.push(index); - } - if (!valid) { - break; - } - var customNames = []; - var strBuf = []; - while (font.pos < end) { - var stringLength = font.getByte(); - strBuf.length = stringLength; - for (i = 0; i < stringLength; ++i) { - strBuf[i] = String.fromCharCode(font.getByte()); - } - customNames.push(strBuf.join('')); - } - glyphNames = []; - for (i = 0; i < numGlyphs; ++i) { - var j = glyphNameIndexes[i]; - if (j < 258) { - glyphNames.push(MacStandardGlyphOrdering[j]); - continue; - } - glyphNames.push(customNames[j - 258]); - } - break; - case 0x00030000: - break; - default: - warn('Unknown/unsupported post table version ' + version); - valid = false; - if (properties.defaultEncoding) { - glyphNames = properties.defaultEncoding; - } - break; - } - properties.glyphNames = glyphNames; - return valid; - } - - function readNameTable(nameTable) { - var start = (font.start ? font.start : 0) + nameTable.offset; - font.pos = start; - - var names = [[], []]; - var length = nameTable.length, end = start + length; - var format = font.getUint16(); - var FORMAT_0_HEADER_LENGTH = 6; - if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { - // unsupported name table format or table "too" small - return names; - } - var numRecords = font.getUint16(); - var stringsStart = font.getUint16(); - var records = []; - var NAME_RECORD_LENGTH = 12; - var i, ii; - - for (i = 0; i < numRecords && - font.pos + NAME_RECORD_LENGTH <= end; i++) { - var r = { - platform: font.getUint16(), - encoding: font.getUint16(), - language: font.getUint16(), - name: font.getUint16(), - length: font.getUint16(), - offset: font.getUint16() - }; - // using only Macintosh and Windows platform/encoding names - if ((r.platform === 1 && r.encoding === 0 && r.language === 0) || - (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) { - records.push(r); - } - } - for (i = 0, ii = records.length; i < ii; i++) { - var record = records[i]; - var pos = start + stringsStart + record.offset; - if (pos + record.length > end) { - continue; // outside of name table, ignoring - } - font.pos = pos; - var nameIndex = record.name; - if (record.encoding) { - // unicode - var str = ''; - for (var j = 0, jj = record.length; j < jj; j += 2) { - str += String.fromCharCode(font.getUint16()); - } - names[1][nameIndex] = str; - } else { - names[0][nameIndex] = bytesToString(font.getBytes(record.length)); - } - } - return names; - } - - var TTOpsStackDeltas = [ - 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, - -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, - 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, - 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, - 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, - -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, - -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, - -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; - // 0xC0-DF == -1 and 0xE0-FF == -2 - - function sanitizeTTProgram(table, ttContext) { - var data = table.data; - var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0; - var stack = []; - var callstack = []; - var functionsCalled = []; - var tooComplexToFollowFunctions = - ttContext.tooComplexToFollowFunctions; - var inFDEF = false, ifLevel = 0, inELSE = 0; - for (var ii = data.length; i < ii;) { - var op = data[i++]; - // The TrueType instruction set docs can be found at - // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html - if (op === 0x40) { // NPUSHB - pushes n bytes - n = data[i++]; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if (op === 0x41) { // NPUSHW - pushes n words - n = data[i++]; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes - n = op - 0xB0 + 1; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words - n = op - 0xB8 + 1; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL - if (!inFDEF && !inELSE) { - // collecting inforamtion about which functions are used - funcId = stack[stack.length - 1]; - ttContext.functionsUsed[funcId] = true; - if (funcId in ttContext.functionsStackDeltas) { - stack.length += ttContext.functionsStackDeltas[funcId]; - } else if (funcId in ttContext.functionsDefined && - functionsCalled.indexOf(funcId) < 0) { - callstack.push({data: data, i: i, stackTop: stack.length - 1}); - functionsCalled.push(funcId); - pc = ttContext.functionsDefined[funcId]; - if (!pc) { - warn('TT: CALL non-existent function'); - ttContext.hintsValid = false; - return; - } - data = pc.data; - i = pc.i; - } - } - } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF - if (inFDEF || inELSE) { - warn('TT: nested FDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // collecting inforamtion about which functions are defined - lastDeff = i; - funcId = stack.pop(); - ttContext.functionsDefined[funcId] = {data: data, i: i}; - } else if (op === 0x2D) { // ENDF - end of function - if (inFDEF) { - inFDEF = false; - lastEndf = i; - } else { - pc = callstack.pop(); - if (!pc) { - warn('TT: ENDF bad stack'); - ttContext.hintsValid = false; - return; - } - funcId = functionsCalled.pop(); - data = pc.data; - i = pc.i; - ttContext.functionsStackDeltas[funcId] = - stack.length - pc.stackTop; - } - } else if (op === 0x89) { // IDEF - instruction definition - if (inFDEF || inELSE) { - warn('TT: nested IDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // recording it as a function to track ENDF - lastDeff = i; - } else if (op === 0x58) { // IF - ++ifLevel; - } else if (op === 0x1B) { // ELSE - inELSE = ifLevel; - } else if (op === 0x59) { // EIF - if (inELSE === ifLevel) { - inELSE = 0; - } - --ifLevel; - } else if (op === 0x1C) { // JMPR - if (!inFDEF && !inELSE) { - var offset = stack[stack.length - 1]; - // only jumping forward to prevent infinite loop - if (offset > 0) { - i += offset - 1; - } - } - } - // Adjusting stack not extactly, but just enough to get function id - if (!inFDEF && !inELSE) { - var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : - op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0; - if (op >= 0x71 && op <= 0x75) { - n = stack.pop(); - if (n === n) { - stackDelta = -n * 2; - } - } - while (stackDelta < 0 && stack.length > 0) { - stack.pop(); - stackDelta++; - } - while (stackDelta > 0) { - stack.push(NaN); // pushing any number into stack - stackDelta--; - } - } - } - ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; - var content = [data]; - if (i > data.length) { - content.push(new Uint8Array(i - data.length)); - } - if (lastDeff > lastEndf) { - warn('TT: complementing a missing function tail'); - // new function definition started, but not finished - // complete function by [CLEAR, ENDF] - content.push(new Uint8Array([0x22, 0x2D])); - } - foldTTTable(table, content); - } - - function checkInvalidFunctions(ttContext, maxFunctionDefs) { - if (ttContext.tooComplexToFollowFunctions) { - return; - } - if (ttContext.functionsDefined.length > maxFunctionDefs) { - warn('TT: more functions defined than expected'); - ttContext.hintsValid = false; - return; - } - for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { - if (j > maxFunctionDefs) { - warn('TT: invalid function id: ' + j); - ttContext.hintsValid = false; - return; - } - if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { - warn('TT: undefined function: ' + j); - ttContext.hintsValid = false; - return; - } - } - } - - function foldTTTable(table, content) { - if (content.length > 1) { - // concatenating the content items - var newLength = 0; - var j, jj; - for (j = 0, jj = content.length; j < jj; j++) { - newLength += content[j].length; - } - newLength = (newLength + 3) & ~3; - var result = new Uint8Array(newLength); - var pos = 0; - for (j = 0, jj = content.length; j < jj; j++) { - result.set(content[j], pos); - pos += content[j].length; - } - table.data = result; - table.length = newLength; - } - } - - function sanitizeTTPrograms(fpgm, prep, cvt) { - var ttContext = { - functionsDefined: [], - functionsUsed: [], - functionsStackDeltas: [], - tooComplexToFollowFunctions: false, - hintsValid: true - }; - if (fpgm) { - sanitizeTTProgram(fpgm, ttContext); - } - if (prep) { - sanitizeTTProgram(prep, ttContext); - } - if (fpgm) { - checkInvalidFunctions(ttContext, maxFunctionDefs); - } - if (cvt && (cvt.length & 1)) { - var cvtData = new Uint8Array(cvt.length + 1); - cvtData.set(cvt.data); - cvt.data = cvtData; - } - return ttContext.hintsValid; - } - - // The following steps modify the original font data, making copy - font = new Stream(new Uint8Array(font.getBytes())); - - var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', - 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF ']; - - var header = readOpenTypeHeader(font); - var numTables = header.numTables; - var cff, cffFile; - - var tables = { 'OS/2': null, cmap: null, head: null, hhea: null, - hmtx: null, maxp: null, name: null, post: null }; - var table; - for (var i = 0; i < numTables; i++) { - table = readTableEntry(font); - if (VALID_TABLES.indexOf(table.tag) < 0) { - continue; // skipping table if it's not a required or optional table - } - if (table.length === 0) { - continue; // skipping empty tables - } - tables[table.tag] = table; - } - - var isTrueType = !tables['CFF ']; - if (!isTrueType) { - // OpenType font - if ((header.version === 'OTTO' && properties.type !== 'CIDFontType2') || - !tables.head || !tables.hhea || !tables.maxp || !tables.post) { - // no major tables: throwing everything at CFFFont - cffFile = new Stream(tables['CFF '].data); - cff = new CFFFont(cffFile, properties); - - adjustWidths(properties); - - return this.convert(name, cff, properties); - } - - delete tables.glyf; - delete tables.loca; - delete tables.fpgm; - delete tables.prep; - delete tables['cvt ']; - this.isOpenType = true; - } else { - if (!tables.glyf || !tables.loca) { - error('Required "glyf" or "loca" tables are not found'); - } - this.isOpenType = false; - } - - if (!tables.maxp) { - error('Required "maxp" table is not found'); - } - - font.pos = (font.start || 0) + tables.maxp.offset; - var version = font.getInt32(); - var numGlyphs = font.getUint16(); - var maxFunctionDefs = 0; - if (version >= 0x00010000 && tables.maxp.length >= 22) { - // maxZones can be invalid - font.pos += 8; - var maxZones = font.getUint16(); - if (maxZones > 2) { // reset to 2 if font has invalid maxZones - tables.maxp.data[14] = 0; - tables.maxp.data[15] = 2; - } - font.pos += 4; - maxFunctionDefs = font.getUint16(); - } - - var dupFirstEntry = false; - if (properties.type === 'CIDFontType2' && properties.toUnicode && - properties.toUnicode.get(0) > '\u0000') { - // oracle's defect (see 3427), duplicating first entry - dupFirstEntry = true; - numGlyphs++; - tables.maxp.data[4] = numGlyphs >> 8; - tables.maxp.data[5] = numGlyphs & 255; - } - - var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, - tables['cvt '], maxFunctionDefs); - if (!hintsValid) { - delete tables.fpgm; - delete tables.prep; - delete tables['cvt ']; - } - - // Ensure the hmtx table contains the advance width and - // sidebearings information for numGlyphs in the maxp table - sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs); - - if (!tables.head) { - error('Required "head" table is not found'); - } - - sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); - - var missingGlyphs = {}; - if (isTrueType) { - var isGlyphLocationsLong = int16(tables.head.data[50], - tables.head.data[51]); - missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, - numGlyphs, isGlyphLocationsLong, - hintsValid, dupFirstEntry); - } - - if (!tables.hhea) { - error('Required "hhea" table is not found'); - } - - // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth - // Sometimes it's 0. That needs to be fixed - if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { - tables.hhea.data[10] = 0xFF; - tables.hhea.data[11] = 0xFF; - } - - // Extract some more font properties from the OpenType head and - // hhea tables; yMin and descent value are always negative. - var metricsOverride = { - unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), - yMax: int16(tables.head.data[42], tables.head.data[43]), - yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000, - ascent: int16(tables.hhea.data[4], tables.hhea.data[5]), - descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000 - }; - - // PDF FontDescriptor metrics lie -- using data from actual font. - this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; - this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; - - // The 'post' table has glyphs names. - if (tables.post) { - var valid = readPostScriptTable(tables.post, properties, numGlyphs); - if (!valid) { - tables.post = null; - } - } - - var charCodeToGlyphId = [], charCode; - var toUnicode = properties.toUnicode, widths = properties.widths; - var skipToUnicode = (toUnicode instanceof IdentityToUnicodeMap || - toUnicode.length === 0x10000); - - // Helper function to try to skip mapping of empty glyphs. - // Note: In some cases, just relying on the glyph data doesn't work, - // hence we also use a few heuristics to fix various PDF files. - function hasGlyph(glyphId, charCode, widthCode) { - if (!missingGlyphs[glyphId]) { - return true; - } - if (!skipToUnicode && charCode >= 0 && toUnicode.has(charCode)) { - return true; - } - if (widths && widthCode >= 0 && isNum(widths[widthCode])) { - return true; - } - return false; - } - - if (properties.type === 'CIDFontType2') { - var cidToGidMap = properties.cidToGidMap || []; - var isCidToGidMapEmpty = cidToGidMap.length === 0; - - properties.cMap.forEach(function(charCode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - var glyphId = -1; - if (isCidToGidMapEmpty) { - glyphId = charCode; - } else if (cidToGidMap[cid] !== undefined) { - glyphId = cidToGidMap[cid]; - } - - if (glyphId >= 0 && glyphId < numGlyphs && - hasGlyph(glyphId, charCode, cid)) { - charCodeToGlyphId[charCode] = glyphId; - } - }); - if (dupFirstEntry) { - charCodeToGlyphId[0] = numGlyphs - 1; - } - } else { - // Most of the following logic in this code branch is based on the - // 9.6.6.4 of the PDF spec. - var hasEncoding = - properties.differences.length > 0 || !!properties.baseEncodingName; - var cmapTable = - readCmapTable(tables.cmap, font, this.isSymbolicFont, hasEncoding); - var cmapPlatformId = cmapTable.platformId; - var cmapEncodingId = cmapTable.encodingId; - var cmapMappings = cmapTable.mappings; - var cmapMappingsLength = cmapMappings.length; - - // The spec seems to imply that if the font is symbolic the encoding - // should be ignored, this doesn't appear to work for 'preistabelle.pdf' - // where the the font is symbolic and it has an encoding. - if (hasEncoding && - (cmapPlatformId === 3 && cmapEncodingId === 1 || - cmapPlatformId === 1 && cmapEncodingId === 0) || - (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack - !!Encodings[properties.baseEncodingName])) { // Temporary hack - // When no preferred cmap table was found and |baseEncodingName| is - // one of the predefined encodings, we seem to obtain a better - // |charCodeToGlyphId| map from the code below (fixes bug 1057544). - // TODO: Note that this is a hack which should be removed as soon as - // we have proper support for more exotic cmap tables. - - var baseEncoding = []; - if (properties.baseEncodingName === 'MacRomanEncoding' || - properties.baseEncodingName === 'WinAnsiEncoding') { - baseEncoding = Encodings[properties.baseEncodingName]; - } - for (charCode = 0; charCode < 256; charCode++) { - var glyphName; - if (this.differences && charCode in this.differences) { - glyphName = this.differences[charCode]; - } else if (charCode in baseEncoding && - baseEncoding[charCode] !== '') { - glyphName = baseEncoding[charCode]; - } else { - glyphName = Encodings.StandardEncoding[charCode]; - } - if (!glyphName) { - continue; - } - var unicodeOrCharCode, isUnicode = false; - if (cmapPlatformId === 3 && cmapEncodingId === 1) { - unicodeOrCharCode = GlyphsUnicode[glyphName]; - isUnicode = true; - } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { - // TODO: the encoding needs to be updated with mac os table. - unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName); - } - - var found = false; - for (i = 0; i < cmapMappingsLength; ++i) { - if (cmapMappings[i].charCode !== unicodeOrCharCode) { - continue; - } - var code = isUnicode ? charCode : unicodeOrCharCode; - if (hasGlyph(cmapMappings[i].glyphId, code, -1)) { - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - found = true; - break; - } - } - if (!found && properties.glyphNames) { - // Try to map using the post table. - var glyphId = properties.glyphNames.indexOf(glyphName); - if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - } else if (cmapPlatformId === 0 && cmapEncodingId === 0) { - // Default Unicode semantics, use the charcodes as is. - for (i = 0; i < cmapMappingsLength; ++i) { - charCodeToGlyphId[cmapMappings[i].charCode] = - cmapMappings[i].glyphId; - } - } else { - // For (3, 0) cmap tables: - // The charcode key being stored in charCodeToGlyphId is the lower - // byte of the two-byte charcodes of the cmap table since according to - // the spec: 'each byte from the string shall be prepended with the - // high byte of the range [of charcodes in the cmap table], to form - // a two-byte character, which shall be used to select the - // associated glyph description from the subtable'. - // - // For (1, 0) cmap tables: - // 'single bytes from the string shall be used to look up the - // associated glyph descriptions from the subtable'. This means - // charcodes in the cmap will be single bytes, so no-op since - // glyph.charCode & 0xFF === glyph.charCode - for (i = 0; i < cmapMappingsLength; ++i) { - charCode = cmapMappings[i].charCode & 0xFF; - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - } - } - } - - if (charCodeToGlyphId.length === 0) { - // defines at least one glyph - charCodeToGlyphId[0] = 0; - } - - // Converting glyphs and ids into font's cmap table - var newMapping = adjustMapping(charCodeToGlyphId, properties); - this.toFontChar = newMapping.toFontChar; - tables.cmap = { - tag: 'cmap', - data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs) - }; - - if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { - tables['OS/2'] = { - tag: 'OS/2', - data: createOS2Table(properties, newMapping.charCodeToGlyphId, - metricsOverride) - }; - } - - // Rewrite the 'post' table if needed - if (!tables.post) { - tables.post = { - tag: 'post', - data: createPostTable(properties) - }; - } - - if (!isTrueType) { - try { - // Trying to repair CFF file - cffFile = new Stream(tables['CFF '].data); - var parser = new CFFParser(cffFile, properties); - cff = parser.parse(); - var compiler = new CFFCompiler(cff); - tables['CFF '].data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - } - } - - // Re-creating 'name' table - if (!tables.name) { - tables.name = { - tag: 'name', - data: createNameTable(this.name) - }; - } else { - // ... using existing 'name' table as prototype - var namePrototype = readNameTable(tables.name); - tables.name.data = createNameTable(name, namePrototype); - } - - var builder = new OpenTypeFileBuilder(header.version); - for (var tableTag in tables) { - builder.addTable(tableTag, tables[tableTag].data); - } - return builder.toArray(); - }, - - convert: function Font_convert(fontName, font, properties) { - // TODO: Check the charstring widths to determine this. - properties.fixedPitch = false; - - var mapping = font.getGlyphMapping(properties); - var newMapping = adjustMapping(mapping, properties); - this.toFontChar = newMapping.toFontChar; - var numGlyphs = font.numGlyphs; - - function getCharCodes(charCodeToGlyphId, glyphId) { - var charCodes = null; - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - if (!charCodes) { - charCodes = []; - } - charCodes.push(charCode | 0); - } - } - return charCodes; - } - - function createCharCode(charCodeToGlyphId, glyphId) { - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - return charCode | 0; - } - } - newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = - glyphId; - return newMapping.nextAvailableFontCharCode++; - } - - var seacs = font.seacs; - if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { - var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; - var charset = font.getCharset(); - var seacMap = Object.create(null); - for (var glyphId in seacs) { - glyphId |= 0; - var seac = seacs[glyphId]; - var baseGlyphName = Encodings.StandardEncoding[seac[2]]; - var accentGlyphName = Encodings.StandardEncoding[seac[3]]; - var baseGlyphId = charset.indexOf(baseGlyphName); - var accentGlyphId = charset.indexOf(accentGlyphName); - if (baseGlyphId < 0 || accentGlyphId < 0) { - continue; - } - var accentOffset = { - x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], - y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] - }; - - var charCodes = getCharCodes(mapping, glyphId); - if (!charCodes) { - // There's no point in mapping it if the char code was never mapped - // to begin with. - continue; - } - for (var i = 0, ii = charCodes.length; i < ii; i++) { - var charCode = charCodes[i]; - // Find a fontCharCode that maps to the base and accent glyphs. - // If one doesn't exists, create it. - var charCodeToGlyphId = newMapping.charCodeToGlyphId; - var baseFontCharCode = createCharCode(charCodeToGlyphId, - baseGlyphId); - var accentFontCharCode = createCharCode(charCodeToGlyphId, - accentGlyphId); - seacMap[charCode] = { - baseFontCharCode: baseFontCharCode, - accentFontCharCode: accentFontCharCode, - accentOffset: accentOffset - }; - } - } - properties.seacMap = seacMap; - } - - var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; - - var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F'); - // PostScript Font Program - builder.addTable('CFF ', font.data); - // OS/2 and Windows Specific metrics - builder.addTable('OS/2', createOS2Table(properties, - newMapping.charCodeToGlyphId)); - // Character to glyphs mapping - builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, - numGlyphs)); - // Font header - builder.addTable('head', - '\x00\x01\x00\x00' + // Version number - '\x00\x00\x10\x00' + // fontRevision - '\x00\x00\x00\x00' + // checksumAdjustement - '\x5F\x0F\x3C\xF5' + // magicNumber - '\x00\x00' + // Flags - safeString16(unitsPerEm) + // unitsPerEM - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date - '\x00\x00' + // xMin - safeString16(properties.descent) + // yMin - '\x0F\xFF' + // xMax - safeString16(properties.ascent) + // yMax - string16(properties.italicAngle ? 2 : 0) + // macStyle - '\x00\x11' + // lowestRecPPEM - '\x00\x00' + // fontDirectionHint - '\x00\x00' + // indexToLocFormat - '\x00\x00'); // glyphDataFormat - - // Horizontal header - builder.addTable('hhea', - '\x00\x01\x00\x00' + // Version number - safeString16(properties.ascent) + // Typographic Ascent - safeString16(properties.descent) + // Typographic Descent - '\x00\x00' + // Line Gap - '\xFF\xFF' + // advanceWidthMax - '\x00\x00' + // minLeftSidebearing - '\x00\x00' + // minRightSidebearing - '\x00\x00' + // xMaxExtent - safeString16(properties.capHeight) + // caretSlopeRise - safeString16(Math.tan(properties.italicAngle) * - properties.xHeight) + // caretSlopeRun - '\x00\x00' + // caretOffset - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // metricDataFormat - string16(numGlyphs)); // Number of HMetrics - - // Horizontal metrics - builder.addTable('hmtx', (function fontFieldsHmtx() { - var charstrings = font.charstrings; - var cffWidths = font.cff ? font.cff.widths : null; - var hmtx = '\x00\x00\x00\x00'; // Fake .notdef - for (var i = 1, ii = numGlyphs; i < ii; i++) { - var width = 0; - if (charstrings) { - var charstring = charstrings[i - 1]; - width = 'width' in charstring ? charstring.width : 0; - } else if (cffWidths) { - width = Math.ceil(cffWidths[i] || 0); - } - hmtx += string16(width) + string16(0); - } - return hmtx; - })()); - - // Maximum profile - builder.addTable('maxp', - '\x00\x00\x50\x00' + // Version number - string16(numGlyphs)); // Num of glyphs - - // Naming tables - builder.addTable('name', createNameTable(fontName)); - - // PostScript informations - builder.addTable('post', createPostTable(properties)); - - return builder.toArray(); - }, - - /** - * Builds a char code to unicode map based on section 9.10 of the spec. - * @param {Object} properties Font properties object. - * @return {Object} A ToUnicodeMap object. - */ - buildToUnicode: function Font_buildToUnicode(properties) { - // Section 9.10.2 Mapping Character Codes to Unicode Values - if (properties.toUnicode && properties.toUnicode.length !== 0) { - return properties.toUnicode; - } - // According to the spec if the font is a simple font we should only map - // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or - // the differences array only contains adobe standard or symbol set names, - // in pratice it seems better to always try to create a toUnicode - // map based of the default encoding. - var toUnicode, charcode; - if (!properties.composite /* is simple font */) { - toUnicode = []; - var encoding = properties.defaultEncoding.slice(); - var baseEncodingName = properties.baseEncodingName; - // Merge in the differences array. - var differences = properties.differences; - for (charcode in differences) { - encoding[charcode] = differences[charcode]; - } - for (charcode in encoding) { - // a) Map the character code to a character name. - var glyphName = encoding[charcode]; - // b) Look up the character name in the Adobe Glyph List (see the - // Bibliography) to obtain the corresponding Unicode value. - if (glyphName === '') { - continue; - } else if (GlyphsUnicode[glyphName] === undefined) { - // (undocumented) c) Few heuristics to recognize unknown glyphs - // NOTE: Adobe Reader does not do this step, but OSX Preview does - var code = 0; - switch (glyphName[0]) { - case 'G': // Gxx glyph - if (glyphName.length === 3) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'g': // g00xx glyph - if (glyphName.length === 5) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'C': // Cddd glyph - case 'c': // cddd glyph - if (glyphName.length >= 3) { - code = +glyphName.substr(1); - } - break; - } - if (code) { - // If |baseEncodingName| is one the predefined encodings, - // and |code| equals |charcode|, using the glyph defined in the - // baseEncoding seems to yield a better |toUnicode| mapping - // (fixes issue 5070). - if (baseEncodingName && code === +charcode) { - var baseEncoding = Encodings[baseEncodingName]; - if (baseEncoding && (glyphName = baseEncoding[charcode])) { - toUnicode[charcode] = - String.fromCharCode(GlyphsUnicode[glyphName]); - continue; - } - } - toUnicode[charcode] = String.fromCharCode(code); - } - continue; - } - toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]); - } - return new ToUnicodeMap(toUnicode); - } - // If the font is a composite font that uses one of the predefined CMaps - // listed in Table 118 (except Identity–H and Identity–V) or whose - // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or - // Adobe-Korea1 character collection: - if (properties.composite && ( - (properties.cMap.builtInCMap && - !(properties.cMap instanceof IdentityCMap)) || - (properties.cidSystemInfo.registry === 'Adobe' && - (properties.cidSystemInfo.ordering === 'GB1' || - properties.cidSystemInfo.ordering === 'CNS1' || - properties.cidSystemInfo.ordering === 'Japan1' || - properties.cidSystemInfo.ordering === 'Korea1')))) { - // Then: - // a) Map the character code to a character identifier (CID) according - // to the font’s CMap. - // b) Obtain the registry and ordering of the character collection used - // by the font’s CMap (for example, Adobe and Japan1) from its - // CIDSystemInfo dictionary. - var registry = properties.cidSystemInfo.registry; - var ordering = properties.cidSystemInfo.ordering; - // c) Construct a second CMap name by concatenating the registry and - // ordering obtained in step (b) in the format registry–ordering–UCS2 - // (for example, Adobe–Japan1–UCS2). - var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2'); - // d) Obtain the CMap with the name constructed in step (c) (available - // from the ASN Web site; see the Bibliography). - var ucs2CMap = CMapFactory.create(ucs2CMapName, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - var cMap = properties.cMap; - toUnicode = []; - cMap.forEach(function(charcode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - // e) Map the CID obtained in step (a) according to the CMap obtained - // in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.lookup(cid); - if (ucs2) { - toUnicode[charcode] = - String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } - }); - return new ToUnicodeMap(toUnicode); - } - - // The viewer's choice, just use an identity map. - return new IdentityToUnicodeMap(properties.firstChar, - properties.lastChar); - }, - - get spaceWidth() { - if ('_shadowWidth' in this) { - return this._shadowWidth; - } - - // trying to estimate space character width - var possibleSpaceReplacements = ['space', 'minus', 'one', 'i']; - var width; - for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { - var glyphName = possibleSpaceReplacements[i]; - // if possible, getting width by glyph name - if (glyphName in this.widths) { - width = this.widths[glyphName]; - break; - } - var glyphUnicode = GlyphsUnicode[glyphName]; - // finding the charcode via unicodeToCID map - var charcode = 0; - if (this.composite) { - if (this.cMap.contains(glyphUnicode)) { - charcode = this.cMap.lookup(glyphUnicode); - } - } - // ... via toUnicode map - if (!charcode && this.toUnicode) { - charcode = this.toUnicode.charCodeOf(glyphUnicode); - } - // setting it to unicode if negative or undefined - if (charcode <= 0) { - charcode = glyphUnicode; - } - // trying to get width via charcode - width = this.widths[charcode]; - if (width) { - break; // the non-zero width found - } - } - width = width || this.defaultWidth; - // Do not shadow the property here. See discussion: - // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280 - this._shadowWidth = width; - return width; - }, - - charToGlyph: function Font_charToGlyph(charcode, isSpace) { - var fontCharCode, width, operatorListId; - - var widthCode = charcode; - if (this.cMap && this.cMap.contains(charcode)) { - widthCode = this.cMap.lookup(charcode); - } - width = this.widths[widthCode]; - width = isNum(width) ? width : this.defaultWidth; - var vmetric = this.vmetrics && this.vmetrics[widthCode]; - - var unicode = this.toUnicode.get(charcode) || charcode; - if (typeof unicode === 'number') { - unicode = String.fromCharCode(unicode); - } - - // First try the toFontChar map, if it's not there then try falling - // back to the char code. - fontCharCode = this.toFontChar[charcode] || charcode; - if (this.missingFile) { - fontCharCode = mapSpecialUnicodeValues(fontCharCode); - } - - if (this.isType3Font) { - // Font char code in this case is actually a glyph name. - operatorListId = fontCharCode; - } - - var accent = null; - if (this.seacMap && this.seacMap[charcode]) { - var seac = this.seacMap[charcode]; - fontCharCode = seac.baseFontCharCode; - accent = { - fontChar: String.fromCharCode(seac.accentFontCharCode), - offset: seac.accentOffset - }; - } - - var fontChar = String.fromCharCode(fontCharCode); - - var glyph = this.glyphCache[charcode]; - if (!glyph || - !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace)) { - glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace); - this.glyphCache[charcode] = glyph; - } - return glyph; - }, - - charsToGlyphs: function Font_charsToGlyphs(chars) { - var charsCache = this.charsCache; - var glyphs, glyph, charcode; - - // if we translated this string before, just grab it from the cache - if (charsCache) { - glyphs = charsCache[chars]; - if (glyphs) { - return glyphs; - } - } - - // lazily create the translation cache - if (!charsCache) { - charsCache = this.charsCache = Object.create(null); - } - - glyphs = []; - var charsCacheKey = chars; - var i = 0, ii; - - if (this.cMap) { - // composite fonts have multi-byte strings convert the string from - // single-byte to multi-byte - var c = {}; - while (i < chars.length) { - this.cMap.readCharCode(chars, i, c); - charcode = c.charcode; - var length = c.length; - i += length; - // Space is char with code 0x20 and length 1 in multiple-byte codes. - var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; - glyph = this.charToGlyph(charcode, isSpace); - glyphs.push(glyph); - } - } else { - for (i = 0, ii = chars.length; i < ii; ++i) { - charcode = chars.charCodeAt(i); - glyph = this.charToGlyph(charcode, charcode === 0x20); - glyphs.push(glyph); - } - } - - // Enter the translated string into the cache - return (charsCache[charsCacheKey] = glyphs); - } - }; - - return Font; -})(); - -var ErrorFont = (function ErrorFontClosure() { - function ErrorFont(error) { - this.error = error; - this.loadedName = 'g_font_error'; - this.loading = false; - } - - ErrorFont.prototype = { - charsToGlyphs: function ErrorFont_charsToGlyphs() { - return []; - }, - exportData: function ErrorFont_exportData() { - return {error: this.error}; - } - }; - - return ErrorFont; -})(); - -/** - * Shared logic for building a char code to glyph id mapping for Type1 and - * simple CFF fonts. See section 9.6.6.2 of the spec. - * @param {Object} properties Font properties object. - * @param {Object} builtInEncoding The encoding contained within the actual font - * data. - * @param {Array} Array of glyph names where the index is the glyph ID. - * @returns {Object} A char code to glyph ID map. - */ -function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { - var charCodeToGlyphId = Object.create(null); - var glyphId, charCode, baseEncoding; - - if (properties.baseEncodingName) { - // If a valid base encoding name was used, the mapping is initialized with - // that. - baseEncoding = Encodings[properties.baseEncodingName]; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } else if (!!(properties.flags & FontFlags.Symbolic)) { - // For a symbolic font the encoding should be the fonts built-in - // encoding. - for (charCode in builtInEncoding) { - charCodeToGlyphId[charCode] = builtInEncoding[charCode]; - } - } else { - // For non-symbolic fonts that don't have a base encoding the standard - // encoding should be used. - baseEncoding = Encodings.StandardEncoding; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - - // Lastly, merge in the differences. - var differences = properties.differences; - if (differences) { - for (charCode in differences) { - var glyphName = differences[charCode]; - glyphId = glyphNames.indexOf(glyphName); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - return charCodeToGlyphId; -} - -/* - * CharStrings are encoded following the the CharString Encoding sequence - * describe in Chapter 6 of the "Adobe Type1 Font Format" specification. - * The value in a byte indicates a command, a number, or subsequent bytes - * that are to be interpreted in a special way. - * - * CharString Number Encoding: - * A CharString byte containing the values from 32 through 255 inclusive - * indicate an integer. These values are decoded in four ranges. - * - * 1. A CharString byte containing a value, v, between 32 and 246 inclusive, - * indicate the integer v - 139. Thus, the integer values from -107 through - * 107 inclusive may be encoded in single byte. - * - * 2. A CharString byte containing a value, v, between 247 and 250 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * [(v - 247) x 256] + w + 108 - * - * 3. A CharString byte containing a value, v, between 251 and 254 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * -[(v - 251) * 256] - w - 108 - * - * 4. A CharString containing the value 255 indicates that the next 4 bytes - * are a two complement signed integer. The first of these bytes contains the - * highest order bits, the second byte contains the next higher order bits - * and the fourth byte contain the lowest order bits. - * - * - * CharString Command Encoding: - * CharStrings commands are encoded in 1 or 2 bytes. - * - * Single byte commands are encoded in 1 byte that contains a value between - * 0 and 31 inclusive. - * If a command byte contains the value 12, then the value in the next byte - * indicates a command. This "escape" mechanism allows many extra commands - * to be encoded and this encoding technique helps to minimize the length of - * the charStrings. - */ -var Type1CharString = (function Type1CharStringClosure() { - var COMMAND_MAP = { - 'hstem': [1], - 'vstem': [3], - 'vmoveto': [4], - 'rlineto': [5], - 'hlineto': [6], - 'vlineto': [7], - 'rrcurveto': [8], - 'callsubr': [10], - 'flex': [12, 35], - 'drop' : [12, 18], - 'endchar': [14], - 'rmoveto': [21], - 'hmoveto': [22], - 'vhcurveto': [30], - 'hvcurveto': [31] - }; - - function Type1CharString() { - this.width = 0; - this.lsb = 0; - this.flexing = false; - this.output = []; - this.stack = []; - } - - Type1CharString.prototype = { - convert: function Type1CharString_convert(encoded, subrs) { - var count = encoded.length; - var error = false; - var wx, sbx, subrNumber; - for (var i = 0; i < count; i++) { - var value = encoded[i]; - if (value < 32) { - if (value === 12) { - value = (value << 8) + encoded[++i]; - } - switch (value) { - case 1: // hstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case 3: // vstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case 4: // vmoveto - if (this.flexing) { - if (this.stack.length < 1) { - error = true; - break; - } - // Add the dx for flex and but also swap the values so they are - // the right order. - var dy = this.stack.pop(); - this.stack.push(0, dy); - break; - } - error = this.executeCommand(1, COMMAND_MAP.vmoveto); - break; - case 5: // rlineto - error = this.executeCommand(2, COMMAND_MAP.rlineto); - break; - case 6: // hlineto - error = this.executeCommand(1, COMMAND_MAP.hlineto); - break; - case 7: // vlineto - error = this.executeCommand(1, COMMAND_MAP.vlineto); - break; - case 8: // rrcurveto - error = this.executeCommand(6, COMMAND_MAP.rrcurveto); - break; - case 9: // closepath - // closepath is a Type1 command that does not take argument and is - // useless in Type2 and it can simply be ignored. - this.stack = []; - break; - case 10: // callsubr - if (this.stack.length < 1) { - error = true; - break; - } - subrNumber = this.stack.pop(); - error = this.convert(subrs[subrNumber], subrs); - break; - case 11: // return - return error; - case 13: // hsbw - if (this.stack.length < 2) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use hmoveto with lsb. - wx = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx); - error = this.executeCommand(2, COMMAND_MAP.hmoveto); - break; - case 14: // endchar - this.output.push(COMMAND_MAP.endchar[0]); - break; - case 21: // rmoveto - if (this.flexing) { - break; - } - error = this.executeCommand(2, COMMAND_MAP.rmoveto); - break; - case 22: // hmoveto - if (this.flexing) { - // Add the dy for flex. - this.stack.push(0); - break; - } - error = this.executeCommand(1, COMMAND_MAP.hmoveto); - break; - case 30: // vhcurveto - error = this.executeCommand(4, COMMAND_MAP.vhcurveto); - break; - case 31: // hvcurveto - error = this.executeCommand(4, COMMAND_MAP.hvcurveto); - break; - case (12 << 8) + 0: // dotsection - // dotsection is a Type1 command to specify some hinting feature - // for dots that do not take a parameter and it can safely be - // ignored for Type2. - this.stack = []; - break; - case (12 << 8) + 1: // vstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // [vh]stem3 are Type1 only and Type2 supports [vh]stem with - // multiple parameters, so instead of returning [vh]stem3 take a - // shortcut and return [vhstem] instead. - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case (12 << 8) + 2: // hstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // See vstem3. - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case (12 << 8) + 6: // seac - // seac is like type 2's special endchar but it doesn't use the - // first argument asb, so remove it. - if (SEAC_ANALYSIS_ENABLED) { - this.seac = this.stack.splice(-4, 4); - error = this.executeCommand(0, COMMAND_MAP.endchar); - } else { - error = this.executeCommand(4, COMMAND_MAP.endchar); - } - break; - case (12 << 8) + 7: // sbw - if (this.stack.length < 4) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use rmoveto with - // (dx, dy). The height argument will not be used for vmtx and - // vhea tables reconstruction -- ignoring it. - var wy = this.stack.pop(); - wx = this.stack.pop(); - var sby = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx, sby); - error = this.executeCommand(3, COMMAND_MAP.rmoveto); - break; - case (12 << 8) + 12: // div - if (this.stack.length < 2) { - error = true; - break; - } - var num2 = this.stack.pop(); - var num1 = this.stack.pop(); - this.stack.push(num1 / num2); - break; - case (12 << 8) + 16: // callothersubr - if (this.stack.length < 2) { - error = true; - break; - } - subrNumber = this.stack.pop(); - var numArgs = this.stack.pop(); - if (subrNumber === 0 && numArgs === 3) { - var flexArgs = this.stack.splice(this.stack.length - 17, 17); - this.stack.push( - flexArgs[2] + flexArgs[0], // bcp1x + rpx - flexArgs[3] + flexArgs[1], // bcp1y + rpy - flexArgs[4], // bcp2x - flexArgs[5], // bcp2y - flexArgs[6], // p2x - flexArgs[7], // p2y - flexArgs[8], // bcp3x - flexArgs[9], // bcp3y - flexArgs[10], // bcp4x - flexArgs[11], // bcp4y - flexArgs[12], // p3x - flexArgs[13], // p3y - flexArgs[14] // flexDepth - // 15 = finalx unused by flex - // 16 = finaly unused by flex - ); - error = this.executeCommand(13, COMMAND_MAP.flex, true); - this.flexing = false; - this.stack.push(flexArgs[15], flexArgs[16]); - } else if (subrNumber === 1 && numArgs === 0) { - this.flexing = true; - } - break; - case (12 << 8) + 17: // pop - // Ignore this since it is only used with othersubr. - break; - case (12 << 8) + 33: // setcurrentpoint - // Ignore for now. - this.stack = []; - break; - default: - warn('Unknown type 1 charstring command of "' + value + '"'); - break; - } - if (error) { - break; - } - continue; - } else if (value <= 246) { - value = value - 139; - } else if (value <= 250) { - value = ((value - 247) * 256) + encoded[++i] + 108; - } else if (value <= 254) { - value = -((value - 251) * 256) - encoded[++i] - 108; - } else { - value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | - (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; - } - this.stack.push(value); - } - return error; - }, - - executeCommand: function(howManyArgs, command, keepStack) { - var stackLength = this.stack.length; - if (howManyArgs > stackLength) { - return true; - } - var start = stackLength - howManyArgs; - for (var i = start; i < stackLength; i++) { - var value = this.stack[i]; - if (value === (value | 0)) { // int - this.output.push(28, (value >> 8) & 0xff, value & 0xff); - } else { // fixed point - value = (65536 * value) | 0; - this.output.push(255, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF); - } - } - this.output.push.apply(this.output, command); - if (keepStack) { - this.stack.splice(start, howManyArgs); - } else { - this.stack.length = 0; - } - return false; - } - }; - - return Type1CharString; -})(); - -/* - * Type1Parser encapsulate the needed code for parsing a Type1 font - * program. Some of its logic depends on the Type2 charstrings - * structure. - * Note: this doesn't really parse the font since that would require evaluation - * of PostScript, but it is possible in most cases to extract what we need - * without a full parse. - */ -var Type1Parser = (function Type1ParserClosure() { - /* - * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence - * of Plaintext Bytes. The function took a key as a parameter which can be - * for decrypting the eexec block of for decoding charStrings. - */ - var EEXEC_ENCRYPT_KEY = 55665; - var CHAR_STRS_ENCRYPT_KEY = 4330; - - function isHexDigit(code) { - return code >= 48 && code <= 57 || // '0'-'9' - code >= 65 && code <= 70 || // 'A'-'F' - code >= 97 && code <= 102; // 'a'-'f' - } - - function decrypt(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length; - var decrypted = new Uint8Array(count); - for (var i = 0; i < count; i++) { - var value = data[i]; - decrypted[i] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - return Array.prototype.slice.call(decrypted, discardNumber); - } - - function decryptAscii(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length, maybeLength = count >>> 1; - var decrypted = new Uint8Array(maybeLength); - var i, j; - for (i = 0, j = 0; i < count; i++) { - var digit1 = data[i]; - if (!isHexDigit(digit1)) { - continue; - } - i++; - var digit2; - while (i < count && !isHexDigit(digit2 = data[i])) { - i++; - } - if (i < count) { - var value = parseInt(String.fromCharCode(digit1, digit2), 16); - decrypted[j++] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - } - return Array.prototype.slice.call(decrypted, discardNumber, j); - } - - function isSpecial(c) { - return c === 0x2F || // '/' - c === 0x5B || c === 0x5D || // '[', ']' - c === 0x7B || c === 0x7D || // '{', '}' - c === 0x28 || c === 0x29; // '(', ')' - } - - function Type1Parser(stream, encrypted) { - if (encrypted) { - var data = stream.getBytes(); - var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && - isHexDigit(data[2]) && isHexDigit(data[3])); - stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : - decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); - } - this.stream = stream; - this.nextChar(); - } - - Type1Parser.prototype = { - readNumberArray: function Type1Parser_readNumberArray() { - this.getToken(); // read '[' or '{' (arrays can start with either) - var array = []; - while (true) { - var token = this.getToken(); - if (token === null || token === ']' || token === '}') { - break; - } - array.push(parseFloat(token || 0)); - } - return array; - }, - - readNumber: function Type1Parser_readNumber() { - var token = this.getToken(); - return parseFloat(token || 0); - }, - - readInt: function Type1Parser_readInt() { - // Use '| 0' to prevent setting a double into length such as the double - // does not flow into the loop variable. - var token = this.getToken(); - return parseInt(token || 0, 10) | 0; - }, - - readBoolean: function Type1Parser_readBoolean() { - var token = this.getToken(); - - // Use 1 and 0 since that's what type2 charstrings use. - return token === 'true' ? 1 : 0; - }, - - nextChar : function Type1_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - - getToken: function Type1Parser_getToken() { - // Eat whitespace and comments. - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch === -1) { - return null; - } - - if (comment) { - if (ch === 0x0A || ch === 0x0D) { - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (!Lexer.isSpace(ch)) { - break; - } - ch = this.nextChar(); - } - if (isSpecial(ch)) { - this.nextChar(); - return String.fromCharCode(ch); - } - var token = ''; - do { - token += String.fromCharCode(ch); - ch = this.nextChar(); - } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch)); - return token; - }, - - /* - * Returns an object containing a Subrs array and a CharStrings - * array extracted from and eexec encrypted block of data - */ - extractFontProgram: function Type1Parser_extractFontProgram() { - var stream = this.stream; - - var subrs = [], charstrings = []; - var program = { - subrs: [], - charstrings: [], - properties: { - 'privateData': { - 'lenIV': 4 - } - } - }; - var token, length, data, lenIV, encoded; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'CharStrings': - // The number immediately following CharStrings must be greater or - // equal to the number of CharStrings. - this.getToken(); - this.getToken(); // read in 'dict' - this.getToken(); // read in 'dup' - this.getToken(); // read in 'begin' - while(true) { - token = this.getToken(); - if (token === null || token === 'end') { - break; - } - - if (token !== '/') { - continue; - } - var glyph = this.getToken(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'ND' or '|-' - if (token === 'noaccess') { - this.getToken(); // read in 'def' - } - charstrings.push({ - glyph: glyph, - encoded: encoded - }); - } - break; - case 'Subrs': - var num = this.readInt(); - this.getToken(); // read in 'array' - while ((token = this.getToken()) === 'dup') { - var index = this.readInt(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'NP' or '|' - if (token === 'noaccess') { - this.getToken(); // read in 'put' - } - subrs[index] = encoded; - } - break; - case 'BlueValues': - case 'OtherBlues': - case 'FamilyBlues': - case 'FamilyOtherBlues': - var blueArray = this.readNumberArray(); - // *Blue* values may contain invalid data: disables reading of - // those values when hinting is disabled. - if (blueArray.length > 0 && (blueArray.length % 2) === 0 && - HINTING_ENABLED) { - program.properties.privateData[token] = blueArray; - } - break; - case 'StemSnapH': - case 'StemSnapV': - program.properties.privateData[token] = this.readNumberArray(); - break; - case 'StdHW': - case 'StdVW': - program.properties.privateData[token] = - this.readNumberArray()[0]; - break; - case 'BlueShift': - case 'lenIV': - case 'BlueFuzz': - case 'BlueScale': - case 'LanguageGroup': - case 'ExpansionFactor': - program.properties.privateData[token] = this.readNumber(); - break; - case 'ForceBold': - program.properties.privateData[token] = this.readBoolean(); - break; - } - } - - for (var i = 0; i < charstrings.length; i++) { - glyph = charstrings[i].glyph; - encoded = charstrings[i].encoded; - var charString = new Type1CharString(); - var error = charString.convert(encoded, subrs); - var output = charString.output; - if (error) { - // It seems when FreeType encounters an error while evaluating a glyph - // that it completely ignores the glyph so we'll mimic that behaviour - // here and put an endchar to make the validator happy. - output = [14]; - } - program.charstrings.push({ - glyphName: glyph, - charstring: output, - width: charString.width, - lsb: charString.lsb, - seac: charString.seac - }); - } - - return program; - }, - - extractFontHeader: function Type1Parser_extractFontHeader(properties) { - var token; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'FontMatrix': - var matrix = this.readNumberArray(); - properties.fontMatrix = matrix; - break; - case 'Encoding': - var encodingArg = this.getToken(); - var encoding; - if (!/^\d+$/.test(encodingArg)) { - // encoding name is specified - encoding = Encodings[encodingArg]; - } else { - encoding = []; - var size = parseInt(encodingArg, 10) | 0; - this.getToken(); // read in 'array' - - for (var j = 0; j < size; j++) { - token = this.getToken(); - // skipping till first dup or def (e.g. ignoring for statement) - while (token !== 'dup' && token !== 'def') { - token = this.getToken(); - if (token === null) { - return; // invalid header - } - } - if (token === 'def') { - break; // read all array data - } - var index = this.readInt(); - this.getToken(); // read in '/' - var glyph = this.getToken(); - encoding[index] = glyph; - this.getToken(); // read the in 'put' - } - } - properties.builtInEncoding = encoding; - break; - case 'FontBBox': - var fontBBox = this.readNumberArray(); - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - break; - } - } - } - }; - - return Type1Parser; -})(); - -/** - * The CFF class takes a Type1 file and wrap it into a - * 'Compact Font Format' which itself embed Type2 charstrings. - */ -var CFFStandardStrings = [ - '.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', 'exclamsmall', - 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', - 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', - 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', - 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', - 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', - 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', - 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', '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', 'questiondownsmall', 'oneeighth', - 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', - 'zerosuperior', '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', '001.000', '001.001', '001.002', '001.003', - 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold' -]; - -// Type1Font is also a CIDFontType0. -var Type1Font = function Type1Font(name, file, properties) { - // Some bad generators embed pfb file as is, we have to strip 6-byte headers. - // Also, length1 and length2 might be off by 6 bytes as well. - // http://www.math.ubc.ca/~cass/piscript/type1.pdf - var PFB_HEADER_SIZE = 6; - var headerBlockLength = properties.length1; - var eexecBlockLength = properties.length2; - var pfbHeader = file.peekBytes(PFB_HEADER_SIZE); - var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; - if (pfbHeaderPresent) { - file.skip(PFB_HEADER_SIZE); - headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Get the data block containing glyphs and subrs informations - var headerBlock = new Stream(file.getBytes(headerBlockLength)); - var headerBlockParser = new Type1Parser(headerBlock); - headerBlockParser.extractFontHeader(properties); - - if (pfbHeaderPresent) { - pfbHeader = file.getBytes(PFB_HEADER_SIZE); - eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Decrypt the data blocks and retrieve it's content - var eexecBlock = new Stream(file.getBytes(eexecBlockLength)); - var eexecBlockParser = new Type1Parser(eexecBlock, true); - var data = eexecBlockParser.extractFontProgram(); - for (var info in data.properties) { - properties[info] = data.properties[info]; - } - - var charstrings = data.charstrings; - var type2Charstrings = this.getType2Charstrings(charstrings); - var subrs = this.getType2Subrs(data.subrs); - - this.charstrings = charstrings; - this.data = this.wrap(name, type2Charstrings, this.charstrings, - subrs, properties); - this.seacs = this.getSeacs(data.charstrings); -}; - -Type1Font.prototype = { - get numGlyphs() { - return this.charstrings.length + 1; - }, - - getCharset: function Type1Font_getCharset() { - var charset = ['.notdef']; - var charstrings = this.charstrings; - for (var glyphId = 0; glyphId < charstrings.length; glyphId++) { - charset.push(charstrings[glyphId].glyphName); - } - return charset; - }, - - getGlyphMapping: function Type1Font_getGlyphMapping(properties) { - var charstrings = this.charstrings; - var glyphNames = ['.notdef'], glyphId; - for (glyphId = 0; glyphId < charstrings.length; glyphId++) { - glyphNames.push(charstrings[glyphId].glyphName); - } - var encoding = properties.builtInEncoding; - if (encoding) { - var builtInEncoding = {}; - for (var charCode in encoding) { - glyphId = glyphNames.indexOf(encoding[charCode]); - if (glyphId >= 0) { - builtInEncoding[charCode] = glyphId; - } - } - } - - return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); - }, - - getSeacs: function Type1Font_getSeacs(charstrings) { - var i, ii; - var seacMap = []; - for (i = 0, ii = charstrings.length; i < ii; i++) { - var charstring = charstrings[i]; - if (charstring.seac) { - // Offset by 1 for .notdef - seacMap[i + 1] = charstring.seac; - } - } - return seacMap; - }, - - getType2Charstrings: function Type1Font_getType2Charstrings( - type1Charstrings) { - var type2Charstrings = []; - for (var i = 0, ii = type1Charstrings.length; i < ii; i++) { - type2Charstrings.push(type1Charstrings[i].charstring); - } - return type2Charstrings; - }, - - getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { - var bias = 0; - var count = type1Subrs.length; - if (count < 1133) { - bias = 107; - } else if (count < 33769) { - bias = 1131; - } else { - bias = 32768; - } - - // Add a bunch of empty subrs to deal with the Type2 bias - var type2Subrs = []; - var i; - for (i = 0; i < bias; i++) { - type2Subrs.push([0x0B]); - } - - for (i = 0; i < count; i++) { - type2Subrs.push(type1Subrs[i]); - } - - return type2Subrs; - }, - - wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) { - var cff = new CFF(); - cff.header = new CFFHeader(1, 0, 4, 4); - - cff.names = [name]; - - var topDict = new CFFTopDict(); - // CFF strings IDs 0...390 are predefined names, so refering - // to entries in our own String INDEX starts at SID 391. - topDict.setByName('version', 391); - topDict.setByName('Notice', 392); - topDict.setByName('FullName', 393); - topDict.setByName('FamilyName', 394); - topDict.setByName('Weight', 395); - topDict.setByName('Encoding', null); // placeholder - topDict.setByName('FontMatrix', properties.fontMatrix); - topDict.setByName('FontBBox', properties.bbox); - topDict.setByName('charset', null); // placeholder - topDict.setByName('CharStrings', null); // placeholder - topDict.setByName('Private', null); // placeholder - cff.topDict = topDict; - - var strings = new CFFStrings(); - strings.add('Version 0.11'); // Version - strings.add('See original notice'); // Notice - strings.add(name); // FullName - strings.add(name); // FamilyName - strings.add('Medium'); // Weight - cff.strings = strings; - - cff.globalSubrIndex = new CFFIndex(); - - var count = glyphs.length; - var charsetArray = [0]; - var i, ii; - for (i = 0; i < count; i++) { - var index = CFFStandardStrings.indexOf(charstrings[i].glyphName); - // TODO: Insert the string and correctly map it. Previously it was - // thought mapping names that aren't in the standard strings to .notdef - // was fine, however in issue818 when mapping them all to .notdef the - // adieresis glyph no longer worked. - if (index === -1) { - index = 0; - } - charsetArray.push((index >> 8) & 0xff, index & 0xff); - } - cff.charset = new CFFCharset(false, 0, [], charsetArray); - - var charStringsIndex = new CFFIndex(); - charStringsIndex.add([0x8B, 0x0E]); // .notdef - for (i = 0; i < count; i++) { - charStringsIndex.add(glyphs[i]); - } - cff.charStrings = charStringsIndex; - - var privateDict = new CFFPrivateDict(); - privateDict.setByName('Subrs', null); // placeholder - var fields = [ - 'BlueValues', - 'OtherBlues', - 'FamilyBlues', - 'FamilyOtherBlues', - 'StemSnapH', - 'StemSnapV', - 'BlueShift', - 'BlueFuzz', - 'BlueScale', - 'LanguageGroup', - 'ExpansionFactor', - 'ForceBold', - 'StdHW', - 'StdVW' - ]; - for (i = 0, ii = fields.length; i < ii; i++) { - var field = fields[i]; - if (!properties.privateData.hasOwnProperty(field)) { - continue; - } - var value = properties.privateData[field]; - if (isArray(value)) { - // All of the private dictionary array data in CFF must be stored as - // "delta-encoded" numbers. - for (var j = value.length - 1; j > 0; j--) { - value[j] -= value[j - 1]; // ... difference from previous value - } - } - privateDict.setByName(field, value); - } - cff.topDict.privateDict = privateDict; - - var subrIndex = new CFFIndex(); - for (i = 0, ii = subrs.length; i < ii; i++) { - subrIndex.add(subrs[i]); - } - privateDict.subrsIndex = subrIndex; - - var compiler = new CFFCompiler(cff); - return compiler.compile(); - } -}; - -var CFFFont = (function CFFFontClosure() { - function CFFFont(file, properties) { - this.properties = properties; - - var parser = new CFFParser(file, properties); - this.cff = parser.parse(); - var compiler = new CFFCompiler(this.cff); - this.seacs = this.cff.seacs; - try { - this.data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - // There may have just been an issue with the compiler, set the data - // anyway and hope the font loaded. - this.data = file; - } - } - - CFFFont.prototype = { - get numGlyphs() { - return this.cff.charStrings.count; - }, - getCharset: function CFFFont_getCharset() { - return this.cff.charset.charset; - }, - getGlyphMapping: function CFFFont_getGlyphMapping() { - var cff = this.cff; - var properties = this.properties; - var charsets = cff.charset.charset; - var charCodeToGlyphId; - var glyphId; - - if (properties.composite) { - charCodeToGlyphId = Object.create(null); - if (cff.isCIDFont) { - // If the font is actually a CID font then we should use the charset - // to map CIDs to GIDs. - for (glyphId = 0; glyphId < charsets.length; glyphId++) { - var cid = charsets[glyphId]; - var charCode = properties.cMap.charCodeOf(cid); - charCodeToGlyphId[charCode] = glyphId; - } - } else { - // If it is NOT actually a CID font then CIDs should be mapped - // directly to GIDs. - for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { - charCodeToGlyphId[glyphId] = glyphId; - } - } - return charCodeToGlyphId; - } - - var encoding = cff.encoding ? cff.encoding.encoding : null; - charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); - return charCodeToGlyphId; - } - }; - - return CFFFont; -})(); - -var CFFParser = (function CFFParserClosure() { - var CharstringValidationData = [ - null, - { id: 'hstem', min: 2, stackClearing: true, stem: true }, - null, - { id: 'vstem', min: 2, stackClearing: true, stem: true }, - { id: 'vmoveto', min: 1, stackClearing: true }, - { id: 'rlineto', min: 2, resetStack: true }, - { id: 'hlineto', min: 1, resetStack: true }, - { id: 'vlineto', min: 1, resetStack: true }, - { id: 'rrcurveto', min: 6, resetStack: true }, - null, - { id: 'callsubr', min: 1, undefStack: true }, - { id: 'return', min: 0, undefStack: true }, - null, // 12 - null, - { id: 'endchar', min: 0, stackClearing: true }, - null, - null, - null, - { id: 'hstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'hintmask', min: 0, stackClearing: true }, - { id: 'cntrmask', min: 0, stackClearing: true }, - { id: 'rmoveto', min: 2, stackClearing: true }, - { id: 'hmoveto', min: 1, stackClearing: true }, - { id: 'vstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'rcurveline', min: 8, resetStack: true }, - { id: 'rlinecurve', min: 8, resetStack: true }, - { id: 'vvcurveto', min: 4, resetStack: true }, - { id: 'hhcurveto', min: 4, resetStack: true }, - null, // shortint - { id: 'callgsubr', min: 1, undefStack: true }, - { id: 'vhcurveto', min: 4, resetStack: true }, - { id: 'hvcurveto', min: 4, resetStack: true } - ]; - var CharstringValidationData12 = [ - null, - null, - null, - { id: 'and', min: 2, stackDelta: -1 }, - { id: 'or', min: 2, stackDelta: -1 }, - { id: 'not', min: 1, stackDelta: 0 }, - null, - null, - null, - { id: 'abs', min: 1, stackDelta: 0 }, - { id: 'add', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] + stack[index - 1]; - } - }, - { id: 'sub', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] - stack[index - 1]; - } - }, - { id: 'div', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] / stack[index - 1]; - } - }, - null, - { id: 'neg', min: 1, stackDelta: 0, - stackFn: function stack_div(stack, index) { - stack[index - 1] = -stack[index - 1]; - } - }, - { id: 'eq', min: 2, stackDelta: -1 }, - null, - null, - { id: 'drop', min: 1, stackDelta: -1 }, - null, - { id: 'put', min: 2, stackDelta: -2 }, - { id: 'get', min: 1, stackDelta: 0 }, - { id: 'ifelse', min: 4, stackDelta: -3 }, - { id: 'random', min: 0, stackDelta: 1 }, - { id: 'mul', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] * stack[index - 1]; - } - }, - null, - { id: 'sqrt', min: 1, stackDelta: 0 }, - { id: 'dup', min: 1, stackDelta: 1 }, - { id: 'exch', min: 2, stackDelta: 0 }, - { id: 'index', min: 2, stackDelta: 0 }, - { id: 'roll', min: 3, stackDelta: -2 }, - null, - null, - null, - { id: 'hflex', min: 7, resetStack: true }, - { id: 'flex', min: 13, resetStack: true }, - { id: 'hflex1', min: 9, resetStack: true }, - { id: 'flex1', min: 11, resetStack: true } - ]; - - function CFFParser(file, properties) { - this.bytes = file.getBytes(); - this.properties = properties; - } - CFFParser.prototype = { - parse: function CFFParser_parse() { - var properties = this.properties; - var cff = new CFF(); - this.cff = cff; - - // The first five sections must be in order, all the others are reached - // via offsets contained in one of the below. - var header = this.parseHeader(); - var nameIndex = this.parseIndex(header.endPos); - var topDictIndex = this.parseIndex(nameIndex.endPos); - var stringIndex = this.parseIndex(topDictIndex.endPos); - var globalSubrIndex = this.parseIndex(stringIndex.endPos); - - var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); - var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); - - cff.header = header.obj; - cff.names = this.parseNameIndex(nameIndex.obj); - cff.strings = this.parseStringIndex(stringIndex.obj); - cff.topDict = topDict; - cff.globalSubrIndex = globalSubrIndex.obj; - - this.parsePrivateDict(cff.topDict); - - cff.isCIDFont = topDict.hasName('ROS'); - - var charStringOffset = topDict.getByName('CharStrings'); - var charStringsAndSeacs = this.parseCharStrings(charStringOffset); - cff.charStrings = charStringsAndSeacs.charStrings; - cff.seacs = charStringsAndSeacs.seacs; - cff.widths = charStringsAndSeacs.widths; - - var fontMatrix = topDict.getByName('FontMatrix'); - if (fontMatrix) { - properties.fontMatrix = fontMatrix; - } - - var fontBBox = topDict.getByName('FontBBox'); - if (fontBBox) { - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - } - - var charset, encoding; - if (cff.isCIDFont) { - var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; - for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { - var dictRaw = fdArrayIndex.get(i); - var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), - cff.strings); - this.parsePrivateDict(fontDict); - cff.fdArray.push(fontDict); - } - // cid fonts don't have an encoding - encoding = null; - charset = this.parseCharsets(topDict.getByName('charset'), - cff.charStrings.count, cff.strings, true); - cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), - cff.charStrings.count); - } else { - charset = this.parseCharsets(topDict.getByName('charset'), - cff.charStrings.count, cff.strings, false); - encoding = this.parseEncoding(topDict.getByName('Encoding'), - properties, - cff.strings, charset.charset); - } - cff.charset = charset; - cff.encoding = encoding; - - return cff; - }, - parseHeader: function CFFParser_parseHeader() { - var bytes = this.bytes; - var bytesLength = bytes.length; - var offset = 0; - - // Prevent an infinite loop, by checking that the offset is within the - // bounds of the bytes array. Necessary in empty, or invalid, font files. - while (offset < bytesLength && bytes[offset] !== 1) { - ++offset; - } - if (offset >= bytesLength) { - error('Invalid CFF header'); - } else if (offset !== 0) { - info('cff data is shifted'); - bytes = bytes.subarray(offset); - this.bytes = bytes; - } - var major = bytes[0]; - var minor = bytes[1]; - var hdrSize = bytes[2]; - var offSize = bytes[3]; - var header = new CFFHeader(major, minor, hdrSize, offSize); - return { obj: header, endPos: hdrSize }; - }, - parseDict: function CFFParser_parseDict(dict) { - var pos = 0; - - function parseOperand() { - var value = dict[pos++]; - if (value === 30) { - return parseFloatOperand(pos); - } else if (value === 28) { - value = dict[pos++]; - value = ((value << 24) | (dict[pos++] << 16)) >> 16; - return value; - } else if (value === 29) { - value = dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - return value; - } else if (value >= 32 && value <= 246) { - return value - 139; - } else if (value >= 247 && value <= 250) { - return ((value - 247) * 256) + dict[pos++] + 108; - } else if (value >= 251 && value <= 254) { - return -((value - 251) * 256) - dict[pos++] - 108; - } else { - error('255 is not a valid DICT command'); - } - return -1; - } - - function parseFloatOperand() { - var str = ''; - var eof = 15; - var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', - '9', '.', 'E', 'E-', null, '-']; - var length = dict.length; - while (pos < length) { - var b = dict[pos++]; - var b1 = b >> 4; - var b2 = b & 15; - - if (b1 === eof) { - break; - } - str += lookup[b1]; - - if (b2 === eof) { - break; - } - str += lookup[b2]; - } - return parseFloat(str); - } - - var operands = []; - var entries = []; - - pos = 0; - var end = dict.length; - while (pos < end) { - var b = dict[pos]; - if (b <= 21) { - if (b === 12) { - b = (b << 8) | dict[++pos]; - } - entries.push([b, operands]); - operands = []; - ++pos; - } else { - operands.push(parseOperand()); - } - } - return entries; - }, - parseIndex: function CFFParser_parseIndex(pos) { - var cffIndex = new CFFIndex(); - var bytes = this.bytes; - var count = (bytes[pos++] << 8) | bytes[pos++]; - var offsets = []; - var end = pos; - var i, ii; - - if (count !== 0) { - var offsetSize = bytes[pos++]; - // add 1 for offset to determine size of last object - var startPos = pos + ((count + 1) * offsetSize) - 1; - - for (i = 0, ii = count + 1; i < ii; ++i) { - var offset = 0; - for (var j = 0; j < offsetSize; ++j) { - offset <<= 8; - offset += bytes[pos++]; - } - offsets.push(startPos + offset); - } - end = offsets[count]; - } - for (i = 0, ii = offsets.length - 1; i < ii; ++i) { - var offsetStart = offsets[i]; - var offsetEnd = offsets[i + 1]; - cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); - } - return {obj: cffIndex, endPos: end}; - }, - parseNameIndex: function CFFParser_parseNameIndex(index) { - var names = []; - for (var i = 0, ii = index.count; i < ii; ++i) { - var name = index.get(i); - // OTS doesn't allow names to be over 127 characters. - var length = Math.min(name.length, 127); - var data = []; - // OTS also only permits certain characters in the name. - for (var j = 0; j < length; ++j) { - var c = name[j]; - if (j === 0 && c === 0) { - data[j] = c; - continue; - } - if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ || - c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ || - c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ || - c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) { - data[j] = 95; - continue; - } - data[j] = c; - } - names.push(bytesToString(data)); - } - return names; - }, - parseStringIndex: function CFFParser_parseStringIndex(index) { - var strings = new CFFStrings(); - for (var i = 0, ii = index.count; i < ii; ++i) { - var data = index.get(i); - strings.add(bytesToString(data)); - } - return strings; - }, - createDict: function CFFParser_createDict(Type, dict, strings) { - var cffDict = new Type(strings); - for (var i = 0, ii = dict.length; i < ii; ++i) { - var pair = dict[i]; - var key = pair[0]; - var value = pair[1]; - cffDict.setByKey(key, value); - } - return cffDict; - }, - parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) { - var charStrings = this.parseIndex(charStringOffset).obj; - var seacs = []; - var widths = []; - var count = charStrings.count; - for (var i = 0; i < count; i++) { - var charstring = charStrings.get(i); - - var stackSize = 0; - var stack = []; - var undefStack = true; - var hints = 0; - var valid = true; - var data = charstring; - var length = data.length; - var firstStackClearing = true; - for (var j = 0; j < length;) { - var value = data[j++]; - var validationCommand = null; - if (value === 12) { - var q = data[j++]; - if (q === 0) { - // The CFF specification state that the 'dotsection' command - // (12, 0) is deprecated and treated as a no-op, but all Type2 - // charstrings processors should support them. Unfortunately - // the font sanitizer don't. As a workaround the sequence (12, 0) - // is replaced by a useless (0, hmoveto). - data[j - 2] = 139; - data[j - 1] = 22; - stackSize = 0; - } else { - validationCommand = CharstringValidationData12[q]; - } - } else if (value === 28) { // number (16 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16; - j += 2; - stackSize++; - } else if (value === 14) { - if (stackSize >= 4) { - stackSize -= 4; - if (SEAC_ANALYSIS_ENABLED) { - seacs[i] = stack.slice(stackSize, stackSize + 4); - valid = false; - } - } - validationCommand = CharstringValidationData[value]; - } else if (value >= 32 && value <= 246) { // number - stack[stackSize] = value - 139; - stackSize++; - } else if (value >= 247 && value <= 254) { // number (+1 bytes) - stack[stackSize] = (value < 251 ? - ((value - 247) << 8) + data[j] + 108 : - -((value - 251) << 8) - data[j] - 108); - j++; - stackSize++; - } else if (value === 255) { // number (32 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) | - (data[j + 2] << 8) | data[j + 3]) / 65536; - j += 4; - stackSize++; - } else if (value === 19 || value === 20) { - hints += stackSize >> 1; - j += (hints + 7) >> 3; // skipping right amount of hints flag data - stackSize %= 2; - validationCommand = CharstringValidationData[value]; - } else { - validationCommand = CharstringValidationData[value]; - } - if (validationCommand) { - if (validationCommand.stem) { - hints += stackSize >> 1; - } - if ('min' in validationCommand) { - if (!undefStack && stackSize < validationCommand.min) { - warn('Not enough parameters for ' + validationCommand.id + - '; actual: ' + stackSize + - ', expected: ' + validationCommand.min); - valid = false; - break; - } - } - if (firstStackClearing && validationCommand.stackClearing) { - firstStackClearing = false; - // the optional character width can be found before the first - // stack-clearing command arguments - stackSize -= validationCommand.min; - if (stackSize >= 2 && validationCommand.stem) { - // there are even amount of arguments for stem commands - stackSize %= 2; - } else if (stackSize > 1) { - warn('Found too many parameters for stack-clearing command'); - } - if (stackSize > 0 && stack[stackSize - 1] >= 0) { - widths[i] = stack[stackSize - 1]; - } - } - if ('stackDelta' in validationCommand) { - if ('stackFn' in validationCommand) { - validationCommand.stackFn(stack, stackSize); - } - stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - undefStack = false; - } else if (validationCommand.undefStack) { - stackSize = 0; - undefStack = true; - firstStackClearing = false; - } - } - } - if (!valid) { - // resetting invalid charstring to single 'endchar' - charStrings.set(i, new Uint8Array([14])); - } - } - return { charStrings: charStrings, seacs: seacs, widths: widths }; - }, - emptyPrivateDictionary: - function CFFParser_emptyPrivateDictionary(parentDict) { - var privateDict = this.createDict(CFFPrivateDict, [], - parentDict.strings); - parentDict.setByKey(18, [0, 0]); - parentDict.privateDict = privateDict; - }, - parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { - // no private dict, do nothing - if (!parentDict.hasName('Private')) { - this.emptyPrivateDictionary(parentDict); - return; - } - var privateOffset = parentDict.getByName('Private'); - // make sure the params are formatted correctly - if (!isArray(privateOffset) || privateOffset.length !== 2) { - parentDict.removeByName('Private'); - return; - } - var size = privateOffset[0]; - var offset = privateOffset[1]; - // remove empty dicts or ones that refer to invalid location - if (size === 0 || offset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - - var privateDictEnd = offset + size; - var dictData = this.bytes.subarray(offset, privateDictEnd); - var dict = this.parseDict(dictData); - var privateDict = this.createDict(CFFPrivateDict, dict, - parentDict.strings); - parentDict.privateDict = privateDict; - - // Parse the Subrs index also since it's relative to the private dict. - if (!privateDict.getByName('Subrs')) { - return; - } - var subrsOffset = privateDict.getByName('Subrs'); - var relativeOffset = offset + subrsOffset; - // Validate the offset. - if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - var subrsIndex = this.parseIndex(relativeOffset); - privateDict.subrsIndex = subrsIndex.obj; - }, - parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { - if (pos === 0) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, - ISOAdobeCharset); - } else if (pos === 1) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, - ExpertCharset); - } else if (pos === 2) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, - ExpertSubsetCharset); - } - - var bytes = this.bytes; - var start = pos; - var format = bytes[pos++]; - var charset = ['.notdef']; - var id, count, i; - - // subtract 1 for the .notdef glyph - length -= 1; - - switch (format) { - case 0: - for (i = 0; i < length; i++) { - id = (bytes[pos++] << 8) | bytes[pos++]; - charset.push(cid ? id : strings.get(id)); - } - break; - case 1: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - case 2: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - default: - error('Unknown charset format'); - } - // Raw won't be needed if we actually compile the charset. - var end = pos; - var raw = bytes.subarray(start, end); - - return new CFFCharset(false, format, charset, raw); - }, - parseEncoding: function CFFParser_parseEncoding(pos, - properties, - strings, - charset) { - var encoding = {}; - var bytes = this.bytes; - var predefined = false; - var hasSupplement = false; - var format, i, ii; - var raw = null; - - function readSupplement() { - var supplementsCount = bytes[pos++]; - for (i = 0; i < supplementsCount; i++) { - var code = bytes[pos++]; - var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); - encoding[code] = charset.indexOf(strings.get(sid)); - } - } - - if (pos === 0 || pos === 1) { - predefined = true; - format = pos; - var baseEncoding = pos ? Encodings.ExpertEncoding : - Encodings.StandardEncoding; - for (i = 0, ii = charset.length; i < ii; i++) { - var index = baseEncoding.indexOf(charset[i]); - if (index !== -1) { - encoding[index] = i; - } - } - } else { - var dataStart = pos; - format = bytes[pos++]; - switch (format & 0x7f) { - case 0: - var glyphsCount = bytes[pos++]; - for (i = 1; i <= glyphsCount; i++) { - encoding[bytes[pos++]] = i; - } - break; - - case 1: - var rangesCount = bytes[pos++]; - var gid = 1; - for (i = 0; i < rangesCount; i++) { - var start = bytes[pos++]; - var left = bytes[pos++]; - for (var j = start; j <= start + left; j++) { - encoding[j] = gid++; - } - } - break; - - default: - error('Unknow encoding format: ' + format + ' in CFF'); - break; - } - var dataEnd = pos; - if (format & 0x80) { - // The font sanitizer does not support CFF encoding with a - // supplement, since the encoding is not really used to map - // between gid to glyph, let's overwrite what is declared in - // the top dictionary to let the sanitizer think the font use - // StandardEncoding, that's a lie but that's ok. - bytes[dataStart] &= 0x7f; - readSupplement(); - hasSupplement = true; - } - raw = bytes.subarray(dataStart, dataEnd); - } - format = format & 0x7f; - return new CFFEncoding(predefined, format, encoding, raw); - }, - parseFDSelect: function CFFParser_parseFDSelect(pos, length) { - var start = pos; - var bytes = this.bytes; - var format = bytes[pos++]; - var fdSelect = []; - var i; - - switch (format) { - case 0: - for (i = 0; i < length; ++i) { - var id = bytes[pos++]; - fdSelect.push(id); - } - break; - case 3: - var rangesCount = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i < rangesCount; ++i) { - var first = (bytes[pos++] << 8) | bytes[pos++]; - var fdIndex = bytes[pos++]; - var next = (bytes[pos] << 8) | bytes[pos + 1]; - for (var j = first; j < next; ++j) { - fdSelect.push(fdIndex); - } - } - // Advance past the sentinel(next). - pos += 2; - break; - default: - error('Unknown fdselect format ' + format); - break; - } - var end = pos; - return new CFFFDSelect(fdSelect, bytes.subarray(start, end)); - } - }; - return CFFParser; -})(); - -// Compact Font Format -var CFF = (function CFFClosure() { - function CFF() { - this.header = null; - this.names = []; - this.topDict = null; - this.strings = new CFFStrings(); - this.globalSubrIndex = null; - - // The following could really be per font, but since we only have one font - // store them here. - this.encoding = null; - this.charset = null; - this.charStrings = null; - this.fdArray = []; - this.fdSelect = null; - - this.isCIDFont = false; - } - return CFF; -})(); - -var CFFHeader = (function CFFHeaderClosure() { - function CFFHeader(major, minor, hdrSize, offSize) { - this.major = major; - this.minor = minor; - this.hdrSize = hdrSize; - this.offSize = offSize; - } - return CFFHeader; -})(); - -var CFFStrings = (function CFFStringsClosure() { - function CFFStrings() { - this.strings = []; - } - CFFStrings.prototype = { - get: function CFFStrings_get(index) { - if (index >= 0 && index <= 390) { - return CFFStandardStrings[index]; - } - if (index - 391 <= this.strings.length) { - return this.strings[index - 391]; - } - return CFFStandardStrings[0]; - }, - add: function CFFStrings_add(value) { - this.strings.push(value); - }, - get count() { - return this.strings.length; - } - }; - return CFFStrings; -})(); - -var CFFIndex = (function CFFIndexClosure() { - function CFFIndex() { - this.objects = []; - this.length = 0; - } - CFFIndex.prototype = { - add: function CFFIndex_add(data) { - this.length += data.length; - this.objects.push(data); - }, - set: function CFFIndex_set(index, data) { - this.length += data.length - this.objects[index].length; - this.objects[index] = data; - }, - get: function CFFIndex_get(index) { - return this.objects[index]; - }, - get count() { - return this.objects.length; - } - }; - return CFFIndex; -})(); - -var CFFDict = (function CFFDictClosure() { - function CFFDict(tables, strings) { - this.keyToNameMap = tables.keyToNameMap; - this.nameToKeyMap = tables.nameToKeyMap; - this.defaults = tables.defaults; - this.types = tables.types; - this.opcodes = tables.opcodes; - this.order = tables.order; - this.strings = strings; - this.values = {}; - } - CFFDict.prototype = { - // value should always be an array - setByKey: function CFFDict_setByKey(key, value) { - if (!(key in this.keyToNameMap)) { - return false; - } - // ignore empty values - if (value.length === 0) { - return true; - } - var type = this.types[key]; - // remove the array wrapping these types of values - if (type === 'num' || type === 'sid' || type === 'offset') { - value = value[0]; - } - this.values[key] = value; - return true; - }, - setByName: function CFFDict_setByName(name, value) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - this.values[this.nameToKeyMap[name]] = value; - }, - hasName: function CFFDict_hasName(name) { - return this.nameToKeyMap[name] in this.values; - }, - getByName: function CFFDict_getByName(name) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - var key = this.nameToKeyMap[name]; - if (!(key in this.values)) { - return this.defaults[key]; - } - return this.values[key]; - }, - removeByName: function CFFDict_removeByName(name) { - delete this.values[this.nameToKeyMap[name]]; - } - }; - CFFDict.createTables = function CFFDict_createTables(layout) { - var tables = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [] - }; - for (var i = 0, ii = layout.length; i < ii; ++i) { - var entry = layout[i]; - var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; - tables.keyToNameMap[key] = entry[1]; - tables.nameToKeyMap[entry[1]] = key; - tables.types[key] = entry[2]; - tables.defaults[key] = entry[3]; - tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; - tables.order.push(key); - } - return tables; - }; - return CFFDict; -})(); - -var CFFTopDict = (function CFFTopDictClosure() { - var layout = [ - [[12, 30], 'ROS', ['sid', 'sid', 'num'], null], - [[12, 20], 'SyntheticBase', 'num', null], - [0, 'version', 'sid', null], - [1, 'Notice', 'sid', null], - [[12, 0], 'Copyright', 'sid', null], - [2, 'FullName', 'sid', null], - [3, 'FamilyName', 'sid', null], - [4, 'Weight', 'sid', null], - [[12, 1], 'isFixedPitch', 'num', 0], - [[12, 2], 'ItalicAngle', 'num', 0], - [[12, 3], 'UnderlinePosition', 'num', -100], - [[12, 4], 'UnderlineThickness', 'num', 50], - [[12, 5], 'PaintType', 'num', 0], - [[12, 6], 'CharstringType', 'num', 2], - [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], - [0.001, 0, 0, 0.001, 0, 0]], - [13, 'UniqueID', 'num', null], - [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], - [[12, 8], 'StrokeWidth', 'num', 0], - [14, 'XUID', 'array', null], - [15, 'charset', 'offset', 0], - [16, 'Encoding', 'offset', 0], - [17, 'CharStrings', 'offset', 0], - [18, 'Private', ['offset', 'offset'], null], - [[12, 21], 'PostScript', 'sid', null], - [[12, 22], 'BaseFontName', 'sid', null], - [[12, 23], 'BaseFontBlend', 'delta', null], - [[12, 31], 'CIDFontVersion', 'num', 0], - [[12, 32], 'CIDFontRevision', 'num', 0], - [[12, 33], 'CIDFontType', 'num', 0], - [[12, 34], 'CIDCount', 'num', 8720], - [[12, 35], 'UIDBase', 'num', null], - // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes - // before FDArray. - [[12, 37], 'FDSelect', 'offset', null], - [[12, 36], 'FDArray', 'offset', null], - [[12, 38], 'FontName', 'sid', null] - ]; - var tables = null; - function CFFTopDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.privateDict = null; - } - CFFTopDict.prototype = Object.create(CFFDict.prototype); - return CFFTopDict; -})(); - -var CFFPrivateDict = (function CFFPrivateDictClosure() { - var layout = [ - [6, 'BlueValues', 'delta', null], - [7, 'OtherBlues', 'delta', null], - [8, 'FamilyBlues', 'delta', null], - [9, 'FamilyOtherBlues', 'delta', null], - [[12, 9], 'BlueScale', 'num', 0.039625], - [[12, 10], 'BlueShift', 'num', 7], - [[12, 11], 'BlueFuzz', 'num', 1], - [10, 'StdHW', 'num', null], - [11, 'StdVW', 'num', null], - [[12, 12], 'StemSnapH', 'delta', null], - [[12, 13], 'StemSnapV', 'delta', null], - [[12, 14], 'ForceBold', 'num', 0], - [[12, 17], 'LanguageGroup', 'num', 0], - [[12, 18], 'ExpansionFactor', 'num', 0.06], - [[12, 19], 'initialRandomSeed', 'num', 0], - [20, 'defaultWidthX', 'num', 0], - [21, 'nominalWidthX', 'num', 0], - [19, 'Subrs', 'offset', null] - ]; - var tables = null; - function CFFPrivateDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.subrsIndex = null; - } - CFFPrivateDict.prototype = Object.create(CFFDict.prototype); - return CFFPrivateDict; -})(); - -var CFFCharsetPredefinedTypes = { - ISO_ADOBE: 0, - EXPERT: 1, - EXPERT_SUBSET: 2 -}; -var CFFCharset = (function CFFCharsetClosure() { - function CFFCharset(predefined, format, charset, raw) { - this.predefined = predefined; - this.format = format; - this.charset = charset; - this.raw = raw; - } - return CFFCharset; -})(); - -var CFFEncoding = (function CFFEncodingClosure() { - function CFFEncoding(predefined, format, encoding, raw) { - this.predefined = predefined; - this.format = format; - this.encoding = encoding; - this.raw = raw; - } - return CFFEncoding; -})(); - -var CFFFDSelect = (function CFFFDSelectClosure() { - function CFFFDSelect(fdSelect, raw) { - this.fdSelect = fdSelect; - this.raw = raw; - } - return CFFFDSelect; -})(); - -// Helper class to keep track of where an offset is within the data and helps -// filling in that offset once it's known. -var CFFOffsetTracker = (function CFFOffsetTrackerClosure() { - function CFFOffsetTracker() { - this.offsets = {}; - } - CFFOffsetTracker.prototype = { - isTracking: function CFFOffsetTracker_isTracking(key) { - return key in this.offsets; - }, - track: function CFFOffsetTracker_track(key, location) { - if (key in this.offsets) { - error('Already tracking location of ' + key); - } - this.offsets[key] = location; - }, - offset: function CFFOffsetTracker_offset(value) { - for (var key in this.offsets) { - this.offsets[key] += value; - } - }, - setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, - values, - output) { - if (!(key in this.offsets)) { - error('Not tracking location of ' + key); - } - var data = output.data; - var dataOffset = this.offsets[key]; - var size = 5; - for (var i = 0, ii = values.length; i < ii; ++i) { - var offset0 = i * size + dataOffset; - var offset1 = offset0 + 1; - var offset2 = offset0 + 2; - var offset3 = offset0 + 3; - var offset4 = offset0 + 4; - // It's easy to screw up offsets so perform this sanity check. - if (data[offset0] !== 0x1d || data[offset1] !== 0 || - data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { - error('writing to an offset that is not empty'); - } - var value = values[i]; - data[offset0] = 0x1d; - data[offset1] = (value >> 24) & 0xFF; - data[offset2] = (value >> 16) & 0xFF; - data[offset3] = (value >> 8) & 0xFF; - data[offset4] = value & 0xFF; - } - } - }; - return CFFOffsetTracker; -})(); - -// Takes a CFF and converts it to the binary representation. -var CFFCompiler = (function CFFCompilerClosure() { - function CFFCompiler(cff) { - this.cff = cff; - } - CFFCompiler.prototype = { - compile: function CFFCompiler_compile() { - var cff = this.cff; - var output = { - data: [], - length: 0, - add: function CFFCompiler_add(data) { - this.data = this.data.concat(data); - this.length = this.data.length; - } - }; - - // Compile the five entries that must be in order. - var header = this.compileHeader(cff.header); - output.add(header); - - var nameIndex = this.compileNameIndex(cff.names); - output.add(nameIndex); - - if (cff.isCIDFont) { - // The spec is unclear on how font matrices should relate to each other - // when there is one in the main top dict and the sub top dicts. - // Windows handles this differently than linux and osx so we have to - // normalize to work on all. - // Rules based off of some mailing list discussions: - // - If main font has a matrix and subfont doesn't, use the main matrix. - // - If no main font matrix and there is a subfont matrix, use the - // subfont matrix. - // - If both have matrices, concat together. - // - If neither have matrices, use default. - // To make this work on all platforms we move the top matrix into each - // sub top dict and concat if necessary. - if (cff.topDict.hasName('FontMatrix')) { - var base = cff.topDict.getByName('FontMatrix'); - cff.topDict.removeByName('FontMatrix'); - for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { - var subDict = cff.fdArray[i]; - var matrix = base.slice(0); - if (subDict.hasName('FontMatrix')) { - matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); - } - subDict.setByName('FontMatrix', matrix); - } - } - } - - var compiled = this.compileTopDicts([cff.topDict], - output.length, - cff.isCIDFont); - output.add(compiled.output); - var topDictTracker = compiled.trackers[0]; - - var stringIndex = this.compileStringIndex(cff.strings.strings); - output.add(stringIndex); - - var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); - output.add(globalSubrIndex); - - // Now start on the other entries that have no specfic order. - if (cff.encoding && cff.topDict.hasName('Encoding')) { - if (cff.encoding.predefined) { - topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], - output); - } else { - var encoding = this.compileEncoding(cff.encoding); - topDictTracker.setEntryLocation('Encoding', [output.length], output); - output.add(encoding); - } - } - - if (cff.charset && cff.topDict.hasName('charset')) { - if (cff.charset.predefined) { - topDictTracker.setEntryLocation('charset', [cff.charset.format], - output); - } else { - var charset = this.compileCharset(cff.charset); - topDictTracker.setEntryLocation('charset', [output.length], output); - output.add(charset); - } - } - - var charStrings = this.compileCharStrings(cff.charStrings); - topDictTracker.setEntryLocation('CharStrings', [output.length], output); - output.add(charStrings); - - if (cff.isCIDFont) { - // For some reason FDSelect must be in front of FDArray on windows. OSX - // and linux don't seem to care. - topDictTracker.setEntryLocation('FDSelect', [output.length], output); - var fdSelect = this.compileFDSelect(cff.fdSelect.raw); - output.add(fdSelect); - // It is unclear if the sub font dictionary can have CID related - // dictionary keys, but the sanitizer doesn't like them so remove them. - compiled = this.compileTopDicts(cff.fdArray, output.length, true); - topDictTracker.setEntryLocation('FDArray', [output.length], output); - output.add(compiled.output); - var fontDictTrackers = compiled.trackers; - - this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); - } - - this.compilePrivateDicts([cff.topDict], [topDictTracker], output); - - // If the font data ends with INDEX whose object data is zero-length, - // the sanitizer will bail out. Add a dummy byte to avoid that. - output.add([0]); - - return output.data; - }, - encodeNumber: function CFFCompiler_encodeNumber(value) { - if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt - return this.encodeInteger(value); - } else { - return this.encodeFloat(value); - } - }, - encodeFloat: function CFFCompiler_encodeFloat(num) { - var value = num.toString(); - - // rounding inaccurate doubles - var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value); - if (m) { - var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length)); - value = (Math.round(num * epsilon) / epsilon).toString(); - } - - var nibbles = ''; - var i, ii; - for (i = 0, ii = value.length; i < ii; ++i) { - var a = value[i]; - if (a === 'e') { - nibbles += value[++i] === '-' ? 'c' : 'b'; - } else if (a === '.') { - nibbles += 'a'; - } else if (a === '-') { - nibbles += 'e'; - } else { - nibbles += a; - } - } - nibbles += (nibbles.length & 1) ? 'f' : 'ff'; - var out = [30]; - for (i = 0, ii = nibbles.length; i < ii; i += 2) { - out.push(parseInt(nibbles.substr(i, 2), 16)); - } - return out; - }, - encodeInteger: function CFFCompiler_encodeInteger(value) { - var code; - if (value >= -107 && value <= 107) { - code = [value + 139]; - } else if (value >= 108 && value <= 1131) { - value = [value - 108]; - code = [(value >> 8) + 247, value & 0xFF]; - } else if (value >= -1131 && value <= -108) { - value = -value - 108; - code = [(value >> 8) + 251, value & 0xFF]; - } else if (value >= -32768 && value <= 32767) { - code = [0x1c, (value >> 8) & 0xFF, value & 0xFF]; - } else { - code = [0x1d, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF]; - } - return code; - }, - compileHeader: function CFFCompiler_compileHeader(header) { - return [ - header.major, - header.minor, - header.hdrSize, - header.offSize - ]; - }, - compileNameIndex: function CFFCompiler_compileNameIndex(names) { - var nameIndex = new CFFIndex(); - for (var i = 0, ii = names.length; i < ii; ++i) { - nameIndex.add(stringToBytes(names[i])); - } - return this.compileIndex(nameIndex); - }, - compileTopDicts: function CFFCompiler_compileTopDicts(dicts, - length, - removeCidKeys) { - var fontDictTrackers = []; - var fdArrayIndex = new CFFIndex(); - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - if (removeCidKeys) { - fontDict.removeByName('CIDFontVersion'); - fontDict.removeByName('CIDFontRevision'); - fontDict.removeByName('CIDFontType'); - fontDict.removeByName('CIDCount'); - fontDict.removeByName('UIDBase'); - } - var fontDictTracker = new CFFOffsetTracker(); - var fontDictData = this.compileDict(fontDict, fontDictTracker); - fontDictTrackers.push(fontDictTracker); - fdArrayIndex.add(fontDictData); - fontDictTracker.offset(length); - } - fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); - return { - trackers: fontDictTrackers, - output: fdArrayIndex - }; - }, - compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, - trackers, - output) { - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - assert(fontDict.privateDict && fontDict.hasName('Private'), - 'There must be an private dictionary.'); - var privateDict = fontDict.privateDict; - var privateDictTracker = new CFFOffsetTracker(); - var privateDictData = this.compileDict(privateDict, privateDictTracker); - - var outputLength = output.length; - privateDictTracker.offset(outputLength); - if (!privateDictData.length) { - // The private dictionary was empty, set the output length to zero to - // ensure the offset length isn't out of bounds in the eyes of the - // sanitizer. - outputLength = 0; - } - - trackers[i].setEntryLocation('Private', - [privateDictData.length, outputLength], - output); - output.add(privateDictData); - - if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { - var subrs = this.compileIndex(privateDict.subrsIndex); - privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], - output); - output.add(subrs); - } - } - }, - compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { - var out = []; - // The dictionary keys must be in a certain order. - var order = dict.order; - for (var i = 0; i < order.length; ++i) { - var key = order[i]; - if (!(key in dict.values)) { - continue; - } - var values = dict.values[key]; - var types = dict.types[key]; - if (!isArray(types)) { - types = [types]; - } - if (!isArray(values)) { - values = [values]; - } - - // Remove any empty dict values. - if (values.length === 0) { - continue; - } - - for (var j = 0, jj = types.length; j < jj; ++j) { - var type = types[j]; - var value = values[j]; - switch (type) { - case 'num': - case 'sid': - out = out.concat(this.encodeNumber(value)); - break; - case 'offset': - // For offsets we just insert a 32bit integer so we don't have to - // deal with figuring out the length of the offset when it gets - // replaced later on by the compiler. - var name = dict.keyToNameMap[key]; - // Some offsets have the offset and the length, so just record the - // position of the first one. - if (!offsetTracker.isTracking(name)) { - offsetTracker.track(name, out.length); - } - out = out.concat([0x1d, 0, 0, 0, 0]); - break; - case 'array': - case 'delta': - out = out.concat(this.encodeNumber(value)); - for (var k = 1, kk = values.length; k < kk; ++k) { - out = out.concat(this.encodeNumber(values[k])); - } - break; - default: - error('Unknown data type of ' + type); - break; - } - } - out = out.concat(dict.opcodes[key]); - } - return out; - }, - compileStringIndex: function CFFCompiler_compileStringIndex(strings) { - var stringIndex = new CFFIndex(); - for (var i = 0, ii = strings.length; i < ii; ++i) { - stringIndex.add(stringToBytes(strings[i])); - } - return this.compileIndex(stringIndex); - }, - compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { - var globalSubrIndex = this.cff.globalSubrIndex; - this.out.writeByteArray(this.compileIndex(globalSubrIndex)); - }, - compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { - return this.compileIndex(charStrings); - }, - compileCharset: function CFFCompiler_compileCharset(charset) { - return this.compileTypedArray(charset.raw); - }, - compileEncoding: function CFFCompiler_compileEncoding(encoding) { - return this.compileTypedArray(encoding.raw); - }, - compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { - return this.compileTypedArray(fdSelect); - }, - compileTypedArray: function CFFCompiler_compileTypedArray(data) { - var out = []; - for (var i = 0, ii = data.length; i < ii; ++i) { - out[i] = data[i]; - } - return out; - }, - compileIndex: function CFFCompiler_compileIndex(index, trackers) { - trackers = trackers || []; - var objects = index.objects; - // First 2 bytes contains the number of objects contained into this index - var count = objects.length; - - // If there is no object, just create an index. This technically - // should just be [0, 0] but OTS has an issue with that. - if (count === 0) { - return [0, 0, 0]; - } - - var data = [(count >> 8) & 0xFF, count & 0xff]; - - var lastOffset = 1, i; - for (i = 0; i < count; ++i) { - lastOffset += objects[i].length; - } - - var offsetSize; - if (lastOffset < 0x100) { - offsetSize = 1; - } else if (lastOffset < 0x10000) { - offsetSize = 2; - } else if (lastOffset < 0x1000000) { - offsetSize = 3; - } else { - offsetSize = 4; - } - - // Next byte contains the offset size use to reference object in the file - data.push(offsetSize); - - // Add another offset after this one because we need a new offset - var relativeOffset = 1; - for (i = 0; i < count + 1; i++) { - if (offsetSize === 1) { - data.push(relativeOffset & 0xFF); - } else if (offsetSize === 2) { - data.push((relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else if (offsetSize === 3) { - data.push((relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else { - data.push((relativeOffset >>> 24) & 0xFF, - (relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } - - if (objects[i]) { - relativeOffset += objects[i].length; - } - } - - for (i = 0; i < count; i++) { - // Notify the tracker where the object will be offset in the data. - if (trackers[i]) { - trackers[i].offset(data.length); - } - for (var j = 0, jj = objects[i].length; j < jj; j++) { - data.push(objects[i][j]); - } - } - return data; - } - }; - return CFFCompiler; -})(); - -// Workaround for seac on Windows. -(function checkSeacSupport() { - if (/Windows/.test(navigator.userAgent)) { - SEAC_ANALYSIS_ENABLED = true; - } -})(); - -// Workaround for Private Use Area characters in Chrome on Windows -// http://code.google.com/p/chromium/issues/detail?id=122465 -// https://github.com/mozilla/pdf.js/issues/1689 -(function checkChromeWindows() { - if (/Windows.*Chrome/.test(navigator.userAgent)) { - SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true; - } -})(); - - -var FontRendererFactory = (function FontRendererFactoryClosure() { - function getLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - } - - function getUshort(data, offset) { - return (data[offset] << 8) | data[offset + 1]; - } - - function parseCmap(data, start, end) { - var offset = (getUshort(data, start + 2) === 1 ? - getLong(data, start + 8) : getLong(data, start + 16)); - var format = getUshort(data, start + offset); - var length, ranges, p, i; - if (format === 4) { - length = getUshort(data, start + offset + 2); - var segCount = getUshort(data, start + offset + 6) >> 1; - p = start + offset + 14; - ranges = []; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i] = {end: getUshort(data, p)}; - } - p += 2; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].start = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].idDelta = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - var idOffset = getUshort(data, p); - if (idOffset === 0) { - continue; - } - ranges[i].ids = []; - for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { - ranges[i].ids[j] = getUshort(data, p + idOffset); - idOffset += 2; - } - } - return ranges; - } else if (format === 12) { - length = getLong(data, start + offset + 4); - var groups = getLong(data, start + offset + 12); - p = start + offset + 16; - ranges = []; - for (i = 0; i < groups; i++) { - ranges.push({ - start: getLong(data, p), - end: getLong(data, p + 4), - idDelta: getLong(data, p + 8) - getLong(data, p) - }); - p += 12; - } - return ranges; - } - error('not supported cmap: ' + format); - } - - function parseCff(data, start, end) { - var properties = {}; - var parser = new CFFParser(new Stream(data, start, end - start), - properties); - var cff = parser.parse(); - return { - glyphs: cff.charStrings.objects, - subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && - cff.topDict.privateDict.subrsIndex.objects), - gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects - }; - } - - function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { - var itemSize, itemDecode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - } - var glyphs = []; - var startOffset = itemDecode(loca, 0); - for (var j = itemSize; j < loca.length; j += itemSize) { - var endOffset = itemDecode(loca, j); - glyphs.push(glyf.subarray(startOffset, endOffset)); - startOffset = endOffset; - } - return glyphs; - } - - function lookupCmap(ranges, unicode) { - var code = unicode.charCodeAt(0); - var l = 0, r = ranges.length - 1; - while (l < r) { - var c = (l + r + 1) >> 1; - if (code < ranges[c].start) { - r = c - 1; - } else { - l = c; - } - } - if (ranges[l].start <= code && code <= ranges[l].end) { - return (ranges[l].idDelta + (ranges[l].ids ? - ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF; - } - return 0; - } - - function compileGlyf(code, cmds, font) { - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function quadraticCurveTo(xa, ya, x, y) { - cmds.push({cmd: 'quadraticCurveTo', args: [xa, ya, x, y]}); - } - - var i = 0; - var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - var flags; - var x = 0, y = 0; - i += 10; - if (numberOfContours < 0) { - // composite glyph - do { - flags = (code[i] << 8) | code[i + 1]; - var glyphIndex = (code[i + 2] << 8) | code[i + 3]; - i += 4; - var arg1, arg2; - if ((flags & 0x01)) { - arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16; - i += 4; - } else { - arg1 = code[i++]; arg2 = code[i++]; - } - if ((flags & 0x02)) { - x = arg1; - y = arg2; - } else { - x = 0; y = 0; // TODO "they are points" ? - } - var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0; - if ((flags & 0x08)) { - scaleX = - scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - i += 2; - } else if ((flags & 0x40)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - i += 4; - } else if ((flags & 0x80)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824; - scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824; - i += 8; - } - var subglyph = font.glyphs[glyphIndex]; - if (subglyph) { - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', - args: [scaleX, scale01, scale10, scaleY, x, y]}); - compileGlyf(subglyph, cmds, font); - cmds.push({cmd: 'restore'}); - } - } while ((flags & 0x20)); - } else { - // simple glyph - var endPtsOfContours = []; - var j, jj; - for (j = 0; j < numberOfContours; j++) { - endPtsOfContours.push((code[i] << 8) | code[i + 1]); - i += 2; - } - var instructionLength = (code[i] << 8) | code[i + 1]; - i += 2 + instructionLength; // skipping the instructions - var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1; - var points = []; - while (points.length < numberOfPoints) { - flags = code[i++]; - var repeat = 1; - if ((flags & 0x08)) { - repeat += code[i++]; - } - while (repeat-- > 0) { - points.push({flags: flags}); - } - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x12) { - case 0x00: - x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x02: - x -= code[i++]; - break; - case 0x12: - x += code[i++]; - break; - } - points[j].x = x; - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x24) { - case 0x00: - y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x04: - y -= code[i++]; - break; - case 0x24: - y += code[i++]; - break; - } - points[j].y = y; - } - - var startPoint = 0; - for (i = 0; i < numberOfContours; i++) { - var endPoint = endPtsOfContours[i]; - // contours might have implicit points, which is located in the middle - // between two neighboring off-curve points - var contour = points.slice(startPoint, endPoint + 1); - if ((contour[0].flags & 1)) { - contour.push(contour[0]); // using start point at the contour end - } else if ((contour[contour.length - 1].flags & 1)) { - // first is off-curve point, trying to use one from the end - contour.unshift(contour[contour.length - 1]); - } else { - // start and end are off-curve points, creating implicit one - var p = { - flags: 1, - x: (contour[0].x + contour[contour.length - 1].x) / 2, - y: (contour[0].y + contour[contour.length - 1].y) / 2 - }; - contour.unshift(p); - contour.push(p); - } - moveTo(contour[0].x, contour[0].y); - for (j = 1, jj = contour.length; j < jj; j++) { - if ((contour[j].flags & 1)) { - lineTo(contour[j].x, contour[j].y); - } else if ((contour[j + 1].flags & 1)){ - quadraticCurveTo(contour[j].x, contour[j].y, - contour[j + 1].x, contour[j + 1].y); - j++; - } else { - quadraticCurveTo(contour[j].x, contour[j].y, - (contour[j].x + contour[j + 1].x) / 2, - (contour[j].y + contour[j + 1].y) / 2); - } - } - startPoint = endPoint + 1; - } - } - } - - function compileCharString(code, cmds, font) { - var stack = []; - var x = 0, y = 0; - var stems = 0; - - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.push({cmd: 'bezierCurveTo', args: [x1, y1, x2, y2, x, y]}); - } - - function parse(code) { - var i = 0; - while (i < code.length) { - var stackClean = false; - var v = code[i++]; - var xa, xb, ya, yb, y1, y2, y3, n, subrCode; - switch (v) { - case 1: // hstem - stems += stack.length >> 1; - stackClean = true; - break; - case 3: // vstem - stems += stack.length >> 1; - stackClean = true; - break; - case 4: // vmoveto - y += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 5: // rlineto - while (stack.length > 0) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - break; - case 6: // hlineto - while (stack.length > 0) { - x += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - y += stack.shift(); - lineTo(x, y); - } - break; - case 7: // vlineto - while (stack.length > 0) { - y += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - x += stack.shift(); - lineTo(x, y); - } - break; - case 8: // rrcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 10: // callsubr - n = stack.pop() + font.subrsBias; - subrCode = font.subrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 11: // return - return; - case 12: - v = code[i++]; - switch (v) { - case 34: // flex - xa = x + stack.shift(); - xb = xa + stack.shift(); y1 = y + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y, xb, y1, x, y1); - xa = x + stack.shift(); - xb = xa + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y, x, y); - break; - case 35: // flex - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - stack.pop(); // fd - break; - case 36: // hflex1 - xa = x + stack.shift(); y1 = y + stack.shift(); - xb = xa + stack.shift(); y2 = y1 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y2, x, y2); - xa = x + stack.shift(); - xb = xa + stack.shift(); y3 = y2 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y2, xb, y3, x, y); - break; - case 37: // flex1 - var x0 = x, y0 = y; - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb; - if (Math.abs(x - x0) > Math.abs(y - y0)) { - x += stack.shift(); - } else { - y += stack.shift(); - } - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - default: - error('unknown operator: 12 ' + v); - } - break; - case 14: // endchar - if (stack.length >= 4) { - var achar = stack.pop(); - var bchar = stack.pop(); - y = stack.pop(); - x = stack.pop(); - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'translate', args: [x, y]}); - var gid = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[Encodings.StandardEncoding[achar]])); - compileCharString(font.glyphs[gid], cmds, font); - cmds.push({cmd: 'restore'}); - - gid = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[Encodings.StandardEncoding[bchar]])); - compileCharString(font.glyphs[gid], cmds, font); - } - return; - case 18: // hstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 19: // hintmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 20: // cntrmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 21: // rmoveto - y += stack.pop(); - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 22: // hmoveto - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 23: // vstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 24: // rcurveline - while (stack.length > 2) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - break; - case 25: // rlinecurve - while (stack.length > 6) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - case 26: // vvcurveto - if (stack.length % 2) { - x += stack.shift(); - } - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 27: // hhcurveto - if (stack.length % 2) { - y += stack.shift(); - } - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb; - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 28: - stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16); - i += 2; - break; - case 29: // callgsubr - n = stack.pop() + font.gsubrsBias; - subrCode = font.gsubrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 30: // vhcurveto - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 31: // hvcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - default: - if (v < 32) { - error('unknown operator: ' + v); - } - if (v < 247) { - stack.push(v - 139); - } else if (v < 251) { - stack.push((v - 247) * 256 + code[i++] + 108); - } else if (v < 255) { - stack.push(-(v - 251) * 256 - code[i++] - 108); - } else { - stack.push(((code[i] << 24) | (code[i + 1] << 16) | - (code[i + 2] << 8) | code[i + 3]) / 65536); - i += 4; - } - break; - } - if (stackClean) { - stack.length = 0; - } - } - } - parse(code); - } - - var noop = ''; - - function CompiledFont(fontMatrix) { - this.compiledGlyphs = {}; - this.fontMatrix = fontMatrix; - } - CompiledFont.prototype = { - getPathJs: function (unicode) { - var gid = lookupCmap(this.cmap, unicode); - var fn = this.compiledGlyphs[gid]; - if (!fn) { - this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]); - } - return fn; - }, - - compileGlyph: function (code) { - if (!code || code.length === 0 || code[0] === 14) { - return noop; - } - - var cmds = []; - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', args: this.fontMatrix.slice()}); - cmds.push({cmd: 'scale', args: ['size', '-size']}); - - this.compileGlyphImpl(code, cmds); - - cmds.push({cmd: 'restore'}); - - return cmds; - }, - - compileGlyphImpl: function () { - error('Children classes should implement this.'); - }, - - hasBuiltPath: function (unicode) { - var gid = lookupCmap(this.cmap, unicode); - return gid in this.compiledGlyphs; - } - }; - - function TrueTypeCompiled(glyphs, cmap, fontMatrix) { - fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]; - CompiledFont.call(this, fontMatrix); - - this.glyphs = glyphs; - this.cmap = cmap; - - this.compiledGlyphs = []; - } - - Util.inherit(TrueTypeCompiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileGlyf(code, cmds, this); - } - }); - - function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) { - fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0]; - CompiledFont.call(this, fontMatrix); - this.glyphs = cffInfo.glyphs; - this.gsubrs = cffInfo.gsubrs || []; - this.subrs = cffInfo.subrs || []; - this.cmap = cmap; - this.glyphNameMap = glyphNameMap || GlyphsUnicode; - - this.compiledGlyphs = []; - this.gsubrsBias = (this.gsubrs.length < 1240 ? - 107 : (this.gsubrs.length < 33900 ? 1131 : 32768)); - this.subrsBias = (this.subrs.length < 1240 ? - 107 : (this.subrs.length < 33900 ? 1131 : 32768)); - } - - Util.inherit(Type2Compiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileCharString(code, cmds, this); - } - }); - - - return { - create: function FontRendererFactory_create(font) { - var data = new Uint8Array(font.data); - var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; - var numTables = getUshort(data, 4); - for (var i = 0, p = 12; i < numTables; i++, p += 16) { - var tag = bytesToString(data.subarray(p, p + 4)); - var offset = getLong(data, p + 8); - var length = getLong(data, p + 12); - switch (tag) { - case 'cmap': - cmap = parseCmap(data, offset, offset + length); - break; - case 'glyf': - glyf = data.subarray(offset, offset + length); - break; - case 'loca': - loca = data.subarray(offset, offset + length); - break; - case 'head': - unitsPerEm = getUshort(data, offset + 18); - indexToLocFormat = getUshort(data, offset + 50); - break; - case 'CFF ': - cff = parseCff(data, offset, offset + length); - break; - } - } - - if (glyf) { - var fontMatrix = (!unitsPerEm ? font.fontMatrix : - [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]); - return new TrueTypeCompiled( - parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); - } else { - return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); - } - } - }; -})(); - - -var GlyphsUnicode = { - A: 0x0041, - AE: 0x00C6, - AEacute: 0x01FC, - AEmacron: 0x01E2, - AEsmall: 0xF7E6, - Aacute: 0x00C1, - Aacutesmall: 0xF7E1, - Abreve: 0x0102, - Abreveacute: 0x1EAE, - Abrevecyrillic: 0x04D0, - Abrevedotbelow: 0x1EB6, - Abrevegrave: 0x1EB0, - Abrevehookabove: 0x1EB2, - Abrevetilde: 0x1EB4, - Acaron: 0x01CD, - Acircle: 0x24B6, - Acircumflex: 0x00C2, - Acircumflexacute: 0x1EA4, - Acircumflexdotbelow: 0x1EAC, - Acircumflexgrave: 0x1EA6, - Acircumflexhookabove: 0x1EA8, - Acircumflexsmall: 0xF7E2, - Acircumflextilde: 0x1EAA, - Acute: 0xF6C9, - Acutesmall: 0xF7B4, - Acyrillic: 0x0410, - Adblgrave: 0x0200, - Adieresis: 0x00C4, - Adieresiscyrillic: 0x04D2, - Adieresismacron: 0x01DE, - Adieresissmall: 0xF7E4, - Adotbelow: 0x1EA0, - Adotmacron: 0x01E0, - Agrave: 0x00C0, - Agravesmall: 0xF7E0, - Ahookabove: 0x1EA2, - Aiecyrillic: 0x04D4, - Ainvertedbreve: 0x0202, - Alpha: 0x0391, - Alphatonos: 0x0386, - Amacron: 0x0100, - Amonospace: 0xFF21, - Aogonek: 0x0104, - Aring: 0x00C5, - Aringacute: 0x01FA, - Aringbelow: 0x1E00, - Aringsmall: 0xF7E5, - Asmall: 0xF761, - Atilde: 0x00C3, - Atildesmall: 0xF7E3, - Aybarmenian: 0x0531, - B: 0x0042, - Bcircle: 0x24B7, - Bdotaccent: 0x1E02, - Bdotbelow: 0x1E04, - Becyrillic: 0x0411, - Benarmenian: 0x0532, - Beta: 0x0392, - Bhook: 0x0181, - Blinebelow: 0x1E06, - Bmonospace: 0xFF22, - Brevesmall: 0xF6F4, - Bsmall: 0xF762, - Btopbar: 0x0182, - C: 0x0043, - Caarmenian: 0x053E, - Cacute: 0x0106, - Caron: 0xF6CA, - Caronsmall: 0xF6F5, - Ccaron: 0x010C, - Ccedilla: 0x00C7, - Ccedillaacute: 0x1E08, - Ccedillasmall: 0xF7E7, - Ccircle: 0x24B8, - Ccircumflex: 0x0108, - Cdot: 0x010A, - Cdotaccent: 0x010A, - Cedillasmall: 0xF7B8, - Chaarmenian: 0x0549, - Cheabkhasiancyrillic: 0x04BC, - Checyrillic: 0x0427, - Chedescenderabkhasiancyrillic: 0x04BE, - Chedescendercyrillic: 0x04B6, - Chedieresiscyrillic: 0x04F4, - Cheharmenian: 0x0543, - Chekhakassiancyrillic: 0x04CB, - Cheverticalstrokecyrillic: 0x04B8, - Chi: 0x03A7, - Chook: 0x0187, - Circumflexsmall: 0xF6F6, - Cmonospace: 0xFF23, - Coarmenian: 0x0551, - Csmall: 0xF763, - D: 0x0044, - DZ: 0x01F1, - DZcaron: 0x01C4, - Daarmenian: 0x0534, - Dafrican: 0x0189, - Dcaron: 0x010E, - Dcedilla: 0x1E10, - Dcircle: 0x24B9, - Dcircumflexbelow: 0x1E12, - Dcroat: 0x0110, - Ddotaccent: 0x1E0A, - Ddotbelow: 0x1E0C, - Decyrillic: 0x0414, - Deicoptic: 0x03EE, - Delta: 0x2206, - Deltagreek: 0x0394, - Dhook: 0x018A, - Dieresis: 0xF6CB, - DieresisAcute: 0xF6CC, - DieresisGrave: 0xF6CD, - Dieresissmall: 0xF7A8, - Digammagreek: 0x03DC, - Djecyrillic: 0x0402, - Dlinebelow: 0x1E0E, - Dmonospace: 0xFF24, - Dotaccentsmall: 0xF6F7, - Dslash: 0x0110, - Dsmall: 0xF764, - Dtopbar: 0x018B, - Dz: 0x01F2, - Dzcaron: 0x01C5, - Dzeabkhasiancyrillic: 0x04E0, - Dzecyrillic: 0x0405, - Dzhecyrillic: 0x040F, - E: 0x0045, - Eacute: 0x00C9, - Eacutesmall: 0xF7E9, - Ebreve: 0x0114, - Ecaron: 0x011A, - Ecedillabreve: 0x1E1C, - Echarmenian: 0x0535, - Ecircle: 0x24BA, - Ecircumflex: 0x00CA, - Ecircumflexacute: 0x1EBE, - Ecircumflexbelow: 0x1E18, - Ecircumflexdotbelow: 0x1EC6, - Ecircumflexgrave: 0x1EC0, - Ecircumflexhookabove: 0x1EC2, - Ecircumflexsmall: 0xF7EA, - Ecircumflextilde: 0x1EC4, - Ecyrillic: 0x0404, - Edblgrave: 0x0204, - Edieresis: 0x00CB, - Edieresissmall: 0xF7EB, - Edot: 0x0116, - Edotaccent: 0x0116, - Edotbelow: 0x1EB8, - Efcyrillic: 0x0424, - Egrave: 0x00C8, - Egravesmall: 0xF7E8, - Eharmenian: 0x0537, - Ehookabove: 0x1EBA, - Eightroman: 0x2167, - Einvertedbreve: 0x0206, - Eiotifiedcyrillic: 0x0464, - Elcyrillic: 0x041B, - Elevenroman: 0x216A, - Emacron: 0x0112, - Emacronacute: 0x1E16, - Emacrongrave: 0x1E14, - Emcyrillic: 0x041C, - Emonospace: 0xFF25, - Encyrillic: 0x041D, - Endescendercyrillic: 0x04A2, - Eng: 0x014A, - Enghecyrillic: 0x04A4, - Enhookcyrillic: 0x04C7, - Eogonek: 0x0118, - Eopen: 0x0190, - Epsilon: 0x0395, - Epsilontonos: 0x0388, - Ercyrillic: 0x0420, - Ereversed: 0x018E, - Ereversedcyrillic: 0x042D, - Escyrillic: 0x0421, - Esdescendercyrillic: 0x04AA, - Esh: 0x01A9, - Esmall: 0xF765, - Eta: 0x0397, - Etarmenian: 0x0538, - Etatonos: 0x0389, - Eth: 0x00D0, - Ethsmall: 0xF7F0, - Etilde: 0x1EBC, - Etildebelow: 0x1E1A, - Euro: 0x20AC, - Ezh: 0x01B7, - Ezhcaron: 0x01EE, - Ezhreversed: 0x01B8, - F: 0x0046, - Fcircle: 0x24BB, - Fdotaccent: 0x1E1E, - Feharmenian: 0x0556, - Feicoptic: 0x03E4, - Fhook: 0x0191, - Fitacyrillic: 0x0472, - Fiveroman: 0x2164, - Fmonospace: 0xFF26, - Fourroman: 0x2163, - Fsmall: 0xF766, - G: 0x0047, - GBsquare: 0x3387, - Gacute: 0x01F4, - Gamma: 0x0393, - Gammaafrican: 0x0194, - Gangiacoptic: 0x03EA, - Gbreve: 0x011E, - Gcaron: 0x01E6, - Gcedilla: 0x0122, - Gcircle: 0x24BC, - Gcircumflex: 0x011C, - Gcommaaccent: 0x0122, - Gdot: 0x0120, - Gdotaccent: 0x0120, - Gecyrillic: 0x0413, - Ghadarmenian: 0x0542, - Ghemiddlehookcyrillic: 0x0494, - Ghestrokecyrillic: 0x0492, - Gheupturncyrillic: 0x0490, - Ghook: 0x0193, - Gimarmenian: 0x0533, - Gjecyrillic: 0x0403, - Gmacron: 0x1E20, - Gmonospace: 0xFF27, - Grave: 0xF6CE, - Gravesmall: 0xF760, - Gsmall: 0xF767, - Gsmallhook: 0x029B, - Gstroke: 0x01E4, - H: 0x0048, - H18533: 0x25CF, - H18543: 0x25AA, - H18551: 0x25AB, - H22073: 0x25A1, - HPsquare: 0x33CB, - Haabkhasiancyrillic: 0x04A8, - Hadescendercyrillic: 0x04B2, - Hardsigncyrillic: 0x042A, - Hbar: 0x0126, - Hbrevebelow: 0x1E2A, - Hcedilla: 0x1E28, - Hcircle: 0x24BD, - Hcircumflex: 0x0124, - Hdieresis: 0x1E26, - Hdotaccent: 0x1E22, - Hdotbelow: 0x1E24, - Hmonospace: 0xFF28, - Hoarmenian: 0x0540, - Horicoptic: 0x03E8, - Hsmall: 0xF768, - Hungarumlaut: 0xF6CF, - Hungarumlautsmall: 0xF6F8, - Hzsquare: 0x3390, - I: 0x0049, - IAcyrillic: 0x042F, - IJ: 0x0132, - IUcyrillic: 0x042E, - Iacute: 0x00CD, - Iacutesmall: 0xF7ED, - Ibreve: 0x012C, - Icaron: 0x01CF, - Icircle: 0x24BE, - Icircumflex: 0x00CE, - Icircumflexsmall: 0xF7EE, - Icyrillic: 0x0406, - Idblgrave: 0x0208, - Idieresis: 0x00CF, - Idieresisacute: 0x1E2E, - Idieresiscyrillic: 0x04E4, - Idieresissmall: 0xF7EF, - Idot: 0x0130, - Idotaccent: 0x0130, - Idotbelow: 0x1ECA, - Iebrevecyrillic: 0x04D6, - Iecyrillic: 0x0415, - Ifraktur: 0x2111, - Igrave: 0x00CC, - Igravesmall: 0xF7EC, - Ihookabove: 0x1EC8, - Iicyrillic: 0x0418, - Iinvertedbreve: 0x020A, - Iishortcyrillic: 0x0419, - Imacron: 0x012A, - Imacroncyrillic: 0x04E2, - Imonospace: 0xFF29, - Iniarmenian: 0x053B, - Iocyrillic: 0x0401, - Iogonek: 0x012E, - Iota: 0x0399, - Iotaafrican: 0x0196, - Iotadieresis: 0x03AA, - Iotatonos: 0x038A, - Ismall: 0xF769, - Istroke: 0x0197, - Itilde: 0x0128, - Itildebelow: 0x1E2C, - Izhitsacyrillic: 0x0474, - Izhitsadblgravecyrillic: 0x0476, - J: 0x004A, - Jaarmenian: 0x0541, - Jcircle: 0x24BF, - Jcircumflex: 0x0134, - Jecyrillic: 0x0408, - Jheharmenian: 0x054B, - Jmonospace: 0xFF2A, - Jsmall: 0xF76A, - K: 0x004B, - KBsquare: 0x3385, - KKsquare: 0x33CD, - Kabashkircyrillic: 0x04A0, - Kacute: 0x1E30, - Kacyrillic: 0x041A, - Kadescendercyrillic: 0x049A, - Kahookcyrillic: 0x04C3, - Kappa: 0x039A, - Kastrokecyrillic: 0x049E, - Kaverticalstrokecyrillic: 0x049C, - Kcaron: 0x01E8, - Kcedilla: 0x0136, - Kcircle: 0x24C0, - Kcommaaccent: 0x0136, - Kdotbelow: 0x1E32, - Keharmenian: 0x0554, - Kenarmenian: 0x053F, - Khacyrillic: 0x0425, - Kheicoptic: 0x03E6, - Khook: 0x0198, - Kjecyrillic: 0x040C, - Klinebelow: 0x1E34, - Kmonospace: 0xFF2B, - Koppacyrillic: 0x0480, - Koppagreek: 0x03DE, - Ksicyrillic: 0x046E, - Ksmall: 0xF76B, - L: 0x004C, - LJ: 0x01C7, - LL: 0xF6BF, - Lacute: 0x0139, - Lambda: 0x039B, - Lcaron: 0x013D, - Lcedilla: 0x013B, - Lcircle: 0x24C1, - Lcircumflexbelow: 0x1E3C, - Lcommaaccent: 0x013B, - Ldot: 0x013F, - Ldotaccent: 0x013F, - Ldotbelow: 0x1E36, - Ldotbelowmacron: 0x1E38, - Liwnarmenian: 0x053C, - Lj: 0x01C8, - Ljecyrillic: 0x0409, - Llinebelow: 0x1E3A, - Lmonospace: 0xFF2C, - Lslash: 0x0141, - Lslashsmall: 0xF6F9, - Lsmall: 0xF76C, - M: 0x004D, - MBsquare: 0x3386, - Macron: 0xF6D0, - Macronsmall: 0xF7AF, - Macute: 0x1E3E, - Mcircle: 0x24C2, - Mdotaccent: 0x1E40, - Mdotbelow: 0x1E42, - Menarmenian: 0x0544, - Mmonospace: 0xFF2D, - Msmall: 0xF76D, - Mturned: 0x019C, - Mu: 0x039C, - N: 0x004E, - NJ: 0x01CA, - Nacute: 0x0143, - Ncaron: 0x0147, - Ncedilla: 0x0145, - Ncircle: 0x24C3, - Ncircumflexbelow: 0x1E4A, - Ncommaaccent: 0x0145, - Ndotaccent: 0x1E44, - Ndotbelow: 0x1E46, - Nhookleft: 0x019D, - Nineroman: 0x2168, - Nj: 0x01CB, - Njecyrillic: 0x040A, - Nlinebelow: 0x1E48, - Nmonospace: 0xFF2E, - Nowarmenian: 0x0546, - Nsmall: 0xF76E, - Ntilde: 0x00D1, - Ntildesmall: 0xF7F1, - Nu: 0x039D, - O: 0x004F, - OE: 0x0152, - OEsmall: 0xF6FA, - Oacute: 0x00D3, - Oacutesmall: 0xF7F3, - Obarredcyrillic: 0x04E8, - Obarreddieresiscyrillic: 0x04EA, - Obreve: 0x014E, - Ocaron: 0x01D1, - Ocenteredtilde: 0x019F, - Ocircle: 0x24C4, - Ocircumflex: 0x00D4, - Ocircumflexacute: 0x1ED0, - Ocircumflexdotbelow: 0x1ED8, - Ocircumflexgrave: 0x1ED2, - Ocircumflexhookabove: 0x1ED4, - Ocircumflexsmall: 0xF7F4, - Ocircumflextilde: 0x1ED6, - Ocyrillic: 0x041E, - Odblacute: 0x0150, - Odblgrave: 0x020C, - Odieresis: 0x00D6, - Odieresiscyrillic: 0x04E6, - Odieresissmall: 0xF7F6, - Odotbelow: 0x1ECC, - Ogoneksmall: 0xF6FB, - Ograve: 0x00D2, - Ogravesmall: 0xF7F2, - Oharmenian: 0x0555, - Ohm: 0x2126, - Ohookabove: 0x1ECE, - Ohorn: 0x01A0, - Ohornacute: 0x1EDA, - Ohorndotbelow: 0x1EE2, - Ohorngrave: 0x1EDC, - Ohornhookabove: 0x1EDE, - Ohorntilde: 0x1EE0, - Ohungarumlaut: 0x0150, - Oi: 0x01A2, - Oinvertedbreve: 0x020E, - Omacron: 0x014C, - Omacronacute: 0x1E52, - Omacrongrave: 0x1E50, - Omega: 0x2126, - Omegacyrillic: 0x0460, - Omegagreek: 0x03A9, - Omegaroundcyrillic: 0x047A, - Omegatitlocyrillic: 0x047C, - Omegatonos: 0x038F, - Omicron: 0x039F, - Omicrontonos: 0x038C, - Omonospace: 0xFF2F, - Oneroman: 0x2160, - Oogonek: 0x01EA, - Oogonekmacron: 0x01EC, - Oopen: 0x0186, - Oslash: 0x00D8, - Oslashacute: 0x01FE, - Oslashsmall: 0xF7F8, - Osmall: 0xF76F, - Ostrokeacute: 0x01FE, - Otcyrillic: 0x047E, - Otilde: 0x00D5, - Otildeacute: 0x1E4C, - Otildedieresis: 0x1E4E, - Otildesmall: 0xF7F5, - P: 0x0050, - Pacute: 0x1E54, - Pcircle: 0x24C5, - Pdotaccent: 0x1E56, - Pecyrillic: 0x041F, - Peharmenian: 0x054A, - Pemiddlehookcyrillic: 0x04A6, - Phi: 0x03A6, - Phook: 0x01A4, - Pi: 0x03A0, - Piwrarmenian: 0x0553, - Pmonospace: 0xFF30, - Psi: 0x03A8, - Psicyrillic: 0x0470, - Psmall: 0xF770, - Q: 0x0051, - Qcircle: 0x24C6, - Qmonospace: 0xFF31, - Qsmall: 0xF771, - R: 0x0052, - Raarmenian: 0x054C, - Racute: 0x0154, - Rcaron: 0x0158, - Rcedilla: 0x0156, - Rcircle: 0x24C7, - Rcommaaccent: 0x0156, - Rdblgrave: 0x0210, - Rdotaccent: 0x1E58, - Rdotbelow: 0x1E5A, - Rdotbelowmacron: 0x1E5C, - Reharmenian: 0x0550, - Rfraktur: 0x211C, - Rho: 0x03A1, - Ringsmall: 0xF6FC, - Rinvertedbreve: 0x0212, - Rlinebelow: 0x1E5E, - Rmonospace: 0xFF32, - Rsmall: 0xF772, - Rsmallinverted: 0x0281, - Rsmallinvertedsuperior: 0x02B6, - S: 0x0053, - SF010000: 0x250C, - SF020000: 0x2514, - SF030000: 0x2510, - SF040000: 0x2518, - SF050000: 0x253C, - SF060000: 0x252C, - SF070000: 0x2534, - SF080000: 0x251C, - SF090000: 0x2524, - SF100000: 0x2500, - SF110000: 0x2502, - SF190000: 0x2561, - SF200000: 0x2562, - SF210000: 0x2556, - SF220000: 0x2555, - SF230000: 0x2563, - SF240000: 0x2551, - SF250000: 0x2557, - SF260000: 0x255D, - SF270000: 0x255C, - SF280000: 0x255B, - SF360000: 0x255E, - SF370000: 0x255F, - SF380000: 0x255A, - SF390000: 0x2554, - SF400000: 0x2569, - SF410000: 0x2566, - SF420000: 0x2560, - SF430000: 0x2550, - SF440000: 0x256C, - SF450000: 0x2567, - SF460000: 0x2568, - SF470000: 0x2564, - SF480000: 0x2565, - SF490000: 0x2559, - SF500000: 0x2558, - SF510000: 0x2552, - SF520000: 0x2553, - SF530000: 0x256B, - SF540000: 0x256A, - Sacute: 0x015A, - Sacutedotaccent: 0x1E64, - Sampigreek: 0x03E0, - Scaron: 0x0160, - Scarondotaccent: 0x1E66, - Scaronsmall: 0xF6FD, - Scedilla: 0x015E, - Schwa: 0x018F, - Schwacyrillic: 0x04D8, - Schwadieresiscyrillic: 0x04DA, - Scircle: 0x24C8, - Scircumflex: 0x015C, - Scommaaccent: 0x0218, - Sdotaccent: 0x1E60, - Sdotbelow: 0x1E62, - Sdotbelowdotaccent: 0x1E68, - Seharmenian: 0x054D, - Sevenroman: 0x2166, - Shaarmenian: 0x0547, - Shacyrillic: 0x0428, - Shchacyrillic: 0x0429, - Sheicoptic: 0x03E2, - Shhacyrillic: 0x04BA, - Shimacoptic: 0x03EC, - Sigma: 0x03A3, - Sixroman: 0x2165, - Smonospace: 0xFF33, - Softsigncyrillic: 0x042C, - Ssmall: 0xF773, - Stigmagreek: 0x03DA, - T: 0x0054, - Tau: 0x03A4, - Tbar: 0x0166, - Tcaron: 0x0164, - Tcedilla: 0x0162, - Tcircle: 0x24C9, - Tcircumflexbelow: 0x1E70, - Tcommaaccent: 0x0162, - Tdotaccent: 0x1E6A, - Tdotbelow: 0x1E6C, - Tecyrillic: 0x0422, - Tedescendercyrillic: 0x04AC, - Tenroman: 0x2169, - Tetsecyrillic: 0x04B4, - Theta: 0x0398, - Thook: 0x01AC, - Thorn: 0x00DE, - Thornsmall: 0xF7FE, - Threeroman: 0x2162, - Tildesmall: 0xF6FE, - Tiwnarmenian: 0x054F, - Tlinebelow: 0x1E6E, - Tmonospace: 0xFF34, - Toarmenian: 0x0539, - Tonefive: 0x01BC, - Tonesix: 0x0184, - Tonetwo: 0x01A7, - Tretroflexhook: 0x01AE, - Tsecyrillic: 0x0426, - Tshecyrillic: 0x040B, - Tsmall: 0xF774, - Twelveroman: 0x216B, - Tworoman: 0x2161, - U: 0x0055, - Uacute: 0x00DA, - Uacutesmall: 0xF7FA, - Ubreve: 0x016C, - Ucaron: 0x01D3, - Ucircle: 0x24CA, - Ucircumflex: 0x00DB, - Ucircumflexbelow: 0x1E76, - Ucircumflexsmall: 0xF7FB, - Ucyrillic: 0x0423, - Udblacute: 0x0170, - Udblgrave: 0x0214, - Udieresis: 0x00DC, - Udieresisacute: 0x01D7, - Udieresisbelow: 0x1E72, - Udieresiscaron: 0x01D9, - Udieresiscyrillic: 0x04F0, - Udieresisgrave: 0x01DB, - Udieresismacron: 0x01D5, - Udieresissmall: 0xF7FC, - Udotbelow: 0x1EE4, - Ugrave: 0x00D9, - Ugravesmall: 0xF7F9, - Uhookabove: 0x1EE6, - Uhorn: 0x01AF, - Uhornacute: 0x1EE8, - Uhorndotbelow: 0x1EF0, - Uhorngrave: 0x1EEA, - Uhornhookabove: 0x1EEC, - Uhorntilde: 0x1EEE, - Uhungarumlaut: 0x0170, - Uhungarumlautcyrillic: 0x04F2, - Uinvertedbreve: 0x0216, - Ukcyrillic: 0x0478, - Umacron: 0x016A, - Umacroncyrillic: 0x04EE, - Umacrondieresis: 0x1E7A, - Umonospace: 0xFF35, - Uogonek: 0x0172, - Upsilon: 0x03A5, - Upsilon1: 0x03D2, - Upsilonacutehooksymbolgreek: 0x03D3, - Upsilonafrican: 0x01B1, - Upsilondieresis: 0x03AB, - Upsilondieresishooksymbolgreek: 0x03D4, - Upsilonhooksymbol: 0x03D2, - Upsilontonos: 0x038E, - Uring: 0x016E, - Ushortcyrillic: 0x040E, - Usmall: 0xF775, - Ustraightcyrillic: 0x04AE, - Ustraightstrokecyrillic: 0x04B0, - Utilde: 0x0168, - Utildeacute: 0x1E78, - Utildebelow: 0x1E74, - V: 0x0056, - Vcircle: 0x24CB, - Vdotbelow: 0x1E7E, - Vecyrillic: 0x0412, - Vewarmenian: 0x054E, - Vhook: 0x01B2, - Vmonospace: 0xFF36, - Voarmenian: 0x0548, - Vsmall: 0xF776, - Vtilde: 0x1E7C, - W: 0x0057, - Wacute: 0x1E82, - Wcircle: 0x24CC, - Wcircumflex: 0x0174, - Wdieresis: 0x1E84, - Wdotaccent: 0x1E86, - Wdotbelow: 0x1E88, - Wgrave: 0x1E80, - Wmonospace: 0xFF37, - Wsmall: 0xF777, - X: 0x0058, - Xcircle: 0x24CD, - Xdieresis: 0x1E8C, - Xdotaccent: 0x1E8A, - Xeharmenian: 0x053D, - Xi: 0x039E, - Xmonospace: 0xFF38, - Xsmall: 0xF778, - Y: 0x0059, - Yacute: 0x00DD, - Yacutesmall: 0xF7FD, - Yatcyrillic: 0x0462, - Ycircle: 0x24CE, - Ycircumflex: 0x0176, - Ydieresis: 0x0178, - Ydieresissmall: 0xF7FF, - Ydotaccent: 0x1E8E, - Ydotbelow: 0x1EF4, - Yericyrillic: 0x042B, - Yerudieresiscyrillic: 0x04F8, - Ygrave: 0x1EF2, - Yhook: 0x01B3, - Yhookabove: 0x1EF6, - Yiarmenian: 0x0545, - Yicyrillic: 0x0407, - Yiwnarmenian: 0x0552, - Ymonospace: 0xFF39, - Ysmall: 0xF779, - Ytilde: 0x1EF8, - Yusbigcyrillic: 0x046A, - Yusbigiotifiedcyrillic: 0x046C, - Yuslittlecyrillic: 0x0466, - Yuslittleiotifiedcyrillic: 0x0468, - Z: 0x005A, - Zaarmenian: 0x0536, - Zacute: 0x0179, - Zcaron: 0x017D, - Zcaronsmall: 0xF6FF, - Zcircle: 0x24CF, - Zcircumflex: 0x1E90, - Zdot: 0x017B, - Zdotaccent: 0x017B, - Zdotbelow: 0x1E92, - Zecyrillic: 0x0417, - Zedescendercyrillic: 0x0498, - Zedieresiscyrillic: 0x04DE, - Zeta: 0x0396, - Zhearmenian: 0x053A, - Zhebrevecyrillic: 0x04C1, - Zhecyrillic: 0x0416, - Zhedescendercyrillic: 0x0496, - Zhedieresiscyrillic: 0x04DC, - Zlinebelow: 0x1E94, - Zmonospace: 0xFF3A, - Zsmall: 0xF77A, - Zstroke: 0x01B5, - a: 0x0061, - aabengali: 0x0986, - aacute: 0x00E1, - aadeva: 0x0906, - aagujarati: 0x0A86, - aagurmukhi: 0x0A06, - aamatragurmukhi: 0x0A3E, - aarusquare: 0x3303, - aavowelsignbengali: 0x09BE, - aavowelsigndeva: 0x093E, - aavowelsigngujarati: 0x0ABE, - abbreviationmarkarmenian: 0x055F, - abbreviationsigndeva: 0x0970, - abengali: 0x0985, - abopomofo: 0x311A, - abreve: 0x0103, - abreveacute: 0x1EAF, - abrevecyrillic: 0x04D1, - abrevedotbelow: 0x1EB7, - abrevegrave: 0x1EB1, - abrevehookabove: 0x1EB3, - abrevetilde: 0x1EB5, - acaron: 0x01CE, - acircle: 0x24D0, - acircumflex: 0x00E2, - acircumflexacute: 0x1EA5, - acircumflexdotbelow: 0x1EAD, - acircumflexgrave: 0x1EA7, - acircumflexhookabove: 0x1EA9, - acircumflextilde: 0x1EAB, - acute: 0x00B4, - acutebelowcmb: 0x0317, - acutecmb: 0x0301, - acutecomb: 0x0301, - acutedeva: 0x0954, - acutelowmod: 0x02CF, - acutetonecmb: 0x0341, - acyrillic: 0x0430, - adblgrave: 0x0201, - addakgurmukhi: 0x0A71, - adeva: 0x0905, - adieresis: 0x00E4, - adieresiscyrillic: 0x04D3, - adieresismacron: 0x01DF, - adotbelow: 0x1EA1, - adotmacron: 0x01E1, - ae: 0x00E6, - aeacute: 0x01FD, - aekorean: 0x3150, - aemacron: 0x01E3, - afii00208: 0x2015, - afii08941: 0x20A4, - afii10017: 0x0410, - afii10018: 0x0411, - afii10019: 0x0412, - afii10020: 0x0413, - afii10021: 0x0414, - afii10022: 0x0415, - afii10023: 0x0401, - afii10024: 0x0416, - afii10025: 0x0417, - afii10026: 0x0418, - afii10027: 0x0419, - afii10028: 0x041A, - afii10029: 0x041B, - afii10030: 0x041C, - afii10031: 0x041D, - afii10032: 0x041E, - afii10033: 0x041F, - afii10034: 0x0420, - afii10035: 0x0421, - afii10036: 0x0422, - afii10037: 0x0423, - afii10038: 0x0424, - afii10039: 0x0425, - afii10040: 0x0426, - afii10041: 0x0427, - afii10042: 0x0428, - afii10043: 0x0429, - afii10044: 0x042A, - afii10045: 0x042B, - afii10046: 0x042C, - afii10047: 0x042D, - afii10048: 0x042E, - afii10049: 0x042F, - afii10050: 0x0490, - afii10051: 0x0402, - afii10052: 0x0403, - afii10053: 0x0404, - afii10054: 0x0405, - afii10055: 0x0406, - afii10056: 0x0407, - afii10057: 0x0408, - afii10058: 0x0409, - afii10059: 0x040A, - afii10060: 0x040B, - afii10061: 0x040C, - afii10062: 0x040E, - afii10063: 0xF6C4, - afii10064: 0xF6C5, - afii10065: 0x0430, - afii10066: 0x0431, - afii10067: 0x0432, - afii10068: 0x0433, - afii10069: 0x0434, - afii10070: 0x0435, - afii10071: 0x0451, - afii10072: 0x0436, - afii10073: 0x0437, - afii10074: 0x0438, - afii10075: 0x0439, - afii10076: 0x043A, - afii10077: 0x043B, - afii10078: 0x043C, - afii10079: 0x043D, - afii10080: 0x043E, - afii10081: 0x043F, - afii10082: 0x0440, - afii10083: 0x0441, - afii10084: 0x0442, - afii10085: 0x0443, - afii10086: 0x0444, - afii10087: 0x0445, - afii10088: 0x0446, - afii10089: 0x0447, - afii10090: 0x0448, - afii10091: 0x0449, - afii10092: 0x044A, - afii10093: 0x044B, - afii10094: 0x044C, - afii10095: 0x044D, - afii10096: 0x044E, - afii10097: 0x044F, - afii10098: 0x0491, - afii10099: 0x0452, - afii10100: 0x0453, - afii10101: 0x0454, - afii10102: 0x0455, - afii10103: 0x0456, - afii10104: 0x0457, - afii10105: 0x0458, - afii10106: 0x0459, - afii10107: 0x045A, - afii10108: 0x045B, - afii10109: 0x045C, - afii10110: 0x045E, - afii10145: 0x040F, - afii10146: 0x0462, - afii10147: 0x0472, - afii10148: 0x0474, - afii10192: 0xF6C6, - afii10193: 0x045F, - afii10194: 0x0463, - afii10195: 0x0473, - afii10196: 0x0475, - afii10831: 0xF6C7, - afii10832: 0xF6C8, - afii10846: 0x04D9, - afii299: 0x200E, - afii300: 0x200F, - afii301: 0x200D, - afii57381: 0x066A, - afii57388: 0x060C, - afii57392: 0x0660, - afii57393: 0x0661, - afii57394: 0x0662, - afii57395: 0x0663, - afii57396: 0x0664, - afii57397: 0x0665, - afii57398: 0x0666, - afii57399: 0x0667, - afii57400: 0x0668, - afii57401: 0x0669, - afii57403: 0x061B, - afii57407: 0x061F, - afii57409: 0x0621, - afii57410: 0x0622, - afii57411: 0x0623, - afii57412: 0x0624, - afii57413: 0x0625, - afii57414: 0x0626, - afii57415: 0x0627, - afii57416: 0x0628, - afii57417: 0x0629, - afii57418: 0x062A, - afii57419: 0x062B, - afii57420: 0x062C, - afii57421: 0x062D, - afii57422: 0x062E, - afii57423: 0x062F, - afii57424: 0x0630, - afii57425: 0x0631, - afii57426: 0x0632, - afii57427: 0x0633, - afii57428: 0x0634, - afii57429: 0x0635, - afii57430: 0x0636, - afii57431: 0x0637, - afii57432: 0x0638, - afii57433: 0x0639, - afii57434: 0x063A, - afii57440: 0x0640, - afii57441: 0x0641, - afii57442: 0x0642, - afii57443: 0x0643, - afii57444: 0x0644, - afii57445: 0x0645, - afii57446: 0x0646, - afii57448: 0x0648, - afii57449: 0x0649, - afii57450: 0x064A, - afii57451: 0x064B, - afii57452: 0x064C, - afii57453: 0x064D, - afii57454: 0x064E, - afii57455: 0x064F, - afii57456: 0x0650, - afii57457: 0x0651, - afii57458: 0x0652, - afii57470: 0x0647, - afii57505: 0x06A4, - afii57506: 0x067E, - afii57507: 0x0686, - afii57508: 0x0698, - afii57509: 0x06AF, - afii57511: 0x0679, - afii57512: 0x0688, - afii57513: 0x0691, - afii57514: 0x06BA, - afii57519: 0x06D2, - afii57534: 0x06D5, - afii57636: 0x20AA, - afii57645: 0x05BE, - afii57658: 0x05C3, - afii57664: 0x05D0, - afii57665: 0x05D1, - afii57666: 0x05D2, - afii57667: 0x05D3, - afii57668: 0x05D4, - afii57669: 0x05D5, - afii57670: 0x05D6, - afii57671: 0x05D7, - afii57672: 0x05D8, - afii57673: 0x05D9, - afii57674: 0x05DA, - afii57675: 0x05DB, - afii57676: 0x05DC, - afii57677: 0x05DD, - afii57678: 0x05DE, - afii57679: 0x05DF, - afii57680: 0x05E0, - afii57681: 0x05E1, - afii57682: 0x05E2, - afii57683: 0x05E3, - afii57684: 0x05E4, - afii57685: 0x05E5, - afii57686: 0x05E6, - afii57687: 0x05E7, - afii57688: 0x05E8, - afii57689: 0x05E9, - afii57690: 0x05EA, - afii57694: 0xFB2A, - afii57695: 0xFB2B, - afii57700: 0xFB4B, - afii57705: 0xFB1F, - afii57716: 0x05F0, - afii57717: 0x05F1, - afii57718: 0x05F2, - afii57723: 0xFB35, - afii57793: 0x05B4, - afii57794: 0x05B5, - afii57795: 0x05B6, - afii57796: 0x05BB, - afii57797: 0x05B8, - afii57798: 0x05B7, - afii57799: 0x05B0, - afii57800: 0x05B2, - afii57801: 0x05B1, - afii57802: 0x05B3, - afii57803: 0x05C2, - afii57804: 0x05C1, - afii57806: 0x05B9, - afii57807: 0x05BC, - afii57839: 0x05BD, - afii57841: 0x05BF, - afii57842: 0x05C0, - afii57929: 0x02BC, - afii61248: 0x2105, - afii61289: 0x2113, - afii61352: 0x2116, - afii61573: 0x202C, - afii61574: 0x202D, - afii61575: 0x202E, - afii61664: 0x200C, - afii63167: 0x066D, - afii64937: 0x02BD, - agrave: 0x00E0, - agujarati: 0x0A85, - agurmukhi: 0x0A05, - ahiragana: 0x3042, - ahookabove: 0x1EA3, - aibengali: 0x0990, - aibopomofo: 0x311E, - aideva: 0x0910, - aiecyrillic: 0x04D5, - aigujarati: 0x0A90, - aigurmukhi: 0x0A10, - aimatragurmukhi: 0x0A48, - ainarabic: 0x0639, - ainfinalarabic: 0xFECA, - aininitialarabic: 0xFECB, - ainmedialarabic: 0xFECC, - ainvertedbreve: 0x0203, - aivowelsignbengali: 0x09C8, - aivowelsigndeva: 0x0948, - aivowelsigngujarati: 0x0AC8, - akatakana: 0x30A2, - akatakanahalfwidth: 0xFF71, - akorean: 0x314F, - alef: 0x05D0, - alefarabic: 0x0627, - alefdageshhebrew: 0xFB30, - aleffinalarabic: 0xFE8E, - alefhamzaabovearabic: 0x0623, - alefhamzaabovefinalarabic: 0xFE84, - alefhamzabelowarabic: 0x0625, - alefhamzabelowfinalarabic: 0xFE88, - alefhebrew: 0x05D0, - aleflamedhebrew: 0xFB4F, - alefmaddaabovearabic: 0x0622, - alefmaddaabovefinalarabic: 0xFE82, - alefmaksuraarabic: 0x0649, - alefmaksurafinalarabic: 0xFEF0, - alefmaksurainitialarabic: 0xFEF3, - alefmaksuramedialarabic: 0xFEF4, - alefpatahhebrew: 0xFB2E, - alefqamatshebrew: 0xFB2F, - aleph: 0x2135, - allequal: 0x224C, - alpha: 0x03B1, - alphatonos: 0x03AC, - amacron: 0x0101, - amonospace: 0xFF41, - ampersand: 0x0026, - ampersandmonospace: 0xFF06, - ampersandsmall: 0xF726, - amsquare: 0x33C2, - anbopomofo: 0x3122, - angbopomofo: 0x3124, - angbracketleft: 0x3008, // This glyph is missing from Adobe's original list. - angbracketright: 0x3009, // This glyph is missing from Adobe's original list. - angkhankhuthai: 0x0E5A, - angle: 0x2220, - anglebracketleft: 0x3008, - anglebracketleftvertical: 0xFE3F, - anglebracketright: 0x3009, - anglebracketrightvertical: 0xFE40, - angleleft: 0x2329, - angleright: 0x232A, - angstrom: 0x212B, - anoteleia: 0x0387, - anudattadeva: 0x0952, - anusvarabengali: 0x0982, - anusvaradeva: 0x0902, - anusvaragujarati: 0x0A82, - aogonek: 0x0105, - apaatosquare: 0x3300, - aparen: 0x249C, - apostrophearmenian: 0x055A, - apostrophemod: 0x02BC, - apple: 0xF8FF, - approaches: 0x2250, - approxequal: 0x2248, - approxequalorimage: 0x2252, - approximatelyequal: 0x2245, - araeaekorean: 0x318E, - araeakorean: 0x318D, - arc: 0x2312, - arighthalfring: 0x1E9A, - aring: 0x00E5, - aringacute: 0x01FB, - aringbelow: 0x1E01, - arrowboth: 0x2194, - arrowdashdown: 0x21E3, - arrowdashleft: 0x21E0, - arrowdashright: 0x21E2, - arrowdashup: 0x21E1, - arrowdblboth: 0x21D4, - arrowdbldown: 0x21D3, - arrowdblleft: 0x21D0, - arrowdblright: 0x21D2, - arrowdblup: 0x21D1, - arrowdown: 0x2193, - arrowdownleft: 0x2199, - arrowdownright: 0x2198, - arrowdownwhite: 0x21E9, - arrowheaddownmod: 0x02C5, - arrowheadleftmod: 0x02C2, - arrowheadrightmod: 0x02C3, - arrowheadupmod: 0x02C4, - arrowhorizex: 0xF8E7, - arrowleft: 0x2190, - arrowleftdbl: 0x21D0, - arrowleftdblstroke: 0x21CD, - arrowleftoverright: 0x21C6, - arrowleftwhite: 0x21E6, - arrowright: 0x2192, - arrowrightdblstroke: 0x21CF, - arrowrightheavy: 0x279E, - arrowrightoverleft: 0x21C4, - arrowrightwhite: 0x21E8, - arrowtableft: 0x21E4, - arrowtabright: 0x21E5, - arrowup: 0x2191, - arrowupdn: 0x2195, - arrowupdnbse: 0x21A8, - arrowupdownbase: 0x21A8, - arrowupleft: 0x2196, - arrowupleftofdown: 0x21C5, - arrowupright: 0x2197, - arrowupwhite: 0x21E7, - arrowvertex: 0xF8E6, - asciicircum: 0x005E, - asciicircummonospace: 0xFF3E, - asciitilde: 0x007E, - asciitildemonospace: 0xFF5E, - ascript: 0x0251, - ascriptturned: 0x0252, - asmallhiragana: 0x3041, - asmallkatakana: 0x30A1, - asmallkatakanahalfwidth: 0xFF67, - asterisk: 0x002A, - asteriskaltonearabic: 0x066D, - asteriskarabic: 0x066D, - asteriskmath: 0x2217, - asteriskmonospace: 0xFF0A, - asterisksmall: 0xFE61, - asterism: 0x2042, - asuperior: 0xF6E9, - asymptoticallyequal: 0x2243, - at: 0x0040, - atilde: 0x00E3, - atmonospace: 0xFF20, - atsmall: 0xFE6B, - aturned: 0x0250, - aubengali: 0x0994, - aubopomofo: 0x3120, - audeva: 0x0914, - augujarati: 0x0A94, - augurmukhi: 0x0A14, - aulengthmarkbengali: 0x09D7, - aumatragurmukhi: 0x0A4C, - auvowelsignbengali: 0x09CC, - auvowelsigndeva: 0x094C, - auvowelsigngujarati: 0x0ACC, - avagrahadeva: 0x093D, - aybarmenian: 0x0561, - ayin: 0x05E2, - ayinaltonehebrew: 0xFB20, - ayinhebrew: 0x05E2, - b: 0x0062, - babengali: 0x09AC, - backslash: 0x005C, - backslashmonospace: 0xFF3C, - badeva: 0x092C, - bagujarati: 0x0AAC, - bagurmukhi: 0x0A2C, - bahiragana: 0x3070, - bahtthai: 0x0E3F, - bakatakana: 0x30D0, - bar: 0x007C, - barmonospace: 0xFF5C, - bbopomofo: 0x3105, - bcircle: 0x24D1, - bdotaccent: 0x1E03, - bdotbelow: 0x1E05, - beamedsixteenthnotes: 0x266C, - because: 0x2235, - becyrillic: 0x0431, - beharabic: 0x0628, - behfinalarabic: 0xFE90, - behinitialarabic: 0xFE91, - behiragana: 0x3079, - behmedialarabic: 0xFE92, - behmeeminitialarabic: 0xFC9F, - behmeemisolatedarabic: 0xFC08, - behnoonfinalarabic: 0xFC6D, - bekatakana: 0x30D9, - benarmenian: 0x0562, - bet: 0x05D1, - beta: 0x03B2, - betasymbolgreek: 0x03D0, - betdagesh: 0xFB31, - betdageshhebrew: 0xFB31, - bethebrew: 0x05D1, - betrafehebrew: 0xFB4C, - bhabengali: 0x09AD, - bhadeva: 0x092D, - bhagujarati: 0x0AAD, - bhagurmukhi: 0x0A2D, - bhook: 0x0253, - bihiragana: 0x3073, - bikatakana: 0x30D3, - bilabialclick: 0x0298, - bindigurmukhi: 0x0A02, - birusquare: 0x3331, - blackcircle: 0x25CF, - blackdiamond: 0x25C6, - blackdownpointingtriangle: 0x25BC, - blackleftpointingpointer: 0x25C4, - blackleftpointingtriangle: 0x25C0, - blacklenticularbracketleft: 0x3010, - blacklenticularbracketleftvertical: 0xFE3B, - blacklenticularbracketright: 0x3011, - blacklenticularbracketrightvertical: 0xFE3C, - blacklowerlefttriangle: 0x25E3, - blacklowerrighttriangle: 0x25E2, - blackrectangle: 0x25AC, - blackrightpointingpointer: 0x25BA, - blackrightpointingtriangle: 0x25B6, - blacksmallsquare: 0x25AA, - blacksmilingface: 0x263B, - blacksquare: 0x25A0, - blackstar: 0x2605, - blackupperlefttriangle: 0x25E4, - blackupperrighttriangle: 0x25E5, - blackuppointingsmalltriangle: 0x25B4, - blackuppointingtriangle: 0x25B2, - blank: 0x2423, - blinebelow: 0x1E07, - block: 0x2588, - bmonospace: 0xFF42, - bobaimaithai: 0x0E1A, - bohiragana: 0x307C, - bokatakana: 0x30DC, - bparen: 0x249D, - bqsquare: 0x33C3, - braceex: 0xF8F4, - braceleft: 0x007B, - braceleftbt: 0xF8F3, - braceleftmid: 0xF8F2, - braceleftmonospace: 0xFF5B, - braceleftsmall: 0xFE5B, - bracelefttp: 0xF8F1, - braceleftvertical: 0xFE37, - braceright: 0x007D, - bracerightbt: 0xF8FE, - bracerightmid: 0xF8FD, - bracerightmonospace: 0xFF5D, - bracerightsmall: 0xFE5C, - bracerighttp: 0xF8FC, - bracerightvertical: 0xFE38, - bracketleft: 0x005B, - bracketleftbt: 0xF8F0, - bracketleftex: 0xF8EF, - bracketleftmonospace: 0xFF3B, - bracketlefttp: 0xF8EE, - bracketright: 0x005D, - bracketrightbt: 0xF8FB, - bracketrightex: 0xF8FA, - bracketrightmonospace: 0xFF3D, - bracketrighttp: 0xF8F9, - breve: 0x02D8, - brevebelowcmb: 0x032E, - brevecmb: 0x0306, - breveinvertedbelowcmb: 0x032F, - breveinvertedcmb: 0x0311, - breveinverteddoublecmb: 0x0361, - bridgebelowcmb: 0x032A, - bridgeinvertedbelowcmb: 0x033A, - brokenbar: 0x00A6, - bstroke: 0x0180, - bsuperior: 0xF6EA, - btopbar: 0x0183, - buhiragana: 0x3076, - bukatakana: 0x30D6, - bullet: 0x2022, - bulletinverse: 0x25D8, - bulletoperator: 0x2219, - bullseye: 0x25CE, - c: 0x0063, - caarmenian: 0x056E, - cabengali: 0x099A, - cacute: 0x0107, - cadeva: 0x091A, - cagujarati: 0x0A9A, - cagurmukhi: 0x0A1A, - calsquare: 0x3388, - candrabindubengali: 0x0981, - candrabinducmb: 0x0310, - candrabindudeva: 0x0901, - candrabindugujarati: 0x0A81, - capslock: 0x21EA, - careof: 0x2105, - caron: 0x02C7, - caronbelowcmb: 0x032C, - caroncmb: 0x030C, - carriagereturn: 0x21B5, - cbopomofo: 0x3118, - ccaron: 0x010D, - ccedilla: 0x00E7, - ccedillaacute: 0x1E09, - ccircle: 0x24D2, - ccircumflex: 0x0109, - ccurl: 0x0255, - cdot: 0x010B, - cdotaccent: 0x010B, - cdsquare: 0x33C5, - cedilla: 0x00B8, - cedillacmb: 0x0327, - cent: 0x00A2, - centigrade: 0x2103, - centinferior: 0xF6DF, - centmonospace: 0xFFE0, - centoldstyle: 0xF7A2, - centsuperior: 0xF6E0, - chaarmenian: 0x0579, - chabengali: 0x099B, - chadeva: 0x091B, - chagujarati: 0x0A9B, - chagurmukhi: 0x0A1B, - chbopomofo: 0x3114, - cheabkhasiancyrillic: 0x04BD, - checkmark: 0x2713, - checyrillic: 0x0447, - chedescenderabkhasiancyrillic: 0x04BF, - chedescendercyrillic: 0x04B7, - chedieresiscyrillic: 0x04F5, - cheharmenian: 0x0573, - chekhakassiancyrillic: 0x04CC, - cheverticalstrokecyrillic: 0x04B9, - chi: 0x03C7, - chieuchacirclekorean: 0x3277, - chieuchaparenkorean: 0x3217, - chieuchcirclekorean: 0x3269, - chieuchkorean: 0x314A, - chieuchparenkorean: 0x3209, - chochangthai: 0x0E0A, - chochanthai: 0x0E08, - chochingthai: 0x0E09, - chochoethai: 0x0E0C, - chook: 0x0188, - cieucacirclekorean: 0x3276, - cieucaparenkorean: 0x3216, - cieuccirclekorean: 0x3268, - cieuckorean: 0x3148, - cieucparenkorean: 0x3208, - cieucuparenkorean: 0x321C, - circle: 0x25CB, - circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list. - circlemultiply: 0x2297, - circleot: 0x2299, - circleplus: 0x2295, - circlepostalmark: 0x3036, - circlewithlefthalfblack: 0x25D0, - circlewithrighthalfblack: 0x25D1, - circumflex: 0x02C6, - circumflexbelowcmb: 0x032D, - circumflexcmb: 0x0302, - clear: 0x2327, - clickalveolar: 0x01C2, - clickdental: 0x01C0, - clicklateral: 0x01C1, - clickretroflex: 0x01C3, - club: 0x2663, - clubsuitblack: 0x2663, - clubsuitwhite: 0x2667, - cmcubedsquare: 0x33A4, - cmonospace: 0xFF43, - cmsquaredsquare: 0x33A0, - coarmenian: 0x0581, - colon: 0x003A, - colonmonetary: 0x20A1, - colonmonospace: 0xFF1A, - colonsign: 0x20A1, - colonsmall: 0xFE55, - colontriangularhalfmod: 0x02D1, - colontriangularmod: 0x02D0, - comma: 0x002C, - commaabovecmb: 0x0313, - commaaboverightcmb: 0x0315, - commaaccent: 0xF6C3, - commaarabic: 0x060C, - commaarmenian: 0x055D, - commainferior: 0xF6E1, - commamonospace: 0xFF0C, - commareversedabovecmb: 0x0314, - commareversedmod: 0x02BD, - commasmall: 0xFE50, - commasuperior: 0xF6E2, - commaturnedabovecmb: 0x0312, - commaturnedmod: 0x02BB, - compass: 0x263C, - congruent: 0x2245, - contourintegral: 0x222E, - control: 0x2303, - controlACK: 0x0006, - controlBEL: 0x0007, - controlBS: 0x0008, - controlCAN: 0x0018, - controlCR: 0x000D, - controlDC1: 0x0011, - controlDC2: 0x0012, - controlDC3: 0x0013, - controlDC4: 0x0014, - controlDEL: 0x007F, - controlDLE: 0x0010, - controlEM: 0x0019, - controlENQ: 0x0005, - controlEOT: 0x0004, - controlESC: 0x001B, - controlETB: 0x0017, - controlETX: 0x0003, - controlFF: 0x000C, - controlFS: 0x001C, - controlGS: 0x001D, - controlHT: 0x0009, - controlLF: 0x000A, - controlNAK: 0x0015, - controlRS: 0x001E, - controlSI: 0x000F, - controlSO: 0x000E, - controlSOT: 0x0002, - controlSTX: 0x0001, - controlSUB: 0x001A, - controlSYN: 0x0016, - controlUS: 0x001F, - controlVT: 0x000B, - copyright: 0x00A9, - copyrightsans: 0xF8E9, - copyrightserif: 0xF6D9, - cornerbracketleft: 0x300C, - cornerbracketlefthalfwidth: 0xFF62, - cornerbracketleftvertical: 0xFE41, - cornerbracketright: 0x300D, - cornerbracketrighthalfwidth: 0xFF63, - cornerbracketrightvertical: 0xFE42, - corporationsquare: 0x337F, - cosquare: 0x33C7, - coverkgsquare: 0x33C6, - cparen: 0x249E, - cruzeiro: 0x20A2, - cstretched: 0x0297, - curlyand: 0x22CF, - curlyor: 0x22CE, - currency: 0x00A4, - cyrBreve: 0xF6D1, - cyrFlex: 0xF6D2, - cyrbreve: 0xF6D4, - cyrflex: 0xF6D5, - d: 0x0064, - daarmenian: 0x0564, - dabengali: 0x09A6, - dadarabic: 0x0636, - dadeva: 0x0926, - dadfinalarabic: 0xFEBE, - dadinitialarabic: 0xFEBF, - dadmedialarabic: 0xFEC0, - dagesh: 0x05BC, - dageshhebrew: 0x05BC, - dagger: 0x2020, - daggerdbl: 0x2021, - dagujarati: 0x0AA6, - dagurmukhi: 0x0A26, - dahiragana: 0x3060, - dakatakana: 0x30C0, - dalarabic: 0x062F, - dalet: 0x05D3, - daletdagesh: 0xFB33, - daletdageshhebrew: 0xFB33, - dalethebrew: 0x05D3, - dalfinalarabic: 0xFEAA, - dammaarabic: 0x064F, - dammalowarabic: 0x064F, - dammatanaltonearabic: 0x064C, - dammatanarabic: 0x064C, - danda: 0x0964, - dargahebrew: 0x05A7, - dargalefthebrew: 0x05A7, - dasiapneumatacyrilliccmb: 0x0485, - dblGrave: 0xF6D3, - dblanglebracketleft: 0x300A, - dblanglebracketleftvertical: 0xFE3D, - dblanglebracketright: 0x300B, - dblanglebracketrightvertical: 0xFE3E, - dblarchinvertedbelowcmb: 0x032B, - dblarrowleft: 0x21D4, - dblarrowright: 0x21D2, - dbldanda: 0x0965, - dblgrave: 0xF6D6, - dblgravecmb: 0x030F, - dblintegral: 0x222C, - dbllowline: 0x2017, - dbllowlinecmb: 0x0333, - dbloverlinecmb: 0x033F, - dblprimemod: 0x02BA, - dblverticalbar: 0x2016, - dblverticallineabovecmb: 0x030E, - dbopomofo: 0x3109, - dbsquare: 0x33C8, - dcaron: 0x010F, - dcedilla: 0x1E11, - dcircle: 0x24D3, - dcircumflexbelow: 0x1E13, - dcroat: 0x0111, - ddabengali: 0x09A1, - ddadeva: 0x0921, - ddagujarati: 0x0AA1, - ddagurmukhi: 0x0A21, - ddalarabic: 0x0688, - ddalfinalarabic: 0xFB89, - dddhadeva: 0x095C, - ddhabengali: 0x09A2, - ddhadeva: 0x0922, - ddhagujarati: 0x0AA2, - ddhagurmukhi: 0x0A22, - ddotaccent: 0x1E0B, - ddotbelow: 0x1E0D, - decimalseparatorarabic: 0x066B, - decimalseparatorpersian: 0x066B, - decyrillic: 0x0434, - degree: 0x00B0, - dehihebrew: 0x05AD, - dehiragana: 0x3067, - deicoptic: 0x03EF, - dekatakana: 0x30C7, - deleteleft: 0x232B, - deleteright: 0x2326, - delta: 0x03B4, - deltaturned: 0x018D, - denominatorminusonenumeratorbengali: 0x09F8, - dezh: 0x02A4, - dhabengali: 0x09A7, - dhadeva: 0x0927, - dhagujarati: 0x0AA7, - dhagurmukhi: 0x0A27, - dhook: 0x0257, - dialytikatonos: 0x0385, - dialytikatonoscmb: 0x0344, - diamond: 0x2666, - diamondsuitwhite: 0x2662, - dieresis: 0x00A8, - dieresisacute: 0xF6D7, - dieresisbelowcmb: 0x0324, - dieresiscmb: 0x0308, - dieresisgrave: 0xF6D8, - dieresistonos: 0x0385, - dihiragana: 0x3062, - dikatakana: 0x30C2, - dittomark: 0x3003, - divide: 0x00F7, - divides: 0x2223, - divisionslash: 0x2215, - djecyrillic: 0x0452, - dkshade: 0x2593, - dlinebelow: 0x1E0F, - dlsquare: 0x3397, - dmacron: 0x0111, - dmonospace: 0xFF44, - dnblock: 0x2584, - dochadathai: 0x0E0E, - dodekthai: 0x0E14, - dohiragana: 0x3069, - dokatakana: 0x30C9, - dollar: 0x0024, - dollarinferior: 0xF6E3, - dollarmonospace: 0xFF04, - dollaroldstyle: 0xF724, - dollarsmall: 0xFE69, - dollarsuperior: 0xF6E4, - dong: 0x20AB, - dorusquare: 0x3326, - dotaccent: 0x02D9, - dotaccentcmb: 0x0307, - dotbelowcmb: 0x0323, - dotbelowcomb: 0x0323, - dotkatakana: 0x30FB, - dotlessi: 0x0131, - dotlessj: 0xF6BE, - dotlessjstrokehook: 0x0284, - dotmath: 0x22C5, - dottedcircle: 0x25CC, - doubleyodpatah: 0xFB1F, - doubleyodpatahhebrew: 0xFB1F, - downtackbelowcmb: 0x031E, - downtackmod: 0x02D5, - dparen: 0x249F, - dsuperior: 0xF6EB, - dtail: 0x0256, - dtopbar: 0x018C, - duhiragana: 0x3065, - dukatakana: 0x30C5, - dz: 0x01F3, - dzaltone: 0x02A3, - dzcaron: 0x01C6, - dzcurl: 0x02A5, - dzeabkhasiancyrillic: 0x04E1, - dzecyrillic: 0x0455, - dzhecyrillic: 0x045F, - e: 0x0065, - eacute: 0x00E9, - earth: 0x2641, - ebengali: 0x098F, - ebopomofo: 0x311C, - ebreve: 0x0115, - ecandradeva: 0x090D, - ecandragujarati: 0x0A8D, - ecandravowelsigndeva: 0x0945, - ecandravowelsigngujarati: 0x0AC5, - ecaron: 0x011B, - ecedillabreve: 0x1E1D, - echarmenian: 0x0565, - echyiwnarmenian: 0x0587, - ecircle: 0x24D4, - ecircumflex: 0x00EA, - ecircumflexacute: 0x1EBF, - ecircumflexbelow: 0x1E19, - ecircumflexdotbelow: 0x1EC7, - ecircumflexgrave: 0x1EC1, - ecircumflexhookabove: 0x1EC3, - ecircumflextilde: 0x1EC5, - ecyrillic: 0x0454, - edblgrave: 0x0205, - edeva: 0x090F, - edieresis: 0x00EB, - edot: 0x0117, - edotaccent: 0x0117, - edotbelow: 0x1EB9, - eegurmukhi: 0x0A0F, - eematragurmukhi: 0x0A47, - efcyrillic: 0x0444, - egrave: 0x00E8, - egujarati: 0x0A8F, - eharmenian: 0x0567, - ehbopomofo: 0x311D, - ehiragana: 0x3048, - ehookabove: 0x1EBB, - eibopomofo: 0x311F, - eight: 0x0038, - eightarabic: 0x0668, - eightbengali: 0x09EE, - eightcircle: 0x2467, - eightcircleinversesansserif: 0x2791, - eightdeva: 0x096E, - eighteencircle: 0x2471, - eighteenparen: 0x2485, - eighteenperiod: 0x2499, - eightgujarati: 0x0AEE, - eightgurmukhi: 0x0A6E, - eighthackarabic: 0x0668, - eighthangzhou: 0x3028, - eighthnotebeamed: 0x266B, - eightideographicparen: 0x3227, - eightinferior: 0x2088, - eightmonospace: 0xFF18, - eightoldstyle: 0xF738, - eightparen: 0x247B, - eightperiod: 0x248F, - eightpersian: 0x06F8, - eightroman: 0x2177, - eightsuperior: 0x2078, - eightthai: 0x0E58, - einvertedbreve: 0x0207, - eiotifiedcyrillic: 0x0465, - ekatakana: 0x30A8, - ekatakanahalfwidth: 0xFF74, - ekonkargurmukhi: 0x0A74, - ekorean: 0x3154, - elcyrillic: 0x043B, - element: 0x2208, - elevencircle: 0x246A, - elevenparen: 0x247E, - elevenperiod: 0x2492, - elevenroman: 0x217A, - ellipsis: 0x2026, - ellipsisvertical: 0x22EE, - emacron: 0x0113, - emacronacute: 0x1E17, - emacrongrave: 0x1E15, - emcyrillic: 0x043C, - emdash: 0x2014, - emdashvertical: 0xFE31, - emonospace: 0xFF45, - emphasismarkarmenian: 0x055B, - emptyset: 0x2205, - enbopomofo: 0x3123, - encyrillic: 0x043D, - endash: 0x2013, - endashvertical: 0xFE32, - endescendercyrillic: 0x04A3, - eng: 0x014B, - engbopomofo: 0x3125, - enghecyrillic: 0x04A5, - enhookcyrillic: 0x04C8, - enspace: 0x2002, - eogonek: 0x0119, - eokorean: 0x3153, - eopen: 0x025B, - eopenclosed: 0x029A, - eopenreversed: 0x025C, - eopenreversedclosed: 0x025E, - eopenreversedhook: 0x025D, - eparen: 0x24A0, - epsilon: 0x03B5, - epsilontonos: 0x03AD, - equal: 0x003D, - equalmonospace: 0xFF1D, - equalsmall: 0xFE66, - equalsuperior: 0x207C, - equivalence: 0x2261, - erbopomofo: 0x3126, - ercyrillic: 0x0440, - ereversed: 0x0258, - ereversedcyrillic: 0x044D, - escyrillic: 0x0441, - esdescendercyrillic: 0x04AB, - esh: 0x0283, - eshcurl: 0x0286, - eshortdeva: 0x090E, - eshortvowelsigndeva: 0x0946, - eshreversedloop: 0x01AA, - eshsquatreversed: 0x0285, - esmallhiragana: 0x3047, - esmallkatakana: 0x30A7, - esmallkatakanahalfwidth: 0xFF6A, - estimated: 0x212E, - esuperior: 0xF6EC, - eta: 0x03B7, - etarmenian: 0x0568, - etatonos: 0x03AE, - eth: 0x00F0, - etilde: 0x1EBD, - etildebelow: 0x1E1B, - etnahtafoukhhebrew: 0x0591, - etnahtafoukhlefthebrew: 0x0591, - etnahtahebrew: 0x0591, - etnahtalefthebrew: 0x0591, - eturned: 0x01DD, - eukorean: 0x3161, - euro: 0x20AC, - evowelsignbengali: 0x09C7, - evowelsigndeva: 0x0947, - evowelsigngujarati: 0x0AC7, - exclam: 0x0021, - exclamarmenian: 0x055C, - exclamdbl: 0x203C, - exclamdown: 0x00A1, - exclamdownsmall: 0xF7A1, - exclammonospace: 0xFF01, - exclamsmall: 0xF721, - existential: 0x2203, - ezh: 0x0292, - ezhcaron: 0x01EF, - ezhcurl: 0x0293, - ezhreversed: 0x01B9, - ezhtail: 0x01BA, - f: 0x0066, - fadeva: 0x095E, - fagurmukhi: 0x0A5E, - fahrenheit: 0x2109, - fathaarabic: 0x064E, - fathalowarabic: 0x064E, - fathatanarabic: 0x064B, - fbopomofo: 0x3108, - fcircle: 0x24D5, - fdotaccent: 0x1E1F, - feharabic: 0x0641, - feharmenian: 0x0586, - fehfinalarabic: 0xFED2, - fehinitialarabic: 0xFED3, - fehmedialarabic: 0xFED4, - feicoptic: 0x03E5, - female: 0x2640, - ff: 0xFB00, - ffi: 0xFB03, - ffl: 0xFB04, - fi: 0xFB01, - fifteencircle: 0x246E, - fifteenparen: 0x2482, - fifteenperiod: 0x2496, - figuredash: 0x2012, - filledbox: 0x25A0, - filledrect: 0x25AC, - finalkaf: 0x05DA, - finalkafdagesh: 0xFB3A, - finalkafdageshhebrew: 0xFB3A, - finalkafhebrew: 0x05DA, - finalmem: 0x05DD, - finalmemhebrew: 0x05DD, - finalnun: 0x05DF, - finalnunhebrew: 0x05DF, - finalpe: 0x05E3, - finalpehebrew: 0x05E3, - finaltsadi: 0x05E5, - finaltsadihebrew: 0x05E5, - firsttonechinese: 0x02C9, - fisheye: 0x25C9, - fitacyrillic: 0x0473, - five: 0x0035, - fivearabic: 0x0665, - fivebengali: 0x09EB, - fivecircle: 0x2464, - fivecircleinversesansserif: 0x278E, - fivedeva: 0x096B, - fiveeighths: 0x215D, - fivegujarati: 0x0AEB, - fivegurmukhi: 0x0A6B, - fivehackarabic: 0x0665, - fivehangzhou: 0x3025, - fiveideographicparen: 0x3224, - fiveinferior: 0x2085, - fivemonospace: 0xFF15, - fiveoldstyle: 0xF735, - fiveparen: 0x2478, - fiveperiod: 0x248C, - fivepersian: 0x06F5, - fiveroman: 0x2174, - fivesuperior: 0x2075, - fivethai: 0x0E55, - fl: 0xFB02, - florin: 0x0192, - fmonospace: 0xFF46, - fmsquare: 0x3399, - fofanthai: 0x0E1F, - fofathai: 0x0E1D, - fongmanthai: 0x0E4F, - forall: 0x2200, - four: 0x0034, - fourarabic: 0x0664, - fourbengali: 0x09EA, - fourcircle: 0x2463, - fourcircleinversesansserif: 0x278D, - fourdeva: 0x096A, - fourgujarati: 0x0AEA, - fourgurmukhi: 0x0A6A, - fourhackarabic: 0x0664, - fourhangzhou: 0x3024, - fourideographicparen: 0x3223, - fourinferior: 0x2084, - fourmonospace: 0xFF14, - fournumeratorbengali: 0x09F7, - fouroldstyle: 0xF734, - fourparen: 0x2477, - fourperiod: 0x248B, - fourpersian: 0x06F4, - fourroman: 0x2173, - foursuperior: 0x2074, - fourteencircle: 0x246D, - fourteenparen: 0x2481, - fourteenperiod: 0x2495, - fourthai: 0x0E54, - fourthtonechinese: 0x02CB, - fparen: 0x24A1, - fraction: 0x2044, - franc: 0x20A3, - g: 0x0067, - gabengali: 0x0997, - gacute: 0x01F5, - gadeva: 0x0917, - gafarabic: 0x06AF, - gaffinalarabic: 0xFB93, - gafinitialarabic: 0xFB94, - gafmedialarabic: 0xFB95, - gagujarati: 0x0A97, - gagurmukhi: 0x0A17, - gahiragana: 0x304C, - gakatakana: 0x30AC, - gamma: 0x03B3, - gammalatinsmall: 0x0263, - gammasuperior: 0x02E0, - gangiacoptic: 0x03EB, - gbopomofo: 0x310D, - gbreve: 0x011F, - gcaron: 0x01E7, - gcedilla: 0x0123, - gcircle: 0x24D6, - gcircumflex: 0x011D, - gcommaaccent: 0x0123, - gdot: 0x0121, - gdotaccent: 0x0121, - gecyrillic: 0x0433, - gehiragana: 0x3052, - gekatakana: 0x30B2, - geometricallyequal: 0x2251, - gereshaccenthebrew: 0x059C, - gereshhebrew: 0x05F3, - gereshmuqdamhebrew: 0x059D, - germandbls: 0x00DF, - gershayimaccenthebrew: 0x059E, - gershayimhebrew: 0x05F4, - getamark: 0x3013, - ghabengali: 0x0998, - ghadarmenian: 0x0572, - ghadeva: 0x0918, - ghagujarati: 0x0A98, - ghagurmukhi: 0x0A18, - ghainarabic: 0x063A, - ghainfinalarabic: 0xFECE, - ghaininitialarabic: 0xFECF, - ghainmedialarabic: 0xFED0, - ghemiddlehookcyrillic: 0x0495, - ghestrokecyrillic: 0x0493, - gheupturncyrillic: 0x0491, - ghhadeva: 0x095A, - ghhagurmukhi: 0x0A5A, - ghook: 0x0260, - ghzsquare: 0x3393, - gihiragana: 0x304E, - gikatakana: 0x30AE, - gimarmenian: 0x0563, - gimel: 0x05D2, - gimeldagesh: 0xFB32, - gimeldageshhebrew: 0xFB32, - gimelhebrew: 0x05D2, - gjecyrillic: 0x0453, - glottalinvertedstroke: 0x01BE, - glottalstop: 0x0294, - glottalstopinverted: 0x0296, - glottalstopmod: 0x02C0, - glottalstopreversed: 0x0295, - glottalstopreversedmod: 0x02C1, - glottalstopreversedsuperior: 0x02E4, - glottalstopstroke: 0x02A1, - glottalstopstrokereversed: 0x02A2, - gmacron: 0x1E21, - gmonospace: 0xFF47, - gohiragana: 0x3054, - gokatakana: 0x30B4, - gparen: 0x24A2, - gpasquare: 0x33AC, - gradient: 0x2207, - grave: 0x0060, - gravebelowcmb: 0x0316, - gravecmb: 0x0300, - gravecomb: 0x0300, - gravedeva: 0x0953, - gravelowmod: 0x02CE, - gravemonospace: 0xFF40, - gravetonecmb: 0x0340, - greater: 0x003E, - greaterequal: 0x2265, - greaterequalorless: 0x22DB, - greatermonospace: 0xFF1E, - greaterorequivalent: 0x2273, - greaterorless: 0x2277, - greateroverequal: 0x2267, - greatersmall: 0xFE65, - gscript: 0x0261, - gstroke: 0x01E5, - guhiragana: 0x3050, - guillemotleft: 0x00AB, - guillemotright: 0x00BB, - guilsinglleft: 0x2039, - guilsinglright: 0x203A, - gukatakana: 0x30B0, - guramusquare: 0x3318, - gysquare: 0x33C9, - h: 0x0068, - haabkhasiancyrillic: 0x04A9, - haaltonearabic: 0x06C1, - habengali: 0x09B9, - hadescendercyrillic: 0x04B3, - hadeva: 0x0939, - hagujarati: 0x0AB9, - hagurmukhi: 0x0A39, - haharabic: 0x062D, - hahfinalarabic: 0xFEA2, - hahinitialarabic: 0xFEA3, - hahiragana: 0x306F, - hahmedialarabic: 0xFEA4, - haitusquare: 0x332A, - hakatakana: 0x30CF, - hakatakanahalfwidth: 0xFF8A, - halantgurmukhi: 0x0A4D, - hamzaarabic: 0x0621, - hamzalowarabic: 0x0621, - hangulfiller: 0x3164, - hardsigncyrillic: 0x044A, - harpoonleftbarbup: 0x21BC, - harpoonrightbarbup: 0x21C0, - hasquare: 0x33CA, - hatafpatah: 0x05B2, - hatafpatah16: 0x05B2, - hatafpatah23: 0x05B2, - hatafpatah2f: 0x05B2, - hatafpatahhebrew: 0x05B2, - hatafpatahnarrowhebrew: 0x05B2, - hatafpatahquarterhebrew: 0x05B2, - hatafpatahwidehebrew: 0x05B2, - hatafqamats: 0x05B3, - hatafqamats1b: 0x05B3, - hatafqamats28: 0x05B3, - hatafqamats34: 0x05B3, - hatafqamatshebrew: 0x05B3, - hatafqamatsnarrowhebrew: 0x05B3, - hatafqamatsquarterhebrew: 0x05B3, - hatafqamatswidehebrew: 0x05B3, - hatafsegol: 0x05B1, - hatafsegol17: 0x05B1, - hatafsegol24: 0x05B1, - hatafsegol30: 0x05B1, - hatafsegolhebrew: 0x05B1, - hatafsegolnarrowhebrew: 0x05B1, - hatafsegolquarterhebrew: 0x05B1, - hatafsegolwidehebrew: 0x05B1, - hbar: 0x0127, - hbopomofo: 0x310F, - hbrevebelow: 0x1E2B, - hcedilla: 0x1E29, - hcircle: 0x24D7, - hcircumflex: 0x0125, - hdieresis: 0x1E27, - hdotaccent: 0x1E23, - hdotbelow: 0x1E25, - he: 0x05D4, - heart: 0x2665, - heartsuitblack: 0x2665, - heartsuitwhite: 0x2661, - hedagesh: 0xFB34, - hedageshhebrew: 0xFB34, - hehaltonearabic: 0x06C1, - heharabic: 0x0647, - hehebrew: 0x05D4, - hehfinalaltonearabic: 0xFBA7, - hehfinalalttwoarabic: 0xFEEA, - hehfinalarabic: 0xFEEA, - hehhamzaabovefinalarabic: 0xFBA5, - hehhamzaaboveisolatedarabic: 0xFBA4, - hehinitialaltonearabic: 0xFBA8, - hehinitialarabic: 0xFEEB, - hehiragana: 0x3078, - hehmedialaltonearabic: 0xFBA9, - hehmedialarabic: 0xFEEC, - heiseierasquare: 0x337B, - hekatakana: 0x30D8, - hekatakanahalfwidth: 0xFF8D, - hekutaarusquare: 0x3336, - henghook: 0x0267, - herutusquare: 0x3339, - het: 0x05D7, - hethebrew: 0x05D7, - hhook: 0x0266, - hhooksuperior: 0x02B1, - hieuhacirclekorean: 0x327B, - hieuhaparenkorean: 0x321B, - hieuhcirclekorean: 0x326D, - hieuhkorean: 0x314E, - hieuhparenkorean: 0x320D, - hihiragana: 0x3072, - hikatakana: 0x30D2, - hikatakanahalfwidth: 0xFF8B, - hiriq: 0x05B4, - hiriq14: 0x05B4, - hiriq21: 0x05B4, - hiriq2d: 0x05B4, - hiriqhebrew: 0x05B4, - hiriqnarrowhebrew: 0x05B4, - hiriqquarterhebrew: 0x05B4, - hiriqwidehebrew: 0x05B4, - hlinebelow: 0x1E96, - hmonospace: 0xFF48, - hoarmenian: 0x0570, - hohipthai: 0x0E2B, - hohiragana: 0x307B, - hokatakana: 0x30DB, - hokatakanahalfwidth: 0xFF8E, - holam: 0x05B9, - holam19: 0x05B9, - holam26: 0x05B9, - holam32: 0x05B9, - holamhebrew: 0x05B9, - holamnarrowhebrew: 0x05B9, - holamquarterhebrew: 0x05B9, - holamwidehebrew: 0x05B9, - honokhukthai: 0x0E2E, - hookabovecomb: 0x0309, - hookcmb: 0x0309, - hookpalatalizedbelowcmb: 0x0321, - hookretroflexbelowcmb: 0x0322, - hoonsquare: 0x3342, - horicoptic: 0x03E9, - horizontalbar: 0x2015, - horncmb: 0x031B, - hotsprings: 0x2668, - house: 0x2302, - hparen: 0x24A3, - hsuperior: 0x02B0, - hturned: 0x0265, - huhiragana: 0x3075, - huiitosquare: 0x3333, - hukatakana: 0x30D5, - hukatakanahalfwidth: 0xFF8C, - hungarumlaut: 0x02DD, - hungarumlautcmb: 0x030B, - hv: 0x0195, - hyphen: 0x002D, - hypheninferior: 0xF6E5, - hyphenmonospace: 0xFF0D, - hyphensmall: 0xFE63, - hyphensuperior: 0xF6E6, - hyphentwo: 0x2010, - i: 0x0069, - iacute: 0x00ED, - iacyrillic: 0x044F, - ibengali: 0x0987, - ibopomofo: 0x3127, - ibreve: 0x012D, - icaron: 0x01D0, - icircle: 0x24D8, - icircumflex: 0x00EE, - icyrillic: 0x0456, - idblgrave: 0x0209, - ideographearthcircle: 0x328F, - ideographfirecircle: 0x328B, - ideographicallianceparen: 0x323F, - ideographiccallparen: 0x323A, - ideographiccentrecircle: 0x32A5, - ideographicclose: 0x3006, - ideographiccomma: 0x3001, - ideographiccommaleft: 0xFF64, - ideographiccongratulationparen: 0x3237, - ideographiccorrectcircle: 0x32A3, - ideographicearthparen: 0x322F, - ideographicenterpriseparen: 0x323D, - ideographicexcellentcircle: 0x329D, - ideographicfestivalparen: 0x3240, - ideographicfinancialcircle: 0x3296, - ideographicfinancialparen: 0x3236, - ideographicfireparen: 0x322B, - ideographichaveparen: 0x3232, - ideographichighcircle: 0x32A4, - ideographiciterationmark: 0x3005, - ideographiclaborcircle: 0x3298, - ideographiclaborparen: 0x3238, - ideographicleftcircle: 0x32A7, - ideographiclowcircle: 0x32A6, - ideographicmedicinecircle: 0x32A9, - ideographicmetalparen: 0x322E, - ideographicmoonparen: 0x322A, - ideographicnameparen: 0x3234, - ideographicperiod: 0x3002, - ideographicprintcircle: 0x329E, - ideographicreachparen: 0x3243, - ideographicrepresentparen: 0x3239, - ideographicresourceparen: 0x323E, - ideographicrightcircle: 0x32A8, - ideographicsecretcircle: 0x3299, - ideographicselfparen: 0x3242, - ideographicsocietyparen: 0x3233, - ideographicspace: 0x3000, - ideographicspecialparen: 0x3235, - ideographicstockparen: 0x3231, - ideographicstudyparen: 0x323B, - ideographicsunparen: 0x3230, - ideographicsuperviseparen: 0x323C, - ideographicwaterparen: 0x322C, - ideographicwoodparen: 0x322D, - ideographiczero: 0x3007, - ideographmetalcircle: 0x328E, - ideographmooncircle: 0x328A, - ideographnamecircle: 0x3294, - ideographsuncircle: 0x3290, - ideographwatercircle: 0x328C, - ideographwoodcircle: 0x328D, - ideva: 0x0907, - idieresis: 0x00EF, - idieresisacute: 0x1E2F, - idieresiscyrillic: 0x04E5, - idotbelow: 0x1ECB, - iebrevecyrillic: 0x04D7, - iecyrillic: 0x0435, - ieungacirclekorean: 0x3275, - ieungaparenkorean: 0x3215, - ieungcirclekorean: 0x3267, - ieungkorean: 0x3147, - ieungparenkorean: 0x3207, - igrave: 0x00EC, - igujarati: 0x0A87, - igurmukhi: 0x0A07, - ihiragana: 0x3044, - ihookabove: 0x1EC9, - iibengali: 0x0988, - iicyrillic: 0x0438, - iideva: 0x0908, - iigujarati: 0x0A88, - iigurmukhi: 0x0A08, - iimatragurmukhi: 0x0A40, - iinvertedbreve: 0x020B, - iishortcyrillic: 0x0439, - iivowelsignbengali: 0x09C0, - iivowelsigndeva: 0x0940, - iivowelsigngujarati: 0x0AC0, - ij: 0x0133, - ikatakana: 0x30A4, - ikatakanahalfwidth: 0xFF72, - ikorean: 0x3163, - ilde: 0x02DC, - iluyhebrew: 0x05AC, - imacron: 0x012B, - imacroncyrillic: 0x04E3, - imageorapproximatelyequal: 0x2253, - imatragurmukhi: 0x0A3F, - imonospace: 0xFF49, - increment: 0x2206, - infinity: 0x221E, - iniarmenian: 0x056B, - integral: 0x222B, - integralbottom: 0x2321, - integralbt: 0x2321, - integralex: 0xF8F5, - integraltop: 0x2320, - integraltp: 0x2320, - intersection: 0x2229, - intisquare: 0x3305, - invbullet: 0x25D8, - invcircle: 0x25D9, - invsmileface: 0x263B, - iocyrillic: 0x0451, - iogonek: 0x012F, - iota: 0x03B9, - iotadieresis: 0x03CA, - iotadieresistonos: 0x0390, - iotalatin: 0x0269, - iotatonos: 0x03AF, - iparen: 0x24A4, - irigurmukhi: 0x0A72, - ismallhiragana: 0x3043, - ismallkatakana: 0x30A3, - ismallkatakanahalfwidth: 0xFF68, - issharbengali: 0x09FA, - istroke: 0x0268, - isuperior: 0xF6ED, - iterationhiragana: 0x309D, - iterationkatakana: 0x30FD, - itilde: 0x0129, - itildebelow: 0x1E2D, - iubopomofo: 0x3129, - iucyrillic: 0x044E, - ivowelsignbengali: 0x09BF, - ivowelsigndeva: 0x093F, - ivowelsigngujarati: 0x0ABF, - izhitsacyrillic: 0x0475, - izhitsadblgravecyrillic: 0x0477, - j: 0x006A, - jaarmenian: 0x0571, - jabengali: 0x099C, - jadeva: 0x091C, - jagujarati: 0x0A9C, - jagurmukhi: 0x0A1C, - jbopomofo: 0x3110, - jcaron: 0x01F0, - jcircle: 0x24D9, - jcircumflex: 0x0135, - jcrossedtail: 0x029D, - jdotlessstroke: 0x025F, - jecyrillic: 0x0458, - jeemarabic: 0x062C, - jeemfinalarabic: 0xFE9E, - jeeminitialarabic: 0xFE9F, - jeemmedialarabic: 0xFEA0, - jeharabic: 0x0698, - jehfinalarabic: 0xFB8B, - jhabengali: 0x099D, - jhadeva: 0x091D, - jhagujarati: 0x0A9D, - jhagurmukhi: 0x0A1D, - jheharmenian: 0x057B, - jis: 0x3004, - jmonospace: 0xFF4A, - jparen: 0x24A5, - jsuperior: 0x02B2, - k: 0x006B, - kabashkircyrillic: 0x04A1, - kabengali: 0x0995, - kacute: 0x1E31, - kacyrillic: 0x043A, - kadescendercyrillic: 0x049B, - kadeva: 0x0915, - kaf: 0x05DB, - kafarabic: 0x0643, - kafdagesh: 0xFB3B, - kafdageshhebrew: 0xFB3B, - kaffinalarabic: 0xFEDA, - kafhebrew: 0x05DB, - kafinitialarabic: 0xFEDB, - kafmedialarabic: 0xFEDC, - kafrafehebrew: 0xFB4D, - kagujarati: 0x0A95, - kagurmukhi: 0x0A15, - kahiragana: 0x304B, - kahookcyrillic: 0x04C4, - kakatakana: 0x30AB, - kakatakanahalfwidth: 0xFF76, - kappa: 0x03BA, - kappasymbolgreek: 0x03F0, - kapyeounmieumkorean: 0x3171, - kapyeounphieuphkorean: 0x3184, - kapyeounpieupkorean: 0x3178, - kapyeounssangpieupkorean: 0x3179, - karoriisquare: 0x330D, - kashidaautoarabic: 0x0640, - kashidaautonosidebearingarabic: 0x0640, - kasmallkatakana: 0x30F5, - kasquare: 0x3384, - kasraarabic: 0x0650, - kasratanarabic: 0x064D, - kastrokecyrillic: 0x049F, - katahiraprolongmarkhalfwidth: 0xFF70, - kaverticalstrokecyrillic: 0x049D, - kbopomofo: 0x310E, - kcalsquare: 0x3389, - kcaron: 0x01E9, - kcedilla: 0x0137, - kcircle: 0x24DA, - kcommaaccent: 0x0137, - kdotbelow: 0x1E33, - keharmenian: 0x0584, - kehiragana: 0x3051, - kekatakana: 0x30B1, - kekatakanahalfwidth: 0xFF79, - kenarmenian: 0x056F, - kesmallkatakana: 0x30F6, - kgreenlandic: 0x0138, - khabengali: 0x0996, - khacyrillic: 0x0445, - khadeva: 0x0916, - khagujarati: 0x0A96, - khagurmukhi: 0x0A16, - khaharabic: 0x062E, - khahfinalarabic: 0xFEA6, - khahinitialarabic: 0xFEA7, - khahmedialarabic: 0xFEA8, - kheicoptic: 0x03E7, - khhadeva: 0x0959, - khhagurmukhi: 0x0A59, - khieukhacirclekorean: 0x3278, - khieukhaparenkorean: 0x3218, - khieukhcirclekorean: 0x326A, - khieukhkorean: 0x314B, - khieukhparenkorean: 0x320A, - khokhaithai: 0x0E02, - khokhonthai: 0x0E05, - khokhuatthai: 0x0E03, - khokhwaithai: 0x0E04, - khomutthai: 0x0E5B, - khook: 0x0199, - khorakhangthai: 0x0E06, - khzsquare: 0x3391, - kihiragana: 0x304D, - kikatakana: 0x30AD, - kikatakanahalfwidth: 0xFF77, - kiroguramusquare: 0x3315, - kiromeetorusquare: 0x3316, - kirosquare: 0x3314, - kiyeokacirclekorean: 0x326E, - kiyeokaparenkorean: 0x320E, - kiyeokcirclekorean: 0x3260, - kiyeokkorean: 0x3131, - kiyeokparenkorean: 0x3200, - kiyeoksioskorean: 0x3133, - kjecyrillic: 0x045C, - klinebelow: 0x1E35, - klsquare: 0x3398, - kmcubedsquare: 0x33A6, - kmonospace: 0xFF4B, - kmsquaredsquare: 0x33A2, - kohiragana: 0x3053, - kohmsquare: 0x33C0, - kokaithai: 0x0E01, - kokatakana: 0x30B3, - kokatakanahalfwidth: 0xFF7A, - kooposquare: 0x331E, - koppacyrillic: 0x0481, - koreanstandardsymbol: 0x327F, - koroniscmb: 0x0343, - kparen: 0x24A6, - kpasquare: 0x33AA, - ksicyrillic: 0x046F, - ktsquare: 0x33CF, - kturned: 0x029E, - kuhiragana: 0x304F, - kukatakana: 0x30AF, - kukatakanahalfwidth: 0xFF78, - kvsquare: 0x33B8, - kwsquare: 0x33BE, - l: 0x006C, - labengali: 0x09B2, - lacute: 0x013A, - ladeva: 0x0932, - lagujarati: 0x0AB2, - lagurmukhi: 0x0A32, - lakkhangyaothai: 0x0E45, - lamaleffinalarabic: 0xFEFC, - lamalefhamzaabovefinalarabic: 0xFEF8, - lamalefhamzaaboveisolatedarabic: 0xFEF7, - lamalefhamzabelowfinalarabic: 0xFEFA, - lamalefhamzabelowisolatedarabic: 0xFEF9, - lamalefisolatedarabic: 0xFEFB, - lamalefmaddaabovefinalarabic: 0xFEF6, - lamalefmaddaaboveisolatedarabic: 0xFEF5, - lamarabic: 0x0644, - lambda: 0x03BB, - lambdastroke: 0x019B, - lamed: 0x05DC, - lameddagesh: 0xFB3C, - lameddageshhebrew: 0xFB3C, - lamedhebrew: 0x05DC, - lamfinalarabic: 0xFEDE, - lamhahinitialarabic: 0xFCCA, - laminitialarabic: 0xFEDF, - lamjeeminitialarabic: 0xFCC9, - lamkhahinitialarabic: 0xFCCB, - lamlamhehisolatedarabic: 0xFDF2, - lammedialarabic: 0xFEE0, - lammeemhahinitialarabic: 0xFD88, - lammeeminitialarabic: 0xFCCC, - largecircle: 0x25EF, - lbar: 0x019A, - lbelt: 0x026C, - lbopomofo: 0x310C, - lcaron: 0x013E, - lcedilla: 0x013C, - lcircle: 0x24DB, - lcircumflexbelow: 0x1E3D, - lcommaaccent: 0x013C, - ldot: 0x0140, - ldotaccent: 0x0140, - ldotbelow: 0x1E37, - ldotbelowmacron: 0x1E39, - leftangleabovecmb: 0x031A, - lefttackbelowcmb: 0x0318, - less: 0x003C, - lessequal: 0x2264, - lessequalorgreater: 0x22DA, - lessmonospace: 0xFF1C, - lessorequivalent: 0x2272, - lessorgreater: 0x2276, - lessoverequal: 0x2266, - lesssmall: 0xFE64, - lezh: 0x026E, - lfblock: 0x258C, - lhookretroflex: 0x026D, - lira: 0x20A4, - liwnarmenian: 0x056C, - lj: 0x01C9, - ljecyrillic: 0x0459, - ll: 0xF6C0, - lladeva: 0x0933, - llagujarati: 0x0AB3, - llinebelow: 0x1E3B, - llladeva: 0x0934, - llvocalicbengali: 0x09E1, - llvocalicdeva: 0x0961, - llvocalicvowelsignbengali: 0x09E3, - llvocalicvowelsigndeva: 0x0963, - lmiddletilde: 0x026B, - lmonospace: 0xFF4C, - lmsquare: 0x33D0, - lochulathai: 0x0E2C, - logicaland: 0x2227, - logicalnot: 0x00AC, - logicalnotreversed: 0x2310, - logicalor: 0x2228, - lolingthai: 0x0E25, - longs: 0x017F, - lowlinecenterline: 0xFE4E, - lowlinecmb: 0x0332, - lowlinedashed: 0xFE4D, - lozenge: 0x25CA, - lparen: 0x24A7, - lslash: 0x0142, - lsquare: 0x2113, - lsuperior: 0xF6EE, - ltshade: 0x2591, - luthai: 0x0E26, - lvocalicbengali: 0x098C, - lvocalicdeva: 0x090C, - lvocalicvowelsignbengali: 0x09E2, - lvocalicvowelsigndeva: 0x0962, - lxsquare: 0x33D3, - m: 0x006D, - mabengali: 0x09AE, - macron: 0x00AF, - macronbelowcmb: 0x0331, - macroncmb: 0x0304, - macronlowmod: 0x02CD, - macronmonospace: 0xFFE3, - macute: 0x1E3F, - madeva: 0x092E, - magujarati: 0x0AAE, - magurmukhi: 0x0A2E, - mahapakhhebrew: 0x05A4, - mahapakhlefthebrew: 0x05A4, - mahiragana: 0x307E, - maichattawalowleftthai: 0xF895, - maichattawalowrightthai: 0xF894, - maichattawathai: 0x0E4B, - maichattawaupperleftthai: 0xF893, - maieklowleftthai: 0xF88C, - maieklowrightthai: 0xF88B, - maiekthai: 0x0E48, - maiekupperleftthai: 0xF88A, - maihanakatleftthai: 0xF884, - maihanakatthai: 0x0E31, - maitaikhuleftthai: 0xF889, - maitaikhuthai: 0x0E47, - maitholowleftthai: 0xF88F, - maitholowrightthai: 0xF88E, - maithothai: 0x0E49, - maithoupperleftthai: 0xF88D, - maitrilowleftthai: 0xF892, - maitrilowrightthai: 0xF891, - maitrithai: 0x0E4A, - maitriupperleftthai: 0xF890, - maiyamokthai: 0x0E46, - makatakana: 0x30DE, - makatakanahalfwidth: 0xFF8F, - male: 0x2642, - mansyonsquare: 0x3347, - maqafhebrew: 0x05BE, - mars: 0x2642, - masoracirclehebrew: 0x05AF, - masquare: 0x3383, - mbopomofo: 0x3107, - mbsquare: 0x33D4, - mcircle: 0x24DC, - mcubedsquare: 0x33A5, - mdotaccent: 0x1E41, - mdotbelow: 0x1E43, - meemarabic: 0x0645, - meemfinalarabic: 0xFEE2, - meeminitialarabic: 0xFEE3, - meemmedialarabic: 0xFEE4, - meemmeeminitialarabic: 0xFCD1, - meemmeemisolatedarabic: 0xFC48, - meetorusquare: 0x334D, - mehiragana: 0x3081, - meizierasquare: 0x337E, - mekatakana: 0x30E1, - mekatakanahalfwidth: 0xFF92, - mem: 0x05DE, - memdagesh: 0xFB3E, - memdageshhebrew: 0xFB3E, - memhebrew: 0x05DE, - menarmenian: 0x0574, - merkhahebrew: 0x05A5, - merkhakefulahebrew: 0x05A6, - merkhakefulalefthebrew: 0x05A6, - merkhalefthebrew: 0x05A5, - mhook: 0x0271, - mhzsquare: 0x3392, - middledotkatakanahalfwidth: 0xFF65, - middot: 0x00B7, - mieumacirclekorean: 0x3272, - mieumaparenkorean: 0x3212, - mieumcirclekorean: 0x3264, - mieumkorean: 0x3141, - mieumpansioskorean: 0x3170, - mieumparenkorean: 0x3204, - mieumpieupkorean: 0x316E, - mieumsioskorean: 0x316F, - mihiragana: 0x307F, - mikatakana: 0x30DF, - mikatakanahalfwidth: 0xFF90, - minus: 0x2212, - minusbelowcmb: 0x0320, - minuscircle: 0x2296, - minusmod: 0x02D7, - minusplus: 0x2213, - minute: 0x2032, - miribaarusquare: 0x334A, - mirisquare: 0x3349, - mlonglegturned: 0x0270, - mlsquare: 0x3396, - mmcubedsquare: 0x33A3, - mmonospace: 0xFF4D, - mmsquaredsquare: 0x339F, - mohiragana: 0x3082, - mohmsquare: 0x33C1, - mokatakana: 0x30E2, - mokatakanahalfwidth: 0xFF93, - molsquare: 0x33D6, - momathai: 0x0E21, - moverssquare: 0x33A7, - moverssquaredsquare: 0x33A8, - mparen: 0x24A8, - mpasquare: 0x33AB, - mssquare: 0x33B3, - msuperior: 0xF6EF, - mturned: 0x026F, - mu: 0x00B5, - mu1: 0x00B5, - muasquare: 0x3382, - muchgreater: 0x226B, - muchless: 0x226A, - mufsquare: 0x338C, - mugreek: 0x03BC, - mugsquare: 0x338D, - muhiragana: 0x3080, - mukatakana: 0x30E0, - mukatakanahalfwidth: 0xFF91, - mulsquare: 0x3395, - multiply: 0x00D7, - mumsquare: 0x339B, - munahhebrew: 0x05A3, - munahlefthebrew: 0x05A3, - musicalnote: 0x266A, - musicalnotedbl: 0x266B, - musicflatsign: 0x266D, - musicsharpsign: 0x266F, - mussquare: 0x33B2, - muvsquare: 0x33B6, - muwsquare: 0x33BC, - mvmegasquare: 0x33B9, - mvsquare: 0x33B7, - mwmegasquare: 0x33BF, - mwsquare: 0x33BD, - n: 0x006E, - nabengali: 0x09A8, - nabla: 0x2207, - nacute: 0x0144, - nadeva: 0x0928, - nagujarati: 0x0AA8, - nagurmukhi: 0x0A28, - nahiragana: 0x306A, - nakatakana: 0x30CA, - nakatakanahalfwidth: 0xFF85, - napostrophe: 0x0149, - nasquare: 0x3381, - nbopomofo: 0x310B, - nbspace: 0x00A0, - ncaron: 0x0148, - ncedilla: 0x0146, - ncircle: 0x24DD, - ncircumflexbelow: 0x1E4B, - ncommaaccent: 0x0146, - ndotaccent: 0x1E45, - ndotbelow: 0x1E47, - nehiragana: 0x306D, - nekatakana: 0x30CD, - nekatakanahalfwidth: 0xFF88, - newsheqelsign: 0x20AA, - nfsquare: 0x338B, - ngabengali: 0x0999, - ngadeva: 0x0919, - ngagujarati: 0x0A99, - ngagurmukhi: 0x0A19, - ngonguthai: 0x0E07, - nhiragana: 0x3093, - nhookleft: 0x0272, - nhookretroflex: 0x0273, - nieunacirclekorean: 0x326F, - nieunaparenkorean: 0x320F, - nieuncieuckorean: 0x3135, - nieuncirclekorean: 0x3261, - nieunhieuhkorean: 0x3136, - nieunkorean: 0x3134, - nieunpansioskorean: 0x3168, - nieunparenkorean: 0x3201, - nieunsioskorean: 0x3167, - nieuntikeutkorean: 0x3166, - nihiragana: 0x306B, - nikatakana: 0x30CB, - nikatakanahalfwidth: 0xFF86, - nikhahitleftthai: 0xF899, - nikhahitthai: 0x0E4D, - nine: 0x0039, - ninearabic: 0x0669, - ninebengali: 0x09EF, - ninecircle: 0x2468, - ninecircleinversesansserif: 0x2792, - ninedeva: 0x096F, - ninegujarati: 0x0AEF, - ninegurmukhi: 0x0A6F, - ninehackarabic: 0x0669, - ninehangzhou: 0x3029, - nineideographicparen: 0x3228, - nineinferior: 0x2089, - ninemonospace: 0xFF19, - nineoldstyle: 0xF739, - nineparen: 0x247C, - nineperiod: 0x2490, - ninepersian: 0x06F9, - nineroman: 0x2178, - ninesuperior: 0x2079, - nineteencircle: 0x2472, - nineteenparen: 0x2486, - nineteenperiod: 0x249A, - ninethai: 0x0E59, - nj: 0x01CC, - njecyrillic: 0x045A, - nkatakana: 0x30F3, - nkatakanahalfwidth: 0xFF9D, - nlegrightlong: 0x019E, - nlinebelow: 0x1E49, - nmonospace: 0xFF4E, - nmsquare: 0x339A, - nnabengali: 0x09A3, - nnadeva: 0x0923, - nnagujarati: 0x0AA3, - nnagurmukhi: 0x0A23, - nnnadeva: 0x0929, - nohiragana: 0x306E, - nokatakana: 0x30CE, - nokatakanahalfwidth: 0xFF89, - nonbreakingspace: 0x00A0, - nonenthai: 0x0E13, - nonuthai: 0x0E19, - noonarabic: 0x0646, - noonfinalarabic: 0xFEE6, - noonghunnaarabic: 0x06BA, - noonghunnafinalarabic: 0xFB9F, - nooninitialarabic: 0xFEE7, - noonjeeminitialarabic: 0xFCD2, - noonjeemisolatedarabic: 0xFC4B, - noonmedialarabic: 0xFEE8, - noonmeeminitialarabic: 0xFCD5, - noonmeemisolatedarabic: 0xFC4E, - noonnoonfinalarabic: 0xFC8D, - notcontains: 0x220C, - notelement: 0x2209, - notelementof: 0x2209, - notequal: 0x2260, - notgreater: 0x226F, - notgreaternorequal: 0x2271, - notgreaternorless: 0x2279, - notidentical: 0x2262, - notless: 0x226E, - notlessnorequal: 0x2270, - notparallel: 0x2226, - notprecedes: 0x2280, - notsubset: 0x2284, - notsucceeds: 0x2281, - notsuperset: 0x2285, - nowarmenian: 0x0576, - nparen: 0x24A9, - nssquare: 0x33B1, - nsuperior: 0x207F, - ntilde: 0x00F1, - nu: 0x03BD, - nuhiragana: 0x306C, - nukatakana: 0x30CC, - nukatakanahalfwidth: 0xFF87, - nuktabengali: 0x09BC, - nuktadeva: 0x093C, - nuktagujarati: 0x0ABC, - nuktagurmukhi: 0x0A3C, - numbersign: 0x0023, - numbersignmonospace: 0xFF03, - numbersignsmall: 0xFE5F, - numeralsigngreek: 0x0374, - numeralsignlowergreek: 0x0375, - numero: 0x2116, - nun: 0x05E0, - nundagesh: 0xFB40, - nundageshhebrew: 0xFB40, - nunhebrew: 0x05E0, - nvsquare: 0x33B5, - nwsquare: 0x33BB, - nyabengali: 0x099E, - nyadeva: 0x091E, - nyagujarati: 0x0A9E, - nyagurmukhi: 0x0A1E, - o: 0x006F, - oacute: 0x00F3, - oangthai: 0x0E2D, - obarred: 0x0275, - obarredcyrillic: 0x04E9, - obarreddieresiscyrillic: 0x04EB, - obengali: 0x0993, - obopomofo: 0x311B, - obreve: 0x014F, - ocandradeva: 0x0911, - ocandragujarati: 0x0A91, - ocandravowelsigndeva: 0x0949, - ocandravowelsigngujarati: 0x0AC9, - ocaron: 0x01D2, - ocircle: 0x24DE, - ocircumflex: 0x00F4, - ocircumflexacute: 0x1ED1, - ocircumflexdotbelow: 0x1ED9, - ocircumflexgrave: 0x1ED3, - ocircumflexhookabove: 0x1ED5, - ocircumflextilde: 0x1ED7, - ocyrillic: 0x043E, - odblacute: 0x0151, - odblgrave: 0x020D, - odeva: 0x0913, - odieresis: 0x00F6, - odieresiscyrillic: 0x04E7, - odotbelow: 0x1ECD, - oe: 0x0153, - oekorean: 0x315A, - ogonek: 0x02DB, - ogonekcmb: 0x0328, - ograve: 0x00F2, - ogujarati: 0x0A93, - oharmenian: 0x0585, - ohiragana: 0x304A, - ohookabove: 0x1ECF, - ohorn: 0x01A1, - ohornacute: 0x1EDB, - ohorndotbelow: 0x1EE3, - ohorngrave: 0x1EDD, - ohornhookabove: 0x1EDF, - ohorntilde: 0x1EE1, - ohungarumlaut: 0x0151, - oi: 0x01A3, - oinvertedbreve: 0x020F, - okatakana: 0x30AA, - okatakanahalfwidth: 0xFF75, - okorean: 0x3157, - olehebrew: 0x05AB, - omacron: 0x014D, - omacronacute: 0x1E53, - omacrongrave: 0x1E51, - omdeva: 0x0950, - omega: 0x03C9, - omega1: 0x03D6, - omegacyrillic: 0x0461, - omegalatinclosed: 0x0277, - omegaroundcyrillic: 0x047B, - omegatitlocyrillic: 0x047D, - omegatonos: 0x03CE, - omgujarati: 0x0AD0, - omicron: 0x03BF, - omicrontonos: 0x03CC, - omonospace: 0xFF4F, - one: 0x0031, - onearabic: 0x0661, - onebengali: 0x09E7, - onecircle: 0x2460, - onecircleinversesansserif: 0x278A, - onedeva: 0x0967, - onedotenleader: 0x2024, - oneeighth: 0x215B, - onefitted: 0xF6DC, - onegujarati: 0x0AE7, - onegurmukhi: 0x0A67, - onehackarabic: 0x0661, - onehalf: 0x00BD, - onehangzhou: 0x3021, - oneideographicparen: 0x3220, - oneinferior: 0x2081, - onemonospace: 0xFF11, - onenumeratorbengali: 0x09F4, - oneoldstyle: 0xF731, - oneparen: 0x2474, - oneperiod: 0x2488, - onepersian: 0x06F1, - onequarter: 0x00BC, - oneroman: 0x2170, - onesuperior: 0x00B9, - onethai: 0x0E51, - onethird: 0x2153, - oogonek: 0x01EB, - oogonekmacron: 0x01ED, - oogurmukhi: 0x0A13, - oomatragurmukhi: 0x0A4B, - oopen: 0x0254, - oparen: 0x24AA, - openbullet: 0x25E6, - option: 0x2325, - ordfeminine: 0x00AA, - ordmasculine: 0x00BA, - orthogonal: 0x221F, - oshortdeva: 0x0912, - oshortvowelsigndeva: 0x094A, - oslash: 0x00F8, - oslashacute: 0x01FF, - osmallhiragana: 0x3049, - osmallkatakana: 0x30A9, - osmallkatakanahalfwidth: 0xFF6B, - ostrokeacute: 0x01FF, - osuperior: 0xF6F0, - otcyrillic: 0x047F, - otilde: 0x00F5, - otildeacute: 0x1E4D, - otildedieresis: 0x1E4F, - oubopomofo: 0x3121, - overline: 0x203E, - overlinecenterline: 0xFE4A, - overlinecmb: 0x0305, - overlinedashed: 0xFE49, - overlinedblwavy: 0xFE4C, - overlinewavy: 0xFE4B, - overscore: 0x00AF, - ovowelsignbengali: 0x09CB, - ovowelsigndeva: 0x094B, - ovowelsigngujarati: 0x0ACB, - p: 0x0070, - paampssquare: 0x3380, - paasentosquare: 0x332B, - pabengali: 0x09AA, - pacute: 0x1E55, - padeva: 0x092A, - pagedown: 0x21DF, - pageup: 0x21DE, - pagujarati: 0x0AAA, - pagurmukhi: 0x0A2A, - pahiragana: 0x3071, - paiyannoithai: 0x0E2F, - pakatakana: 0x30D1, - palatalizationcyrilliccmb: 0x0484, - palochkacyrillic: 0x04C0, - pansioskorean: 0x317F, - paragraph: 0x00B6, - parallel: 0x2225, - parenleft: 0x0028, - parenleftaltonearabic: 0xFD3E, - parenleftbt: 0xF8ED, - parenleftex: 0xF8EC, - parenleftinferior: 0x208D, - parenleftmonospace: 0xFF08, - parenleftsmall: 0xFE59, - parenleftsuperior: 0x207D, - parenlefttp: 0xF8EB, - parenleftvertical: 0xFE35, - parenright: 0x0029, - parenrightaltonearabic: 0xFD3F, - parenrightbt: 0xF8F8, - parenrightex: 0xF8F7, - parenrightinferior: 0x208E, - parenrightmonospace: 0xFF09, - parenrightsmall: 0xFE5A, - parenrightsuperior: 0x207E, - parenrighttp: 0xF8F6, - parenrightvertical: 0xFE36, - partialdiff: 0x2202, - paseqhebrew: 0x05C0, - pashtahebrew: 0x0599, - pasquare: 0x33A9, - patah: 0x05B7, - patah11: 0x05B7, - patah1d: 0x05B7, - patah2a: 0x05B7, - patahhebrew: 0x05B7, - patahnarrowhebrew: 0x05B7, - patahquarterhebrew: 0x05B7, - patahwidehebrew: 0x05B7, - pazerhebrew: 0x05A1, - pbopomofo: 0x3106, - pcircle: 0x24DF, - pdotaccent: 0x1E57, - pe: 0x05E4, - pecyrillic: 0x043F, - pedagesh: 0xFB44, - pedageshhebrew: 0xFB44, - peezisquare: 0x333B, - pefinaldageshhebrew: 0xFB43, - peharabic: 0x067E, - peharmenian: 0x057A, - pehebrew: 0x05E4, - pehfinalarabic: 0xFB57, - pehinitialarabic: 0xFB58, - pehiragana: 0x307A, - pehmedialarabic: 0xFB59, - pekatakana: 0x30DA, - pemiddlehookcyrillic: 0x04A7, - perafehebrew: 0xFB4E, - percent: 0x0025, - percentarabic: 0x066A, - percentmonospace: 0xFF05, - percentsmall: 0xFE6A, - period: 0x002E, - periodarmenian: 0x0589, - periodcentered: 0x00B7, - periodhalfwidth: 0xFF61, - periodinferior: 0xF6E7, - periodmonospace: 0xFF0E, - periodsmall: 0xFE52, - periodsuperior: 0xF6E8, - perispomenigreekcmb: 0x0342, - perpendicular: 0x22A5, - perthousand: 0x2030, - peseta: 0x20A7, - pfsquare: 0x338A, - phabengali: 0x09AB, - phadeva: 0x092B, - phagujarati: 0x0AAB, - phagurmukhi: 0x0A2B, - phi: 0x03C6, - phi1: 0x03D5, - phieuphacirclekorean: 0x327A, - phieuphaparenkorean: 0x321A, - phieuphcirclekorean: 0x326C, - phieuphkorean: 0x314D, - phieuphparenkorean: 0x320C, - philatin: 0x0278, - phinthuthai: 0x0E3A, - phisymbolgreek: 0x03D5, - phook: 0x01A5, - phophanthai: 0x0E1E, - phophungthai: 0x0E1C, - phosamphaothai: 0x0E20, - pi: 0x03C0, - pieupacirclekorean: 0x3273, - pieupaparenkorean: 0x3213, - pieupcieuckorean: 0x3176, - pieupcirclekorean: 0x3265, - pieupkiyeokkorean: 0x3172, - pieupkorean: 0x3142, - pieupparenkorean: 0x3205, - pieupsioskiyeokkorean: 0x3174, - pieupsioskorean: 0x3144, - pieupsiostikeutkorean: 0x3175, - pieupthieuthkorean: 0x3177, - pieuptikeutkorean: 0x3173, - pihiragana: 0x3074, - pikatakana: 0x30D4, - pisymbolgreek: 0x03D6, - piwrarmenian: 0x0583, - plus: 0x002B, - plusbelowcmb: 0x031F, - pluscircle: 0x2295, - plusminus: 0x00B1, - plusmod: 0x02D6, - plusmonospace: 0xFF0B, - plussmall: 0xFE62, - plussuperior: 0x207A, - pmonospace: 0xFF50, - pmsquare: 0x33D8, - pohiragana: 0x307D, - pointingindexdownwhite: 0x261F, - pointingindexleftwhite: 0x261C, - pointingindexrightwhite: 0x261E, - pointingindexupwhite: 0x261D, - pokatakana: 0x30DD, - poplathai: 0x0E1B, - postalmark: 0x3012, - postalmarkface: 0x3020, - pparen: 0x24AB, - precedes: 0x227A, - prescription: 0x211E, - primemod: 0x02B9, - primereversed: 0x2035, - product: 0x220F, - projective: 0x2305, - prolongedkana: 0x30FC, - propellor: 0x2318, - propersubset: 0x2282, - propersuperset: 0x2283, - proportion: 0x2237, - proportional: 0x221D, - psi: 0x03C8, - psicyrillic: 0x0471, - psilipneumatacyrilliccmb: 0x0486, - pssquare: 0x33B0, - puhiragana: 0x3077, - pukatakana: 0x30D7, - pvsquare: 0x33B4, - pwsquare: 0x33BA, - q: 0x0071, - qadeva: 0x0958, - qadmahebrew: 0x05A8, - qafarabic: 0x0642, - qaffinalarabic: 0xFED6, - qafinitialarabic: 0xFED7, - qafmedialarabic: 0xFED8, - qamats: 0x05B8, - qamats10: 0x05B8, - qamats1a: 0x05B8, - qamats1c: 0x05B8, - qamats27: 0x05B8, - qamats29: 0x05B8, - qamats33: 0x05B8, - qamatsde: 0x05B8, - qamatshebrew: 0x05B8, - qamatsnarrowhebrew: 0x05B8, - qamatsqatanhebrew: 0x05B8, - qamatsqatannarrowhebrew: 0x05B8, - qamatsqatanquarterhebrew: 0x05B8, - qamatsqatanwidehebrew: 0x05B8, - qamatsquarterhebrew: 0x05B8, - qamatswidehebrew: 0x05B8, - qarneyparahebrew: 0x059F, - qbopomofo: 0x3111, - qcircle: 0x24E0, - qhook: 0x02A0, - qmonospace: 0xFF51, - qof: 0x05E7, - qofdagesh: 0xFB47, - qofdageshhebrew: 0xFB47, - qofhebrew: 0x05E7, - qparen: 0x24AC, - quarternote: 0x2669, - qubuts: 0x05BB, - qubuts18: 0x05BB, - qubuts25: 0x05BB, - qubuts31: 0x05BB, - qubutshebrew: 0x05BB, - qubutsnarrowhebrew: 0x05BB, - qubutsquarterhebrew: 0x05BB, - qubutswidehebrew: 0x05BB, - question: 0x003F, - questionarabic: 0x061F, - questionarmenian: 0x055E, - questiondown: 0x00BF, - questiondownsmall: 0xF7BF, - questiongreek: 0x037E, - questionmonospace: 0xFF1F, - questionsmall: 0xF73F, - quotedbl: 0x0022, - quotedblbase: 0x201E, - quotedblleft: 0x201C, - quotedblmonospace: 0xFF02, - quotedblprime: 0x301E, - quotedblprimereversed: 0x301D, - quotedblright: 0x201D, - quoteleft: 0x2018, - quoteleftreversed: 0x201B, - quotereversed: 0x201B, - quoteright: 0x2019, - quoterightn: 0x0149, - quotesinglbase: 0x201A, - quotesingle: 0x0027, - quotesinglemonospace: 0xFF07, - r: 0x0072, - raarmenian: 0x057C, - rabengali: 0x09B0, - racute: 0x0155, - radeva: 0x0930, - radical: 0x221A, - radicalex: 0xF8E5, - radoverssquare: 0x33AE, - radoverssquaredsquare: 0x33AF, - radsquare: 0x33AD, - rafe: 0x05BF, - rafehebrew: 0x05BF, - ragujarati: 0x0AB0, - ragurmukhi: 0x0A30, - rahiragana: 0x3089, - rakatakana: 0x30E9, - rakatakanahalfwidth: 0xFF97, - ralowerdiagonalbengali: 0x09F1, - ramiddlediagonalbengali: 0x09F0, - ramshorn: 0x0264, - ratio: 0x2236, - rbopomofo: 0x3116, - rcaron: 0x0159, - rcedilla: 0x0157, - rcircle: 0x24E1, - rcommaaccent: 0x0157, - rdblgrave: 0x0211, - rdotaccent: 0x1E59, - rdotbelow: 0x1E5B, - rdotbelowmacron: 0x1E5D, - referencemark: 0x203B, - reflexsubset: 0x2286, - reflexsuperset: 0x2287, - registered: 0x00AE, - registersans: 0xF8E8, - registerserif: 0xF6DA, - reharabic: 0x0631, - reharmenian: 0x0580, - rehfinalarabic: 0xFEAE, - rehiragana: 0x308C, - rekatakana: 0x30EC, - rekatakanahalfwidth: 0xFF9A, - resh: 0x05E8, - reshdageshhebrew: 0xFB48, - reshhebrew: 0x05E8, - reversedtilde: 0x223D, - reviahebrew: 0x0597, - reviamugrashhebrew: 0x0597, - revlogicalnot: 0x2310, - rfishhook: 0x027E, - rfishhookreversed: 0x027F, - rhabengali: 0x09DD, - rhadeva: 0x095D, - rho: 0x03C1, - rhook: 0x027D, - rhookturned: 0x027B, - rhookturnedsuperior: 0x02B5, - rhosymbolgreek: 0x03F1, - rhotichookmod: 0x02DE, - rieulacirclekorean: 0x3271, - rieulaparenkorean: 0x3211, - rieulcirclekorean: 0x3263, - rieulhieuhkorean: 0x3140, - rieulkiyeokkorean: 0x313A, - rieulkiyeoksioskorean: 0x3169, - rieulkorean: 0x3139, - rieulmieumkorean: 0x313B, - rieulpansioskorean: 0x316C, - rieulparenkorean: 0x3203, - rieulphieuphkorean: 0x313F, - rieulpieupkorean: 0x313C, - rieulpieupsioskorean: 0x316B, - rieulsioskorean: 0x313D, - rieulthieuthkorean: 0x313E, - rieultikeutkorean: 0x316A, - rieulyeorinhieuhkorean: 0x316D, - rightangle: 0x221F, - righttackbelowcmb: 0x0319, - righttriangle: 0x22BF, - rihiragana: 0x308A, - rikatakana: 0x30EA, - rikatakanahalfwidth: 0xFF98, - ring: 0x02DA, - ringbelowcmb: 0x0325, - ringcmb: 0x030A, - ringhalfleft: 0x02BF, - ringhalfleftarmenian: 0x0559, - ringhalfleftbelowcmb: 0x031C, - ringhalfleftcentered: 0x02D3, - ringhalfright: 0x02BE, - ringhalfrightbelowcmb: 0x0339, - ringhalfrightcentered: 0x02D2, - rinvertedbreve: 0x0213, - rittorusquare: 0x3351, - rlinebelow: 0x1E5F, - rlongleg: 0x027C, - rlonglegturned: 0x027A, - rmonospace: 0xFF52, - rohiragana: 0x308D, - rokatakana: 0x30ED, - rokatakanahalfwidth: 0xFF9B, - roruathai: 0x0E23, - rparen: 0x24AD, - rrabengali: 0x09DC, - rradeva: 0x0931, - rragurmukhi: 0x0A5C, - rreharabic: 0x0691, - rrehfinalarabic: 0xFB8D, - rrvocalicbengali: 0x09E0, - rrvocalicdeva: 0x0960, - rrvocalicgujarati: 0x0AE0, - rrvocalicvowelsignbengali: 0x09C4, - rrvocalicvowelsigndeva: 0x0944, - rrvocalicvowelsigngujarati: 0x0AC4, - rsuperior: 0xF6F1, - rtblock: 0x2590, - rturned: 0x0279, - rturnedsuperior: 0x02B4, - ruhiragana: 0x308B, - rukatakana: 0x30EB, - rukatakanahalfwidth: 0xFF99, - rupeemarkbengali: 0x09F2, - rupeesignbengali: 0x09F3, - rupiah: 0xF6DD, - ruthai: 0x0E24, - rvocalicbengali: 0x098B, - rvocalicdeva: 0x090B, - rvocalicgujarati: 0x0A8B, - rvocalicvowelsignbengali: 0x09C3, - rvocalicvowelsigndeva: 0x0943, - rvocalicvowelsigngujarati: 0x0AC3, - s: 0x0073, - sabengali: 0x09B8, - sacute: 0x015B, - sacutedotaccent: 0x1E65, - sadarabic: 0x0635, - sadeva: 0x0938, - sadfinalarabic: 0xFEBA, - sadinitialarabic: 0xFEBB, - sadmedialarabic: 0xFEBC, - sagujarati: 0x0AB8, - sagurmukhi: 0x0A38, - sahiragana: 0x3055, - sakatakana: 0x30B5, - sakatakanahalfwidth: 0xFF7B, - sallallahoualayhewasallamarabic: 0xFDFA, - samekh: 0x05E1, - samekhdagesh: 0xFB41, - samekhdageshhebrew: 0xFB41, - samekhhebrew: 0x05E1, - saraaathai: 0x0E32, - saraaethai: 0x0E41, - saraaimaimalaithai: 0x0E44, - saraaimaimuanthai: 0x0E43, - saraamthai: 0x0E33, - saraathai: 0x0E30, - saraethai: 0x0E40, - saraiileftthai: 0xF886, - saraiithai: 0x0E35, - saraileftthai: 0xF885, - saraithai: 0x0E34, - saraothai: 0x0E42, - saraueeleftthai: 0xF888, - saraueethai: 0x0E37, - saraueleftthai: 0xF887, - sarauethai: 0x0E36, - sarauthai: 0x0E38, - sarauuthai: 0x0E39, - sbopomofo: 0x3119, - scaron: 0x0161, - scarondotaccent: 0x1E67, - scedilla: 0x015F, - schwa: 0x0259, - schwacyrillic: 0x04D9, - schwadieresiscyrillic: 0x04DB, - schwahook: 0x025A, - scircle: 0x24E2, - scircumflex: 0x015D, - scommaaccent: 0x0219, - sdotaccent: 0x1E61, - sdotbelow: 0x1E63, - sdotbelowdotaccent: 0x1E69, - seagullbelowcmb: 0x033C, - second: 0x2033, - secondtonechinese: 0x02CA, - section: 0x00A7, - seenarabic: 0x0633, - seenfinalarabic: 0xFEB2, - seeninitialarabic: 0xFEB3, - seenmedialarabic: 0xFEB4, - segol: 0x05B6, - segol13: 0x05B6, - segol1f: 0x05B6, - segol2c: 0x05B6, - segolhebrew: 0x05B6, - segolnarrowhebrew: 0x05B6, - segolquarterhebrew: 0x05B6, - segoltahebrew: 0x0592, - segolwidehebrew: 0x05B6, - seharmenian: 0x057D, - sehiragana: 0x305B, - sekatakana: 0x30BB, - sekatakanahalfwidth: 0xFF7E, - semicolon: 0x003B, - semicolonarabic: 0x061B, - semicolonmonospace: 0xFF1B, - semicolonsmall: 0xFE54, - semivoicedmarkkana: 0x309C, - semivoicedmarkkanahalfwidth: 0xFF9F, - sentisquare: 0x3322, - sentosquare: 0x3323, - seven: 0x0037, - sevenarabic: 0x0667, - sevenbengali: 0x09ED, - sevencircle: 0x2466, - sevencircleinversesansserif: 0x2790, - sevendeva: 0x096D, - seveneighths: 0x215E, - sevengujarati: 0x0AED, - sevengurmukhi: 0x0A6D, - sevenhackarabic: 0x0667, - sevenhangzhou: 0x3027, - sevenideographicparen: 0x3226, - seveninferior: 0x2087, - sevenmonospace: 0xFF17, - sevenoldstyle: 0xF737, - sevenparen: 0x247A, - sevenperiod: 0x248E, - sevenpersian: 0x06F7, - sevenroman: 0x2176, - sevensuperior: 0x2077, - seventeencircle: 0x2470, - seventeenparen: 0x2484, - seventeenperiod: 0x2498, - seventhai: 0x0E57, - sfthyphen: 0x00AD, - shaarmenian: 0x0577, - shabengali: 0x09B6, - shacyrillic: 0x0448, - shaddaarabic: 0x0651, - shaddadammaarabic: 0xFC61, - shaddadammatanarabic: 0xFC5E, - shaddafathaarabic: 0xFC60, - shaddakasraarabic: 0xFC62, - shaddakasratanarabic: 0xFC5F, - shade: 0x2592, - shadedark: 0x2593, - shadelight: 0x2591, - shademedium: 0x2592, - shadeva: 0x0936, - shagujarati: 0x0AB6, - shagurmukhi: 0x0A36, - shalshelethebrew: 0x0593, - shbopomofo: 0x3115, - shchacyrillic: 0x0449, - sheenarabic: 0x0634, - sheenfinalarabic: 0xFEB6, - sheeninitialarabic: 0xFEB7, - sheenmedialarabic: 0xFEB8, - sheicoptic: 0x03E3, - sheqel: 0x20AA, - sheqelhebrew: 0x20AA, - sheva: 0x05B0, - sheva115: 0x05B0, - sheva15: 0x05B0, - sheva22: 0x05B0, - sheva2e: 0x05B0, - shevahebrew: 0x05B0, - shevanarrowhebrew: 0x05B0, - shevaquarterhebrew: 0x05B0, - shevawidehebrew: 0x05B0, - shhacyrillic: 0x04BB, - shimacoptic: 0x03ED, - shin: 0x05E9, - shindagesh: 0xFB49, - shindageshhebrew: 0xFB49, - shindageshshindot: 0xFB2C, - shindageshshindothebrew: 0xFB2C, - shindageshsindot: 0xFB2D, - shindageshsindothebrew: 0xFB2D, - shindothebrew: 0x05C1, - shinhebrew: 0x05E9, - shinshindot: 0xFB2A, - shinshindothebrew: 0xFB2A, - shinsindot: 0xFB2B, - shinsindothebrew: 0xFB2B, - shook: 0x0282, - sigma: 0x03C3, - sigma1: 0x03C2, - sigmafinal: 0x03C2, - sigmalunatesymbolgreek: 0x03F2, - sihiragana: 0x3057, - sikatakana: 0x30B7, - sikatakanahalfwidth: 0xFF7C, - siluqhebrew: 0x05BD, - siluqlefthebrew: 0x05BD, - similar: 0x223C, - sindothebrew: 0x05C2, - siosacirclekorean: 0x3274, - siosaparenkorean: 0x3214, - sioscieuckorean: 0x317E, - sioscirclekorean: 0x3266, - sioskiyeokkorean: 0x317A, - sioskorean: 0x3145, - siosnieunkorean: 0x317B, - siosparenkorean: 0x3206, - siospieupkorean: 0x317D, - siostikeutkorean: 0x317C, - six: 0x0036, - sixarabic: 0x0666, - sixbengali: 0x09EC, - sixcircle: 0x2465, - sixcircleinversesansserif: 0x278F, - sixdeva: 0x096C, - sixgujarati: 0x0AEC, - sixgurmukhi: 0x0A6C, - sixhackarabic: 0x0666, - sixhangzhou: 0x3026, - sixideographicparen: 0x3225, - sixinferior: 0x2086, - sixmonospace: 0xFF16, - sixoldstyle: 0xF736, - sixparen: 0x2479, - sixperiod: 0x248D, - sixpersian: 0x06F6, - sixroman: 0x2175, - sixsuperior: 0x2076, - sixteencircle: 0x246F, - sixteencurrencydenominatorbengali: 0x09F9, - sixteenparen: 0x2483, - sixteenperiod: 0x2497, - sixthai: 0x0E56, - slash: 0x002F, - slashmonospace: 0xFF0F, - slong: 0x017F, - slongdotaccent: 0x1E9B, - smileface: 0x263A, - smonospace: 0xFF53, - sofpasuqhebrew: 0x05C3, - softhyphen: 0x00AD, - softsigncyrillic: 0x044C, - sohiragana: 0x305D, - sokatakana: 0x30BD, - sokatakanahalfwidth: 0xFF7F, - soliduslongoverlaycmb: 0x0338, - solidusshortoverlaycmb: 0x0337, - sorusithai: 0x0E29, - sosalathai: 0x0E28, - sosothai: 0x0E0B, - sosuathai: 0x0E2A, - space: 0x0020, - spacehackarabic: 0x0020, - spade: 0x2660, - spadesuitblack: 0x2660, - spadesuitwhite: 0x2664, - sparen: 0x24AE, - squarebelowcmb: 0x033B, - squarecc: 0x33C4, - squarecm: 0x339D, - squarediagonalcrosshatchfill: 0x25A9, - squarehorizontalfill: 0x25A4, - squarekg: 0x338F, - squarekm: 0x339E, - squarekmcapital: 0x33CE, - squareln: 0x33D1, - squarelog: 0x33D2, - squaremg: 0x338E, - squaremil: 0x33D5, - squaremm: 0x339C, - squaremsquared: 0x33A1, - squareorthogonalcrosshatchfill: 0x25A6, - squareupperlefttolowerrightfill: 0x25A7, - squareupperrighttolowerleftfill: 0x25A8, - squareverticalfill: 0x25A5, - squarewhitewithsmallblack: 0x25A3, - srsquare: 0x33DB, - ssabengali: 0x09B7, - ssadeva: 0x0937, - ssagujarati: 0x0AB7, - ssangcieuckorean: 0x3149, - ssanghieuhkorean: 0x3185, - ssangieungkorean: 0x3180, - ssangkiyeokkorean: 0x3132, - ssangnieunkorean: 0x3165, - ssangpieupkorean: 0x3143, - ssangsioskorean: 0x3146, - ssangtikeutkorean: 0x3138, - ssuperior: 0xF6F2, - sterling: 0x00A3, - sterlingmonospace: 0xFFE1, - strokelongoverlaycmb: 0x0336, - strokeshortoverlaycmb: 0x0335, - subset: 0x2282, - subsetnotequal: 0x228A, - subsetorequal: 0x2286, - succeeds: 0x227B, - suchthat: 0x220B, - suhiragana: 0x3059, - sukatakana: 0x30B9, - sukatakanahalfwidth: 0xFF7D, - sukunarabic: 0x0652, - summation: 0x2211, - sun: 0x263C, - superset: 0x2283, - supersetnotequal: 0x228B, - supersetorequal: 0x2287, - svsquare: 0x33DC, - syouwaerasquare: 0x337C, - t: 0x0074, - tabengali: 0x09A4, - tackdown: 0x22A4, - tackleft: 0x22A3, - tadeva: 0x0924, - tagujarati: 0x0AA4, - tagurmukhi: 0x0A24, - taharabic: 0x0637, - tahfinalarabic: 0xFEC2, - tahinitialarabic: 0xFEC3, - tahiragana: 0x305F, - tahmedialarabic: 0xFEC4, - taisyouerasquare: 0x337D, - takatakana: 0x30BF, - takatakanahalfwidth: 0xFF80, - tatweelarabic: 0x0640, - tau: 0x03C4, - tav: 0x05EA, - tavdages: 0xFB4A, - tavdagesh: 0xFB4A, - tavdageshhebrew: 0xFB4A, - tavhebrew: 0x05EA, - tbar: 0x0167, - tbopomofo: 0x310A, - tcaron: 0x0165, - tccurl: 0x02A8, - tcedilla: 0x0163, - tcheharabic: 0x0686, - tchehfinalarabic: 0xFB7B, - tchehinitialarabic: 0xFB7C, - tchehmedialarabic: 0xFB7D, - tcircle: 0x24E3, - tcircumflexbelow: 0x1E71, - tcommaaccent: 0x0163, - tdieresis: 0x1E97, - tdotaccent: 0x1E6B, - tdotbelow: 0x1E6D, - tecyrillic: 0x0442, - tedescendercyrillic: 0x04AD, - teharabic: 0x062A, - tehfinalarabic: 0xFE96, - tehhahinitialarabic: 0xFCA2, - tehhahisolatedarabic: 0xFC0C, - tehinitialarabic: 0xFE97, - tehiragana: 0x3066, - tehjeeminitialarabic: 0xFCA1, - tehjeemisolatedarabic: 0xFC0B, - tehmarbutaarabic: 0x0629, - tehmarbutafinalarabic: 0xFE94, - tehmedialarabic: 0xFE98, - tehmeeminitialarabic: 0xFCA4, - tehmeemisolatedarabic: 0xFC0E, - tehnoonfinalarabic: 0xFC73, - tekatakana: 0x30C6, - tekatakanahalfwidth: 0xFF83, - telephone: 0x2121, - telephoneblack: 0x260E, - telishagedolahebrew: 0x05A0, - telishaqetanahebrew: 0x05A9, - tencircle: 0x2469, - tenideographicparen: 0x3229, - tenparen: 0x247D, - tenperiod: 0x2491, - tenroman: 0x2179, - tesh: 0x02A7, - tet: 0x05D8, - tetdagesh: 0xFB38, - tetdageshhebrew: 0xFB38, - tethebrew: 0x05D8, - tetsecyrillic: 0x04B5, - tevirhebrew: 0x059B, - tevirlefthebrew: 0x059B, - thabengali: 0x09A5, - thadeva: 0x0925, - thagujarati: 0x0AA5, - thagurmukhi: 0x0A25, - thalarabic: 0x0630, - thalfinalarabic: 0xFEAC, - thanthakhatlowleftthai: 0xF898, - thanthakhatlowrightthai: 0xF897, - thanthakhatthai: 0x0E4C, - thanthakhatupperleftthai: 0xF896, - theharabic: 0x062B, - thehfinalarabic: 0xFE9A, - thehinitialarabic: 0xFE9B, - thehmedialarabic: 0xFE9C, - thereexists: 0x2203, - therefore: 0x2234, - theta: 0x03B8, - theta1: 0x03D1, - thetasymbolgreek: 0x03D1, - thieuthacirclekorean: 0x3279, - thieuthaparenkorean: 0x3219, - thieuthcirclekorean: 0x326B, - thieuthkorean: 0x314C, - thieuthparenkorean: 0x320B, - thirteencircle: 0x246C, - thirteenparen: 0x2480, - thirteenperiod: 0x2494, - thonangmonthothai: 0x0E11, - thook: 0x01AD, - thophuthaothai: 0x0E12, - thorn: 0x00FE, - thothahanthai: 0x0E17, - thothanthai: 0x0E10, - thothongthai: 0x0E18, - thothungthai: 0x0E16, - thousandcyrillic: 0x0482, - thousandsseparatorarabic: 0x066C, - thousandsseparatorpersian: 0x066C, - three: 0x0033, - threearabic: 0x0663, - threebengali: 0x09E9, - threecircle: 0x2462, - threecircleinversesansserif: 0x278C, - threedeva: 0x0969, - threeeighths: 0x215C, - threegujarati: 0x0AE9, - threegurmukhi: 0x0A69, - threehackarabic: 0x0663, - threehangzhou: 0x3023, - threeideographicparen: 0x3222, - threeinferior: 0x2083, - threemonospace: 0xFF13, - threenumeratorbengali: 0x09F6, - threeoldstyle: 0xF733, - threeparen: 0x2476, - threeperiod: 0x248A, - threepersian: 0x06F3, - threequarters: 0x00BE, - threequartersemdash: 0xF6DE, - threeroman: 0x2172, - threesuperior: 0x00B3, - threethai: 0x0E53, - thzsquare: 0x3394, - tihiragana: 0x3061, - tikatakana: 0x30C1, - tikatakanahalfwidth: 0xFF81, - tikeutacirclekorean: 0x3270, - tikeutaparenkorean: 0x3210, - tikeutcirclekorean: 0x3262, - tikeutkorean: 0x3137, - tikeutparenkorean: 0x3202, - tilde: 0x02DC, - tildebelowcmb: 0x0330, - tildecmb: 0x0303, - tildecomb: 0x0303, - tildedoublecmb: 0x0360, - tildeoperator: 0x223C, - tildeoverlaycmb: 0x0334, - tildeverticalcmb: 0x033E, - timescircle: 0x2297, - tipehahebrew: 0x0596, - tipehalefthebrew: 0x0596, - tippigurmukhi: 0x0A70, - titlocyrilliccmb: 0x0483, - tiwnarmenian: 0x057F, - tlinebelow: 0x1E6F, - tmonospace: 0xFF54, - toarmenian: 0x0569, - tohiragana: 0x3068, - tokatakana: 0x30C8, - tokatakanahalfwidth: 0xFF84, - tonebarextrahighmod: 0x02E5, - tonebarextralowmod: 0x02E9, - tonebarhighmod: 0x02E6, - tonebarlowmod: 0x02E8, - tonebarmidmod: 0x02E7, - tonefive: 0x01BD, - tonesix: 0x0185, - tonetwo: 0x01A8, - tonos: 0x0384, - tonsquare: 0x3327, - topatakthai: 0x0E0F, - tortoiseshellbracketleft: 0x3014, - tortoiseshellbracketleftsmall: 0xFE5D, - tortoiseshellbracketleftvertical: 0xFE39, - tortoiseshellbracketright: 0x3015, - tortoiseshellbracketrightsmall: 0xFE5E, - tortoiseshellbracketrightvertical: 0xFE3A, - totaothai: 0x0E15, - tpalatalhook: 0x01AB, - tparen: 0x24AF, - trademark: 0x2122, - trademarksans: 0xF8EA, - trademarkserif: 0xF6DB, - tretroflexhook: 0x0288, - triagdn: 0x25BC, - triaglf: 0x25C4, - triagrt: 0x25BA, - triagup: 0x25B2, - ts: 0x02A6, - tsadi: 0x05E6, - tsadidagesh: 0xFB46, - tsadidageshhebrew: 0xFB46, - tsadihebrew: 0x05E6, - tsecyrillic: 0x0446, - tsere: 0x05B5, - tsere12: 0x05B5, - tsere1e: 0x05B5, - tsere2b: 0x05B5, - tserehebrew: 0x05B5, - tserenarrowhebrew: 0x05B5, - tserequarterhebrew: 0x05B5, - tserewidehebrew: 0x05B5, - tshecyrillic: 0x045B, - tsuperior: 0xF6F3, - ttabengali: 0x099F, - ttadeva: 0x091F, - ttagujarati: 0x0A9F, - ttagurmukhi: 0x0A1F, - tteharabic: 0x0679, - ttehfinalarabic: 0xFB67, - ttehinitialarabic: 0xFB68, - ttehmedialarabic: 0xFB69, - tthabengali: 0x09A0, - tthadeva: 0x0920, - tthagujarati: 0x0AA0, - tthagurmukhi: 0x0A20, - tturned: 0x0287, - tuhiragana: 0x3064, - tukatakana: 0x30C4, - tukatakanahalfwidth: 0xFF82, - tusmallhiragana: 0x3063, - tusmallkatakana: 0x30C3, - tusmallkatakanahalfwidth: 0xFF6F, - twelvecircle: 0x246B, - twelveparen: 0x247F, - twelveperiod: 0x2493, - twelveroman: 0x217B, - twentycircle: 0x2473, - twentyhangzhou: 0x5344, - twentyparen: 0x2487, - twentyperiod: 0x249B, - two: 0x0032, - twoarabic: 0x0662, - twobengali: 0x09E8, - twocircle: 0x2461, - twocircleinversesansserif: 0x278B, - twodeva: 0x0968, - twodotenleader: 0x2025, - twodotleader: 0x2025, - twodotleadervertical: 0xFE30, - twogujarati: 0x0AE8, - twogurmukhi: 0x0A68, - twohackarabic: 0x0662, - twohangzhou: 0x3022, - twoideographicparen: 0x3221, - twoinferior: 0x2082, - twomonospace: 0xFF12, - twonumeratorbengali: 0x09F5, - twooldstyle: 0xF732, - twoparen: 0x2475, - twoperiod: 0x2489, - twopersian: 0x06F2, - tworoman: 0x2171, - twostroke: 0x01BB, - twosuperior: 0x00B2, - twothai: 0x0E52, - twothirds: 0x2154, - u: 0x0075, - uacute: 0x00FA, - ubar: 0x0289, - ubengali: 0x0989, - ubopomofo: 0x3128, - ubreve: 0x016D, - ucaron: 0x01D4, - ucircle: 0x24E4, - ucircumflex: 0x00FB, - ucircumflexbelow: 0x1E77, - ucyrillic: 0x0443, - udattadeva: 0x0951, - udblacute: 0x0171, - udblgrave: 0x0215, - udeva: 0x0909, - udieresis: 0x00FC, - udieresisacute: 0x01D8, - udieresisbelow: 0x1E73, - udieresiscaron: 0x01DA, - udieresiscyrillic: 0x04F1, - udieresisgrave: 0x01DC, - udieresismacron: 0x01D6, - udotbelow: 0x1EE5, - ugrave: 0x00F9, - ugujarati: 0x0A89, - ugurmukhi: 0x0A09, - uhiragana: 0x3046, - uhookabove: 0x1EE7, - uhorn: 0x01B0, - uhornacute: 0x1EE9, - uhorndotbelow: 0x1EF1, - uhorngrave: 0x1EEB, - uhornhookabove: 0x1EED, - uhorntilde: 0x1EEF, - uhungarumlaut: 0x0171, - uhungarumlautcyrillic: 0x04F3, - uinvertedbreve: 0x0217, - ukatakana: 0x30A6, - ukatakanahalfwidth: 0xFF73, - ukcyrillic: 0x0479, - ukorean: 0x315C, - umacron: 0x016B, - umacroncyrillic: 0x04EF, - umacrondieresis: 0x1E7B, - umatragurmukhi: 0x0A41, - umonospace: 0xFF55, - underscore: 0x005F, - underscoredbl: 0x2017, - underscoremonospace: 0xFF3F, - underscorevertical: 0xFE33, - underscorewavy: 0xFE4F, - union: 0x222A, - universal: 0x2200, - uogonek: 0x0173, - uparen: 0x24B0, - upblock: 0x2580, - upperdothebrew: 0x05C4, - upsilon: 0x03C5, - upsilondieresis: 0x03CB, - upsilondieresistonos: 0x03B0, - upsilonlatin: 0x028A, - upsilontonos: 0x03CD, - uptackbelowcmb: 0x031D, - uptackmod: 0x02D4, - uragurmukhi: 0x0A73, - uring: 0x016F, - ushortcyrillic: 0x045E, - usmallhiragana: 0x3045, - usmallkatakana: 0x30A5, - usmallkatakanahalfwidth: 0xFF69, - ustraightcyrillic: 0x04AF, - ustraightstrokecyrillic: 0x04B1, - utilde: 0x0169, - utildeacute: 0x1E79, - utildebelow: 0x1E75, - uubengali: 0x098A, - uudeva: 0x090A, - uugujarati: 0x0A8A, - uugurmukhi: 0x0A0A, - uumatragurmukhi: 0x0A42, - uuvowelsignbengali: 0x09C2, - uuvowelsigndeva: 0x0942, - uuvowelsigngujarati: 0x0AC2, - uvowelsignbengali: 0x09C1, - uvowelsigndeva: 0x0941, - uvowelsigngujarati: 0x0AC1, - v: 0x0076, - vadeva: 0x0935, - vagujarati: 0x0AB5, - vagurmukhi: 0x0A35, - vakatakana: 0x30F7, - vav: 0x05D5, - vavdagesh: 0xFB35, - vavdagesh65: 0xFB35, - vavdageshhebrew: 0xFB35, - vavhebrew: 0x05D5, - vavholam: 0xFB4B, - vavholamhebrew: 0xFB4B, - vavvavhebrew: 0x05F0, - vavyodhebrew: 0x05F1, - vcircle: 0x24E5, - vdotbelow: 0x1E7F, - vecyrillic: 0x0432, - veharabic: 0x06A4, - vehfinalarabic: 0xFB6B, - vehinitialarabic: 0xFB6C, - vehmedialarabic: 0xFB6D, - vekatakana: 0x30F9, - venus: 0x2640, - verticalbar: 0x007C, - verticallineabovecmb: 0x030D, - verticallinebelowcmb: 0x0329, - verticallinelowmod: 0x02CC, - verticallinemod: 0x02C8, - vewarmenian: 0x057E, - vhook: 0x028B, - vikatakana: 0x30F8, - viramabengali: 0x09CD, - viramadeva: 0x094D, - viramagujarati: 0x0ACD, - visargabengali: 0x0983, - visargadeva: 0x0903, - visargagujarati: 0x0A83, - vmonospace: 0xFF56, - voarmenian: 0x0578, - voicediterationhiragana: 0x309E, - voicediterationkatakana: 0x30FE, - voicedmarkkana: 0x309B, - voicedmarkkanahalfwidth: 0xFF9E, - vokatakana: 0x30FA, - vparen: 0x24B1, - vtilde: 0x1E7D, - vturned: 0x028C, - vuhiragana: 0x3094, - vukatakana: 0x30F4, - w: 0x0077, - wacute: 0x1E83, - waekorean: 0x3159, - wahiragana: 0x308F, - wakatakana: 0x30EF, - wakatakanahalfwidth: 0xFF9C, - wakorean: 0x3158, - wasmallhiragana: 0x308E, - wasmallkatakana: 0x30EE, - wattosquare: 0x3357, - wavedash: 0x301C, - wavyunderscorevertical: 0xFE34, - wawarabic: 0x0648, - wawfinalarabic: 0xFEEE, - wawhamzaabovearabic: 0x0624, - wawhamzaabovefinalarabic: 0xFE86, - wbsquare: 0x33DD, - wcircle: 0x24E6, - wcircumflex: 0x0175, - wdieresis: 0x1E85, - wdotaccent: 0x1E87, - wdotbelow: 0x1E89, - wehiragana: 0x3091, - weierstrass: 0x2118, - wekatakana: 0x30F1, - wekorean: 0x315E, - weokorean: 0x315D, - wgrave: 0x1E81, - whitebullet: 0x25E6, - whitecircle: 0x25CB, - whitecircleinverse: 0x25D9, - whitecornerbracketleft: 0x300E, - whitecornerbracketleftvertical: 0xFE43, - whitecornerbracketright: 0x300F, - whitecornerbracketrightvertical: 0xFE44, - whitediamond: 0x25C7, - whitediamondcontainingblacksmalldiamond: 0x25C8, - whitedownpointingsmalltriangle: 0x25BF, - whitedownpointingtriangle: 0x25BD, - whiteleftpointingsmalltriangle: 0x25C3, - whiteleftpointingtriangle: 0x25C1, - whitelenticularbracketleft: 0x3016, - whitelenticularbracketright: 0x3017, - whiterightpointingsmalltriangle: 0x25B9, - whiterightpointingtriangle: 0x25B7, - whitesmallsquare: 0x25AB, - whitesmilingface: 0x263A, - whitesquare: 0x25A1, - whitestar: 0x2606, - whitetelephone: 0x260F, - whitetortoiseshellbracketleft: 0x3018, - whitetortoiseshellbracketright: 0x3019, - whiteuppointingsmalltriangle: 0x25B5, - whiteuppointingtriangle: 0x25B3, - wihiragana: 0x3090, - wikatakana: 0x30F0, - wikorean: 0x315F, - wmonospace: 0xFF57, - wohiragana: 0x3092, - wokatakana: 0x30F2, - wokatakanahalfwidth: 0xFF66, - won: 0x20A9, - wonmonospace: 0xFFE6, - wowaenthai: 0x0E27, - wparen: 0x24B2, - wring: 0x1E98, - wsuperior: 0x02B7, - wturned: 0x028D, - wynn: 0x01BF, - x: 0x0078, - xabovecmb: 0x033D, - xbopomofo: 0x3112, - xcircle: 0x24E7, - xdieresis: 0x1E8D, - xdotaccent: 0x1E8B, - xeharmenian: 0x056D, - xi: 0x03BE, - xmonospace: 0xFF58, - xparen: 0x24B3, - xsuperior: 0x02E3, - y: 0x0079, - yaadosquare: 0x334E, - yabengali: 0x09AF, - yacute: 0x00FD, - yadeva: 0x092F, - yaekorean: 0x3152, - yagujarati: 0x0AAF, - yagurmukhi: 0x0A2F, - yahiragana: 0x3084, - yakatakana: 0x30E4, - yakatakanahalfwidth: 0xFF94, - yakorean: 0x3151, - yamakkanthai: 0x0E4E, - yasmallhiragana: 0x3083, - yasmallkatakana: 0x30E3, - yasmallkatakanahalfwidth: 0xFF6C, - yatcyrillic: 0x0463, - ycircle: 0x24E8, - ycircumflex: 0x0177, - ydieresis: 0x00FF, - ydotaccent: 0x1E8F, - ydotbelow: 0x1EF5, - yeharabic: 0x064A, - yehbarreearabic: 0x06D2, - yehbarreefinalarabic: 0xFBAF, - yehfinalarabic: 0xFEF2, - yehhamzaabovearabic: 0x0626, - yehhamzaabovefinalarabic: 0xFE8A, - yehhamzaaboveinitialarabic: 0xFE8B, - yehhamzaabovemedialarabic: 0xFE8C, - yehinitialarabic: 0xFEF3, - yehmedialarabic: 0xFEF4, - yehmeeminitialarabic: 0xFCDD, - yehmeemisolatedarabic: 0xFC58, - yehnoonfinalarabic: 0xFC94, - yehthreedotsbelowarabic: 0x06D1, - yekorean: 0x3156, - yen: 0x00A5, - yenmonospace: 0xFFE5, - yeokorean: 0x3155, - yeorinhieuhkorean: 0x3186, - yerahbenyomohebrew: 0x05AA, - yerahbenyomolefthebrew: 0x05AA, - yericyrillic: 0x044B, - yerudieresiscyrillic: 0x04F9, - yesieungkorean: 0x3181, - yesieungpansioskorean: 0x3183, - yesieungsioskorean: 0x3182, - yetivhebrew: 0x059A, - ygrave: 0x1EF3, - yhook: 0x01B4, - yhookabove: 0x1EF7, - yiarmenian: 0x0575, - yicyrillic: 0x0457, - yikorean: 0x3162, - yinyang: 0x262F, - yiwnarmenian: 0x0582, - ymonospace: 0xFF59, - yod: 0x05D9, - yoddagesh: 0xFB39, - yoddageshhebrew: 0xFB39, - yodhebrew: 0x05D9, - yodyodhebrew: 0x05F2, - yodyodpatahhebrew: 0xFB1F, - yohiragana: 0x3088, - yoikorean: 0x3189, - yokatakana: 0x30E8, - yokatakanahalfwidth: 0xFF96, - yokorean: 0x315B, - yosmallhiragana: 0x3087, - yosmallkatakana: 0x30E7, - yosmallkatakanahalfwidth: 0xFF6E, - yotgreek: 0x03F3, - yoyaekorean: 0x3188, - yoyakorean: 0x3187, - yoyakthai: 0x0E22, - yoyingthai: 0x0E0D, - yparen: 0x24B4, - ypogegrammeni: 0x037A, - ypogegrammenigreekcmb: 0x0345, - yr: 0x01A6, - yring: 0x1E99, - ysuperior: 0x02B8, - ytilde: 0x1EF9, - yturned: 0x028E, - yuhiragana: 0x3086, - yuikorean: 0x318C, - yukatakana: 0x30E6, - yukatakanahalfwidth: 0xFF95, - yukorean: 0x3160, - yusbigcyrillic: 0x046B, - yusbigiotifiedcyrillic: 0x046D, - yuslittlecyrillic: 0x0467, - yuslittleiotifiedcyrillic: 0x0469, - yusmallhiragana: 0x3085, - yusmallkatakana: 0x30E5, - yusmallkatakanahalfwidth: 0xFF6D, - yuyekorean: 0x318B, - yuyeokorean: 0x318A, - yyabengali: 0x09DF, - yyadeva: 0x095F, - z: 0x007A, - zaarmenian: 0x0566, - zacute: 0x017A, - zadeva: 0x095B, - zagurmukhi: 0x0A5B, - zaharabic: 0x0638, - zahfinalarabic: 0xFEC6, - zahinitialarabic: 0xFEC7, - zahiragana: 0x3056, - zahmedialarabic: 0xFEC8, - zainarabic: 0x0632, - zainfinalarabic: 0xFEB0, - zakatakana: 0x30B6, - zaqefgadolhebrew: 0x0595, - zaqefqatanhebrew: 0x0594, - zarqahebrew: 0x0598, - zayin: 0x05D6, - zayindagesh: 0xFB36, - zayindageshhebrew: 0xFB36, - zayinhebrew: 0x05D6, - zbopomofo: 0x3117, - zcaron: 0x017E, - zcircle: 0x24E9, - zcircumflex: 0x1E91, - zcurl: 0x0291, - zdot: 0x017C, - zdotaccent: 0x017C, - zdotbelow: 0x1E93, - zecyrillic: 0x0437, - zedescendercyrillic: 0x0499, - zedieresiscyrillic: 0x04DF, - zehiragana: 0x305C, - zekatakana: 0x30BC, - zero: 0x0030, - zeroarabic: 0x0660, - zerobengali: 0x09E6, - zerodeva: 0x0966, - zerogujarati: 0x0AE6, - zerogurmukhi: 0x0A66, - zerohackarabic: 0x0660, - zeroinferior: 0x2080, - zeromonospace: 0xFF10, - zerooldstyle: 0xF730, - zeropersian: 0x06F0, - zerosuperior: 0x2070, - zerothai: 0x0E50, - zerowidthjoiner: 0xFEFF, - zerowidthnonjoiner: 0x200C, - zerowidthspace: 0x200B, - zeta: 0x03B6, - zhbopomofo: 0x3113, - zhearmenian: 0x056A, - zhebrevecyrillic: 0x04C2, - zhecyrillic: 0x0436, - zhedescendercyrillic: 0x0497, - zhedieresiscyrillic: 0x04DD, - zihiragana: 0x3058, - zikatakana: 0x30B8, - zinorhebrew: 0x05AE, - zlinebelow: 0x1E95, - zmonospace: 0xFF5A, - zohiragana: 0x305E, - zokatakana: 0x30BE, - zparen: 0x24B5, - zretroflexhook: 0x0290, - zstroke: 0x01B6, - zuhiragana: 0x305A, - zukatakana: 0x30BA, - '.notdef': 0x0000 -}; - -var DingbatsGlyphsUnicode = { - space: 0x0020, - a1: 0x2701, - a2: 0x2702, - a202: 0x2703, - a3: 0x2704, - a4: 0x260E, - a5: 0x2706, - a119: 0x2707, - a118: 0x2708, - a117: 0x2709, - a11: 0x261B, - a12: 0x261E, - a13: 0x270C, - a14: 0x270D, - a15: 0x270E, - a16: 0x270F, - a105: 0x2710, - a17: 0x2711, - a18: 0x2712, - a19: 0x2713, - a20: 0x2714, - a21: 0x2715, - a22: 0x2716, - a23: 0x2717, - a24: 0x2718, - a25: 0x2719, - a26: 0x271A, - a27: 0x271B, - a28: 0x271C, - a6: 0x271D, - a7: 0x271E, - a8: 0x271F, - a9: 0x2720, - a10: 0x2721, - a29: 0x2722, - a30: 0x2723, - a31: 0x2724, - a32: 0x2725, - a33: 0x2726, - a34: 0x2727, - a35: 0x2605, - a36: 0x2729, - a37: 0x272A, - a38: 0x272B, - a39: 0x272C, - a40: 0x272D, - a41: 0x272E, - a42: 0x272F, - a43: 0x2730, - a44: 0x2731, - a45: 0x2732, - a46: 0x2733, - a47: 0x2734, - a48: 0x2735, - a49: 0x2736, - a50: 0x2737, - a51: 0x2738, - a52: 0x2739, - a53: 0x273A, - a54: 0x273B, - a55: 0x273C, - a56: 0x273D, - a57: 0x273E, - a58: 0x273F, - a59: 0x2740, - a60: 0x2741, - a61: 0x2742, - a62: 0x2743, - a63: 0x2744, - a64: 0x2745, - a65: 0x2746, - a66: 0x2747, - a67: 0x2748, - a68: 0x2749, - a69: 0x274A, - a70: 0x274B, - a71: 0x25CF, - a72: 0x274D, - a73: 0x25A0, - a74: 0x274F, - a203: 0x2750, - a75: 0x2751, - a204: 0x2752, - a76: 0x25B2, - a77: 0x25BC, - a78: 0x25C6, - a79: 0x2756, - a81: 0x25D7, - a82: 0x2758, - a83: 0x2759, - a84: 0x275A, - a97: 0x275B, - a98: 0x275C, - a99: 0x275D, - a100: 0x275E, - a101: 0x2761, - a102: 0x2762, - a103: 0x2763, - a104: 0x2764, - a106: 0x2765, - a107: 0x2766, - a108: 0x2767, - a112: 0x2663, - a111: 0x2666, - a110: 0x2665, - a109: 0x2660, - a120: 0x2460, - a121: 0x2461, - a122: 0x2462, - a123: 0x2463, - a124: 0x2464, - a125: 0x2465, - a126: 0x2466, - a127: 0x2467, - a128: 0x2468, - a129: 0x2469, - a130: 0x2776, - a131: 0x2777, - a132: 0x2778, - a133: 0x2779, - a134: 0x277A, - a135: 0x277B, - a136: 0x277C, - a137: 0x277D, - a138: 0x277E, - a139: 0x277F, - a140: 0x2780, - a141: 0x2781, - a142: 0x2782, - a143: 0x2783, - a144: 0x2784, - a145: 0x2785, - a146: 0x2786, - a147: 0x2787, - a148: 0x2788, - a149: 0x2789, - a150: 0x278A, - a151: 0x278B, - a152: 0x278C, - a153: 0x278D, - a154: 0x278E, - a155: 0x278F, - a156: 0x2790, - a157: 0x2791, - a158: 0x2792, - a159: 0x2793, - a160: 0x2794, - a161: 0x2192, - a163: 0x2194, - a164: 0x2195, - a196: 0x2798, - a165: 0x2799, - a192: 0x279A, - a166: 0x279B, - a167: 0x279C, - a168: 0x279D, - a169: 0x279E, - a170: 0x279F, - a171: 0x27A0, - a172: 0x27A1, - a173: 0x27A2, - a162: 0x27A3, - a174: 0x27A4, - a175: 0x27A5, - a176: 0x27A6, - a177: 0x27A7, - a178: 0x27A8, - a179: 0x27A9, - a193: 0x27AA, - a180: 0x27AB, - a199: 0x27AC, - a181: 0x27AD, - a200: 0x27AE, - a182: 0x27AF, - a201: 0x27B1, - a183: 0x27B2, - a184: 0x27B3, - a197: 0x27B4, - a185: 0x27B5, - a194: 0x27B6, - a198: 0x27B7, - a186: 0x27B8, - a195: 0x27B9, - a187: 0x27BA, - a188: 0x27BB, - a189: 0x27BC, - a190: 0x27BD, - a191: 0x27BE, - a89: 0x2768, // 0xF8D7 - a90: 0x2769, // 0xF8D8 - a93: 0x276A, // 0xF8D9 - a94: 0x276B, // 0xF8DA - a91: 0x276C, // 0xF8DB - a92: 0x276D, // 0xF8DC - a205: 0x276E, // 0xF8DD - a85: 0x276F, // 0xF8DE - a206: 0x2770, // 0xF8DF - a86: 0x2771, // 0xF8E0 - a87: 0x2772, // 0xF8E1 - a88: 0x2773, // 0xF8E2 - a95: 0x2774, // 0xF8E3 - a96: 0x2775, // 0xF8E4 - '.notdef': 0x0000 -}; - - -var PDFImage = (function PDFImageClosure() { - /** - * Decode the image in the main thread if it supported. Resovles the promise - * when the image data is ready. - */ - function handleImageData(handler, xref, res, image) { - if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) { - // For natively supported jpegs send them to the main thread for decoding. - var dict = image.dict; - var colorSpace = dict.get('ColorSpace', 'CS'); - colorSpace = ColorSpace.parse(colorSpace, xref, res); - var numComps = colorSpace.numComps; - var decodePromise = handler.sendWithPromise('JpegDecode', - [image.getIR(), numComps]); - return decodePromise.then(function (message) { - var data = message.data; - return new Stream(data, 0, data.length, image.dict); - }); - } else { - return Promise.resolve(image); - } - } - - /** - * Decode and clamp a value. The formula is different from the spec because we - * don't decode to float range [0,1], we decode it in the [0,max] range. - */ - function decodeAndClamp(value, addend, coefficient, max) { - value = addend + value * coefficient; - // Clamp the value to the range - return (value < 0 ? 0 : (value > max ? max : value)); - } - - function PDFImage(xref, res, image, inline, smask, mask, isMask) { - this.image = image; - var dict = image.dict; - if (dict.has('Filter')) { - var filter = dict.get('Filter').name; - if (filter === 'JPXDecode') { - var jpxImage = new JpxImage(); - jpxImage.parseImageProperties(image.stream); - image.stream.reset(); - image.bitsPerComponent = jpxImage.bitsPerComponent; - image.numComps = jpxImage.componentsCount; - } else if (filter === 'JBIG2Decode') { - image.bitsPerComponent = 1; - image.numComps = 1; - } - } - // TODO cache rendered images? - - this.width = dict.get('Width', 'W'); - this.height = dict.get('Height', 'H'); - - if (this.width < 1 || this.height < 1) { - error('Invalid image width: ' + this.width + ' or height: ' + - this.height); - } - - this.interpolate = dict.get('Interpolate', 'I') || false; - this.imageMask = dict.get('ImageMask', 'IM') || false; - this.matte = dict.get('Matte') || false; - - var bitsPerComponent = image.bitsPerComponent; - if (!bitsPerComponent) { - bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); - if (!bitsPerComponent) { - if (this.imageMask) { - bitsPerComponent = 1; - } else { - error('Bits per component missing in image: ' + this.imageMask); - } - } - } - this.bpc = bitsPerComponent; - - if (!this.imageMask) { - var colorSpace = dict.get('ColorSpace', 'CS'); - if (!colorSpace) { - info('JPX images (which do not require color spaces)'); - switch (image.numComps) { - case 1: - colorSpace = Name.get('DeviceGray'); - break; - case 3: - colorSpace = Name.get('DeviceRGB'); - break; - case 4: - colorSpace = Name.get('DeviceCMYK'); - break; - default: - error('JPX images with ' + this.numComps + - ' color components not supported.'); - } - } - this.colorSpace = ColorSpace.parse(colorSpace, xref, res); - this.numComps = this.colorSpace.numComps; - } - - this.decode = dict.get('Decode', 'D'); - this.needsDecode = false; - if (this.decode && - ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) || - (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) { - this.needsDecode = true; - // Do some preprocessing to avoid more math. - var max = (1 << bitsPerComponent) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { - var dmin = this.decode[i]; - var dmax = this.decode[i + 1]; - this.decodeCoefficients[j] = dmax - dmin; - this.decodeAddends[j] = max * dmin; - } - } - - if (smask) { - this.smask = new PDFImage(xref, res, smask, false); - } else if (mask) { - if (isStream(mask)) { - var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); - if (!imageMask) { - warn('Ignoring /Mask in image without /ImageMask.'); - } else { - this.mask = new PDFImage(xref, res, mask, false, null, null, true); - } - } else { - // Color key mask (just an array). - this.mask = mask; - } - } - } - /** - * Handles processing of image data and returns the Promise that is resolved - * with a PDFImage when the image is ready to be used. - */ - PDFImage.buildImage = function PDFImage_buildImage(handler, xref, - res, image, inline) { - var imagePromise = handleImageData(handler, xref, res, image); - var smaskPromise; - var maskPromise; - - var smask = image.dict.get('SMask'); - var mask = image.dict.get('Mask'); - - if (smask) { - smaskPromise = handleImageData(handler, xref, res, smask); - maskPromise = Promise.resolve(null); - } else { - smaskPromise = Promise.resolve(null); - if (mask) { - if (isStream(mask)) { - maskPromise = handleImageData(handler, xref, res, mask); - } else if (isArray(mask)) { - maskPromise = Promise.resolve(mask); - } else { - warn('Unsupported mask format.'); - maskPromise = Promise.resolve(null); - } - } else { - maskPromise = Promise.resolve(null); - } - } - return Promise.all([imagePromise, smaskPromise, maskPromise]).then( - function(results) { - var imageData = results[0]; - var smaskData = results[1]; - var maskData = results[2]; - return new PDFImage(xref, res, imageData, inline, smaskData, maskData); - }); - }; - - /** - * Resize an image using the nearest neighbor algorithm. Currently only - * supports one and three component images. - * @param {TypedArray} pixels The original image with one component. - * @param {Number} bpc Number of bits per component. - * @param {Number} components Number of color components, 1 or 3 is supported. - * @param {Number} w1 Original width. - * @param {Number} h1 Original height. - * @param {Number} w2 New width. - * @param {Number} h2 New height. - * @param {TypedArray} dest (Optional) The destination buffer. - * @param {Number} alpha01 (Optional) Size reserved for the alpha channel. - * @return {TypedArray} Resized image data. - */ - PDFImage.resize = function PDFImage_resize(pixels, bpc, components, - w1, h1, w2, h2, dest, alpha01) { - - if (components !== 1 && components !== 3) { - error('Unsupported component count for resizing.'); - } - - var length = w2 * h2 * components; - var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var xRatio = w1 / w2; - var yRatio = h1 / h2; - var i, j, py, newIndex = 0, oldIndex; - var xScaled = new Uint16Array(w2); - var w1Scanline = w1 * components; - if (alpha01 !== 1) { - alpha01 = 0; - } - - for (j = 0; j < w2; j++) { - xScaled[j] = Math.floor(j * xRatio) * components; - } - - if (components === 1) { - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - temp[newIndex++] = pixels[oldIndex]; - } - } - } else if (components === 3) { - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - temp[newIndex++] = pixels[oldIndex++]; - temp[newIndex++] = pixels[oldIndex++]; - temp[newIndex++] = pixels[oldIndex++]; - newIndex += alpha01; - } - } - } - return temp; - }; - - PDFImage.createMask = - function PDFImage_createMask(imgArray, width, height, - imageIsFromDecodeStream, inverseDecode) { - - // |imgArray| might not contain full data for every pixel of the mask, so - // we need to distinguish between |computedLength| and |actualLength|. - // In particular, if inverseDecode is true, then the array we return must - // have a length of |computedLength|. - - var computedLength = ((width + 7) >> 3) * height; - var actualLength = imgArray.byteLength; - var haveFullData = computedLength === actualLength; - var data, i; - - if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { - // imgArray came from a DecodeStream and its data is in an appropriate - // form, so we can just transfer it. - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(actualLength); - data.set(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - for (i = actualLength; i < computedLength; i++) { - data[i] = 0xff; - } - } - - // If necessary, invert the original mask data (but not any extra we might - // have added above). It's safe to modify the array -- whether it's the - // original or a copy, we're about to transfer it anyway, so nothing else - // in this thread can be relying on its contents. - if (inverseDecode) { - for (i = 0; i < actualLength; i++) { - data[i] = ~data[i]; - } - } - - return {data: data, width: width, height: height}; - }; - - PDFImage.prototype = { - get drawWidth() { - return Math.max(this.width, - this.smask && this.smask.width || 0, - this.mask && this.mask.width || 0); - }, - - get drawHeight() { - return Math.max(this.height, - this.smask && this.smask.height || 0, - this.mask && this.mask.height || 0); - }, - - decodeBuffer: function PDFImage_decodeBuffer(buffer) { - var bpc = this.bpc; - var numComps = this.numComps; - - var decodeAddends = this.decodeAddends; - var decodeCoefficients = this.decodeCoefficients; - var max = (1 << bpc) - 1; - var i, ii; - - if (bpc === 1) { - // If the buffer needed decode that means it just needs to be inverted. - for (i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = +!(buffer[i]); - } - return; - } - var index = 0; - for (i = 0, ii = this.width * this.height; i < ii; i++) { - for (var j = 0; j < numComps; j++) { - buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], - decodeCoefficients[j], max); - index++; - } - } - }, - - getComponents: function PDFImage_getComponents(buffer) { - var bpc = this.bpc; - - // This image doesn't require any extra work. - if (bpc === 8) { - return buffer; - } - - var width = this.width; - var height = this.height; - var numComps = this.numComps; - - var length = width * height * numComps; - var bufferPos = 0; - var output = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var rowComps = width * numComps; - - var max = (1 << bpc) - 1; - var i = 0, ii, buf; - - if (bpc === 1) { - // Optimization for reading 1 bpc images. - var mask, loop1End, loop2End; - for (var j = 0; j < height; j++) { - loop1End = i + (rowComps & ~7); - loop2End = i + rowComps; - - // unroll loop for all full bytes - while (i < loop1End) { - buf = buffer[bufferPos++]; - output[i] = (buf >> 7) & 1; - output[i + 1] = (buf >> 6) & 1; - output[i + 2] = (buf >> 5) & 1; - output[i + 3] = (buf >> 4) & 1; - output[i + 4] = (buf >> 3) & 1; - output[i + 5] = (buf >> 2) & 1; - output[i + 6] = (buf >> 1) & 1; - output[i + 7] = buf & 1; - i += 8; - } - - // handle remaing bits - if (i < loop2End) { - buf = buffer[bufferPos++]; - mask = 128; - while (i < loop2End) { - output[i++] = +!!(buf & mask); - mask >>= 1; - } - } - } - } else { - // The general case that handles all other bpc values. - var bits = 0; - buf = 0; - for (i = 0, ii = length; i < ii; ++i) { - if (i % rowComps === 0) { - buf = 0; - bits = 0; - } - - while (bits < bpc) { - buf = (buf << 8) | buffer[bufferPos++]; - bits += 8; - } - - var remainingBits = bits - bpc; - var value = buf >> remainingBits; - output[i] = (value < 0 ? 0 : (value > max ? max : value)); - buf = buf & ((1 << remainingBits) - 1); - bits = remainingBits; - } - } - return output; - }, - - fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, - actualHeight, image) { - var smask = this.smask; - var mask = this.mask; - var alphaBuf, sw, sh, i, ii, j; - - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8Array(sw * sh); - smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width, - height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8Array(sw * sh); - mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); - - // Need to invert values in rgbaBuf - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - - if (sw !== width || sh !== height) { - alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width, - height); - } - } else if (isArray(mask)) { - // Color key mask: if any of the compontents are outside the range - // then they should be painted. - alphaBuf = new Uint8Array(width * height); - var numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - var opacity = 0; - var imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - var color = image[imageOffset + j]; - var maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; - } - } - alphaBuf[i] = opacity; - } - } else { - error('Unknown mask format.'); - } - } - - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } - } else { - // No mask. - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } - } - }, - - undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { - var matte = this.smask && this.smask.matte; - if (!matte) { - return; - } - var matteRgb = this.colorSpace.getRgb(matte, 0); - var matteR = matteRgb[0]; - var matteG = matteRgb[1]; - var matteB = matteRgb[2]; - var length = width * height * 4; - var r, g, b; - for (var i = 0; i < length; i += 4) { - var alpha = buffer[i + 3]; - if (alpha === 0) { - // according formula we have to get Infinity in all components - // making it white (typical paper color) should be okay - buffer[i] = 255; - buffer[i + 1] = 255; - buffer[i + 2] = 255; - continue; - } - var k = 255 / alpha; - r = (buffer[i] - matteR) * k + matteR; - g = (buffer[i + 1] - matteG) * k + matteG; - b = (buffer[i + 2] - matteB) * k + matteB; - buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; - buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; - buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; - } - }, - - createImageData: function PDFImage_createImageData(forceRGBA) { - var drawWidth = this.drawWidth; - var drawHeight = this.drawHeight; - var imgData = { // other fields are filled in below - width: drawWidth, - height: drawHeight - }; - - var numComps = this.numComps; - var originalWidth = this.width; - var originalHeight = this.height; - var bpc = this.bpc; - - // Rows start at byte boundary. - var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; - var imgArray; - - if (!forceRGBA) { - // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image - // without any complications, we pass a same-sized copy to the main - // thread rather than expanding by 32x to RGBA form. This saves *lots* - // of memory for many scanned documents. It's also much faster. - // - // Similarly, if it is a 24-bit-per pixel RGB image without any - // complications, we avoid expanding by 1.333x to RGBA form. - var kind; - if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { - kind = ImageKind.GRAYSCALE_1BPP; - } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && - !this.needsDecode) { - kind = ImageKind.RGB_24BPP; - } - if (kind && !this.smask && !this.mask && - drawWidth === originalWidth && drawHeight === originalHeight) { - imgData.kind = kind; - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // If imgArray came from a DecodeStream, we're safe to transfer it - // (and thus neuter it) because it will constitute the entire - // DecodeStream's data. But if it came from a Stream, we need to - // copy it because it'll only be a portion of the Stream's data, and - // the rest will be read later on. - if (this.image instanceof DecodeStream) { - imgData.data = imgArray; - } else { - var newArray = new Uint8Array(imgArray.length); - newArray.set(imgArray); - imgData.data = newArray; - } - if (this.needsDecode) { - // Invert the buffer (which must be grayscale if we reached here). - assert(kind === ImageKind.GRAYSCALE_1BPP); - var buffer = imgData.data; - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] ^= 0xff; - } - } - return imgData; - } - if (this.image instanceof JpegStream && !this.smask && !this.mask && - (this.colorSpace.name === 'DeviceGray' || - this.colorSpace.name === 'DeviceRGB' || - this.colorSpace.name === 'DeviceCMYK')) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(originalHeight * rowBytes, - drawWidth, drawHeight, true); - return imgData; - } - } - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // imgArray can be incomplete (e.g. after CCITT fax encoding). - var actualHeight = 0 | (imgArray.length / rowBytes * - drawHeight / originalHeight); - - var comps = this.getComponents(imgArray); - - // If opacity data is present, use RGBA_32BPP form. Otherwise, use the - // more compact RGB_24BPP form if allowable. - var alpha01, maybeUndoPreblend; - if (!forceRGBA && !this.smask && !this.mask) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 3); - alpha01 = 0; - maybeUndoPreblend = false; - } else { - imgData.kind = ImageKind.RGBA_32BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 4); - alpha01 = 1; - maybeUndoPreblend = true; - - // Color key masking (opacity) must be performed before decoding. - this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, - comps); - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, - drawWidth, drawHeight, actualHeight, bpc, comps, - alpha01); - if (maybeUndoPreblend) { - this.undoPreblend(imgData.data, drawWidth, actualHeight); - } - - return imgData; - }, - - fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { - var numComps = this.numComps; - if (numComps !== 1) { - error('Reading gray scale from a color image: ' + numComps); - } - - var width = this.width; - var height = this.height; - var bpc = this.bpc; - - // rows start at byte boundary - var rowBytes = (width * numComps * bpc + 7) >> 3; - var imgArray = this.getImageBytes(height * rowBytes); - - var comps = this.getComponents(imgArray); - var i, length; - - if (bpc === 1) { - // inline decoding (= inversion) for 1 bpc images - length = width * height; - if (this.needsDecode) { - // invert and scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (comps[i] - 1) & 255; - } - } else { - // scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (-comps[i]) & 255; - } - } - return; - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - length = width * height; - // we aren't using a colorspace so we need to scale the value - var scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = (scale * comps[i]) | 0; - } - }, - - getImageBytes: function PDFImage_getImageBytes(length, - drawWidth, drawHeight, - forceRGB) { - this.image.reset(); - this.image.drawWidth = drawWidth || this.width; - this.image.drawHeight = drawHeight || this.height; - this.image.forceRGB = !!forceRGB; - return this.image.getBytes(length); - } - }; - return PDFImage; -})(); - - -// The Metrics object contains glyph widths (in glyph space units). -// As per PDF spec, for most fonts (Type 3 being an exception) a glyph -// space unit corresponds to 1/1000th of text space unit. -var Metrics = { - 'Courier': 600, - 'Courier-Bold': 600, - 'Courier-BoldOblique': 600, - 'Courier-Oblique': 600, - 'Helvetica' : { - 'space': 278, - 'exclam': 278, - 'quotedbl': 355, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 667, - 'quoteright': 222, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 278, - 'semicolon': 278, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 556, - 'at': 1015, - 'A': 667, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 278, - 'backslash': 278, - 'bracketright': 278, - 'asciicircum': 469, - 'underscore': 556, - 'quoteleft': 222, - 'a': 556, - 'b': 556, - 'c': 500, - 'd': 556, - 'e': 556, - 'f': 278, - 'g': 556, - 'h': 556, - 'i': 222, - 'j': 222, - 'k': 500, - 'l': 222, - 'm': 833, - 'n': 556, - 'o': 556, - 'p': 556, - 'q': 556, - 'r': 333, - 's': 500, - 't': 278, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 500, - 'braceleft': 334, - 'bar': 260, - 'braceright': 334, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 191, - 'quotedblleft': 333, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 537, - 'bullet': 350, - 'quotesinglbase': 222, - 'quotedblbase': 333, - 'quotedblright': 333, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 556, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 222, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 556, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 667, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 500, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 500, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 222, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 500, - 'scedilla': 500, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 556, - 'Amacron': 667, - 'rcaron': 333, - 'ccedilla': 500, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 643, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 584, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 500, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 260, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 333, - 'omacron': 556, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 222, - 'tcaron': 317, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 222, - 'Oacute': 778, - 'oacute': 556, - 'amacron': 556, - 'sacute': 500, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 556, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 299, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 556, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 556, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 556, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 556, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 556, - 'Rcommaaccent': 722, - 'Lcommaaccent': 556, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 500, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 584, - 'odieresis': 556, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 556, - 'eth': 556, - 'zcaron': 500, - 'ncommaaccent': 556, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-Bold': { - 'space': 278, - 'exclam': 333, - 'quotedbl': 474, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 722, - 'quoteright': 278, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 333, - 'semicolon': 333, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 611, - 'at': 975, - 'A': 722, - 'B': 722, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 584, - 'underscore': 556, - 'quoteleft': 278, - 'a': 556, - 'b': 611, - 'c': 556, - 'd': 611, - 'e': 556, - 'f': 333, - 'g': 611, - 'h': 611, - 'i': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'm': 889, - 'n': 611, - 'o': 611, - 'p': 611, - 'q': 611, - 'r': 389, - 's': 556, - 't': 333, - 'u': 611, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'z': 500, - 'braceleft': 389, - 'bar': 280, - 'braceright': 389, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 238, - 'quotedblleft': 500, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 611, - 'fl': 611, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 556, - 'bullet': 350, - 'quotesinglbase': 278, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 611, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 611, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 722, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 556, - 'scommaaccent': 556, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 611, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 556, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 556, - 'scedilla': 556, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 611, - 'acircumflex': 556, - 'Amacron': 722, - 'rcaron': 389, - 'ccedilla': 556, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 743, - 'Umacron': 722, - 'uring': 611, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 584, - 'uacute': 611, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 556, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 556, - 'nacute': 611, - 'umacron': 611, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 280, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 611, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 389, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 611, - 'amacron': 556, - 'sacute': 556, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 611, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 611, - 'igrave': 278, - 'ohungarumlaut': 611, - 'Eogonek': 667, - 'dcroat': 611, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 400, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 611, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 611, - 'ntilde': 611, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 611, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 611, - 'Ccaron': 722, - 'ugrave': 611, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 611, - 'Rcommaaccent': 722, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 556, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 611, - 'tcommaaccent': 333, - 'logicalnot': 584, - 'odieresis': 611, - 'udieresis': 611, - 'notequal': 549, - 'gcommaaccent': 611, - 'eth': 611, - 'zcaron': 500, - 'ncommaaccent': 611, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-BoldOblique': { - 'space': 278, - 'exclam': 333, - 'quotedbl': 474, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 722, - 'quoteright': 278, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 333, - 'semicolon': 333, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 611, - 'at': 975, - 'A': 722, - 'B': 722, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 584, - 'underscore': 556, - 'quoteleft': 278, - 'a': 556, - 'b': 611, - 'c': 556, - 'd': 611, - 'e': 556, - 'f': 333, - 'g': 611, - 'h': 611, - 'i': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'm': 889, - 'n': 611, - 'o': 611, - 'p': 611, - 'q': 611, - 'r': 389, - 's': 556, - 't': 333, - 'u': 611, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'z': 500, - 'braceleft': 389, - 'bar': 280, - 'braceright': 389, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 238, - 'quotedblleft': 500, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 611, - 'fl': 611, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 556, - 'bullet': 350, - 'quotesinglbase': 278, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 611, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 611, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 722, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 556, - 'scommaaccent': 556, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 611, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 556, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 556, - 'scedilla': 556, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 611, - 'acircumflex': 556, - 'Amacron': 722, - 'rcaron': 389, - 'ccedilla': 556, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 743, - 'Umacron': 722, - 'uring': 611, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 584, - 'uacute': 611, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 556, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 556, - 'nacute': 611, - 'umacron': 611, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 280, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 611, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 389, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 611, - 'amacron': 556, - 'sacute': 556, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 611, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 611, - 'igrave': 278, - 'ohungarumlaut': 611, - 'Eogonek': 667, - 'dcroat': 611, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 400, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 611, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 611, - 'ntilde': 611, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 611, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 611, - 'Ccaron': 722, - 'ugrave': 611, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 611, - 'Rcommaaccent': 722, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 556, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 611, - 'tcommaaccent': 333, - 'logicalnot': 584, - 'odieresis': 611, - 'udieresis': 611, - 'notequal': 549, - 'gcommaaccent': 611, - 'eth': 611, - 'zcaron': 500, - 'ncommaaccent': 611, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-Oblique' : { - 'space': 278, - 'exclam': 278, - 'quotedbl': 355, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 667, - 'quoteright': 222, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 278, - 'semicolon': 278, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 556, - 'at': 1015, - 'A': 667, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 278, - 'backslash': 278, - 'bracketright': 278, - 'asciicircum': 469, - 'underscore': 556, - 'quoteleft': 222, - 'a': 556, - 'b': 556, - 'c': 500, - 'd': 556, - 'e': 556, - 'f': 278, - 'g': 556, - 'h': 556, - 'i': 222, - 'j': 222, - 'k': 500, - 'l': 222, - 'm': 833, - 'n': 556, - 'o': 556, - 'p': 556, - 'q': 556, - 'r': 333, - 's': 500, - 't': 278, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 500, - 'braceleft': 334, - 'bar': 260, - 'braceright': 334, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 191, - 'quotedblleft': 333, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 537, - 'bullet': 350, - 'quotesinglbase': 222, - 'quotedblbase': 333, - 'quotedblright': 333, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 556, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 222, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 556, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 667, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 500, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 500, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 222, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 500, - 'scedilla': 500, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 556, - 'Amacron': 667, - 'rcaron': 333, - 'ccedilla': 500, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 643, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 584, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 500, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 260, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 333, - 'omacron': 556, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 222, - 'tcaron': 317, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 222, - 'Oacute': 778, - 'oacute': 556, - 'amacron': 556, - 'sacute': 500, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 556, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 299, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 556, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 556, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 556, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 556, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 556, - 'Rcommaaccent': 722, - 'Lcommaaccent': 556, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 500, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 584, - 'odieresis': 556, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 556, - 'eth': 556, - 'zcaron': 500, - 'ncommaaccent': 556, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Symbol': { - 'space': 250, - 'exclam': 333, - 'universal': 713, - 'numbersign': 500, - 'existential': 549, - 'percent': 833, - 'ampersand': 778, - 'suchthat': 439, - 'parenleft': 333, - 'parenright': 333, - 'asteriskmath': 500, - 'plus': 549, - 'comma': 250, - 'minus': 549, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 278, - 'semicolon': 278, - 'less': 549, - 'equal': 549, - 'greater': 549, - 'question': 444, - 'congruent': 549, - 'Alpha': 722, - 'Beta': 667, - 'Chi': 722, - 'Delta': 612, - 'Epsilon': 611, - 'Phi': 763, - 'Gamma': 603, - 'Eta': 722, - 'Iota': 333, - 'theta1': 631, - 'Kappa': 722, - 'Lambda': 686, - 'Mu': 889, - 'Nu': 722, - 'Omicron': 722, - 'Pi': 768, - 'Theta': 741, - 'Rho': 556, - 'Sigma': 592, - 'Tau': 611, - 'Upsilon': 690, - 'sigma1': 439, - 'Omega': 768, - 'Xi': 645, - 'Psi': 795, - 'Zeta': 611, - 'bracketleft': 333, - 'therefore': 863, - 'bracketright': 333, - 'perpendicular': 658, - 'underscore': 500, - 'radicalex': 500, - 'alpha': 631, - 'beta': 549, - 'chi': 549, - 'delta': 494, - 'epsilon': 439, - 'phi': 521, - 'gamma': 411, - 'eta': 603, - 'iota': 329, - 'phi1': 603, - 'kappa': 549, - 'lambda': 549, - 'mu': 576, - 'nu': 521, - 'omicron': 549, - 'pi': 549, - 'theta': 521, - 'rho': 549, - 'sigma': 603, - 'tau': 439, - 'upsilon': 576, - 'omega1': 713, - 'omega': 686, - 'xi': 493, - 'psi': 686, - 'zeta': 494, - 'braceleft': 480, - 'bar': 200, - 'braceright': 480, - 'similar': 549, - 'Euro': 750, - 'Upsilon1': 620, - 'minute': 247, - 'lessequal': 549, - 'fraction': 167, - 'infinity': 713, - 'florin': 500, - 'club': 753, - 'diamond': 753, - 'heart': 753, - 'spade': 753, - 'arrowboth': 1042, - 'arrowleft': 987, - 'arrowup': 603, - 'arrowright': 987, - 'arrowdown': 603, - 'degree': 400, - 'plusminus': 549, - 'second': 411, - 'greaterequal': 549, - 'multiply': 549, - 'proportional': 713, - 'partialdiff': 494, - 'bullet': 460, - 'divide': 549, - 'notequal': 549, - 'equivalence': 549, - 'approxequal': 549, - 'ellipsis': 1000, - 'arrowvertex': 603, - 'arrowhorizex': 1000, - 'carriagereturn': 658, - 'aleph': 823, - 'Ifraktur': 686, - 'Rfraktur': 795, - 'weierstrass': 987, - 'circlemultiply': 768, - 'circleplus': 768, - 'emptyset': 823, - 'intersection': 768, - 'union': 768, - 'propersuperset': 713, - 'reflexsuperset': 713, - 'notsubset': 713, - 'propersubset': 713, - 'reflexsubset': 713, - 'element': 713, - 'notelement': 713, - 'angle': 768, - 'gradient': 713, - 'registerserif': 790, - 'copyrightserif': 790, - 'trademarkserif': 890, - 'product': 823, - 'radical': 549, - 'dotmath': 250, - 'logicalnot': 713, - 'logicaland': 603, - 'logicalor': 603, - 'arrowdblboth': 1042, - 'arrowdblleft': 987, - 'arrowdblup': 603, - 'arrowdblright': 987, - 'arrowdbldown': 603, - 'lozenge': 494, - 'angleleft': 329, - 'registersans': 790, - 'copyrightsans': 790, - 'trademarksans': 786, - 'summation': 713, - 'parenlefttp': 384, - 'parenleftex': 384, - 'parenleftbt': 384, - 'bracketlefttp': 384, - 'bracketleftex': 384, - 'bracketleftbt': 384, - 'bracelefttp': 494, - 'braceleftmid': 494, - 'braceleftbt': 494, - 'braceex': 494, - 'angleright': 329, - 'integral': 274, - 'integraltp': 686, - 'integralex': 686, - 'integralbt': 686, - 'parenrighttp': 384, - 'parenrightex': 384, - 'parenrightbt': 384, - 'bracketrighttp': 384, - 'bracketrightex': 384, - 'bracketrightbt': 384, - 'bracerighttp': 494, - 'bracerightmid': 494, - 'bracerightbt': 494, - 'apple': 790 - }, - 'Times-Roman': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 408, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 564, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 278, - 'semicolon': 278, - 'less': 564, - 'equal': 564, - 'greater': 564, - 'question': 444, - 'at': 921, - 'A': 722, - 'B': 667, - 'C': 667, - 'D': 722, - 'E': 611, - 'F': 556, - 'G': 722, - 'H': 722, - 'I': 333, - 'J': 389, - 'K': 722, - 'L': 611, - 'M': 889, - 'N': 722, - 'O': 722, - 'P': 556, - 'Q': 722, - 'R': 667, - 'S': 556, - 'T': 611, - 'U': 722, - 'V': 722, - 'W': 944, - 'X': 722, - 'Y': 722, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 469, - 'underscore': 500, - 'quoteleft': 333, - 'a': 444, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 500, - 'i': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'm': 778, - 'n': 500, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 333, - 's': 389, - 't': 278, - 'u': 500, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 444, - 'braceleft': 480, - 'bar': 200, - 'braceright': 480, - 'asciitilde': 541, - 'exclamdown': 333, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 180, - 'quotedblleft': 444, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 453, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 444, - 'quotedblright': 444, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 444, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 889, - 'ordfeminine': 276, - 'Lslash': 611, - 'Oslash': 722, - 'OE': 889, - 'ordmasculine': 310, - 'ae': 667, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 500, - 'Idieresis': 333, - 'eacute': 444, - 'abreve': 444, - 'uhungarumlaut': 500, - 'ecaron': 444, - 'Ydieresis': 722, - 'divide': 564, - 'Yacute': 722, - 'Acircumflex': 722, - 'aacute': 444, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 444, - 'Uacute': 722, - 'uogonek': 500, - 'Edieresis': 611, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 760, - 'Emacron': 611, - 'ccaron': 444, - 'aring': 444, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 444, - 'Tcommaaccent': 611, - 'Cacute': 667, - 'atilde': 444, - 'Edotaccent': 611, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 667, - 'Gcommaaccent': 722, - 'ucircumflex': 500, - 'acircumflex': 444, - 'Amacron': 722, - 'rcaron': 333, - 'ccedilla': 444, - 'Zdotaccent': 611, - 'Thorn': 556, - 'Omacron': 722, - 'Racute': 667, - 'Sacute': 556, - 'dcaron': 588, - 'Umacron': 722, - 'uring': 500, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 564, - 'uacute': 500, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 611, - 'adieresis': 444, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 500, - 'umacron': 500, - 'Ncaron': 722, - 'Iacute': 333, - 'plusminus': 564, - 'brokenbar': 200, - 'registered': 760, - 'Gbreve': 722, - 'Idotaccent': 333, - 'summation': 600, - 'Egrave': 611, - 'racute': 333, - 'omacron': 500, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 326, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 444, - 'zacute': 444, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 444, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 500, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 611, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 344, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 980, - 'edotaccent': 444, - 'Igrave': 333, - 'Imacron': 333, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 500, - 'Uhungarumlaut': 722, - 'Eacute': 611, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 500, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 667, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 722, - 'zdotaccent': 444, - 'Ecaron': 611, - 'Iogonek': 333, - 'kcommaaccent': 500, - 'minus': 564, - 'Icircumflex': 333, - 'ncaron': 500, - 'tcommaaccent': 278, - 'logicalnot': 564, - 'odieresis': 500, - 'udieresis': 500, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 444, - 'ncommaaccent': 500, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-Bold': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 555, - 'numbersign': 500, - 'dollar': 500, - 'percent': 1000, - 'ampersand': 833, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 570, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 570, - 'equal': 570, - 'greater': 570, - 'question': 500, - 'at': 930, - 'A': 722, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 778, - 'I': 389, - 'J': 500, - 'K': 778, - 'L': 667, - 'M': 944, - 'N': 722, - 'O': 778, - 'P': 611, - 'Q': 778, - 'R': 722, - 'S': 556, - 'T': 667, - 'U': 722, - 'V': 722, - 'W': 1000, - 'X': 722, - 'Y': 722, - 'Z': 667, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 581, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 556, - 'c': 444, - 'd': 556, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 556, - 'i': 278, - 'j': 333, - 'k': 556, - 'l': 278, - 'm': 833, - 'n': 556, - 'o': 500, - 'p': 556, - 'q': 556, - 'r': 444, - 's': 389, - 't': 333, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 444, - 'braceleft': 394, - 'bar': 220, - 'braceright': 394, - 'asciitilde': 520, - 'exclamdown': 333, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 278, - 'quotedblleft': 500, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 540, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 300, - 'Lslash': 667, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 330, - 'ae': 722, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 556, - 'Idieresis': 389, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 556, - 'ecaron': 444, - 'Ydieresis': 722, - 'divide': 570, - 'Yacute': 722, - 'Acircumflex': 722, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 747, - 'Emacron': 667, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 667, - 'Cacute': 722, - 'atilde': 500, - 'Edotaccent': 667, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 500, - 'Amacron': 722, - 'rcaron': 444, - 'ccedilla': 444, - 'Zdotaccent': 667, - 'Thorn': 611, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 556, - 'dcaron': 672, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 300, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 570, - 'uacute': 556, - 'Tcaron': 667, - 'partialdiff': 494, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 389, - 'plusminus': 570, - 'brokenbar': 220, - 'registered': 747, - 'Gbreve': 778, - 'Idotaccent': 389, - 'summation': 600, - 'Egrave': 667, - 'racute': 444, - 'omacron': 500, - 'Zacute': 667, - 'Zcaron': 667, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 416, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 444, - 'zacute': 444, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 300, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 394, - 'Kcommaaccent': 778, - 'Lacute': 667, - 'trademark': 1000, - 'edotaccent': 444, - 'Igrave': 389, - 'Imacron': 389, - 'Lcaron': 667, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 444, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 722, - 'Lcommaaccent': 667, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 444, - 'Ecaron': 667, - 'Iogonek': 389, - 'kcommaaccent': 556, - 'minus': 570, - 'Icircumflex': 389, - 'ncaron': 556, - 'tcommaaccent': 333, - 'logicalnot': 570, - 'odieresis': 500, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 444, - 'ncommaaccent': 556, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-BoldItalic': { - 'space': 250, - 'exclam': 389, - 'quotedbl': 555, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 570, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 570, - 'equal': 570, - 'greater': 570, - 'question': 500, - 'at': 832, - 'A': 667, - 'B': 667, - 'C': 667, - 'D': 722, - 'E': 667, - 'F': 667, - 'G': 722, - 'H': 778, - 'I': 389, - 'J': 500, - 'K': 667, - 'L': 611, - 'M': 889, - 'N': 722, - 'O': 722, - 'P': 611, - 'Q': 722, - 'R': 667, - 'S': 556, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 889, - 'X': 667, - 'Y': 611, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 570, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 556, - 'i': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'm': 778, - 'n': 556, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 389, - 's': 389, - 't': 278, - 'u': 556, - 'v': 444, - 'w': 667, - 'x': 500, - 'y': 444, - 'z': 389, - 'braceleft': 348, - 'bar': 220, - 'braceright': 348, - 'asciitilde': 570, - 'exclamdown': 389, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 278, - 'quotedblleft': 500, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 500, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 944, - 'ordfeminine': 266, - 'Lslash': 611, - 'Oslash': 722, - 'OE': 944, - 'ordmasculine': 300, - 'ae': 722, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 500, - 'Idieresis': 389, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 556, - 'ecaron': 444, - 'Ydieresis': 611, - 'divide': 570, - 'Yacute': 611, - 'Acircumflex': 667, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 444, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 747, - 'Emacron': 667, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 611, - 'Cacute': 667, - 'atilde': 500, - 'Edotaccent': 667, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 667, - 'Gcommaaccent': 722, - 'ucircumflex': 556, - 'acircumflex': 500, - 'Amacron': 667, - 'rcaron': 389, - 'ccedilla': 444, - 'Zdotaccent': 611, - 'Thorn': 611, - 'Omacron': 722, - 'Racute': 667, - 'Sacute': 556, - 'dcaron': 608, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 570, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 444, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 389, - 'plusminus': 570, - 'brokenbar': 220, - 'registered': 747, - 'Gbreve': 722, - 'Idotaccent': 389, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 500, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 366, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 444, - 'zacute': 389, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 576, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 667, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 382, - 'Kcommaaccent': 667, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 444, - 'Igrave': 389, - 'Imacron': 389, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 556, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 667, - 'Lcommaaccent': 611, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 722, - 'zdotaccent': 389, - 'Ecaron': 667, - 'Iogonek': 389, - 'kcommaaccent': 500, - 'minus': 606, - 'Icircumflex': 389, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 606, - 'odieresis': 500, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 389, - 'ncommaaccent': 556, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-Italic': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 420, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 675, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 675, - 'equal': 675, - 'greater': 675, - 'question': 500, - 'at': 920, - 'A': 611, - 'B': 611, - 'C': 667, - 'D': 722, - 'E': 611, - 'F': 611, - 'G': 722, - 'H': 722, - 'I': 333, - 'J': 444, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 667, - 'O': 722, - 'P': 611, - 'Q': 722, - 'R': 611, - 'S': 500, - 'T': 556, - 'U': 722, - 'V': 611, - 'W': 833, - 'X': 611, - 'Y': 556, - 'Z': 556, - 'bracketleft': 389, - 'backslash': 278, - 'bracketright': 389, - 'asciicircum': 422, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 278, - 'g': 500, - 'h': 500, - 'i': 278, - 'j': 278, - 'k': 444, - 'l': 278, - 'm': 722, - 'n': 500, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 389, - 's': 389, - 't': 278, - 'u': 500, - 'v': 444, - 'w': 667, - 'x': 444, - 'y': 444, - 'z': 389, - 'braceleft': 400, - 'bar': 275, - 'braceright': 400, - 'asciitilde': 541, - 'exclamdown': 389, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 214, - 'quotedblleft': 556, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 523, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 556, - 'quotedblright': 556, - 'guillemotright': 500, - 'ellipsis': 889, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 889, - 'AE': 889, - 'ordfeminine': 276, - 'Lslash': 556, - 'Oslash': 722, - 'OE': 944, - 'ordmasculine': 310, - 'ae': 667, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 667, - 'germandbls': 500, - 'Idieresis': 333, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 500, - 'ecaron': 444, - 'Ydieresis': 556, - 'divide': 675, - 'Yacute': 556, - 'Acircumflex': 611, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 444, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 500, - 'Edieresis': 611, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 760, - 'Emacron': 611, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 667, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 556, - 'Cacute': 667, - 'atilde': 500, - 'Edotaccent': 611, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 611, - 'Gcommaaccent': 722, - 'ucircumflex': 500, - 'acircumflex': 500, - 'Amacron': 611, - 'rcaron': 389, - 'ccedilla': 444, - 'Zdotaccent': 556, - 'Thorn': 611, - 'Omacron': 722, - 'Racute': 611, - 'Sacute': 500, - 'dcaron': 544, - 'Umacron': 722, - 'uring': 500, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 611, - 'Abreve': 611, - 'multiply': 675, - 'uacute': 500, - 'Tcaron': 556, - 'partialdiff': 476, - 'ydieresis': 444, - 'Nacute': 667, - 'icircumflex': 278, - 'Ecircumflex': 611, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 500, - 'umacron': 500, - 'Ncaron': 667, - 'Iacute': 333, - 'plusminus': 675, - 'brokenbar': 275, - 'registered': 760, - 'Gbreve': 722, - 'Idotaccent': 333, - 'summation': 600, - 'Egrave': 611, - 'racute': 389, - 'omacron': 500, - 'Zacute': 556, - 'Zcaron': 556, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 300, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 611, - 'Adieresis': 611, - 'egrave': 444, - 'zacute': 389, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 500, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 611, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 500, - 'lcaron': 300, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 980, - 'edotaccent': 444, - 'Igrave': 333, - 'Imacron': 333, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 500, - 'Uhungarumlaut': 722, - 'Eacute': 611, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 500, - 'Scommaaccent': 500, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 500, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 667, - 'otilde': 500, - 'Rcommaaccent': 611, - 'Lcommaaccent': 556, - 'Atilde': 611, - 'Aogonek': 611, - 'Aring': 611, - 'Otilde': 722, - 'zdotaccent': 389, - 'Ecaron': 611, - 'Iogonek': 333, - 'kcommaaccent': 444, - 'minus': 675, - 'Icircumflex': 333, - 'ncaron': 500, - 'tcommaaccent': 278, - 'logicalnot': 675, - 'odieresis': 500, - 'udieresis': 500, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 389, - 'ncommaaccent': 500, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'ZapfDingbats': { - 'space': 278, - 'a1': 974, - 'a2': 961, - 'a202': 974, - 'a3': 980, - 'a4': 719, - 'a5': 789, - 'a119': 790, - 'a118': 791, - 'a117': 690, - 'a11': 960, - 'a12': 939, - 'a13': 549, - 'a14': 855, - 'a15': 911, - 'a16': 933, - 'a105': 911, - 'a17': 945, - 'a18': 974, - 'a19': 755, - 'a20': 846, - 'a21': 762, - 'a22': 761, - 'a23': 571, - 'a24': 677, - 'a25': 763, - 'a26': 760, - 'a27': 759, - 'a28': 754, - 'a6': 494, - 'a7': 552, - 'a8': 537, - 'a9': 577, - 'a10': 692, - 'a29': 786, - 'a30': 788, - 'a31': 788, - 'a32': 790, - 'a33': 793, - 'a34': 794, - 'a35': 816, - 'a36': 823, - 'a37': 789, - 'a38': 841, - 'a39': 823, - 'a40': 833, - 'a41': 816, - 'a42': 831, - 'a43': 923, - 'a44': 744, - 'a45': 723, - 'a46': 749, - 'a47': 790, - 'a48': 792, - 'a49': 695, - 'a50': 776, - 'a51': 768, - 'a52': 792, - 'a53': 759, - 'a54': 707, - 'a55': 708, - 'a56': 682, - 'a57': 701, - 'a58': 826, - 'a59': 815, - 'a60': 789, - 'a61': 789, - 'a62': 707, - 'a63': 687, - 'a64': 696, - 'a65': 689, - 'a66': 786, - 'a67': 787, - 'a68': 713, - 'a69': 791, - 'a70': 785, - 'a71': 791, - 'a72': 873, - 'a73': 761, - 'a74': 762, - 'a203': 762, - 'a75': 759, - 'a204': 759, - 'a76': 892, - 'a77': 892, - 'a78': 788, - 'a79': 784, - 'a81': 438, - 'a82': 138, - 'a83': 277, - 'a84': 415, - 'a97': 392, - 'a98': 392, - 'a99': 668, - 'a100': 668, - 'a89': 390, - 'a90': 390, - 'a93': 317, - 'a94': 317, - 'a91': 276, - 'a92': 276, - 'a205': 509, - 'a85': 509, - 'a206': 410, - 'a86': 410, - 'a87': 234, - 'a88': 234, - 'a95': 334, - 'a96': 334, - 'a101': 732, - 'a102': 544, - 'a103': 544, - 'a104': 910, - 'a106': 667, - 'a107': 760, - 'a108': 760, - 'a112': 776, - 'a111': 595, - 'a110': 694, - 'a109': 626, - 'a120': 788, - 'a121': 788, - 'a122': 788, - 'a123': 788, - 'a124': 788, - 'a125': 788, - 'a126': 788, - 'a127': 788, - 'a128': 788, - 'a129': 788, - 'a130': 788, - 'a131': 788, - 'a132': 788, - 'a133': 788, - 'a134': 788, - 'a135': 788, - 'a136': 788, - 'a137': 788, - 'a138': 788, - 'a139': 788, - 'a140': 788, - 'a141': 788, - 'a142': 788, - 'a143': 788, - 'a144': 788, - 'a145': 788, - 'a146': 788, - 'a147': 788, - 'a148': 788, - 'a149': 788, - 'a150': 788, - 'a151': 788, - 'a152': 788, - 'a153': 788, - 'a154': 788, - 'a155': 788, - 'a156': 788, - 'a157': 788, - 'a158': 788, - 'a159': 788, - 'a160': 894, - 'a161': 838, - 'a163': 1016, - 'a164': 458, - 'a196': 748, - 'a165': 924, - 'a192': 748, - 'a166': 918, - 'a167': 927, - 'a168': 928, - 'a169': 928, - 'a170': 834, - 'a171': 873, - 'a172': 828, - 'a173': 924, - 'a162': 924, - 'a174': 917, - 'a175': 930, - 'a176': 931, - 'a177': 463, - 'a178': 883, - 'a179': 836, - 'a193': 836, - 'a180': 867, - 'a199': 867, - 'a181': 696, - 'a200': 696, - 'a182': 874, - 'a201': 874, - 'a183': 760, - 'a184': 946, - 'a197': 771, - 'a185': 865, - 'a194': 771, - 'a198': 888, - 'a186': 967, - 'a195': 888, - 'a187': 831, - 'a188': 873, - 'a189': 927, - 'a190': 970, - 'a191': 918 - } -}; - - -var EOF = {}; - -function isEOF(v) { - return (v === EOF); -} - -var MAX_LENGTH_TO_CACHE = 1000; - -var Parser = (function ParserClosure() { - function Parser(lexer, allowStreams, xref) { - this.lexer = lexer; - this.allowStreams = allowStreams; - this.xref = xref; - this.imageCache = {}; - this.refill(); - } - - Parser.prototype = { - refill: function Parser_refill() { - this.buf1 = this.lexer.getObj(); - this.buf2 = this.lexer.getObj(); - }, - shift: function Parser_shift() { - if (isCmd(this.buf2, 'ID')) { - this.buf1 = this.buf2; - this.buf2 = null; - } else { - this.buf1 = this.buf2; - this.buf2 = this.lexer.getObj(); - } - }, - tryShift: function Parser_tryShift() { - try { - this.shift(); - return true; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - // Upon failure, the caller should reset this.lexer.pos to a known good - // state and call this.shift() twice to reset the buffers. - return false; - } - }, - getObj: function Parser_getObj(cipherTransform) { - var buf1 = this.buf1; - this.shift(); - - if (buf1 instanceof Cmd) { - switch (buf1.cmd) { - case 'BI': // inline image - return this.makeInlineImage(cipherTransform); - case '[': // array - var array = []; - while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) { - array.push(this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - error('End of file inside array'); - } - this.shift(); - return array; - case '<<': // dictionary or stream - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - info('Malformed dictionary: key must be a name object'); - this.shift(); - continue; - } - - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - error('End of file inside dictionary'); - } - - // Stream objects are not allowed inside content streams or - // object streams. - if (isCmd(this.buf2, 'stream')) { - return (this.allowStreams ? - this.makeStream(dict, cipherTransform) : dict); - } - this.shift(); - return dict; - default: // simple object - return buf1; - } - } - - if (isInt(buf1)) { // indirect reference or integer - var num = buf1; - if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { - var ref = new Ref(num, this.buf1); - this.shift(); - this.shift(); - return ref; - } - return num; - } - - if (isString(buf1)) { // string - var str = buf1; - if (cipherTransform) { - str = cipherTransform.decryptString(str); - } - return str; - } - - // simple object - return buf1; - }, - /** - * Find the end of the stream by searching for the /EI\s/. - * @returns {number} The inline stream length. - */ - findDefaultInlineStreamEnd: - function Parser_findDefaultInlineStreamEnd(stream) { - var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD; - var startPos = stream.pos, state = 0, ch, i, n, followingBytes; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else { - assert(state === 2); - if (ch === SPACE || ch === LF || ch === CR) { - // Let's check the next five bytes are ASCII... just be sure. - n = 5; - followingBytes = stream.peekBytes(n); - for (i = 0; i < n; i++) { - ch = followingBytes[i]; - if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) { - // Not a LF, CR, SPACE or any visible ASCII character, i.e. - // it's binary stuff. Resetting the state. - state = 0; - break; - } - } - if (state === 2) { - break; // Finished! - } - } else { - state = 0; - } - } - } - return ((stream.pos - 4) - startPos); - }, - /** - * Find the EOI (end-of-image) marker 0xFFD9 of the stream. - * @returns {number} The inline stream length. - */ - findDCTDecodeInlineStreamEnd: - function Parser_findDCTDecodeInlineStreamEnd(stream) { - var startPos = stream.pos, foundEOI = false, b, markerLength, length; - while ((b = stream.getByte()) !== -1) { - if (b !== 0xFF) { // Not a valid marker. - continue; - } - switch (stream.getByte()) { - case 0x00: // Byte stuffing. - // 0xFF00 appears to be a very common byte sequence in JPEG images. - break; - - case 0xFF: // Fill byte. - // Avoid skipping a valid marker, resetting the stream position. - stream.skip(-1); - break; - - case 0xD9: // EOI - foundEOI = true; - break; - - case 0xC0: // SOF0 - case 0xC1: // SOF1 - case 0xC2: // SOF2 - case 0xC3: // SOF3 - - case 0xC5: // SOF5 - case 0xC6: // SOF6 - case 0xC7: // SOF7 - - case 0xC9: // SOF9 - case 0xCA: // SOF10 - case 0xCB: // SOF11 - - case 0xCD: // SOF13 - case 0xCE: // SOF14 - case 0xCF: // SOF15 - - case 0xC4: // DHT - case 0xCC: // DAC - - case 0xDA: // SOS - case 0xDB: // DQT - case 0xDC: // DNL - case 0xDD: // DRI - case 0xDE: // DHP - case 0xDF: // EXP - - case 0xE0: // APP0 - case 0xE1: // APP1 - case 0xE2: // APP2 - case 0xE3: // APP3 - case 0xE4: // APP4 - case 0xE5: // APP5 - case 0xE6: // APP6 - case 0xE7: // APP7 - case 0xE8: // APP8 - case 0xE9: // APP9 - case 0xEA: // APP10 - case 0xEB: // APP11 - case 0xEC: // APP12 - case 0xED: // APP13 - case 0xEE: // APP14 - case 0xEF: // APP15 - - case 0xFE: // COM - // The marker should be followed by the length of the segment. - markerLength = stream.getUint16(); - if (markerLength > 2) { - // |markerLength| contains the byte length of the marker segment, - // including its own length (2 bytes) and excluding the marker. - stream.skip(markerLength - 2); // Jump to the next marker. - } else { - // The marker length is invalid, resetting the stream position. - stream.skip(-2); - } - break; - } - if (foundEOI) { - break; - } - } - length = stream.pos - startPos; - if (b === -1) { - warn('Inline DCTDecode image stream: ' + - 'EOI marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCII85DecodeInlineStreamEnd: - function Parser_findASCII85DecodeInlineStreamEnd(stream) { - var TILDE = 0x7E, GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === TILDE && stream.peekByte() === GT) { - stream.skip(); - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCII85Decode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCIIHexDecodeInlineStreamEnd: - function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { - var GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === GT) { - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCIIHexDecode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Skip over the /EI/ for streams where we search for an EOD marker. - */ - inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { - var E = 0x45, I = 0x49; - var state = 0, ch; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else if (state === 2) { - break; - } - } - }, - makeInlineImage: function Parser_makeInlineImage(cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // Parse dictionary. - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - error('Dictionary key must be a name object'); - } - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - - // Extract the name of the first (i.e. the current) image filter. - var filter = dict.get('Filter', 'F'), filterName; - if (isName(filter)) { - filterName = filter.name; - } else if (isArray(filter) && isName(filter[0])) { - filterName = filter[0].name; - } - - // Parse image stream. - var startPos = stream.pos, length, i, ii; - if (filterName === 'DCTDecode' || filterName === 'DCT') { - length = this.findDCTDecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCII85Decide' || filterName === 'A85') { - length = this.findASCII85DecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') { - length = this.findASCIIHexDecodeInlineStreamEnd(stream); - } else { - length = this.findDefaultInlineStreamEnd(stream); - } - var imageStream = stream.makeSubStream(startPos, length, dict); - - // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their - // adler32 checksum. - var adler32; - if (length < MAX_LENGTH_TO_CACHE) { - var imageBytes = imageStream.getBytes(); - imageStream.reset(); - - var a = 1; - var b = 0; - for (i = 0, ii = imageBytes.length; i < ii; ++i) { - // No modulo required in the loop if imageBytes.length < 5552. - a += imageBytes[i] & 0xff; - b += a; - } - adler32 = ((b % 65521) << 16) | (a % 65521); - - if (this.imageCache.adler32 === adler32) { - this.buf2 = Cmd.get('EI'); - this.shift(); - - this.imageCache[adler32].reset(); - return this.imageCache[adler32]; - } - } - - if (cipherTransform) { - imageStream = cipherTransform.createStream(imageStream, length); - } - - imageStream = this.filter(imageStream, dict, length); - imageStream.dict = dict; - if (adler32 !== undefined) { - imageStream.cacheKey = 'inline_' + length + '_' + adler32; - this.imageCache[adler32] = imageStream; - } - - this.buf2 = Cmd.get('EI'); - this.shift(); - - return imageStream; - }, - makeStream: function Parser_makeStream(dict, cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // get stream start position - lexer.skipToNextLine(); - var pos = stream.pos - 1; - - // get length - var length = dict.get('Length'); - if (!isInt(length)) { - info('Bad ' + length + ' attribute in stream'); - length = 0; - } - - // skip over the stream data - stream.pos = pos + length; - lexer.nextChar(); - - // Shift '>>' and check whether the new object marks the end of the stream - if (this.tryShift() && isCmd(this.buf2, 'endstream')) { - this.shift(); // 'stream' - } else { - // bad stream length, scanning for endstream - stream.pos = pos; - var SCAN_BLOCK_SIZE = 2048; - var ENDSTREAM_SIGNATURE_LENGTH = 9; - var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6D]; - var skipped = 0, found = false, i, j; - while (stream.pos < stream.end) { - var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE); - var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH; - if (scanLength <= 0) { - break; - } - found = false; - for (i = 0, j = 0; i < scanLength; i++) { - var b = scanBytes[i]; - if (b !== ENDSTREAM_SIGNATURE[j]) { - i -= j; - j = 0; - } else { - j++; - if (j >= ENDSTREAM_SIGNATURE_LENGTH) { - i++; - found = true; - break; - } - } - } - if (found) { - skipped += i - ENDSTREAM_SIGNATURE_LENGTH; - stream.pos += i - ENDSTREAM_SIGNATURE_LENGTH; - break; - } - skipped += scanLength; - stream.pos += scanLength; - } - if (!found) { - error('Missing endstream'); - } - length = skipped; - - lexer.nextChar(); - this.shift(); - this.shift(); - } - this.shift(); // 'endstream' - - stream = stream.makeSubStream(pos, length, dict); - if (cipherTransform) { - stream = cipherTransform.createStream(stream, length); - } - stream = this.filter(stream, dict, length); - stream.dict = dict; - return stream; - }, - filter: function Parser_filter(stream, dict, length) { - var filter = dict.get('Filter', 'F'); - var params = dict.get('DecodeParms', 'DP'); - if (isName(filter)) { - return this.makeFilter(stream, filter.name, length, params); - } - - var maybeLength = length; - if (isArray(filter)) { - var filterArray = filter; - var paramsArray = params; - for (var i = 0, ii = filterArray.length; i < ii; ++i) { - filter = filterArray[i]; - if (!isName(filter)) { - error('Bad filter name: ' + filter); - } - - params = null; - if (isArray(paramsArray) && (i in paramsArray)) { - params = paramsArray[i]; - } - stream = this.makeFilter(stream, filter.name, maybeLength, params); - // after the first stream the length variable is invalid - maybeLength = null; - } - } - return stream; - }, - makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { - if (stream.dict.get('Length') === 0 && !maybeLength) { - warn('Empty "' + name + '" stream.'); - return new NullStream(stream); - } - try { - if (params && this.xref) { - params = this.xref.fetchIfRef(params); - } - var xrefStreamStats = this.xref.stats.streamTypes; - if (name === 'FlateDecode' || name === 'Fl') { - xrefStreamStats[StreamType.FLATE] = true; - if (params) { - return new PredictorStream(new FlateStream(stream, maybeLength), - maybeLength, params); - } - return new FlateStream(stream, maybeLength); - } - if (name === 'LZWDecode' || name === 'LZW') { - xrefStreamStats[StreamType.LZW] = true; - var earlyChange = 1; - if (params) { - if (params.has('EarlyChange')) { - earlyChange = params.get('EarlyChange'); - } - return new PredictorStream( - new LZWStream(stream, maybeLength, earlyChange), - maybeLength, params); - } - return new LZWStream(stream, maybeLength, earlyChange); - } - if (name === 'DCTDecode' || name === 'DCT') { - xrefStreamStats[StreamType.DCT] = true; - return new JpegStream(stream, maybeLength, stream.dict, this.xref); - } - if (name === 'JPXDecode' || name === 'JPX') { - xrefStreamStats[StreamType.JPX] = true; - return new JpxStream(stream, maybeLength, stream.dict); - } - if (name === 'ASCII85Decode' || name === 'A85') { - xrefStreamStats[StreamType.A85] = true; - return new Ascii85Stream(stream, maybeLength); - } - if (name === 'ASCIIHexDecode' || name === 'AHx') { - xrefStreamStats[StreamType.AHX] = true; - return new AsciiHexStream(stream, maybeLength); - } - if (name === 'CCITTFaxDecode' || name === 'CCF') { - xrefStreamStats[StreamType.CCF] = true; - return new CCITTFaxStream(stream, maybeLength, params); - } - if (name === 'RunLengthDecode' || name === 'RL') { - xrefStreamStats[StreamType.RL] = true; - return new RunLengthStream(stream, maybeLength); - } - if (name === 'JBIG2Decode') { - xrefStreamStats[StreamType.JBIG] = true; - return new Jbig2Stream(stream, maybeLength, stream.dict); - } - warn('filter "' + name + '" not supported yet'); - return stream; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Invalid stream: \"' + ex + '\"'); - return new NullStream(stream); - } - } - }; - - return Parser; -})(); - -var Lexer = (function LexerClosure() { - function Lexer(stream, knownCommands) { - this.stream = stream; - this.nextChar(); - - // While lexing, we build up many strings one char at a time. Using += for - // this can result in lots of garbage strings. It's better to build an - // array of single-char strings and then join() them together at the end. - // And reusing a single array (i.e. |this.strBuf|) over and over for this - // purpose uses less memory than using a new array for each string. - this.strBuf = []; - - // The PDFs might have "glued" commands with other commands, operands or - // literals, e.g. "q1". The knownCommands is a dictionary of the valid - // commands and their prefixes. The prefixes are built the following way: - // if there a command that is a prefix of the other valid command or - // literal (e.g. 'f' and 'false') the following prefixes must be included, - // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no - // other commands or literals as a prefix. The knowCommands is optional. - this.knownCommands = knownCommands; - } - - Lexer.isSpace = function Lexer_isSpace(ch) { - // Space is one of the following characters: SPACE, TAB, CR or LF. - return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); - }; - - // A '1' in this array means the character is white space. A '1' or - // '2' means the character ends a name or command. - var specialChars = [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x - 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx - ]; - - function toHexDigit(ch) { - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - return ch & 0x0F; - } - if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'F', 'a'-'f' - return (ch & 0x0F) + 9; - } - return -1; - } - - Lexer.prototype = { - nextChar: function Lexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - peekChar: function Lexer_peekChar() { - return this.stream.peekByte(); - }, - getNumber: function Lexer_getNumber() { - var ch = this.currentChar; - var eNotation = false; - var divideBy = 0; // different from 0 if it's a floating point value - var sign = 1; - - if (ch === 0x2D) { // '-' - sign = -1; - ch = this.nextChar(); - - if (ch === 0x2D) { // '-' - // Ignore double negative (this is consistent with Adobe Reader). - ch = this.nextChar(); - } - } else if (ch === 0x2B) { // '+' - ch = this.nextChar(); - } - if (ch === 0x2E) { // '.' - divideBy = 10; - ch = this.nextChar(); - } - if (ch < 0x30 || ch > 0x39) { // '0' - '9' - error('Invalid number: ' + String.fromCharCode(ch)); - return 0; - } - - var baseValue = ch - 0x30; // '0' - var powerValue = 0; - var powerValueSign = 1; - - while ((ch = this.nextChar()) >= 0) { - if (0x30 <= ch && ch <= 0x39) { // '0' - '9' - var currentDigit = ch - 0x30; // '0' - if (eNotation) { // We are after an 'e' or 'E' - powerValue = powerValue * 10 + currentDigit; - } else { - if (divideBy !== 0) { // We are after a point - divideBy *= 10; - } - baseValue = baseValue * 10 + currentDigit; - } - } else if (ch === 0x2E) { // '.' - if (divideBy === 0) { - divideBy = 1; - } else { - // A number can have only one '.' - break; - } - } else if (ch === 0x2D) { // '-' - // ignore minus signs in the middle of numbers to match - // Adobe's behavior - warn('Badly formated number'); - } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e' - // 'E' can be either a scientific notation or the beginning of a new - // operator - ch = this.peekChar(); - if (ch === 0x2B || ch === 0x2D) { // '+', '-' - powerValueSign = (ch === 0x2D) ? -1 : 1; - this.nextChar(); // Consume the sign character - } else if (ch < 0x30 || ch > 0x39) { // '0' - '9' - // The 'E' must be the beginning of a new operator - break; - } - eNotation = true; - } else { - // the last character doesn't belong to us - break; - } - } - - if (divideBy !== 0) { - baseValue /= divideBy; - } - if (eNotation) { - baseValue *= Math.pow(10, powerValueSign * powerValue); - } - return sign * baseValue; - }, - getString: function Lexer_getString() { - var numParen = 1; - var done = false; - var strBuf = this.strBuf; - strBuf.length = 0; - - var ch = this.nextChar(); - while (true) { - var charBuffered = false; - switch (ch | 0) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x28: // '(' - ++numParen; - strBuf.push('('); - break; - case 0x29: // ')' - if (--numParen === 0) { - this.nextChar(); // consume strings ')' - done = true; - } else { - strBuf.push(')'); - } - break; - case 0x5C: // '\\' - ch = this.nextChar(); - switch (ch) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x6E: // 'n' - strBuf.push('\n'); - break; - case 0x72: // 'r' - strBuf.push('\r'); - break; - case 0x74: // 't' - strBuf.push('\t'); - break; - case 0x62: // 'b' - strBuf.push('\b'); - break; - case 0x66: // 'f' - strBuf.push('\f'); - break; - case 0x5C: // '\' - case 0x28: // '(' - case 0x29: // ')' - strBuf.push(String.fromCharCode(ch)); - break; - case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3' - case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7' - var x = ch & 0x0F; - ch = this.nextChar(); - charBuffered = true; - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - x = (x << 3) + (ch & 0x0F); - ch = this.nextChar(); - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - charBuffered = false; - x = (x << 3) + (ch & 0x0F); - } - } - strBuf.push(String.fromCharCode(x)); - break; - case 0x0D: // CR - if (this.peekChar() === 0x0A) { // LF - this.nextChar(); - } - break; - case 0x0A: // LF - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - if (done) { - break; - } - if (!charBuffered) { - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getName: function Lexer_getName() { - var ch, previousCh; - var strBuf = this.strBuf; - strBuf.length = 0; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - if (ch === 0x23) { // '#' - ch = this.nextChar(); - if (specialChars[ch]) { - warn('Lexer_getName: ' + - 'NUMBER SIGN (#) should be followed by a hexadecimal number.'); - strBuf.push('#'); - break; - } - var x = toHexDigit(ch); - if (x !== -1) { - previousCh = ch; - ch = this.nextChar(); - var x2 = toHexDigit(ch); - if (x2 === -1) { - warn('Lexer_getName: Illegal digit (' + - String.fromCharCode(ch) +') in hexadecimal number.'); - strBuf.push('#', String.fromCharCode(previousCh)); - if (specialChars[ch]) { - break; - } - strBuf.push(String.fromCharCode(ch)); - continue; - } - strBuf.push(String.fromCharCode((x << 4) | x2)); - } else { - strBuf.push('#', String.fromCharCode(ch)); - } - } else { - strBuf.push(String.fromCharCode(ch)); - } - } - if (strBuf.length > 127) { - warn('name token is longer than allowed by the spec: ' + strBuf.length); - } - return Name.get(strBuf.join('')); - }, - getHexString: function Lexer_getHexString() { - var strBuf = this.strBuf; - strBuf.length = 0; - var ch = this.currentChar; - var isFirstHex = true; - var firstDigit; - var secondDigit; - while (true) { - if (ch < 0) { - warn('Unterminated hex string'); - break; - } else if (ch === 0x3E) { // '>' - this.nextChar(); - break; - } else if (specialChars[ch] === 1) { - ch = this.nextChar(); - continue; - } else { - if (isFirstHex) { - firstDigit = toHexDigit(ch); - if (firstDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - } else { - secondDigit = toHexDigit(ch); - if (secondDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit)); - } - isFirstHex = !isFirstHex; - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getObj: function Lexer_getObj() { - // skip whitespace and comments - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0A || ch === 0x0D) { // LF, CR - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (specialChars[ch] !== 1) { - break; - } - ch = this.nextChar(); - } - - // start reading token - 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 this.getNumber(); - case 0x28: // '(' - return this.getString(); - case 0x2F: // '/' - return this.getName(); - // array punctuation - case 0x5B: // '[' - this.nextChar(); - return Cmd.get('['); - case 0x5D: // ']' - this.nextChar(); - return Cmd.get(']'); - // hex string or dict punctuation - case 0x3C: // '<' - ch = this.nextChar(); - if (ch === 0x3C) { - // dict punctuation - this.nextChar(); - return Cmd.get('<<'); - } - return this.getHexString(); - // dict punctuation - case 0x3E: // '>' - ch = this.nextChar(); - if (ch === 0x3E) { - this.nextChar(); - return Cmd.get('>>'); - } - return Cmd.get('>'); - case 0x7B: // '{' - this.nextChar(); - return Cmd.get('{'); - case 0x7D: // '}' - this.nextChar(); - return Cmd.get('}'); - case 0x29: // ')' - error('Illegal character: ' + ch); - break; - } - - // command - var str = String.fromCharCode(ch); - var knownCommands = this.knownCommands; - var knownCommandFound = knownCommands && knownCommands[str] !== undefined; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - // stop if known command is found and next character does not make - // the str a command - var possibleCommand = str + String.fromCharCode(ch); - if (knownCommandFound && knownCommands[possibleCommand] === undefined) { - break; - } - if (str.length === 128) { - error('Command token too long: ' + str.length); - } - str = possibleCommand; - knownCommandFound = knownCommands && knownCommands[str] !== undefined; - } - if (str === 'true') { - return true; - } - if (str === 'false') { - return false; - } - if (str === 'null') { - return null; - } - return Cmd.get(str); - }, - skipToNextLine: function Lexer_skipToNextLine() { - var ch = this.currentChar; - while (ch >= 0) { - if (ch === 0x0D) { // CR - ch = this.nextChar(); - if (ch === 0x0A) { // LF - this.nextChar(); - } - break; - } else if (ch === 0x0A) { // LF - this.nextChar(); - break; - } - ch = this.nextChar(); - } - } - }; - - return Lexer; -})(); - -var Linearization = { - create: function LinearizationCreate(stream) { - function getInt(name, allowZeroValue) { - var obj = linDict.get(name); - if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; - } - throw new Error('The "' + name + '" parameter in the linearization ' + - 'dictionary is invalid.'); - } - function getHints() { - var hints = linDict.get('H'), hintsLength, item; - if (isArray(hints) && - ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (var index = 0; index < hintsLength; index++) { - if (!(isInt(item = hints[index]) && item > 0)) { - throw new Error('Hint (' + index + - ') in the linearization dictionary is invalid.'); - } - } - return hints; - } - throw new Error('Hint array in the linearization dictionary is invalid.'); - } - var parser = new Parser(new Lexer(stream), false, null); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - var linDict = parser.getObj(); - var obj, length; - if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) && - isNum(obj = linDict.get('Linearized')) && obj > 0)) { - return null; // No valid linearization dictionary found. - } else if ((length = getInt('L')) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + - 'does not equal the stream length.'); - } - return { - length: length, - hints: getHints(), - objectNumberFirst: getInt('O'), - endFirst: getInt('E'), - numPages: getInt('N'), - mainXRefEntriesOffset: getInt('T'), - pageFirst: (linDict.has('P') ? getInt('P', true) : 0) - }; - } -}; - - -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(); - - this.strBuf = []; - } - PostScriptLexer.prototype = { - nextChar: function PostScriptLexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - getToken: function PostScriptLexer_getToken() { - 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 strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z' - ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) { - strBuf.push(String.fromCharCode(ch)); - } - var str = strBuf.join(''); - 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 strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0) { - if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9' - ch === 0x2D || ch === 0x2E) { // '-', '.' - strBuf.push(String.fromCharCode(ch)); - } else { - break; - } - } - var value = parseFloat(strBuf.join('')); - if (isNaN(value)) { - error('Invalid floating point number: ' + value); - } - return value; - } - }; - return PostScriptLexer; -})(); - - -var Stream = (function StreamClosure() { - function Stream(arrayBuffer, start, length, dict) { - this.bytes = (arrayBuffer instanceof Uint8Array ? - arrayBuffer : new Uint8Array(arrayBuffer)); - this.start = start || 0; - this.pos = this.start; - this.end = (start + length) || this.bytes.length; - this.dict = dict; - } - - // required methods for a stream. if a particular stream does not - // implement these, an error should be thrown - Stream.prototype = { - get length() { - return this.end - this.start; - }, - get isEmpty() { - return this.length === 0; - }, - getByte: function Stream_getByte() { - if (this.pos >= this.end) { - return -1; - } - return this.bytes[this.pos++]; - }, - getUint16: function Stream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function Stream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - // returns subarray of original buffer - // should only be read - getBytes: function Stream_getBytes(length) { - var bytes = this.bytes; - var pos = this.pos; - var strEnd = this.end; - - if (!length) { - return bytes.subarray(pos, strEnd); - } - var end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.pos = end; - return bytes.subarray(pos, end); - }, - peekByte: function Stream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function Stream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - skip: function Stream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function Stream_reset() { - this.pos = this.start; - }, - moveStart: function Stream_moveStart() { - this.start = this.pos; - }, - makeSubStream: function Stream_makeSubStream(start, length, dict) { - return new Stream(this.bytes.buffer, start, length, dict); - }, - isStream: true - }; - - return Stream; -})(); - -var StringStream = (function StringStreamClosure() { - function StringStream(str) { - var length = str.length; - var bytes = new Uint8Array(length); - for (var n = 0; n < length; ++n) { - bytes[n] = str.charCodeAt(n); - } - Stream.call(this, bytes); - } - - StringStream.prototype = Stream.prototype; - - return StringStream; -})(); - -// super class for the decoding streams -var DecodeStream = (function DecodeStreamClosure() { - // Lots of DecodeStreams are created whose buffers are never used. For these - // we share a single empty buffer. This is (a) space-efficient and (b) avoids - // having special cases that would be required if we used |null| for an empty - // buffer. - var emptyBuffer = new Uint8Array(0); - - function DecodeStream(maybeMinBufferLength) { - this.pos = 0; - this.bufferLength = 0; - this.eof = false; - this.buffer = emptyBuffer; - this.minBufferLength = 512; - if (maybeMinBufferLength) { - // Compute the first power of two that is as big as maybeMinBufferLength. - while (this.minBufferLength < maybeMinBufferLength) { - this.minBufferLength *= 2; - } - } - } - - DecodeStream.prototype = { - get isEmpty() { - while (!this.eof && this.bufferLength === 0) { - this.readBlock(); - } - return this.bufferLength === 0; - }, - ensureBuffer: function DecodeStream_ensureBuffer(requested) { - var buffer = this.buffer; - if (requested <= buffer.byteLength) { - return buffer; - } - var size = this.minBufferLength; - while (size < requested) { - size *= 2; - } - var buffer2 = new Uint8Array(size); - buffer2.set(buffer); - return (this.buffer = buffer2); - }, - getByte: function DecodeStream_getByte() { - var pos = this.pos; - while (this.bufferLength <= pos) { - if (this.eof) { - return -1; - } - this.readBlock(); - } - return this.buffer[this.pos++]; - }, - getUint16: function DecodeStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function DecodeStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - getBytes: function DecodeStream_getBytes(length) { - var end, pos = this.pos; - - if (length) { - this.ensureBuffer(pos + length); - end = pos + length; - - while (!this.eof && this.bufferLength < end) { - this.readBlock(); - } - var bufEnd = this.bufferLength; - if (end > bufEnd) { - end = bufEnd; - } - } else { - while (!this.eof) { - this.readBlock(); - } - end = this.bufferLength; - } - - this.pos = end; - return this.buffer.subarray(pos, end); - }, - peekByte: function DecodeStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function DecodeStream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { - var end = start + length; - while (this.bufferLength <= end && !this.eof) { - this.readBlock(); - } - return new Stream(this.buffer, start, length, dict); - }, - skip: function DecodeStream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function DecodeStream_reset() { - this.pos = 0; - }, - getBaseStreams: function DecodeStream_getBaseStreams() { - if (this.str && this.str.getBaseStreams) { - return this.str.getBaseStreams(); - } - return []; - } - }; - - return DecodeStream; -})(); - -var StreamsSequenceStream = (function StreamsSequenceStreamClosure() { - function StreamsSequenceStream(streams) { - this.streams = streams; - DecodeStream.call(this, /* maybeLength = */ null); - } - - StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); - - StreamsSequenceStream.prototype.readBlock = - function streamSequenceStreamReadBlock() { - - var streams = this.streams; - if (streams.length === 0) { - this.eof = true; - return; - } - var stream = streams.shift(); - var chunk = stream.getBytes(); - var bufferLength = this.bufferLength; - var newLength = bufferLength + chunk.length; - var buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - }; - - StreamsSequenceStream.prototype.getBaseStreams = - function StreamsSequenceStream_getBaseStreams() { - - var baseStreams = []; - for (var i = 0, ii = this.streams.length; i < ii; i++) { - var stream = this.streams[i]; - if (stream.getBaseStreams) { - Util.appendToArray(baseStreams, stream.getBaseStreams()); - } - } - return baseStreams; - }; - - return StreamsSequenceStream; -})(); - -var FlateStream = (function FlateStreamClosure() { - var codeLenCodeMap = new Int32Array([ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - ]); - - var lengthDecode = new Int32Array([ - 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, - 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, - 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, - 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 - ]); - - var distDecode = new Int32Array([ - 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, - 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, - 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, - 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 - ]); - - var fixedLitCodeTab = [new Int32Array([ - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, - 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, - 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, - 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, - 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, - 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, - 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, - 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, - 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, - 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, - 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, - 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, - 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, - 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, - 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, - 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, - 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, - 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, - 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, - 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, - 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, - 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, - 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, - 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, - 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, - 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, - 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, - 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, - 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, - 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, - 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, - 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, - 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, - 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, - 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, - 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, - 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, - 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, - 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, - 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, - 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, - 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, - 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, - 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, - 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, - 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, - 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, - 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, - 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff - ]), 9]; - - var fixedDistCodeTab = [new Int32Array([ - 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, - 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, - 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, - 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 - ]), 5]; - - function FlateStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - var cmf = str.getByte(); - var flg = str.getByte(); - if (cmf === -1 || flg === -1) { - error('Invalid header in flate stream: ' + cmf + ', ' + flg); - } - if ((cmf & 0x0f) !== 0x08) { - error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); - } - if ((((cmf << 8) + flg) % 31) !== 0) { - error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); - } - if (flg & 0x20) { - error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); - } - - this.codeSize = 0; - this.codeBuf = 0; - - DecodeStream.call(this, maybeLength); - } - - FlateStream.prototype = Object.create(DecodeStream.prototype); - - FlateStream.prototype.getBits = function FlateStream_getBits(bits) { - var str = this.str; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < bits) { - if ((b = str.getByte()) === -1) { - error('Bad encoding in flate stream'); - } - codeBuf |= b << codeSize; - codeSize += 8; - } - b = codeBuf & ((1 << bits) - 1); - this.codeBuf = codeBuf >> bits; - this.codeSize = codeSize -= bits; - - return b; - }; - - FlateStream.prototype.getCode = function FlateStream_getCode(table) { - var str = this.str; - var codes = table[0]; - var maxLen = table[1]; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < maxLen) { - if ((b = str.getByte()) === -1) { - // premature end of stream. code might however still be valid. - // codeSize < codeLen check below guards against incomplete codeVal. - break; - } - codeBuf |= (b << codeSize); - codeSize += 8; - } - var code = codes[codeBuf & ((1 << maxLen) - 1)]; - var codeLen = code >> 16; - var codeVal = code & 0xffff; - if (codeLen < 1 || codeSize < codeLen) { - error('Bad encoding in flate stream'); - } - this.codeBuf = (codeBuf >> codeLen); - this.codeSize = (codeSize - codeLen); - return codeVal; - }; - - FlateStream.prototype.generateHuffmanTable = - function flateStreamGenerateHuffmanTable(lengths) { - var n = lengths.length; - - // find max code length - var maxLen = 0; - var i; - for (i = 0; i < n; ++i) { - if (lengths[i] > maxLen) { - maxLen = lengths[i]; - } - } - - // build the table - var size = 1 << maxLen; - var codes = new Int32Array(size); - for (var len = 1, code = 0, skip = 2; - len <= maxLen; - ++len, code <<= 1, skip <<= 1) { - for (var val = 0; val < n; ++val) { - if (lengths[val] === len) { - // bit-reverse the code - var code2 = 0; - var t = code; - for (i = 0; i < len; ++i) { - code2 = (code2 << 1) | (t & 1); - t >>= 1; - } - - // fill the table entries - for (i = code2; i < size; i += skip) { - codes[i] = (len << 16) | val; - } - ++code; - } - } - } - - return [codes, maxLen]; - }; - - FlateStream.prototype.readBlock = function FlateStream_readBlock() { - var buffer, len; - var str = this.str; - // read block header - var hdr = this.getBits(3); - if (hdr & 1) { - this.eof = true; - } - hdr >>= 1; - - if (hdr === 0) { // uncompressed block - var b; - - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var blockLen = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - blockLen |= (b << 8); - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var check = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - check |= (b << 8); - if (check !== (~blockLen & 0xffff) && - (blockLen !== 0 || check !== 0)) { - // Ignoring error for bad "empty" block (see issue 1277) - error('Bad uncompressed block length in flate stream'); - } - - this.codeBuf = 0; - this.codeSize = 0; - - var bufferLength = this.bufferLength; - buffer = this.ensureBuffer(bufferLength + blockLen); - var end = bufferLength + blockLen; - this.bufferLength = end; - if (blockLen === 0) { - if (str.peekByte() === -1) { - this.eof = true; - } - } else { - for (var n = bufferLength; n < end; ++n) { - if ((b = str.getByte()) === -1) { - this.eof = true; - break; - } - buffer[n] = b; - } - } - return; - } - - var litCodeTable; - var distCodeTable; - if (hdr === 1) { // compressed block, fixed codes - litCodeTable = fixedLitCodeTab; - distCodeTable = fixedDistCodeTab; - } else if (hdr === 2) { // compressed block, dynamic codes - var numLitCodes = this.getBits(5) + 257; - var numDistCodes = this.getBits(5) + 1; - var numCodeLenCodes = this.getBits(4) + 4; - - // build the code lengths code table - var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); - - var i; - for (i = 0; i < numCodeLenCodes; ++i) { - codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); - } - var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); - - // build the literal and distance code tables - len = 0; - i = 0; - var codes = numLitCodes + numDistCodes; - var codeLengths = new Uint8Array(codes); - var bitsLength, bitsOffset, what; - while (i < codes) { - var code = this.getCode(codeLenCodeTab); - if (code === 16) { - bitsLength = 2; bitsOffset = 3; what = len; - } else if (code === 17) { - bitsLength = 3; bitsOffset = 3; what = (len = 0); - } else if (code === 18) { - bitsLength = 7; bitsOffset = 11; what = (len = 0); - } else { - codeLengths[i++] = len = code; - continue; - } - - var repeatLength = this.getBits(bitsLength) + bitsOffset; - while (repeatLength-- > 0) { - codeLengths[i++] = what; - } - } - - litCodeTable = - this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); - distCodeTable = - this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); - } else { - error('Unknown block type in flate stream'); - } - - buffer = this.buffer; - var limit = buffer ? buffer.length : 0; - var pos = this.bufferLength; - while (true) { - var code1 = this.getCode(litCodeTable); - if (code1 < 256) { - if (pos + 1 >= limit) { - buffer = this.ensureBuffer(pos + 1); - limit = buffer.length; - } - buffer[pos++] = code1; - continue; - } - if (code1 === 256) { - this.bufferLength = pos; - return; - } - code1 -= 257; - code1 = lengthDecode[code1]; - var code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - var dist = (code1 & 0xffff) + code2; - if (pos + len >= limit) { - buffer = this.ensureBuffer(pos + len); - limit = buffer.length; - } - for (var k = 0; k < len; ++k, ++pos) { - buffer[pos] = buffer[pos - dist]; - } - } - }; - - return FlateStream; -})(); - -var PredictorStream = (function PredictorStreamClosure() { - function PredictorStream(str, maybeLength, params) { - var predictor = this.predictor = params.get('Predictor') || 1; - - if (predictor <= 1) { - return str; // no prediction - } - if (predictor !== 2 && (predictor < 10 || predictor > 15)) { - error('Unsupported predictor: ' + predictor); - } - - if (predictor === 2) { - this.readBlock = this.readBlockTiff; - } else { - this.readBlock = this.readBlockPng; - } - - this.str = str; - this.dict = str.dict; - - var colors = this.colors = params.get('Colors') || 1; - var bits = this.bits = params.get('BitsPerComponent') || 8; - var columns = this.columns = params.get('Columns') || 1; - - this.pixBytes = (colors * bits + 7) >> 3; - this.rowBytes = (columns * colors * bits + 7) >> 3; - - DecodeStream.call(this, maybeLength); - return this; - } - - PredictorStream.prototype = Object.create(DecodeStream.prototype); - - PredictorStream.prototype.readBlockTiff = - function predictorStreamReadBlockTiff() { - var rowBytes = this.rowBytes; - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var bits = this.bits; - var colors = this.colors; - - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var inbuf = 0, outbuf = 0; - var inbits = 0, outbits = 0; - var pos = bufferLength; - var i; - - if (bits === 1) { - for (i = 0; i < rowBytes; ++i) { - var c = rawBytes[i]; - inbuf = (inbuf << 8) | c; - // bitwise addition is exclusive or - // first shift inbuf and then add - buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF; - // truncate inbuf (assumes colors < 16) - inbuf &= 0xFFFF; - } - } else if (bits === 8) { - for (i = 0; i < colors; ++i) { - buffer[pos++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[pos] = buffer[pos - colors] + rawBytes[i]; - pos++; - } - } else { - var compArray = new Uint8Array(colors + 1); - var bitMask = (1 << bits) - 1; - var j = 0, k = bufferLength; - var columns = this.columns; - for (i = 0; i < columns; ++i) { - for (var kk = 0; kk < colors; ++kk) { - if (inbits < bits) { - inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF); - inbits += 8; - } - compArray[kk] = (compArray[kk] + - (inbuf >> (inbits - bits))) & bitMask; - inbits -= bits; - outbuf = (outbuf << bits) | compArray[kk]; - outbits += bits; - if (outbits >= 8) { - buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF; - outbits -= 8; - } - } - } - if (outbits > 0) { - buffer[k++] = (outbuf << (8 - outbits)) + - (inbuf & ((1 << (8 - outbits)) - 1)); - } - } - this.bufferLength += rowBytes; - }; - - PredictorStream.prototype.readBlockPng = - function predictorStreamReadBlockPng() { - - var rowBytes = this.rowBytes; - var pixBytes = this.pixBytes; - - var predictor = this.str.getByte(); - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); - if (prevRow.length === 0) { - prevRow = new Uint8Array(rowBytes); - } - - var i, j = bufferLength, up, c; - switch (predictor) { - case 0: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - break; - case 1: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF; - j++; - } - break; - case 2: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF; - } - break; - case 3: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) + - rawBytes[i]) & 0xFF; - j++; - } - break; - case 4: - // we need to save the up left pixels values. the simplest way - // is to create a new buffer - for (i = 0; i < pixBytes; ++i) { - up = prevRow[i]; - c = rawBytes[i]; - buffer[j++] = up + c; - } - for (; i < rowBytes; ++i) { - up = prevRow[i]; - var upLeft = prevRow[i - pixBytes]; - var left = buffer[j - pixBytes]; - var p = left + up - upLeft; - - var pa = p - left; - if (pa < 0) { - pa = -pa; - } - var pb = p - up; - if (pb < 0) { - pb = -pb; - } - var pc = p - upLeft; - if (pc < 0) { - pc = -pc; - } - - c = rawBytes[i]; - if (pa <= pb && pa <= pc) { - buffer[j++] = left + c; - } else if (pb <= pc) { - buffer[j++] = up + c; - } else { - buffer[j++] = upLeft + c; - } - } - break; - default: - error('Unsupported predictor: ' + predictor); - } - this.bufferLength += rowBytes; - }; - - return PredictorStream; -})(); - -/** - * Depending on the type of JPEG a JpegStream is handled in different ways. For - * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image - * data is stored and then loaded by the browser. For unsupported JPEG's we use - * a library to decode these images and the stream behaves like all the other - * DecodeStreams. - */ -var JpegStream = (function JpegStreamClosure() { - function JpegStream(stream, maybeLength, dict, xref) { - // Some images may contain 'junk' before the SOI (start-of-image) marker. - // Note: this seems to mainly affect inline images. - var ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8). - stream.skip(-1); // Reset the stream position to the SOI. - break; - } - } - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpegStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpegStream.prototype, 'bytes', { - get: function JpegStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - try { - var jpegImage = new JpegImage(); - - // checking if values needs to be transformed before conversion - if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) { - var decodeArr = this.dict.get('Decode'); - var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; - var decodeArrLength = decodeArr.length; - var transform = new Int32Array(decodeArrLength); - var transformNeeded = false; - var maxValue = (1 << bitsPerComponent) - 1; - for (var i = 0; i < decodeArrLength; i += 2) { - transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0; - transform[i + 1] = (decodeArr[i] * maxValue) | 0; - if (transform[i] !== 256 || transform[i + 1] !== 0) { - transformNeeded = true; - } - } - if (transformNeeded) { - jpegImage.decodeTransform = transform; - } - } - - jpegImage.parse(this.bytes); - var data = jpegImage.getData(this.drawWidth, this.drawHeight, - this.forceRGB); - this.buffer = data; - this.bufferLength = data.length; - this.eof = true; - } catch (e) { - error('JPEG error: ' + e); - } - }; - - JpegStream.prototype.getBytes = function JpegStream_getBytes(length) { - this.ensureBuffer(); - return this.buffer; - }; - - JpegStream.prototype.getIR = function JpegStream_getIR() { - return PDFJS.createObjectURL(this.bytes, 'image/jpeg'); - }; - /** - * Checks if the image can be decoded and displayed by the browser without any - * further processing such as color space conversions. - */ - JpegStream.prototype.isNativelySupported = - function JpegStream_isNativelySupported(xref, res) { - var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res); - return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && - cs.isDefaultDecode(this.dict.get('Decode', 'D')); - }; - /** - * Checks if the image can be decoded by the browser. - */ - JpegStream.prototype.isNativelyDecodable = - function JpegStream_isNativelyDecodable(xref, res) { - var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res); - return (cs.numComps === 1 || cs.numComps === 3) && - cs.isDefaultDecode(this.dict.get('Decode', 'D')); - }; - - return JpegStream; -})(); - -/** - * For JPEG 2000's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var JpxStream = (function JpxStreamClosure() { - function JpxStream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpxStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpxStream.prototype, 'bytes', { - get: function JpxStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jpxImage = new JpxImage(); - jpxImage.parse(this.bytes); - - var width = jpxImage.width; - var height = jpxImage.height; - var componentsCount = jpxImage.componentsCount; - var tileCount = jpxImage.tiles.length; - if (tileCount === 1) { - this.buffer = jpxImage.tiles[0].items; - } else { - var data = new Uint8Array(width * height * componentsCount); - - for (var k = 0; k < tileCount; k++) { - var tileComponents = jpxImage.tiles[k]; - var tileWidth = tileComponents.width; - var tileHeight = tileComponents.height; - var tileLeft = tileComponents.left; - var tileTop = tileComponents.top; - - var src = tileComponents.items; - var srcPosition = 0; - var dataPosition = (width * tileTop + tileLeft) * componentsCount; - var imgRowSize = width * componentsCount; - var tileRowSize = tileWidth * componentsCount; - - for (var j = 0; j < tileHeight; j++) { - var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); - data.set(rowBytes, dataPosition); - srcPosition += tileRowSize; - dataPosition += imgRowSize; - } - } - this.buffer = data; - } - this.bufferLength = this.buffer.length; - this.eof = true; - }; - - return JpxStream; -})(); - -/** - * For JBIG2's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var Jbig2Stream = (function Jbig2StreamClosure() { - function Jbig2Stream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - Jbig2Stream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(Jbig2Stream.prototype, 'bytes', { - get: function Jbig2Stream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jbig2Image = new Jbig2Image(); - - var chunks = [], xref = this.dict.xref; - var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms')); - - // According to the PDF specification, DecodeParms can be either - // a dictionary, or an array whose elements are dictionaries. - if (isArray(decodeParams)) { - if (decodeParams.length > 1) { - warn('JBIG2 - \'DecodeParms\' array with multiple elements ' + - 'not supported.'); - } - decodeParams = xref.fetchIfRef(decodeParams[0]); - } - if (decodeParams && decodeParams.has('JBIG2Globals')) { - var globalsStream = decodeParams.get('JBIG2Globals'); - var globals = globalsStream.getBytes(); - chunks.push({data: globals, start: 0, end: globals.length}); - } - chunks.push({data: this.bytes, start: 0, end: this.bytes.length}); - var data = jbig2Image.parseChunks(chunks); - var dataLength = data.length; - - // JBIG2 had black as 1 and white as 0, inverting the colors - for (var i = 0; i < dataLength; i++) { - data[i] ^= 0xFF; - } - - this.buffer = data; - this.bufferLength = dataLength; - this.eof = true; - }; - - return Jbig2Stream; -})(); - -var DecryptStream = (function DecryptStreamClosure() { - function DecryptStream(str, maybeLength, decrypt) { - this.str = str; - this.dict = str.dict; - this.decrypt = decrypt; - this.nextChunk = null; - this.initialized = false; - - DecodeStream.call(this, maybeLength); - } - - var chunkSize = 512; - - DecryptStream.prototype = Object.create(DecodeStream.prototype); - - DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { - var chunk; - if (this.initialized) { - chunk = this.nextChunk; - } else { - chunk = this.str.getBytes(chunkSize); - this.initialized = true; - } - if (!chunk || chunk.length === 0) { - this.eof = true; - return; - } - this.nextChunk = this.str.getBytes(chunkSize); - var hasMoreData = this.nextChunk && this.nextChunk.length > 0; - - var decrypt = this.decrypt; - chunk = decrypt(chunk, !hasMoreData); - - var bufferLength = this.bufferLength; - var i, n = chunk.length; - var buffer = this.ensureBuffer(bufferLength + n); - for (i = 0; i < n; i++) { - buffer[bufferLength++] = chunk[i]; - } - this.bufferLength = bufferLength; - }; - - return DecryptStream; -})(); - -var Ascii85Stream = (function Ascii85StreamClosure() { - function Ascii85Stream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - this.input = new Uint8Array(5); - - // Most streams increase in size when decoded, but Ascii85 streams - // typically shrink by ~20%. - if (maybeLength) { - maybeLength = 0.8 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - Ascii85Stream.prototype = Object.create(DecodeStream.prototype); - - Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { - var TILDA_CHAR = 0x7E; // '~' - var Z_LOWER_CHAR = 0x7A; // 'z' - var EOF = -1; - - var str = this.str; - - var c = str.getByte(); - while (Lexer.isSpace(c)) { - c = str.getByte(); - } - - if (c === EOF || c === TILDA_CHAR) { - this.eof = true; - return; - } - - var bufferLength = this.bufferLength, buffer; - var i; - - // special code for z - if (c === Z_LOWER_CHAR) { - buffer = this.ensureBuffer(bufferLength + 4); - for (i = 0; i < 4; ++i) { - buffer[bufferLength + i] = 0; - } - this.bufferLength += 4; - } else { - var input = this.input; - input[0] = c; - for (i = 1; i < 5; ++i) { - c = str.getByte(); - while (Lexer.isSpace(c)) { - c = str.getByte(); - } - - input[i] = c; - - if (c === EOF || c === TILDA_CHAR) { - break; - } - } - buffer = this.ensureBuffer(bufferLength + i - 1); - this.bufferLength += i - 1; - - // partial ending; - if (i < 5) { - for (; i < 5; ++i) { - input[i] = 0x21 + 84; - } - this.eof = true; - } - var t = 0; - for (i = 0; i < 5; ++i) { - t = t * 85 + (input[i] - 0x21); - } - - for (i = 3; i >= 0; --i) { - buffer[bufferLength + i] = t & 0xFF; - t >>= 8; - } - } - }; - - return Ascii85Stream; -})(); - -var AsciiHexStream = (function AsciiHexStreamClosure() { - function AsciiHexStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - this.firstDigit = -1; - - // Most streams increase in size when decoded, but AsciiHex streams shrink - // by 50%. - if (maybeLength) { - maybeLength = 0.5 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - AsciiHexStream.prototype = Object.create(DecodeStream.prototype); - - AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { - var UPSTREAM_BLOCK_SIZE = 8000; - var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - - var maxDecodeLength = (bytes.length + 1) >> 1; - var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - var bufferLength = this.bufferLength; - - var firstDigit = this.firstDigit; - for (var i = 0, ii = bytes.length; i < ii; i++) { - var ch = bytes[i], digit; - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - digit = ch & 0x0F; - } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'Z', 'a'-'z' - digit = (ch & 0x0F) + 9; - } else if (ch === 0x3E) { // '>' - this.eof = true; - break; - } else { // probably whitespace - continue; // ignoring - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = (firstDigit << 4) | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - // incomplete byte - buffer[bufferLength++] = (firstDigit << 4); - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - }; - - return AsciiHexStream; -})(); - -var RunLengthStream = (function RunLengthStreamClosure() { - function RunLengthStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - DecodeStream.call(this, maybeLength); - } - - RunLengthStream.prototype = Object.create(DecodeStream.prototype); - - RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { - // The repeatHeader has following format. The first byte defines type of run - // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes - // (in addition to the second byte from the header), n = 129 through 255 - - // duplicate the second byte from the header (257 - n) times, n = 128 - end. - var repeatHeader = this.str.getBytes(2); - if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { - this.eof = true; - return; - } - - var buffer; - var bufferLength = this.bufferLength; - var n = repeatHeader[0]; - if (n < 128) { - // copy n bytes - buffer = this.ensureBuffer(bufferLength + n + 1); - buffer[bufferLength++] = repeatHeader[1]; - if (n > 0) { - var source = this.str.getBytes(n); - buffer.set(source, bufferLength); - bufferLength += n; - } - } else { - n = 257 - n; - var b = repeatHeader[1]; - buffer = this.ensureBuffer(bufferLength + n + 1); - for (var i = 0; i < n; i++) { - buffer[bufferLength++] = b; - } - } - this.bufferLength = bufferLength; - }; - - return RunLengthStream; -})(); - -var CCITTFaxStream = (function CCITTFaxStreamClosure() { - - var ccittEOL = -2; - var twoDimPass = 0; - var twoDimHoriz = 1; - var twoDimVert0 = 2; - var twoDimVertR1 = 3; - var twoDimVertL1 = 4; - var twoDimVertR2 = 5; - var twoDimVertL2 = 6; - var twoDimVertR3 = 7; - var twoDimVertL3 = 8; - - var twoDimTable = [ - [-1, -1], [-1, -1], // 000000x - [7, twoDimVertL3], // 0000010 - [7, twoDimVertR3], // 0000011 - [6, twoDimVertL2], [6, twoDimVertL2], // 000010x - [6, twoDimVertR2], [6, twoDimVertR2], // 000011x - [4, twoDimPass], [4, twoDimPass], // 0001xxx - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0] - ]; - - var whiteTable1 = [ - [-1, -1], // 00000 - [12, ccittEOL], // 00001 - [-1, -1], [-1, -1], // 0001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx - [11, 1792], [11, 1792], // 1000x - [12, 1984], // 10010 - [12, 2048], // 10011 - [12, 2112], // 10100 - [12, 2176], // 10101 - [12, 2240], // 10110 - [12, 2304], // 10111 - [11, 1856], [11, 1856], // 1100x - [11, 1920], [11, 1920], // 1101x - [12, 2368], // 11100 - [12, 2432], // 11101 - [12, 2496], // 11110 - [12, 2560] // 11111 - ]; - - var whiteTable2 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx - [8, 29], [8, 29], // 00000010x - [8, 30], [8, 30], // 00000011x - [8, 45], [8, 45], // 00000100x - [8, 46], [8, 46], // 00000101x - [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx - [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx - [8, 47], [8, 47], // 00001010x - [8, 48], [8, 48], // 00001011x - [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx - [6, 13], [6, 13], [6, 13], [6, 13], - [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx - [8, 33], [8, 33], // 00010010x - [8, 34], [8, 34], // 00010011x - [8, 35], [8, 35], // 00010100x - [8, 36], [8, 36], // 00010101x - [8, 37], [8, 37], // 00010110x - [8, 38], [8, 38], // 00010111x - [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx - [8, 31], [8, 31], // 00011010x - [8, 32], [8, 32], // 00011011x - [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx - [6, 1], [6, 1], [6, 1], [6, 1], - [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx - [6, 12], [6, 12], [6, 12], [6, 12], - [8, 53], [8, 53], // 00100100x - [8, 54], [8, 54], // 00100101x - [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx - [8, 39], [8, 39], // 00101000x - [8, 40], [8, 40], // 00101001x - [8, 41], [8, 41], // 00101010x - [8, 42], [8, 42], // 00101011x - [8, 43], [8, 43], // 00101100x - [8, 44], [8, 44], // 00101101x - [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx - [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx - [8, 61], [8, 61], // 00110010x - [8, 62], [8, 62], // 00110011x - [8, 63], [8, 63], // 00110100x - [8, 0], [8, 0], // 00110101x - [8, 320], [8, 320], // 00110110x - [8, 384], [8, 384], // 00110111x - [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx - [8, 59], [8, 59], // 01001010x - [8, 60], [8, 60], // 01001011x - [9, 1472], // 010011000 - [9, 1536], // 010011001 - [9, 1600], // 010011010 - [9, 1728], // 010011011 - [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx - [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx - [8, 49], [8, 49], // 01010010x - [8, 50], [8, 50], // 01010011x - [8, 51], [8, 51], // 01010100x - [8, 52], [8, 52], // 01010101x - [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx - [8, 55], [8, 55], // 01011000x - [8, 56], [8, 56], // 01011001x - [8, 57], [8, 57], // 01011010x - [8, 58], [8, 58], // 01011011x - [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx - [6, 192], [6, 192], [6, 192], [6, 192], - [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx - [6, 1664], [6, 1664], [6, 1664], [6, 1664], - [8, 448], [8, 448], // 01100100x - [8, 512], [8, 512], // 01100101x - [9, 704], // 011001100 - [9, 768], // 011001101 - [8, 640], [8, 640], // 01100111x - [8, 576], [8, 576], // 01101000x - [9, 832], // 011010010 - [9, 896], // 011010011 - [9, 960], // 011010100 - [9, 1024], // 011010101 - [9, 1088], // 011010110 - [9, 1152], // 011010111 - [9, 1216], // 011011000 - [9, 1280], // 011011001 - [9, 1344], // 011011010 - [9, 1408], // 011011011 - [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx - [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx - [6, 16], [6, 16], [6, 16], [6, 16], - [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx - [6, 17], [6, 17], [6, 17], [6, 17], - [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx - [6, 14], [6, 14], [6, 14], [6, 14], - [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx - [6, 15], [6, 15], [6, 15], [6, 15], - [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7] - ]; - - var blackTable1 = [ - [-1, -1], [-1, -1], // 000000000000x - [12, ccittEOL], [12, ccittEOL], // 000000000001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx - [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx - [12, 1984], [12, 1984], // 000000010010x - [12, 2048], [12, 2048], // 000000010011x - [12, 2112], [12, 2112], // 000000010100x - [12, 2176], [12, 2176], // 000000010101x - [12, 2240], [12, 2240], // 000000010110x - [12, 2304], [12, 2304], // 000000010111x - [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx - [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx - [12, 2368], [12, 2368], // 000000011100x - [12, 2432], [12, 2432], // 000000011101x - [12, 2496], [12, 2496], // 000000011110x - [12, 2560], [12, 2560], // 000000011111x - [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx - [10, 18], [10, 18], [10, 18], [10, 18], - [12, 52], [12, 52], // 000000100100x - [13, 640], // 0000001001010 - [13, 704], // 0000001001011 - [13, 768], // 0000001001100 - [13, 832], // 0000001001101 - [12, 55], [12, 55], // 000000100111x - [12, 56], [12, 56], // 000000101000x - [13, 1280], // 0000001010010 - [13, 1344], // 0000001010011 - [13, 1408], // 0000001010100 - [13, 1472], // 0000001010101 - [12, 59], [12, 59], // 000000101011x - [12, 60], [12, 60], // 000000101100x - [13, 1536], // 0000001011010 - [13, 1600], // 0000001011011 - [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx - [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx - [13, 1664], // 0000001100100 - [13, 1728], // 0000001100101 - [12, 320], [12, 320], // 000000110011x - [12, 384], [12, 384], // 000000110100x - [12, 448], [12, 448], // 000000110101x - [13, 512], // 0000001101100 - [13, 576], // 0000001101101 - [12, 53], [12, 53], // 000000110111x - [12, 54], [12, 54], // 000000111000x - [13, 896], // 0000001110010 - [13, 960], // 0000001110011 - [13, 1024], // 0000001110100 - [13, 1088], // 0000001110101 - [13, 1152], // 0000001110110 - [13, 1216], // 0000001110111 - [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx - [10, 64], [10, 64], [10, 64], [10, 64] - ]; - - var blackTable2 = [ - [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [11, 23], [11, 23], // 00000101000x - [12, 50], // 000001010010 - [12, 51], // 000001010011 - [12, 44], // 000001010100 - [12, 45], // 000001010101 - [12, 46], // 000001010110 - [12, 47], // 000001010111 - [12, 57], // 000001011000 - [12, 58], // 000001011001 - [12, 61], // 000001011010 - [12, 256], // 000001011011 - [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx - [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx - [12, 48], // 000001100100 - [12, 49], // 000001100101 - [12, 62], // 000001100110 - [12, 63], // 000001100111 - [12, 30], // 000001101000 - [12, 31], // 000001101001 - [12, 32], // 000001101010 - [12, 33], // 000001101011 - [12, 40], // 000001101100 - [12, 41], // 000001101101 - [11, 22], [11, 22], // 00000110111x - [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx - [9, 15], [9, 15], [9, 15], [9, 15], - [12, 128], // 000011001000 - [12, 192], // 000011001001 - [12, 26], // 000011001010 - [12, 27], // 000011001011 - [12, 28], // 000011001100 - [12, 29], // 000011001101 - [11, 19], [11, 19], // 00001100111x - [11, 20], [11, 20], // 00001101000x - [12, 34], // 000011010010 - [12, 35], // 000011010011 - [12, 36], // 000011010100 - [12, 37], // 000011010101 - [12, 38], // 000011010110 - [12, 39], // 000011010111 - [11, 21], [11, 21], // 00001101100x - [12, 42], // 000011011010 - [12, 43], // 000011011011 - [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx - [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12] - ]; - - var blackTable3 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx - [6, 9], // 000100 - [6, 8], // 000101 - [5, 7], [5, 7], // 00011x - [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx - [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx - [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx - [3, 1], [3, 1], [3, 1], [3, 1], - [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx - [3, 4], [3, 4], [3, 4], [3, 4], - [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2] - ]; - - function CCITTFaxStream(str, maybeLength, params) { - this.str = str; - this.dict = str.dict; - - params = params || Dict.empty; - - this.encoding = params.get('K') || 0; - this.eoline = params.get('EndOfLine') || false; - this.byteAlign = params.get('EncodedByteAlign') || false; - this.columns = params.get('Columns') || 1728; - this.rows = params.get('Rows') || 0; - var eoblock = params.get('EndOfBlock'); - if (eoblock === null || eoblock === undefined) { - eoblock = true; - } - this.eoblock = eoblock; - this.black = params.get('BlackIs1') || false; - - this.codingLine = new Uint32Array(this.columns + 1); - this.refLine = new Uint32Array(this.columns + 2); - - this.codingLine[0] = this.columns; - this.codingPos = 0; - - this.row = 0; - this.nextLine2D = this.encoding < 0; - this.inputBits = 0; - this.inputBuf = 0; - this.outputBits = 0; - - var code1; - while ((code1 = this.lookBits(12)) === 0) { - this.eatBits(1); - } - if (code1 === 1) { - this.eatBits(12); - } - if (this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - DecodeStream.call(this, maybeLength); - } - - CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); - - CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { - while (!this.eof) { - var c = this.lookChar(); - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } - }; - - CCITTFaxStream.prototype.addPixels = - function ccittFaxStreamAddPixels(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.addPixelsNeg = - function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } else if (a1 < codingLine[codingPos]) { - if (a1 < 0) { - info('invalid code'); - this.err = true; - a1 = 0; - } - while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { - --codingPos; - } - codingLine[codingPos] = a1; - } - - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { - var refLine = this.refLine; - var codingLine = this.codingLine; - var columns = this.columns; - - var refPos, blackPixels, bits, i; - - if (this.outputBits === 0) { - if (this.eof) { - return null; - } - this.err = false; - - var code1, code2, code3; - if (this.nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - this.codingPos = 0; - refPos = 0; - blackPixels = 0; - - while (codingLine[this.codingPos] < columns) { - code1 = this.getTwoDimCode(); - switch (code1) { - case twoDimPass: - this.addPixels(refLine[refPos + 1], blackPixels); - if (refLine[refPos + 1] < columns) { - refPos += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + - code1, blackPixels); - if (codingLine[this.codingPos] < columns) { - this.addPixels(codingLine[this.codingPos] + code2, - blackPixels ^ 1); - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - break; - case twoDimVertR3: - this.addPixels(refLine[refPos] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR2: - this.addPixels(refLine[refPos] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR1: - this.addPixels(refLine[refPos] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVert0: - this.addPixels(refLine[refPos], blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL3: - this.addPixelsNeg(refLine[refPos] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL2: - this.addPixelsNeg(refLine[refPos] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL1: - this.addPixelsNeg(refLine[refPos] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case EOF: - this.addPixels(columns, 0); - this.eof = true; - break; - default: - info('bad 2d code'); - this.addPixels(columns, 0); - this.err = true; - } - } - } else { - codingLine[0] = 0; - this.codingPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + code1, blackPixels); - blackPixels ^= 1; - } - } - - var gotEOL = false; - - if (this.byteAlign) { - this.inputBits &= ~7; - } - - if (!this.eoblock && this.row === this.rows - 1) { - this.eof = true; - } else { - code1 = this.lookBits(12); - if (this.eoline) { - while (code1 !== EOF && code1 !== 1) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } else { - while (code1 === 0) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } - if (code1 === 1) { - this.eatBits(12); - gotEOL = true; - } else if (code1 === EOF) { - this.eof = true; - } - } - - if (!this.eof && this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - if (this.eoblock && gotEOL && this.byteAlign) { - code1 = this.lookBits(12); - if (code1 === 1) { - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - if (this.encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = this.lookBits(12); - if (code1 !== 1) { - info('bad rtc code: ' + code1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - } - } - this.eof = true; - } - } else if (this.err && this.eoline) { - while (true) { - code1 = this.lookBits(13); - if (code1 === EOF) { - this.eof = true; - return null; - } - if ((code1 >> 1) === 1) { - break; - } - this.eatBits(1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.eatBits(1); - this.nextLine2D = !(code1 & 1); - } - } - - if (codingLine[0] > 0) { - this.outputBits = codingLine[this.codingPos = 0]; - } else { - this.outputBits = codingLine[this.codingPos = 1]; - } - this.row++; - } - - var c; - if (this.outputBits >= 8) { - c = (this.codingPos & 1) ? 0 : 0xFF; - this.outputBits -= 8; - if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } - } else { - bits = 8; - c = 0; - do { - if (this.outputBits > bits) { - c <<= bits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - bits); - } - this.outputBits -= bits; - bits = 0; - } else { - c <<= this.outputBits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - this.outputBits); - } - bits -= this.outputBits; - this.outputBits = 0; - if (codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } else if (bits > 0) { - c <<= bits; - bits = 0; - } - } - } while (bits); - } - if (this.black) { - c ^= 0xFF; - } - return c; - }; - - // This functions returns the code found from the table. - // The start and end parameters set the boundaries for searching the table. - // The limit parameter is optional. Function returns an array with three - // values. The first array element indicates whether a valid code is being - // returned. The second array element is the actual code. The third array - // element indicates whether EOF was reached. - CCITTFaxStream.prototype.findTableCode = - function ccittFaxStreamFindTableCode(start, end, table, limit) { - - var limitValue = limit || 0; - for (var i = start; i <= end; ++i) { - var code = this.lookBits(i); - if (code === EOF) { - return [true, 1, false]; - } - if (i < end) { - code <<= end - i; - } - if (!limitValue || code >= limitValue) { - var p = table[code - limitValue]; - if (p[0] === i) { - this.eatBits(i); - return [true, p[1], true]; - } - } - } - return [false, 0, false]; - }; - - CCITTFaxStream.prototype.getTwoDimCode = - function ccittFaxStreamGetTwoDimCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(7); - p = twoDimTable[code]; - if (p && p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 7, twoDimTable); - if (result[0] && result[2]) { - return result[1]; - } - } - info('Bad two dim code'); - return EOF; - }; - - CCITTFaxStream.prototype.getWhiteCode = - function ccittFaxStreamGetWhiteCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(12); - if (code === EOF) { - return 1; - } - - if ((code >> 5) === 0) { - p = whiteTable1[code]; - } else { - p = whiteTable2[code >> 3]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 9, whiteTable2); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(11, 12, whiteTable1); - if (result[0]) { - return result[1]; - } - } - info('bad white code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.getBlackCode = - function ccittFaxStreamGetBlackCode() { - - var code, p; - if (this.eoblock) { - code = this.lookBits(13); - if (code === EOF) { - return 1; - } - if ((code >> 7) === 0) { - p = blackTable1[code]; - } else if ((code >> 9) === 0 && (code >> 7) !== 0) { - p = blackTable2[(code >> 1) - 64]; - } else { - p = blackTable3[code >> 7]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(2, 6, blackTable3); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(7, 12, blackTable2, 64); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(10, 13, blackTable1); - if (result[0]) { - return result[1]; - } - } - info('bad black code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { - var c; - while (this.inputBits < n) { - if ((c = this.str.getByte()) === -1) { - if (this.inputBits === 0) { - return EOF; - } - return ((this.inputBuf << (n - this.inputBits)) & - (0xFFFF >> (16 - n))); - } - this.inputBuf = (this.inputBuf << 8) + c; - this.inputBits += 8; - } - return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n)); - }; - - CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { - if ((this.inputBits -= n) < 0) { - this.inputBits = 0; - } - }; - - return CCITTFaxStream; -})(); - -var LZWStream = (function LZWStreamClosure() { - function LZWStream(str, maybeLength, earlyChange) { - this.str = str; - this.dict = str.dict; - this.cachedData = 0; - this.bitsCached = 0; - - var maxLzwDictionarySize = 4096; - var lzwState = { - earlyChange: earlyChange, - codeLength: 9, - nextCode: 258, - dictionaryValues: new Uint8Array(maxLzwDictionarySize), - dictionaryLengths: new Uint16Array(maxLzwDictionarySize), - dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), - currentSequence: new Uint8Array(maxLzwDictionarySize), - currentSequenceLength: 0 - }; - for (var i = 0; i < 256; ++i) { - lzwState.dictionaryValues[i] = i; - lzwState.dictionaryLengths[i] = 1; - } - this.lzwState = lzwState; - - DecodeStream.call(this, maybeLength); - } - - LZWStream.prototype = Object.create(DecodeStream.prototype); - - LZWStream.prototype.readBits = function LZWStream_readBits(n) { - var bitsCached = this.bitsCached; - var cachedData = this.cachedData; - while (bitsCached < n) { - var c = this.str.getByte(); - if (c === -1) { - this.eof = true; - return null; - } - cachedData = (cachedData << 8) | c; - bitsCached += 8; - } - this.bitsCached = (bitsCached -= n); - this.cachedData = cachedData; - this.lastCode = null; - return (cachedData >>> bitsCached) & ((1 << n) - 1); - }; - - LZWStream.prototype.readBlock = function LZWStream_readBlock() { - var blockSize = 512; - var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; - var i, j, q; - - var lzwState = this.lzwState; - if (!lzwState) { - return; // eof was found - } - - var earlyChange = lzwState.earlyChange; - var nextCode = lzwState.nextCode; - var dictionaryValues = lzwState.dictionaryValues; - var dictionaryLengths = lzwState.dictionaryLengths; - var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; - var codeLength = lzwState.codeLength; - var prevCode = lzwState.prevCode; - var currentSequence = lzwState.currentSequence; - var currentSequenceLength = lzwState.currentSequenceLength; - - var decodedLength = 0; - var currentBufferLength = this.bufferLength; - var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - - for (i = 0; i < blockSize; i++) { - var code = this.readBits(codeLength); - var hasPrev = currentSequenceLength > 0; - if (code < 256) { - currentSequence[0] = code; - currentSequenceLength = 1; - } else if (code >= 258) { - if (code < nextCode) { - currentSequenceLength = dictionaryLengths[code]; - for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { - currentSequence[j] = dictionaryValues[q]; - q = dictionaryPrevCodes[q]; - } - } else { - currentSequence[currentSequenceLength++] = currentSequence[0]; - } - } else if (code === 256) { - codeLength = 9; - nextCode = 258; - currentSequenceLength = 0; - continue; - } else { - this.eof = true; - delete this.lzwState; - break; - } - - if (hasPrev) { - dictionaryPrevCodes[nextCode] = prevCode; - dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; - dictionaryValues[nextCode] = currentSequence[0]; - nextCode++; - codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ? - codeLength : Math.min(Math.log(nextCode + earlyChange) / - 0.6931471805599453 + 1, 12) | 0; - } - prevCode = code; - - decodedLength += currentSequenceLength; - if (estimatedDecodedSize < decodedLength) { - do { - estimatedDecodedSize += decodedSizeDelta; - } while (estimatedDecodedSize < decodedLength); - buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - } - for (j = 0; j < currentSequenceLength; j++) { - buffer[currentBufferLength++] = currentSequence[j]; - } - } - lzwState.nextCode = nextCode; - lzwState.codeLength = codeLength; - lzwState.prevCode = prevCode; - lzwState.currentSequenceLength = currentSequenceLength; - - this.bufferLength = currentBufferLength; - }; - - return LZWStream; -})(); - -var NullStream = (function NullStreamClosure() { - function NullStream() { - Stream.call(this, new Uint8Array(0)); - } - - NullStream.prototype = Stream.prototype; - - return NullStream; -})(); - - -var WorkerTask = (function WorkerTaskClosure() { - function WorkerTask(name) { - this.name = name; - this.terminated = false; - this._capability = createPromiseCapability(); - } - - WorkerTask.prototype = { - get finished() { - return this._capability.promise; - }, - - finish: function () { - this._capability.resolve(); - }, - - terminate: function () { - this.terminated = true; - }, - - ensureNotTerminated: function () { - if (this.terminated) { - throw new Error('Worker task was terminated'); - } - } - }; - - return WorkerTask; -})(); - -var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { - setup: function wphSetup(handler, port) { - handler.on('test', function wphSetupTest(data) { - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', 'main', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); - }, - createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { - // This context is actually holds references on pdfManager and handler, - // until the latter is destroyed. - var pdfManager; - var terminated = false; - var cancelXHRs = null; - var WorkerTasks = []; - - var docId = docParams.docId; - var workerHandlerName = docParams.docId + '_worker'; - var handler = new MessageHandler(workerHandlerName, docId, port); - - function ensureNotTerminated() { - if (terminated) { - throw new Error('Worker was terminated'); - } - } - - function startWorkerTask(task) { - WorkerTasks.push(task); - } - - function finishWorkerTask(task) { - task.finish(); - var i = WorkerTasks.indexOf(task); - WorkerTasks.splice(i, 1); - } - - function loadDocument(recoveryMode) { - var loadDocumentCapability = createPromiseCapability(); - - var parseSuccess = function parseSuccess() { - var numPagesPromise = pdfManager.ensureDoc('numPages'); - var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); - var encryptedPromise = pdfManager.ensureXRef('encrypt'); - Promise.all([numPagesPromise, fingerprintPromise, - encryptedPromise]).then(function onDocReady(results) { - var doc = { - numPages: results[0], - fingerprint: results[1], - encrypted: !!results[2], - }; - loadDocumentCapability.resolve(doc); - }, - parseFailure); - }; - - var parseFailure = function parseFailure(e) { - loadDocumentCapability.reject(e); - }; - - pdfManager.ensureDoc('checkHeader', []).then(function() { - pdfManager.ensureDoc('parseStartXRef', []).then(function() { - pdfManager.ensureDoc('parse', [recoveryMode]).then( - parseSuccess, parseFailure); - }, parseFailure); - }, parseFailure); - - return loadDocumentCapability.promise; - } - - function getPdfManager(data) { - var pdfManagerCapability = createPromiseCapability(); - var pdfManager; - - var source = data.source; - var disableRange = data.disableRange; - if (source.data) { - try { - pdfManager = new LocalPdfManager(docId, source.data, source.password); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } else if (source.chunkedViewerLoading) { - try { - pdfManager = new NetworkPdfManager(docId, source, handler); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } - - var networkManager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - var cachedChunks = []; - var fullRequestXhrId = networkManager.requestFull({ - onHeadersReceived: function onHeadersReceived() { - if (disableRange) { - return; - } - - var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); - if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { - return; - } - - var contentEncoding = - fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; - if (contentEncoding !== 'identity') { - return; - } - - var length = fullRequestXhr.getResponseHeader('Content-Length'); - length = parseInt(length, 10); - if (!isInt(length)) { - return; - } - source.length = length; - if (length <= 2 * source.rangeChunkSize) { - // The file size is smaller than the size of two chunks, so it does - // not make any sense to abort the request and retry with a range - // request. - return; - } - - if (networkManager.isStreamingRequest(fullRequestXhrId)) { - // We can continue fetching when progressive loading is enabled, - // and we don't need the autoFetch feature. - source.disableAutoFetch = true; - } else { - // NOTE: by cancelling the full request, and then issuing range - // requests, there will be an issue for sites where you can only - // request the pdf once. However, if this is the case, then the - // server should not be returning that it can support range - // requests. - networkManager.abortRequest(fullRequestXhrId); - } - - try { - pdfManager = new NetworkPdfManager(docId, source, handler); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cancelXHRs = null; - }, - - onProgressiveData: source.disableStream ? null : - function onProgressiveData(chunk) { - if (!pdfManager) { - cachedChunks.push(chunk); - return; - } - pdfManager.sendProgressiveData(chunk); - }, - - onDone: function onDone(args) { - if (pdfManager) { - return; // already processed - } - - var pdfFile; - if (args === null) { - // TODO add some streaming manager, e.g. for unknown length files. - // The data was returned in the onProgressiveData, combining... - var pdfFileLength = 0, pos = 0; - cachedChunks.forEach(function (chunk) { - pdfFileLength += chunk.byteLength; - }); - if (source.length && pdfFileLength !== source.length) { - warn('reported HTTP length is different from actual'); - } - var pdfFileArray = new Uint8Array(pdfFileLength); - cachedChunks.forEach(function (chunk) { - pdfFileArray.set(new Uint8Array(chunk), pos); - pos += chunk.byteLength; - }); - pdfFile = pdfFileArray.buffer; - } else { - pdfFile = args.chunk; - } - - // the data is array, instantiating directly from it - try { - pdfManager = new LocalPdfManager(docId, pdfFile, source.password); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cancelXHRs = null; - }, - - onError: function onError(status) { - var exception; - if (status === 404 || status === 0 && /^file:/.test(source.url)) { - exception = new MissingPDFException('Missing PDF "' + - source.url + '".'); - handler.send('MissingPDF', exception); - } else { - exception = new UnexpectedResponseException( - 'Unexpected server response (' + status + - ') while retrieving PDF "' + source.url + '".', status); - handler.send('UnexpectedResponse', exception); - } - cancelXHRs = null; - }, - - onProgress: function onProgress(evt) { - handler.send('DocProgress', { - loaded: evt.loaded, - total: evt.lengthComputable ? evt.total : source.length - }); - } - }); - - cancelXHRs = function () { - networkManager.abortRequest(fullRequestXhrId); - }; - - return pdfManagerCapability.promise; - } - - var setupDoc = function(data) { - var onSuccess = function(doc) { - ensureNotTerminated(); - handler.send('GetDoc', { pdfInfo: doc }); - }; - - var onFailure = function(e) { - if (e instanceof PasswordException) { - if (e.code === PasswordResponses.NEED_PASSWORD) { - handler.send('NeedPassword', e); - } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) { - handler.send('IncorrectPassword', e); - } - } else if (e instanceof InvalidPDFException) { - handler.send('InvalidPDF', e); - } else if (e instanceof MissingPDFException) { - handler.send('MissingPDF', e); - } else if (e instanceof UnexpectedResponseException) { - handler.send('UnexpectedResponse', e); - } else { - handler.send('UnknownError', - new UnknownErrorException(e.message, e.toString())); - } - }; - - ensureNotTerminated(); - - PDFJS.maxImageSize = data.maxImageSize === undefined ? - -1 : data.maxImageSize; - PDFJS.disableFontFace = data.disableFontFace; - PDFJS.disableCreateObjectURL = data.disableCreateObjectURL; - PDFJS.verbosity = data.verbosity; - PDFJS.cMapUrl = data.cMapUrl === undefined ? - null : data.cMapUrl; - PDFJS.cMapPacked = data.cMapPacked === true; - - getPdfManager(data).then(function (newPdfManager) { - if (terminated) { - // We were in a process of setting up the manager, but it got - // terminated in the middle. - newPdfManager.terminate(); - throw new Error('Worker was terminated'); - } - - pdfManager = newPdfManager; - handler.send('PDFManagerReady', null); - pdfManager.onLoadedStream().then(function(stream) { - handler.send('DataLoaded', { length: stream.bytes.byteLength }); - }); - }).then(function pdfManagerReady() { - ensureNotTerminated(); - - loadDocument(false).then(onSuccess, function loadFailure(ex) { - ensureNotTerminated(); - - // Try again with recoveryMode == true - if (!(ex instanceof XRefParseException)) { - if (ex instanceof PasswordException) { - // after password exception prepare to receive a new password - // to repeat loading - pdfManager.passwordChanged().then(pdfManagerReady); - } - - onFailure(ex); - return; - } - - pdfManager.requestLoadedStream(); - pdfManager.onLoadedStream().then(function() { - ensureNotTerminated(); - - loadDocument(true).then(onSuccess, onFailure); - }); - }, onFailure); - }, onFailure); - }; - - handler.on('GetPage', function wphSetupGetPage(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - var rotatePromise = pdfManager.ensure(page, 'rotate'); - var refPromise = pdfManager.ensure(page, 'ref'); - var viewPromise = pdfManager.ensure(page, 'view'); - - return Promise.all([rotatePromise, refPromise, viewPromise]).then( - function(results) { - return { - rotate: results[0], - ref: results[1], - view: results[2] - }; - }); - }); - }); - - handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new Ref(data.ref.num, data.ref.gen); - var catalog = pdfManager.pdfDocument.catalog; - return catalog.getPageIndex(ref); - }); - - handler.on('GetDestinations', - function wphSetupGetDestinations(data) { - return pdfManager.ensureCatalog('destinations'); - } - ); - - handler.on('GetDestination', - function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [data.id]); - } - ); - - handler.on('GetAttachments', - function wphSetupGetAttachments(data) { - return pdfManager.ensureCatalog('attachments'); - } - ); - - handler.on('GetJavaScript', - function wphSetupGetJavaScript(data) { - return pdfManager.ensureCatalog('javaScript'); - } - ); - - handler.on('GetOutline', - function wphSetupGetOutline(data) { - return pdfManager.ensureCatalog('documentOutline'); - } - ); - - handler.on('GetMetadata', - function wphSetupGetMetadata(data) { - return Promise.all([pdfManager.ensureDoc('documentInfo'), - pdfManager.ensureCatalog('metadata')]); - } - ); - - handler.on('GetData', function wphSetupGetData(data) { - pdfManager.requestLoadedStream(); - return pdfManager.onLoadedStream().then(function(stream) { - return stream.bytes; - }); - }); - - handler.on('GetStats', - function wphSetupGetStats(data) { - return pdfManager.pdfDocument.xref.stats; - } - ); - - handler.on('UpdatePassword', function wphSetupUpdatePassword(data) { - pdfManager.updatePassword(data); - }); - - handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); - }); - }); - - handler.on('RenderPageRequest', function wphSetupRenderPage(data) { - var pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); - startWorkerTask(task); - - var pageNum = pageIndex + 1; - var start = Date.now(); - // Pre compile the pdf page and fetch the fonts/images. - page.getOperatorList(handler, task, data.intent).then( - function(operatorList) { - finishWorkerTask(task); - - info('page=' + pageNum + ' - getOperatorList: time=' + - (Date.now() - start) + 'ms, len=' + operatorList.totalLength); - }, function(e) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - - // For compatibility with older behavior, generating unknown - // unsupported feature notification on errors. - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.unknown}); - - var minimumStackMessage = - 'worker.js: while trying to getPage() and getOperatorList()'; - - var wrappedException; - - // Turn the error into an obj that can be serialized - if (typeof e === 'string') { - wrappedException = { - message: e, - stack: minimumStackMessage - }; - } else if (typeof e === 'object') { - wrappedException = { - message: e.message || e.toString(), - stack: e.stack || minimumStackMessage - }; - } else { - wrappedException = { - message: 'Unknown exception type: ' + (typeof e), - stack: minimumStackMessage - }; - } - - handler.send('PageError', { - pageNum: pageNum, - error: wrappedException, - intent: data.intent - }); - }); - }); - }, this); - - handler.on('GetTextContent', function wphExtractText(data) { - var pageIndex = data.pageIndex; - var normalizeWhitespace = data.normalizeWhitespace; - return pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('GetTextContent: page ' + pageIndex); - startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); - return page.extractTextContent(task, normalizeWhitespace).then( - function(textContent) { - finishWorkerTask(task); - info('text indexing: page=' + pageNum + ' - time=' + - (Date.now() - start) + 'ms'); - return textContent; - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - throw reason; - }); - }); - }); - - handler.on('Cleanup', function wphCleanup(data) { - return pdfManager.cleanup(); - }); - - handler.on('Terminate', function wphTerminate(data) { - terminated = true; - if (pdfManager) { - pdfManager.terminate(); - pdfManager = null; - } - if (cancelXHRs) { - cancelXHRs(); - } - - var waitOn = []; - WorkerTasks.forEach(function (task) { - waitOn.push(task.finished); - task.terminate(); - }); - - return Promise.all(waitOn).then(function () { - // Notice that even if we destroying handler, resolved response promise - // must be sent back. - handler.destroy(); - handler = null; - }); - }); - - handler.on('Ready', function wphReady(data) { - setupDoc(docParams); - docParams = null; // we don't need docParams anymore -- saving memory. - }); - return workerHandlerName; - } -}; - -var consoleTimer = {}; - -var workerConsole = { - log: function log() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_log', - data: args - }); - }, - - error: function error() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_error', - data: args - }); - throw 'pdf.js execution error'; - }, - - time: function time(name) { - consoleTimer[name] = Date.now(); - }, - - timeEnd: function timeEnd(name) { - var time = consoleTimer[name]; - if (!time) { - error('Unknown timer name ' + name); - } - this.log('Timer:', name, Date.now() - time); - } -}; - - -// Worker thread? -if (typeof window === 'undefined') { - if (!('console' in globalScope)) { - globalScope.console = workerConsole; - } - - var handler = new MessageHandler('worker', 'main', this); - WorkerMessageHandler.setup(handler, this); -} - - -/* This class implements the QM Coder decoding as defined in - * JPEG 2000 Part I Final Committee Draft Version 1.0 - * Annex C.3 Arithmetic decoding procedure - * available at http://www.jpeg.org/public/fcd15444-1.pdf - * - * The arithmetic decoder is used in conjunction with context models to decode - * JPEG2000 and JBIG2 streams. - */ -var ArithmeticDecoder = (function ArithmeticDecoderClosure() { - // Table C-2 - var QeTable = [ - {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1}, - {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0}, - {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0}, - {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0}, - {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0}, - {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0}, - {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1}, - {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0}, - {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0}, - {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0}, - {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0}, - {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0}, - {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0}, - {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0}, - {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1}, - {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0}, - {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0}, - {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0}, - {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0}, - {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0}, - {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0}, - {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0}, - {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0}, - {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0}, - {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0}, - {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0}, - {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0}, - {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0}, - {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0}, - {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0}, - {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0}, - {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0}, - {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0}, - {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0}, - {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0}, - {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0}, - {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0}, - {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0}, - {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0}, - {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0}, - {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0}, - {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0}, - {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0}, - {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0}, - {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0}, - {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0}, - {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0} - ]; - - // C.3.5 Initialisation of the decoder (INITDEC) - function ArithmeticDecoder(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - - this.chigh = data[start]; - this.clow = 0; - - this.byteIn(); - - this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F); - this.clow = (this.clow << 7) & 0xFFFF; - this.ct -= 7; - this.a = 0x8000; - } - - ArithmeticDecoder.prototype = { - // C.3.4 Compressed data input (BYTEIN) - byteIn: function ArithmeticDecoder_byteIn() { - var data = this.data; - var bp = this.bp; - if (data[bp] === 0xFF) { - var b1 = data[bp + 1]; - if (b1 > 0x8F) { - this.clow += 0xFF00; - this.ct = 8; - } else { - bp++; - this.clow += (data[bp] << 9); - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 0xFFFF) { - this.chigh += (this.clow >> 16); - this.clow &= 0xFFFF; - } - }, - // C.3.2 Decoding a decision (DECODE) - readBit: function ArithmeticDecoder_readBit(contexts, pos) { - // contexts are packed into 1 byte: - // highest 7 bits carry cx.index, lowest bit carries cx.mps - var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; - var qeTableIcx = QeTable[cx_index]; - var qeIcx = qeTableIcx.qe; - var d; - var a = this.a - qeIcx; - - if (this.chigh < qeIcx) { - // exchangeLps - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - // exchangeMps - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - // C.3.3 renormD; - do { - if (this.ct === 0) { - this.byteIn(); - } - - a <<= 1; - this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1); - this.clow = (this.clow << 1) & 0xFFFF; - this.ct--; - } while ((a & 0x8000) === 0); - this.a = a; - - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } - }; - - return ArithmeticDecoder; -})(); - - - -var JpegImage = (function jpegImage() { - var dctZigZag = new Uint8Array([ - 0, - 1, 8, - 16, 9, 2, - 3, 10, 17, 24, - 32, 25, 18, 11, 4, - 5, 12, 19, 26, 33, 40, - 48, 41, 34, 27, 20, 13, 6, - 7, 14, 21, 28, 35, 42, 49, 56, - 57, 50, 43, 36, 29, 22, 15, - 23, 30, 37, 44, 51, 58, - 59, 52, 45, 38, 31, - 39, 46, 53, 60, - 61, 54, 47, - 55, 62, - 63 - ]); - - var dctCos1 = 4017; // cos(pi/16) - var dctSin1 = 799; // sin(pi/16) - var dctCos3 = 3406; // cos(3*pi/16) - var dctSin3 = 2276; // sin(3*pi/16) - var dctCos6 = 1567; // cos(6*pi/16) - var dctSin6 = 3784; // sin(6*pi/16) - var dctSqrt2 = 5793; // sqrt(2) - var dctSqrt1d2 = 2896; // sqrt(2) / 2 - - function constructor() { - } - - function buildHuffmanTable(codeLengths, values) { - var k = 0, code = [], i, j, length = 16; - while (length > 0 && !codeLengths[length - 1]) { - length--; - } - code.push({children: [], index: 0}); - var p = code[0], q; - for (i = 0; i < length; i++) { - for (j = 0; j < codeLengths[i]; j++) { - p = code.pop(); - p.children[p.index] = values[k]; - while (p.index > 0) { - p = code.pop(); - } - p.index++; - code.push(p); - while (code.length <= i) { - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - k++; - } - if (i + 1 < length) { - // p here points to last code - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - } - return code[0].children; - } - - function getBlockBufferOffset(component, row, col) { - return 64 * ((component.blocksPerLine + 1) * row + col); - } - - function decodeScan(data, offset, frame, components, resetInterval, - spectralStart, spectralEnd, successivePrev, successive) { - var precision = frame.precision; - var samplesPerLine = frame.samplesPerLine; - var scanLines = frame.scanLines; - var mcusPerLine = frame.mcusPerLine; - var progressive = frame.progressive; - var maxH = frame.maxH, maxV = frame.maxV; - - var startOffset = offset, bitsData = 0, bitsCount = 0; - - function readBit() { - if (bitsCount > 0) { - bitsCount--; - return (bitsData >> bitsCount) & 1; - } - bitsData = data[offset++]; - if (bitsData === 0xFF) { - var nextByte = data[offset++]; - if (nextByte) { - throw 'unexpected marker: ' + - ((bitsData << 8) | nextByte).toString(16); - } - // unstuff 0 - } - bitsCount = 7; - return bitsData >>> 7; - } - - function decodeHuffman(tree) { - var node = tree; - while (true) { - node = node[readBit()]; - if (typeof node === 'number') { - return node; - } - if (typeof node !== 'object') { - throw 'invalid huffman sequence'; - } - } - } - - function receive(length) { - var n = 0; - while (length > 0) { - n = (n << 1) | readBit(); - length--; - } - return n; - } - - function receiveAndExtend(length) { - if (length === 1) { - return readBit() === 1 ? 1 : -1; - } - var n = receive(length); - if (n >= 1 << (length - 1)) { - return n; - } - return n + (-1 << length) + 1; - } - - function decodeBaseline(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : receiveAndExtend(t); - component.blockData[offset] = (component.pred += diff); - var k = 1; - while (k < 64) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = receiveAndExtend(s); - k++; - } - } - - function decodeDCFirst(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); - component.blockData[offset] = (component.pred += diff); - } - - function decodeDCSuccessive(component, offset) { - component.blockData[offset] |= readBit() << successive; - } - - var eobrun = 0; - function decodeACFirst(component, offset) { - if (eobrun > 0) { - eobrun--; - return; - } - var k = spectralStart, e = spectralEnd; - while (k <= e) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r) - 1; - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = - receiveAndExtend(s) * (1 << successive); - k++; - } - } - - var successiveACState = 0, successiveACNextValue; - function decodeACSuccessive(component, offset) { - var k = spectralStart; - var e = spectralEnd; - var r = 0; - var s; - var rs; - while (k <= e) { - var z = dctZigZag[k]; - switch (successiveACState) { - case 0: // initial state - rs = decodeHuffman(component.huffmanTableAC); - s = rs & 15; - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r); - successiveACState = 4; - } else { - r = 16; - successiveACState = 1; - } - } else { - if (s !== 1) { - throw 'invalid ACn encoding'; - } - successiveACNextValue = receiveAndExtend(s); - successiveACState = r ? 2 : 3; - } - continue; - case 1: // skipping r zero items - case 2: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - r--; - if (r === 0) { - successiveACState = successiveACState === 2 ? 3 : 0; - } - } - break; - case 3: // set value for a zero item - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - component.blockData[offset + z] = - successiveACNextValue << successive; - successiveACState = 0; - } - break; - case 4: // eob - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } - break; - } - k++; - } - if (successiveACState === 4) { - eobrun--; - if (eobrun === 0) { - successiveACState = 0; - } - } - } - - function decodeMcu(component, decode, mcu, row, col) { - var mcuRow = (mcu / mcusPerLine) | 0; - var mcuCol = mcu % mcusPerLine; - var blockRow = mcuRow * component.v + row; - var blockCol = mcuCol * component.h + col; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - function decodeBlock(component, decode, mcu) { - var blockRow = (mcu / component.blocksPerLine) | 0; - var blockCol = mcu % component.blocksPerLine; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - var componentsLength = components.length; - var component, i, j, k, n; - var decodeFn; - if (progressive) { - if (spectralStart === 0) { - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - } else { - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } - } else { - decodeFn = decodeBaseline; - } - - var mcu = 0, marker; - var mcuExpected; - if (componentsLength === 1) { - mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; - } else { - mcuExpected = mcusPerLine * frame.mcusPerColumn; - } - if (!resetInterval) { - resetInterval = mcuExpected; - } - - var h, v; - while (mcu < mcuExpected) { - // reset interval stuff - for (i = 0; i < componentsLength; i++) { - components[i].pred = 0; - } - eobrun = 0; - - if (componentsLength === 1) { - component = components[0]; - for (n = 0; n < resetInterval; n++) { - decodeBlock(component, decodeFn, mcu); - mcu++; - } - } else { - for (n = 0; n < resetInterval; n++) { - for (i = 0; i < componentsLength; i++) { - component = components[i]; - h = component.h; - v = component.v; - for (j = 0; j < v; j++) { - for (k = 0; k < h; k++) { - decodeMcu(component, decodeFn, mcu, j, k); - } - } - } - mcu++; - } - } - - // find marker - bitsCount = 0; - marker = (data[offset] << 8) | data[offset + 1]; - if (marker <= 0xFF00) { - throw 'marker was not found'; - } - - if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx - offset += 2; - } else { - break; - } - } - - return offset - startOffset; - } - - // A port of poppler's IDCT method which in turn is taken from: - // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, - // 'Practical Fast 1-D DCT Algorithms with 11 Multiplications', - // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, - // 988-991. - function quantizeAndInverse(component, blockBufferOffset, p) { - var qt = component.quantizationTable, blockData = component.blockData; - var v0, v1, v2, v3, v4, v5, v6, v7; - var p0, p1, p2, p3, p4, p5, p6, p7; - var t; - - // inverse DCT on rows - for (var row = 0; row < 64; row += 8) { - // gather block data - p0 = blockData[blockBufferOffset + row]; - p1 = blockData[blockBufferOffset + row + 1]; - p2 = blockData[blockBufferOffset + row + 2]; - p3 = blockData[blockBufferOffset + row + 3]; - p4 = blockData[blockBufferOffset + row + 4]; - p5 = blockData[blockBufferOffset + row + 5]; - p6 = blockData[blockBufferOffset + row + 6]; - p7 = blockData[blockBufferOffset + row + 7]; - - // dequant p0 - p0 *= qt[row]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 512) >> 10; - p[row] = t; - p[row + 1] = t; - p[row + 2] = t; - p[row + 3] = t; - p[row + 4] = t; - p[row + 5] = t; - p[row + 6] = t; - p[row + 7] = t; - continue; - } - // dequant p1 ... p7 - p1 *= qt[row + 1]; - p2 *= qt[row + 2]; - p3 *= qt[row + 3]; - p4 *= qt[row + 4]; - p5 *= qt[row + 5]; - p6 *= qt[row + 6]; - p7 *= qt[row + 7]; - - // stage 4 - v0 = (dctSqrt2 * p0 + 128) >> 8; - v1 = (dctSqrt2 * p4 + 128) >> 8; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8; - v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8; - v5 = p3 << 4; - v6 = p5 << 4; - - // stage 3 - v0 = (v0 + v1 + 1) >> 1; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p[row] = v0 + v7; - p[row + 7] = v0 - v7; - p[row + 1] = v1 + v6; - p[row + 6] = v1 - v6; - p[row + 2] = v2 + v5; - p[row + 5] = v2 - v5; - p[row + 3] = v3 + v4; - p[row + 4] = v3 - v4; - } - - // inverse DCT on columns - for (var col = 0; col < 8; ++col) { - p0 = p[col]; - p1 = p[col + 8]; - p2 = p[col + 16]; - p3 = p[col + 24]; - p4 = p[col + 32]; - p5 = p[col + 40]; - p6 = p[col + 48]; - p7 = p[col + 56]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 8192) >> 14; - // convert to 8 bit - t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4; - blockData[blockBufferOffset + col] = t; - blockData[blockBufferOffset + col + 8] = t; - blockData[blockBufferOffset + col + 16] = t; - blockData[blockBufferOffset + col + 24] = t; - blockData[blockBufferOffset + col + 32] = t; - blockData[blockBufferOffset + col + 40] = t; - blockData[blockBufferOffset + col + 48] = t; - blockData[blockBufferOffset + col + 56] = t; - continue; - } - - // stage 4 - v0 = (dctSqrt2 * p0 + 2048) >> 12; - v1 = (dctSqrt2 * p4 + 2048) >> 12; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12; - v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12; - v5 = p3; - v6 = p5; - - // stage 3 - // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when - // converting to UInt8 range later. - v0 = ((v0 + v1 + 1) >> 1) + 4112; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p0 = v0 + v7; - p7 = v0 - v7; - p1 = v1 + v6; - p6 = v1 - v6; - p2 = v2 + v5; - p5 = v2 - v5; - p3 = v3 + v4; - p4 = v3 - v4; - - // convert to 8-bit integers - p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4; - p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4; - p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4; - p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4; - p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4; - p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4; - p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4; - p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4; - - // store block data - blockData[blockBufferOffset + col] = p0; - blockData[blockBufferOffset + col + 8] = p1; - blockData[blockBufferOffset + col + 16] = p2; - blockData[blockBufferOffset + col + 24] = p3; - blockData[blockBufferOffset + col + 32] = p4; - blockData[blockBufferOffset + col + 40] = p5; - blockData[blockBufferOffset + col + 48] = p6; - blockData[blockBufferOffset + col + 56] = p7; - } - } - - function buildComponentData(frame, component) { - var blocksPerLine = component.blocksPerLine; - var blocksPerColumn = component.blocksPerColumn; - var computationBuffer = new Int16Array(64); - - for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { - for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { - var offset = getBlockBufferOffset(component, blockRow, blockCol); - quantizeAndInverse(component, offset, computationBuffer); - } - } - return component.blockData; - } - - function clamp0to255(a) { - return a <= 0 ? 0 : a >= 255 ? 255 : a; - } - - constructor.prototype = { - parse: function parse(data) { - - function readUint16() { - var value = (data[offset] << 8) | data[offset + 1]; - offset += 2; - return value; - } - - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - - function prepareComponents(frame) { - var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (var i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * - component.h / frame.maxH); - var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * - component.v / frame.maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - - var blocksBufferSize = 64 * blocksPerColumnForMcu * - (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; - } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; - } - - var offset = 0, length = data.length; - var jfif = null; - var adobe = null; - var pixels = null; - var frame, resetInterval; - var quantizationTables = []; - var huffmanTablesAC = [], huffmanTablesDC = []; - var fileMarker = readUint16(); - if (fileMarker !== 0xFFD8) { // SOI (Start of Image) - throw 'SOI not found'; - } - - fileMarker = readUint16(); - while (fileMarker !== 0xFFD9) { // EOI (End of image) - var i, j, l; - switch(fileMarker) { - case 0xFFE0: // APP0 (Application Specific) - case 0xFFE1: // APP1 - case 0xFFE2: // APP2 - case 0xFFE3: // APP3 - case 0xFFE4: // APP4 - case 0xFFE5: // APP5 - case 0xFFE6: // APP6 - case 0xFFE7: // APP7 - case 0xFFE8: // APP8 - case 0xFFE9: // APP9 - case 0xFFEA: // APP10 - case 0xFFEB: // APP11 - case 0xFFEC: // APP12 - case 0xFFED: // APP13 - case 0xFFEE: // APP14 - case 0xFFEF: // APP15 - case 0xFFFE: // COM (Comment) - var appData = readDataBlock(); - - if (fileMarker === 0xFFE0) { - if (appData[0] === 0x4A && appData[1] === 0x46 && - appData[2] === 0x49 && appData[3] === 0x46 && - appData[4] === 0) { // 'JFIF\x00' - jfif = { - version: { major: appData[5], minor: appData[6] }, - densityUnits: appData[7], - xDensity: (appData[8] << 8) | appData[9], - yDensity: (appData[10] << 8) | appData[11], - thumbWidth: appData[12], - thumbHeight: appData[13], - thumbData: appData.subarray(14, 14 + - 3 * appData[12] * appData[13]) - }; - } - } - // TODO APP1 - Exif - if (fileMarker === 0xFFEE) { - if (appData[0] === 0x41 && appData[1] === 0x64 && - appData[2] === 0x6F && appData[3] === 0x62 && - appData[4] === 0x65) { // 'Adobe' - adobe = { - version: (appData[5] << 8) | appData[6], - flags0: (appData[7] << 8) | appData[8], - flags1: (appData[9] << 8) | appData[10], - transformCode: appData[11] - }; - } - } - break; - - case 0xFFDB: // DQT (Define Quantization Tables) - var quantizationTablesLength = readUint16(); - var quantizationTablesEnd = quantizationTablesLength + offset - 2; - var z; - while (offset < quantizationTablesEnd) { - var quantizationTableSpec = data[offset++]; - var tableData = new Uint16Array(64); - if ((quantizationTableSpec >> 4) === 0) { // 8 bit values - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = data[offset++]; - } - } else if ((quantizationTableSpec >> 4) === 1) { //16 bit - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = readUint16(); - } - } else { - throw 'DQT: invalid table spec'; - } - quantizationTables[quantizationTableSpec & 15] = tableData; - } - break; - - case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) - case 0xFFC1: // SOF1 (Start of Frame, Extended DCT) - case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) - if (frame) { - throw 'Only single frame JPEGs supported'; - } - readUint16(); // skip data length - frame = {}; - frame.extended = (fileMarker === 0xFFC1); - frame.progressive = (fileMarker === 0xFFC2); - frame.precision = data[offset++]; - frame.scanLines = readUint16(); - frame.samplesPerLine = readUint16(); - frame.components = []; - frame.componentIds = {}; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) { - maxH = h; - } - if (maxV < v) { - maxV = v; - } - var qId = data[offset + 2]; - l = frame.components.push({ - h: h, - v: v, - quantizationTable: quantizationTables[qId] - }); - frame.componentIds[componentId] = l - 1; - offset += 3; - } - frame.maxH = maxH; - frame.maxV = maxV; - prepareComponents(frame); - break; - - case 0xFFC4: // DHT (Define Huffman Tables) - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength;) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) { - codeLengthSum += (codeLengths[j] = data[offset]); - } - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) { - huffmanValues[j] = data[offset]; - } - i += 17 + codeLengthSum; - - ((huffmanTableSpec >> 4) === 0 ? - huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = - buildHuffmanTable(codeLengths, huffmanValues); - } - break; - - case 0xFFDD: // DRI (Define Restart Interval) - readUint16(); // skip data length - resetInterval = readUint16(); - break; - - case 0xFFDA: // SOS (Start of Scan) - var scanLength = readUint16(); - var selectorsCount = data[offset++]; - var components = [], component; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = frame.componentIds[data[offset++]]; - component = frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, - frame, components, resetInterval, - spectralStart, spectralEnd, - successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - break; - - case 0xFFFF: // Fill bytes - if (data[offset] !== 0xFF) { // Avoid skipping a valid marker. - offset--; - } - break; - - default: - if (data[offset - 3] === 0xFF && - data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) { - // could be incorrect encoding -- last 0xFF byte of the previous - // block was eaten by the encoder - offset -= 3; - break; - } - throw 'unknown JPEG marker ' + fileMarker.toString(16); - } - fileMarker = readUint16(); - } - - this.width = frame.samplesPerLine; - this.height = frame.scanLines; - this.jfif = jfif; - this.adobe = adobe; - this.components = []; - for (i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - this.components.push({ - output: buildComponentData(frame, component), - scaleX: component.h / frame.maxH, - scaleY: component.v / frame.maxV, - blocksPerLine: component.blocksPerLine, - blocksPerColumn: component.blocksPerColumn - }); - } - this.numComponents = this.components.length; - }, - - _getLinearizedBlockData: function getLinearizedBlockData(width, height) { - var scaleX = this.width / width, scaleY = this.height / height; - - var component, componentScaleX, componentScaleY, blocksPerScanline; - var x, y, i, j, k; - var index; - var offset = 0; - var output; - var numComponents = this.components.length; - var dataLength = width * height * numComponents; - var data = new Uint8Array(dataLength); - var xScaleBlockOffset = new Uint32Array(width); - var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs - - for (i = 0; i < numComponents; i++) { - component = this.components[i]; - componentScaleX = component.scaleX * scaleX; - componentScaleY = component.scaleY * scaleY; - offset = i; - output = component.output; - blocksPerScanline = (component.blocksPerLine + 1) << 3; - // precalculate the xScaleBlockOffset - for (x = 0; x < width; x++) { - j = 0 | (x * componentScaleX); - xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); - } - // linearize the blocks of the component - for (y = 0; y < height; y++) { - j = 0 | (y * componentScaleY); - index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3); - for (x = 0; x < width; x++) { - data[offset] = output[index + xScaleBlockOffset[x]]; - offset += numComponents; - } - } - } - - // decodeTransform contains pairs of multiplier (-256..256) and additive - var transform = this.decodeTransform; - if (transform) { - for (i = 0; i < dataLength;) { - for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { - data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; - } - } - } - return data; - }, - - _isColorConversionNeeded: function isColorConversionNeeded() { - if (this.adobe && this.adobe.transformCode) { - // The adobe transform marker overrides any previous setting - return true; - } else if (this.numComponents === 3) { - return true; - } else { - return false; - } - }, - - _convertYccToRgb: function convertYccToRgb(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 3) { - Y = data[i ]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(Y - 179.456 + 1.402 * Cr); - data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); - data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); - } - return data; - }, - - _convertYcckToRgb: function convertYcckToRgb(data) { - var Y, Cb, Cr, k; - var offset = 0; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - k = data[i + 3]; - - var r = -122.67195406894 + - Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - - 0.154362151871126) + - Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - - 0.00477271405408747 * k + 1.53380253221734) + - Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + - 0.48357088451265) + - k * (-0.000336197177618394 * k + 0.484791561490776); - - var g = 107.268039397724 + - Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + - 0.000659397001245577 * Y + 0.000426105652938837 * k - - 0.176491792462875) + - Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + - 0.000770482631801132 * k - 0.151051492775562) + - Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + - 0.25802910206845) + - k * (-0.000318913117588328 * k - 0.213742400323665); - - var b = -20.810012546947 + - Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + - 0.0020741088115012 * Y - 0.00288260236853442 * k + - 0.814272968359295) + - Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + - 0.000560833691242812 * k - 0.195152027534049) + - Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + - 0.116935020465145) + - k * (-0.000343531996510555 * k + 0.24165260232407); - - data[offset++] = clamp0to255(r); - data[offset++] = clamp0to255(g); - data[offset++] = clamp0to255(b); - } - return data; - }, - - _convertYcckToCmyk: function convertYcckToCmyk(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(434.456 - Y - 1.402 * Cr); - data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); - data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); - // K in data[i + 3] is unchanged - } - return data; - }, - - _convertCmykToRgb: function convertCmykToRgb(data) { - var c, m, y, k; - var offset = 0; - var min = -255 * 255 * 255; - var scale = 1 / 255 / 255; - for (var i = 0, length = data.length; i < length; i += 4) { - c = data[i]; - m = data[i + 1]; - y = data[i + 2]; - k = data[i + 3]; - - var r = - c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k - - 72734.4411664936) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y - - 17.873870861415444 * k - 1401.7366389350734) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 4465.541406466231) - - k * (21.86122147463605 * k + 48317.86113160301); - var g = - c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k - - 20220.756542821975) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 48691.05921601825) + - y * (4.444339102852739 * y + 9.8632861493405 * k - - 6341.191035517494) - - k * (20.737325471181034 * k + 47890.15695978492); - var b = - c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k - - 3616.812083916688) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 28620.90484698408) + - y * (0.03296041114873217 * y + 115.60384449646641 * k - - 49363.43385999684) - - k * (22.33816807309886 * k + 45932.16563550634); - - data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; - data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; - data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; - } - return data; - }, - - getData: function getData(width, height, forceRGBoutput) { - if (this.numComponents > 4) { - throw 'Unsupported color mode'; - } - // type of data: Uint8Array(width * height * numComponents) - var data = this._getLinearizedBlockData(width, height); - - if (this.numComponents === 3) { - return this._convertYccToRgb(data); - } else if (this.numComponents === 4) { - if (this._isColorConversionNeeded()) { - if (forceRGBoutput) { - return this._convertYcckToRgb(data); - } else { - return this._convertYcckToCmyk(data); - } - } else if (forceRGBoutput) { - return this._convertCmykToRgb(data); - } - } - return data; - } - }; - - return constructor; -})(); - - -var JpxImage = (function JpxImageClosure() { - // Table E.1 - var SubbandsGainLog2 = { - 'LL': 0, - 'LH': 1, - 'HL': 1, - 'HH': 2 - }; - function JpxImage() { - this.failOnCorruptedImage = false; - } - JpxImage.prototype = { - parse: function JpxImage_parse(data) { - - var head = readUint16(data, 0); - // No box header, immediate start of codestream (SOC) - if (head === 0xFF4F) { - this.parseCodestream(data, 0, data.length); - return; - } - - var position = 0, length = data.length; - while (position < length) { - var headerSize = 8; - var lbox = readUint32(data, position); - var tbox = readUint32(data, position + 4); - position += headerSize; - if (lbox === 1) { - // XLBox: read UInt64 according to spec. - // JavaScript's int precision of 53 bit should be sufficient here. - lbox = readUint32(data, position) * 4294967296 + - readUint32(data, position + 4); - position += 8; - headerSize += 8; - } - if (lbox === 0) { - lbox = length - position + headerSize; - } - if (lbox < headerSize) { - throw new Error('JPX Error: Invalid box field size'); - } - var dataLength = lbox - headerSize; - var jumpDataLength = true; - switch (tbox) { - case 0x6A703268: // 'jp2h' - jumpDataLength = false; // parsing child boxes - break; - case 0x636F6C72: // 'colr' - // Colorspaces are not used, the CS from the PDF is used. - var method = data[position]; - var precedence = data[position + 1]; - var approximation = data[position + 2]; - if (method === 1) { - // enumerated colorspace - var colorspace = readUint32(data, position + 3); - switch (colorspace) { - case 16: // this indicates a sRGB colorspace - case 17: // this indicates a grayscale colorspace - case 18: // this indicates a YUV colorspace - break; - default: - warn('Unknown colorspace ' + colorspace); - break; - } - } else if (method === 2) { - info('ICC profile not supported'); - } - break; - case 0x6A703263: // 'jp2c' - this.parseCodestream(data, position, position + dataLength); - break; - case 0x6A502020: // 'jP\024\024' - if (0x0d0a870a !== readUint32(data, position)) { - warn('Invalid JP2 signature'); - } - break; - // The following header types are valid but currently not used: - case 0x6A501A1A: // 'jP\032\032' - case 0x66747970: // 'ftyp' - case 0x72726571: // 'rreq' - case 0x72657320: // 'res ' - case 0x69686472: // 'ihdr' - break; - default: - var headerType = String.fromCharCode((tbox >> 24) & 0xFF, - (tbox >> 16) & 0xFF, - (tbox >> 8) & 0xFF, - tbox & 0xFF); - warn('Unsupported header type ' + tbox + ' (' + headerType + ')'); - break; - } - if (jumpDataLength) { - position += dataLength; - } - } - }, - parseImageProperties: function JpxImage_parseImageProperties(stream) { - var newByte = stream.getByte(); - while (newByte >= 0) { - var oldByte = newByte; - newByte = stream.getByte(); - var code = (oldByte << 8) | newByte; - // Image and tile size (SIZ) - if (code === 0xFF51) { - stream.skip(4); - var Xsiz = stream.getInt32() >>> 0; // Byte 4 - var Ysiz = stream.getInt32() >>> 0; // Byte 8 - var XOsiz = stream.getInt32() >>> 0; // Byte 12 - var YOsiz = stream.getInt32() >>> 0; // Byte 16 - stream.skip(16); - var Csiz = stream.getUint16(); // Byte 36 - this.width = Xsiz - XOsiz; - this.height = Ysiz - YOsiz; - this.componentsCount = Csiz; - // Results are always returned as Uint8Arrays - this.bitsPerComponent = 8; - return; - } - } - throw new Error('JPX Error: No size marker found in JPX stream'); - }, - parseCodestream: function JpxImage_parseCodestream(data, start, end) { - var context = {}; - try { - var doNotRecover = false; - var position = start; - while (position + 1 < end) { - var code = readUint16(data, position); - position += 2; - - var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; - switch (code) { - case 0xFF4F: // Start of codestream (SOC) - context.mainHeader = true; - break; - case 0xFFD9: // End of codestream (EOC) - break; - case 0xFF51: // Image and tile size (SIZ) - length = readUint16(data, position); - var siz = {}; - siz.Xsiz = readUint32(data, position + 4); - siz.Ysiz = readUint32(data, position + 8); - siz.XOsiz = readUint32(data, position + 12); - siz.YOsiz = readUint32(data, position + 16); - siz.XTsiz = readUint32(data, position + 20); - siz.YTsiz = readUint32(data, position + 24); - siz.XTOsiz = readUint32(data, position + 28); - siz.YTOsiz = readUint32(data, position + 32); - var componentsCount = readUint16(data, position + 36); - siz.Csiz = componentsCount; - var components = []; - j = position + 38; - for (var i = 0; i < componentsCount; i++) { - var component = { - precision: (data[j] & 0x7F) + 1, - isSigned: !!(data[j] & 0x80), - XRsiz: data[j + 1], - YRsiz: data[j + 1] - }; - calculateComponentDimensions(component, siz); - components.push(component); - } - context.SIZ = siz; - context.components = components; - calculateTileGrids(context, components); - context.QCC = []; - context.COC = []; - break; - case 0xFF5C: // Quantization default (QCD) - length = readUint16(data, position); - var qcd = {}; - j = position + 2; - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('JPX Error: Invalid SQcd value ' + sqcd); - } - qcd.noQuantization = (spqcdSize === 8); - qcd.scalarExpounded = scalarExpounded; - qcd.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - var spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcd.SPqcds = spqcds; - if (context.mainHeader) { - context.QCD = qcd; - } else { - context.currentTile.QCD = qcd; - context.currentTile.QCC = []; - } - break; - case 0xFF5D: // Quantization component (QCC) - length = readUint16(data, position); - var qcc = {}; - j = position + 2; - var cqcc; - if (context.SIZ.Csiz < 257) { - cqcc = data[j++]; - } else { - cqcc = readUint16(data, j); - j += 2; - } - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('JPX Error: Invalid SQcd value ' + sqcd); - } - qcc.noQuantization = (spqcdSize === 8); - qcc.scalarExpounded = scalarExpounded; - qcc.guardBits = sqcd >> 5; - spqcds = []; - while (j < (length + position)) { - spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcc.SPqcds = spqcds; - if (context.mainHeader) { - context.QCC[cqcc] = qcc; - } else { - context.currentTile.QCC[cqcc] = qcc; - } - break; - case 0xFF52: // Coding style default (COD) - length = readUint16(data, position); - var cod = {}; - j = position + 2; - var scod = data[j++]; - cod.entropyCoderWithCustomPrecincts = !!(scod & 1); - cod.sopMarkerUsed = !!(scod & 2); - cod.ephMarkerUsed = !!(scod & 4); - cod.progressionOrder = data[j++]; - cod.layersCount = readUint16(data, j); - j += 2; - cod.multipleComponentTransform = data[j++]; - - cod.decompositionLevelsCount = data[j++]; - cod.xcb = (data[j++] & 0xF) + 2; - cod.ycb = (data[j++] & 0xF) + 2; - var blockStyle = data[j++]; - cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); - cod.resetContextProbabilities = !!(blockStyle & 2); - cod.terminationOnEachCodingPass = !!(blockStyle & 4); - cod.verticalyStripe = !!(blockStyle & 8); - cod.predictableTermination = !!(blockStyle & 16); - cod.segmentationSymbolUsed = !!(blockStyle & 32); - cod.reversibleTransformation = data[j++]; - if (cod.entropyCoderWithCustomPrecincts) { - var precinctsSizes = []; - while (j < length + position) { - var precinctsSize = data[j++]; - precinctsSizes.push({ - PPx: precinctsSize & 0xF, - PPy: precinctsSize >> 4 - }); - } - cod.precinctsSizes = precinctsSizes; - } - var unsupported = []; - if (cod.selectiveArithmeticCodingBypass) { - unsupported.push('selectiveArithmeticCodingBypass'); - } - if (cod.resetContextProbabilities) { - unsupported.push('resetContextProbabilities'); - } - if (cod.terminationOnEachCodingPass) { - unsupported.push('terminationOnEachCodingPass'); - } - if (cod.verticalyStripe) { - unsupported.push('verticalyStripe'); - } - if (cod.predictableTermination) { - unsupported.push('predictableTermination'); - } - if (unsupported.length > 0) { - doNotRecover = true; - throw new Error('JPX Error: Unsupported COD options (' + - unsupported.join(', ') + ')'); - } - if (context.mainHeader) { - context.COD = cod; - } else { - context.currentTile.COD = cod; - context.currentTile.COC = []; - } - break; - case 0xFF90: // Start of tile-part (SOT) - length = readUint16(data, position); - tile = {}; - tile.index = readUint16(data, position + 2); - tile.length = readUint32(data, position + 4); - tile.dataEnd = tile.length + position - 2; - tile.partIndex = data[position + 8]; - tile.partsCount = data[position + 9]; - - context.mainHeader = false; - if (tile.partIndex === 0) { - // reset component specific settings - tile.COD = context.COD; - tile.COC = context.COC.slice(0); // clone of the global COC - tile.QCD = context.QCD; - tile.QCC = context.QCC.slice(0); // clone of the global COC - } - context.currentTile = tile; - break; - case 0xFF93: // Start of data (SOD) - tile = context.currentTile; - if (tile.partIndex === 0) { - initializeTile(context, tile.index); - buildPackets(context); - } - - // moving to the end of the data - length = tile.dataEnd - position; - parseTilePackets(context, data, position, length); - break; - case 0xFF55: // Tile-part lengths, main header (TLM) - case 0xFF57: // Packet length, main header (PLM) - case 0xFF58: // Packet length, tile-part header (PLT) - case 0xFF64: // Comment (COM) - length = readUint16(data, position); - // skipping content - break; - case 0xFF53: // Coding style component (COC) - throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' + - 'not implemented'); - default: - throw new Error('JPX Error: Unknown codestream code: ' + - code.toString(16)); - } - position += length; - } - } catch (e) { - if (doNotRecover || this.failOnCorruptedImage) { - throw e; - } else { - warn('Trying to recover from ' + e.message); - } - } - this.tiles = transformComponents(context); - this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; - this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; - this.componentsCount = context.SIZ.Csiz; - } - }; - function calculateComponentDimensions(component, siz) { - // Section B.2 Component mapping - component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); - component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); - component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); - component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); - component.width = component.x1 - component.x0; - component.height = component.y1 - component.y0; - } - function calculateTileGrids(context, components) { - var siz = context.SIZ; - // Section B.3 Division into tile and tile-components - var tile, tiles = []; - var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); - var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); - for (var q = 0; q < numYtiles; q++) { - for (var p = 0; p < numXtiles; p++) { - tile = {}; - tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); - tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); - tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); - tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); - tile.width = tile.tx1 - tile.tx0; - tile.height = tile.ty1 - tile.ty0; - tile.components = []; - tiles.push(tile); - } - } - context.tiles = tiles; - - var componentsCount = siz.Csiz; - for (var i = 0, ii = componentsCount; i < ii; i++) { - var component = components[i]; - for (var j = 0, jj = tiles.length; j < jj; j++) { - var tileComponent = {}; - tile = tiles[j]; - tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); - tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); - tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); - tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); - tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; - tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; - tile.components[i] = tileComponent; - } - } - } - function getBlocksDimensions(context, component, r) { - var codOrCoc = component.codingStyleParameters; - var result = {}; - if (!codOrCoc.entropyCoderWithCustomPrecincts) { - result.PPx = 15; - result.PPy = 15; - } else { - result.PPx = codOrCoc.precinctsSizes[r].PPx; - result.PPy = codOrCoc.precinctsSizes[r].PPy; - } - // calculate codeblock size as described in section B.7 - result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : - Math.min(codOrCoc.xcb, result.PPx)); - result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : - Math.min(codOrCoc.ycb, result.PPy)); - return result; - } - function buildPrecincts(context, resolution, dimensions) { - // Section B.6 Division resolution to precincts - var precinctWidth = 1 << dimensions.PPx; - var precinctHeight = 1 << dimensions.PPy; - // Jasper introduces codeblock groups for mapping each subband codeblocks - // to precincts. Precinct partition divides a resolution according to width - // and height parameters. The subband that belongs to the resolution level - // has a different size than the level, unless it is the zero resolution. - - // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding: - // The precinct partitioning for a particular subband is derived from a - // partitioning of its parent LL band (i.e., the LL band at the next higher - // resolution level)... The LL band associated with each resolution level is - // divided into precincts... Each of the resulting precinct regions is then - // mapped into its child subbands (if any) at the next lower resolution - // level. This is accomplished by using the coordinate transformation - // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the - // coordinates of a point in the LL band and child subband, respectively. - var isZeroRes = resolution.resLevel === 0; - var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1)); - var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1)); - var numprecinctswide = (resolution.trx1 > resolution.trx0 ? - Math.ceil(resolution.trx1 / precinctWidth) - - Math.floor(resolution.trx0 / precinctWidth) : 0); - var numprecinctshigh = (resolution.try1 > resolution.try0 ? - Math.ceil(resolution.try1 / precinctHeight) - - Math.floor(resolution.try0 / precinctHeight) : 0); - var numprecincts = numprecinctswide * numprecinctshigh; - - resolution.precinctParameters = { - precinctWidth: precinctWidth, - precinctHeight: precinctHeight, - numprecinctswide: numprecinctswide, - numprecinctshigh: numprecinctshigh, - numprecincts: numprecincts, - precinctWidthInSubband: precinctWidthInSubband, - precinctHeightInSubband: precinctHeightInSubband - }; - } - function buildCodeblocks(context, subband, dimensions) { - // Section B.7 Division sub-band into code-blocks - var xcb_ = dimensions.xcb_; - var ycb_ = dimensions.ycb_; - var codeblockWidth = 1 << xcb_; - var codeblockHeight = 1 << ycb_; - var cbx0 = subband.tbx0 >> xcb_; - var cby0 = subband.tby0 >> ycb_; - var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_; - var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_; - var precinctParameters = subband.resolution.precinctParameters; - var codeblocks = []; - var precincts = []; - var i, j, codeblock, precinctNumber; - for (j = cby0; j < cby1; j++) { - for (i = cbx0; i < cbx1; i++) { - codeblock = { - cbx: i, - cby: j, - tbx0: codeblockWidth * i, - tby0: codeblockHeight * j, - tbx1: codeblockWidth * (i + 1), - tby1: codeblockHeight * (j + 1) - }; - - codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); - codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); - codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); - codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); - - // Calculate precinct number for this codeblock, codeblock position - // should be relative to its subband, use actual dimension and position - // See comment about codeblock group width and height - var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / - precinctParameters.precinctWidthInSubband); - var pj = Math.floor((codeblock.tby0_ - subband.tby0) / - precinctParameters.precinctHeightInSubband); - precinctNumber = pi + (pj * precinctParameters.numprecinctswide); - - codeblock.precinctNumber = precinctNumber; - codeblock.subbandType = subband.type; - codeblock.Lblock = 3; - - if (codeblock.tbx1_ <= codeblock.tbx0_ || - codeblock.tby1_ <= codeblock.tby0_) { - continue; - } - codeblocks.push(codeblock); - // building precinct for the sub-band - var precinct = precincts[precinctNumber]; - if (precinct !== undefined) { - if (i < precinct.cbxMin) { - precinct.cbxMin = i; - } else if (i > precinct.cbxMax) { - precinct.cbxMax = i; - } - if (j < precinct.cbyMin) { - precinct.cbxMin = j; - } else if (j > precinct.cbyMax) { - precinct.cbyMax = j; - } - } else { - precincts[precinctNumber] = precinct = { - cbxMin: i, - cbyMin: j, - cbxMax: i, - cbyMax: j - }; - } - codeblock.precinct = precinct; - } - } - subband.codeblockParameters = { - codeblockWidth: xcb_, - codeblockHeight: ycb_, - numcodeblockwide: cbx1 - cbx0 + 1, - numcodeblockhigh: cby1 - cby0 + 1 - }; - subband.codeblocks = codeblocks; - subband.precincts = precincts; - } - function createPacket(resolution, precinctNumber, layerNumber) { - var precinctCodeblocks = []; - // Section B.10.8 Order of info in packet - var subbands = resolution.subbands; - // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence - for (var i = 0, ii = subbands.length; i < ii; i++) { - var subband = subbands[i]; - var codeblocks = subband.codeblocks; - for (var j = 0, jj = codeblocks.length; j < jj; j++) { - var codeblock = codeblocks[j]; - if (codeblock.precinctNumber !== precinctNumber) { - continue; - } - precinctCodeblocks.push(codeblock); - } - } - return { - layerNumber: layerNumber, - codeblocks: precinctCodeblocks - }; - } - function LayerResolutionComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var l = 0, r = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.1 Layer-resolution-component-position - for (; l < layersCount; l++) { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - r = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ResolutionLayerComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var r = 0, l = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.2 Resolution-layer-component-position - for (; r <= maxDecompositionLevelsCount; r++) { - for (; l < layersCount; l++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - l = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ResolutionPositionComponentLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var l, r, c, p; - var maxDecompositionLevelsCount = 0; - for (c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - component.codingStyleParameters.decompositionLevelsCount); - } - var maxNumPrecinctsInLevel = new Int32Array( - maxDecompositionLevelsCount + 1); - for (r = 0; r <= maxDecompositionLevelsCount; ++r) { - var maxNumPrecincts = 0; - for (c = 0; c < componentsCount; ++c) { - var resolutions = tile.components[c].resolutions; - if (r < resolutions.length) { - maxNumPrecincts = Math.max(maxNumPrecincts, - resolutions[r].precinctParameters.numprecincts); - } - } - maxNumPrecinctsInLevel[r] = maxNumPrecincts; - } - l = 0; - r = 0; - c = 0; - p = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.3 Resolution-position-component-layer - for (; r <= maxDecompositionLevelsCount; r++) { - for (; p < maxNumPrecinctsInLevel[r]; p++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - if (p >= numprecincts) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, p, l); - l++; - return packet; - } - l = 0; - } - c = 0; - } - p = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function PositionComponentResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var precinctsIterationSizes = precinctsSizes; - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.4 Position-component-resolution-layer - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = - precinctsSizes.components[c].resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - c = 0; - } - px = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ComponentPositionResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.5 Component-position-resolution-layer - for (; c < componentsCount; ++c) { - var component = tile.components[c]; - var precinctsIterationSizes = precinctsSizes.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = precinctsIterationSizes.resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - px = 0; - } - py = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function getPrecinctIndexIfExist( - pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { - var posX = pxIndex * precinctIterationSizes.minWidth; - var posY = pyIndex * precinctIterationSizes.minHeight; - if (posX % sizeInImageScale.width !== 0 || - posY % sizeInImageScale.height !== 0) { - return null; - } - var startPrecinctRowIndex = - (posY / sizeInImageScale.width) * - resolution.precinctParameters.numprecinctswide; - return (posX / sizeInImageScale.height) + startPrecinctRowIndex; - } - function getPrecinctSizesInImageScale(tile) { - var componentsCount = tile.components.length; - var minWidth = Number.MAX_VALUE; - var minHeight = Number.MAX_VALUE; - var maxNumWide = 0; - var maxNumHigh = 0; - var sizePerComponent = new Array(componentsCount); - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - var sizePerResolution = new Array(decompositionLevelsCount + 1); - var minWidthCurrentComponent = Number.MAX_VALUE; - var minHeightCurrentComponent = Number.MAX_VALUE; - var maxNumWideCurrentComponent = 0; - var maxNumHighCurrentComponent = 0; - var scale = 1; - for (var r = decompositionLevelsCount; r >= 0; --r) { - var resolution = component.resolutions[r]; - var widthCurrentResolution = - scale * resolution.precinctParameters.precinctWidth; - var heightCurrentResolution = - scale * resolution.precinctParameters.precinctHeight; - minWidthCurrentComponent = Math.min( - minWidthCurrentComponent, - widthCurrentResolution); - minHeightCurrentComponent = Math.min( - minHeightCurrentComponent, - heightCurrentResolution); - maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, - resolution.precinctParameters.numprecinctswide); - maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, - resolution.precinctParameters.numprecinctshigh); - sizePerResolution[r] = { - width: widthCurrentResolution, - height: heightCurrentResolution - }; - scale <<= 1; - } - minWidth = Math.min(minWidth, minWidthCurrentComponent); - minHeight = Math.min(minHeight, minHeightCurrentComponent); - maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); - maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); - sizePerComponent[c] = { - resolutions: sizePerResolution, - minWidth: minWidthCurrentComponent, - minHeight: minHeightCurrentComponent, - maxNumWide: maxNumWideCurrentComponent, - maxNumHigh: maxNumHighCurrentComponent - }; - } - return { - components: sizePerComponent, - minWidth: minWidth, - minHeight: minHeight, - maxNumWide: maxNumWide, - maxNumHigh: maxNumHigh - }; - } - function buildPackets(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var componentsCount = siz.Csiz; - // Creating resolutions and sub-bands for each component - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - // Section B.5 Resolution levels and sub-bands - var resolutions = []; - var subbands = []; - for (var r = 0; r <= decompositionLevelsCount; r++) { - var blocksDimensions = getBlocksDimensions(context, component, r); - var resolution = {}; - var scale = 1 << (decompositionLevelsCount - r); - resolution.trx0 = Math.ceil(component.tcx0 / scale); - resolution.try0 = Math.ceil(component.tcy0 / scale); - resolution.trx1 = Math.ceil(component.tcx1 / scale); - resolution.try1 = Math.ceil(component.tcy1 / scale); - resolution.resLevel = r; - buildPrecincts(context, resolution, blocksDimensions); - resolutions.push(resolution); - - var subband; - if (r === 0) { - // one sub-band (LL) with last decomposition - subband = {}; - subband.type = 'LL'; - subband.tbx0 = Math.ceil(component.tcx0 / scale); - subband.tby0 = Math.ceil(component.tcy0 / scale); - subband.tbx1 = Math.ceil(component.tcx1 / scale); - subband.tby1 = Math.ceil(component.tcy1 / scale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolution.subbands = [subband]; - } else { - var bscale = 1 << (decompositionLevelsCount - r + 1); - var resolutionSubbands = []; - // three sub-bands (HL, LH and HH) with rest of decompositions - subband = {}; - subband.type = 'HL'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'LH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'HH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - resolution.subbands = resolutionSubbands; - } - } - component.resolutions = resolutions; - component.subbands = subbands; - } - // Generate the packets sequence - var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; - switch (progressionOrder) { - case 0: - tile.packetsIterator = - new LayerResolutionComponentPositionIterator(context); - break; - case 1: - tile.packetsIterator = - new ResolutionLayerComponentPositionIterator(context); - break; - case 2: - tile.packetsIterator = - new ResolutionPositionComponentLayerIterator(context); - break; - case 3: - tile.packetsIterator = - new PositionComponentResolutionLayerIterator(context); - break; - case 4: - tile.packetsIterator = - new ComponentPositionResolutionLayerIterator(context); - break; - default: - throw new Error('JPX Error: Unsupported progression order ' + - progressionOrder); - } - } - function parseTilePackets(context, data, offset, dataLength) { - var position = 0; - var buffer, bufferSize = 0, skipNextBit = false; - function readBits(count) { - while (bufferSize < count) { - var b = data[offset + position]; - position++; - if (skipNextBit) { - buffer = (buffer << 7) | b; - bufferSize += 7; - skipNextBit = false; - } else { - buffer = (buffer << 8) | b; - bufferSize += 8; - } - if (b === 0xFF) { - skipNextBit = true; - } - } - bufferSize -= count; - return (buffer >>> bufferSize) & ((1 << count) - 1); - } - function skipMarkerIfEqual(value) { - if (data[offset + position - 1] === 0xFF && - data[offset + position] === value) { - skipBytes(1); - return true; - } else if (data[offset + position] === 0xFF && - data[offset + position + 1] === value) { - skipBytes(2); - return true; - } - return false; - } - function skipBytes(count) { - position += count; - } - function alignToByte() { - bufferSize = 0; - if (skipNextBit) { - position++; - skipNextBit = false; - } - } - function readCodingpasses() { - if (readBits(1) === 0) { - return 1; - } - if (readBits(1) === 0) { - return 2; - } - var value = readBits(2); - if (value < 3) { - return value + 3; - } - value = readBits(5); - if (value < 31) { - return value + 6; - } - value = readBits(7); - return value + 37; - } - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var sopMarkerUsed = context.COD.sopMarkerUsed; - var ephMarkerUsed = context.COD.ephMarkerUsed; - var packetsIterator = tile.packetsIterator; - while (position < dataLength) { - alignToByte(); - if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { - // Skip also marker segment length and packet sequence ID - skipBytes(4); - } - var packet = packetsIterator.nextPacket(); - if (!readBits(1)) { - continue; - } - var layerNumber = packet.layerNumber; - var queue = [], codeblock; - for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { - codeblock = packet.codeblocks[i]; - var precinct = codeblock.precinct; - var codeblockColumn = codeblock.cbx - precinct.cbxMin; - var codeblockRow = codeblock.cby - precinct.cbyMin; - var codeblockIncluded = false; - var firstTimeInclusion = false; - var valueReady; - if (codeblock['included'] !== undefined) { - codeblockIncluded = !!readBits(1); - } else { - // reading inclusion tree - precinct = codeblock.precinct; - var inclusionTree, zeroBitPlanesTree; - if (precinct['inclusionTree'] !== undefined) { - inclusionTree = precinct.inclusionTree; - } else { - // building inclusion and zero bit-planes trees - var width = precinct.cbxMax - precinct.cbxMin + 1; - var height = precinct.cbyMax - precinct.cbyMin + 1; - inclusionTree = new InclusionTree(width, height, layerNumber); - zeroBitPlanesTree = new TagTree(width, height); - precinct.inclusionTree = inclusionTree; - precinct.zeroBitPlanesTree = zeroBitPlanesTree; - } - - if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { - while (true) { - if (readBits(1)) { - valueReady = !inclusionTree.nextLevel(); - if (valueReady) { - codeblock.included = true; - codeblockIncluded = firstTimeInclusion = true; - break; - } - } else { - inclusionTree.incrementValue(layerNumber); - break; - } - } - } - } - if (!codeblockIncluded) { - continue; - } - if (firstTimeInclusion) { - zeroBitPlanesTree = precinct.zeroBitPlanesTree; - zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); - while (true) { - if (readBits(1)) { - valueReady = !zeroBitPlanesTree.nextLevel(); - if (valueReady) { - break; - } - } else { - zeroBitPlanesTree.incrementValue(); - } - } - codeblock.zeroBitPlanes = zeroBitPlanesTree.value; - } - var codingpasses = readCodingpasses(); - while (readBits(1)) { - codeblock.Lblock++; - } - var codingpassesLog2 = log2(codingpasses); - // rounding down log2 - var bits = ((codingpasses < (1 << codingpassesLog2)) ? - codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; - var codedDataLength = readBits(bits); - queue.push({ - codeblock: codeblock, - codingpasses: codingpasses, - dataLength: codedDataLength - }); - } - alignToByte(); - if (ephMarkerUsed) { - skipMarkerIfEqual(0x92); - } - while (queue.length > 0) { - var packetItem = queue.shift(); - codeblock = packetItem.codeblock; - if (codeblock['data'] === undefined) { - codeblock.data = []; - } - codeblock.data.push({ - data: data, - start: offset + position, - end: offset + position + packetItem.dataLength, - codingpasses: packetItem.codingpasses - }); - position += packetItem.dataLength; - } - } - return position; - } - function copyCoefficients(coefficients, levelWidth, levelHeight, subband, - delta, mb, reversible, segmentationSymbolUsed) { - var x0 = subband.tbx0; - var y0 = subband.tby0; - var width = subband.tbx1 - subband.tbx0; - var codeblocks = subband.codeblocks; - var right = subband.type.charAt(0) === 'H' ? 1 : 0; - var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0; - - for (var i = 0, ii = codeblocks.length; i < ii; ++i) { - var codeblock = codeblocks[i]; - var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; - var blockHeight = codeblock.tby1_ - codeblock.tby0_; - if (blockWidth === 0 || blockHeight === 0) { - continue; - } - if (codeblock['data'] === undefined) { - continue; - } - - var bitModel, currentCodingpassType; - bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, - codeblock.zeroBitPlanes, mb); - currentCodingpassType = 2; // first bit plane starts from cleanup - - // collect data - var data = codeblock.data, totalLength = 0, codingpasses = 0; - var j, jj, dataItem; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - totalLength += dataItem.end - dataItem.start; - codingpasses += dataItem.codingpasses; - } - var encodedData = new Uint8Array(totalLength); - var position = 0; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); - encodedData.set(chunk, position); - position += chunk.length; - } - // decoding the item - var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); - bitModel.setDecoder(decoder); - - for (j = 0; j < codingpasses; j++) { - switch (currentCodingpassType) { - case 0: - bitModel.runSignificancePropogationPass(); - break; - case 1: - bitModel.runMagnitudeRefinementPass(); - break; - case 2: - bitModel.runCleanupPass(); - if (segmentationSymbolUsed) { - bitModel.checkSegmentationSymbol(); - } - break; - } - currentCodingpassType = (currentCodingpassType + 1) % 3; - } - - var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width; - var sign = bitModel.coefficentsSign; - var magnitude = bitModel.coefficentsMagnitude; - var bitsDecoded = bitModel.bitsDecoded; - var magnitudeCorrection = reversible ? 0 : 0.5; - var k, n, nb; - position = 0; - // Do the interleaving of Section F.3.3 here, so we do not need - // to copy later. LL level is not interleaved, just copied. - var interleave = (subband.type !== 'LL'); - for (j = 0; j < blockHeight; j++) { - var row = (offset / width) | 0; // row in the non-interleaved subband - var levelOffset = 2 * row * (levelWidth - width) + right + bottom; - for (k = 0; k < blockWidth; k++) { - n = magnitude[position]; - if (n !== 0) { - n = (n + magnitudeCorrection) * delta; - if (sign[position] !== 0) { - n = -n; - } - nb = bitsDecoded[position]; - var pos = interleave ? (levelOffset + (offset << 1)) : offset; - if (reversible && (nb >= mb)) { - coefficients[pos] = n; - } else { - coefficients[pos] = n * (1 << (mb - nb)); - } - } - offset++; - position++; - } - offset += width - blockWidth; - } - } - } - function transformTile(context, tile, c) { - var component = tile.components[c]; - var codingStyleParameters = component.codingStyleParameters; - var quantizationParameters = component.quantizationParameters; - var decompositionLevelsCount = - codingStyleParameters.decompositionLevelsCount; - var spqcds = quantizationParameters.SPqcds; - var scalarExpounded = quantizationParameters.scalarExpounded; - var guardBits = quantizationParameters.guardBits; - var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; - var precision = context.components[c].precision; - - var reversible = codingStyleParameters.reversibleTransformation; - var transform = (reversible ? new ReversibleTransform() : - new IrreversibleTransform()); - - var subbandCoefficients = []; - var b = 0; - for (var i = 0; i <= decompositionLevelsCount; i++) { - var resolution = component.resolutions[i]; - - var width = resolution.trx1 - resolution.trx0; - var height = resolution.try1 - resolution.try0; - // Allocate space for the whole sublevel. - var coefficients = new Float32Array(width * height); - - for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { - var mu, epsilon; - if (!scalarExpounded) { - // formula E-5 - mu = spqcds[0].mu; - epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); - } else { - mu = spqcds[b].mu; - epsilon = spqcds[b].epsilon; - b++; - } - - var subband = resolution.subbands[j]; - var gainLog2 = SubbandsGainLog2[subband.type]; - - // calulate quantization coefficient (Section E.1.1.1) - var delta = (reversible ? 1 : - Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048)); - var mb = (guardBits + epsilon - 1); - - // In the first resolution level, copyCoefficients will fill the - // whole array with coefficients. In the succeding passes, - // copyCoefficients will consecutively fill in the values that belong - // to the interleaved positions of the HL, LH, and HH coefficients. - // The LL coefficients will then be interleaved in Transform.iterate(). - copyCoefficients(coefficients, width, height, subband, delta, mb, - reversible, segmentationSymbolUsed); - } - subbandCoefficients.push({ - width: width, - height: height, - items: coefficients - }); - } - - var result = transform.calculate(subbandCoefficients, - component.tcx0, component.tcy0); - return { - left: component.tcx0, - top: component.tcy0, - width: result.width, - height: result.height, - items: result.items - }; - } - function transformComponents(context) { - var siz = context.SIZ; - var components = context.components; - var componentsCount = siz.Csiz; - var resultImages = []; - for (var i = 0, ii = context.tiles.length; i < ii; i++) { - var tile = context.tiles[i]; - var transformedTiles = []; - var c; - for (c = 0; c < componentsCount; c++) { - transformedTiles[c] = transformTile(context, tile, c); - } - var tile0 = transformedTiles[0]; - var out = new Uint8Array(tile0.items.length * componentsCount); - var result = { - left: tile0.left, - top: tile0.top, - width: tile0.width, - height: tile0.height, - items: out - }; - - // Section G.2.2 Inverse multi component transform - var shift, offset, max, min, maxK; - var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; - if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - var fourComponents = componentsCount === 4; - var y0items = transformedTiles[0].items; - var y1items = transformedTiles[1].items; - var y2items = transformedTiles[2].items; - var y3items = fourComponents ? transformedTiles[3].items : null; - - // HACK: The multiple component transform formulas below assume that - // all components have the same precision. With this in mind, we - // compute shift and offset only once. - shift = components[0].precision - 8; - offset = (128 << shift) + 0.5; - max = 255 * (1 << shift); - maxK = max * 0.5; - min = -maxK; - - var component0 = tile.components[0]; - var alpha01 = componentsCount - 3; - jj = y0items.length; - if (!component0.codingStyleParameters.reversibleTransformation) { - // inverse irreversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - r = y0 + 1.402 * y2; - g = y0 - 0.34413 * y1 - 0.71414 * y2; - b = y0 + 1.772 * y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } else { - // inverse reversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - g = y0 - ((y2 + y1) >> 2); - r = g + y2; - b = g + y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } - if (fourComponents) { - for (j = 0, pos = 3; j < jj; j++, pos += 4) { - k = y3items[j]; - out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift; - } - } - } else { // no multi-component transform - for (c = 0; c < componentsCount; c++) { - var items = transformedTiles[c].items; - shift = components[c].precision - 8; - offset = (128 << shift) + 0.5; - max = (127.5 * (1 << shift)); - min = -max; - for (pos = c, j = 0, jj = items.length; j < jj; j++) { - val = items[j]; - out[pos] = val <= min ? 0 : - val >= max ? 255 : (val + offset) >> shift; - pos += componentsCount; - } - } - } - resultImages.push(result); - } - return resultImages; - } - function initializeTile(context, tileIndex) { - var siz = context.SIZ; - var componentsCount = siz.Csiz; - var tile = context.tiles[tileIndex]; - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ? - context.currentTile.QCC[c] : context.currentTile.QCD); - component.quantizationParameters = qcdOrQcc; - var codOrCoc = (context.currentTile.COC[c] !== undefined ? - context.currentTile.COC[c] : context.currentTile.COD); - component.codingStyleParameters = codOrCoc; - } - tile.codingStyleDefaultParameters = context.currentTile.COD; - } - - // Section B.10.2 Tag trees - var TagTree = (function TagTreeClosure() { - function TagTree(width, height) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var level = { - width: width, - height: height, - items: [] - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - TagTree.prototype = { - reset: function TagTree_reset(i, j) { - var currentLevel = 0, value = 0, level; - while (currentLevel < this.levels.length) { - level = this.levels[currentLevel]; - var index = i + j * level.width; - if (level.items[index] !== undefined) { - value = level.items[index]; - break; - } - level.index = index; - i >>= 1; - j >>= 1; - currentLevel++; - } - currentLevel--; - level = this.levels[currentLevel]; - level.items[level.index] = value; - this.currentLevel = currentLevel; - delete this.value; - }, - incrementValue: function TagTree_incrementValue() { - var level = this.levels[this.currentLevel]; - level.items[level.index]++; - }, - nextLevel: function TagTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - currentLevel--; - if (currentLevel < 0) { - this.value = value; - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return TagTree; - })(); - - var InclusionTree = (function InclusionTreeClosure() { - function InclusionTree(width, height, defaultValue) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var items = new Uint8Array(width * height); - for (var j = 0, jj = items.length; j < jj; j++) { - items[j] = defaultValue; - } - - var level = { - width: width, - height: height, - items: items - }; - this.levels.push(level); - - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - InclusionTree.prototype = { - reset: function InclusionTree_reset(i, j, stopValue) { - var currentLevel = 0; - while (currentLevel < this.levels.length) { - var level = this.levels[currentLevel]; - var index = i + j * level.width; - level.index = index; - var value = level.items[index]; - - if (value === 0xFF) { - break; - } - - if (value > stopValue) { - this.currentLevel = currentLevel; - // already know about this one, propagating the value to top levels - this.propagateValues(); - return false; - } - - i >>= 1; - j >>= 1; - currentLevel++; - } - this.currentLevel = currentLevel - 1; - return true; - }, - incrementValue: function InclusionTree_incrementValue(stopValue) { - var level = this.levels[this.currentLevel]; - level.items[level.index] = stopValue + 1; - this.propagateValues(); - }, - propagateValues: function InclusionTree_propagateValues() { - var levelIndex = this.currentLevel; - var level = this.levels[levelIndex]; - var currentValue = level.items[level.index]; - while (--levelIndex >= 0) { - level = this.levels[levelIndex]; - level.items[level.index] = currentValue; - } - }, - nextLevel: function InclusionTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - level.items[level.index] = 0xFF; - currentLevel--; - if (currentLevel < 0) { - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return InclusionTree; - })(); - - // Section D. Coefficient bit modeling - var BitModel = (function BitModelClosure() { - var UNIFORM_CONTEXT = 17; - var RUNLENGTH_CONTEXT = 18; - // Table D-1 - // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4), - // vv - sum of Vi (0..2), and hh - sum of Hi (0..2) - var LLAndLHContextsLabel = new Uint8Array([ - 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, - 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, - 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 - ]); - var HLContextLabel = new Uint8Array([ - 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, - 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, - 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 - ]); - var HHContextLabel = new Uint8Array([ - 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, - 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, - 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 - ]); - - function BitModel(width, height, subband, zeroBitPlanes, mb) { - this.width = width; - this.height = height; - - this.contextLabelTable = (subband === 'HH' ? HHContextLabel : - (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel)); - - var coefficientCount = width * height; - - // coefficients outside the encoding region treated as insignificant - // add border state cells for significanceState - this.neighborsSignificance = new Uint8Array(coefficientCount); - this.coefficentsSign = new Uint8Array(coefficientCount); - this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : - mb > 6 ? new Uint16Array(coefficientCount) : - new Uint8Array(coefficientCount); - this.processingFlags = new Uint8Array(coefficientCount); - - var bitsDecoded = new Uint8Array(coefficientCount); - if (zeroBitPlanes !== 0) { - for (var i = 0; i < coefficientCount; i++) { - bitsDecoded[i] = zeroBitPlanes; - } - } - this.bitsDecoded = bitsDecoded; - - this.reset(); - } - - BitModel.prototype = { - setDecoder: function BitModel_setDecoder(decoder) { - this.decoder = decoder; - }, - reset: function BitModel_reset() { - // We have 17 contexts that are accessed via context labels, - // plus the uniform and runlength context. - this.contexts = new Int8Array(19); - - // Contexts are packed into 1 byte: - // highest 7 bits carry the index, lowest bit carries mps - this.contexts[0] = (4 << 1) | 0; - this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0; - this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0; - }, - setNeighborsSignificance: - function BitModel_setNeighborsSignificance(row, column, index) { - var neighborsSignificance = this.neighborsSignificance; - var width = this.width, height = this.height; - var left = (column > 0); - var right = (column + 1 < width); - var i; - - if (row > 0) { - i = index - width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (row + 1 < height) { - i = index + width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (left) { - neighborsSignificance[index - 1] += 0x01; - } - if (right) { - neighborsSignificance[index + 1] += 0x01; - } - neighborsSignificance[index] |= 0x80; - }, - runSignificancePropogationPass: - function BitModel_runSignificancePropogationPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var neighborsSignificance = this.neighborsSignificance; - var processingFlags = this.processingFlags; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processedInverseMask = ~1; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - - for (var i0 = 0; i0 < height; i0 += 4) { - for (var j = 0; j < width; j++) { - var index = i0 * width + j; - for (var i1 = 0; i1 < 4; i1++, index += width) { - var i = i0 + i1; - if (i >= height) { - break; - } - // clear processed flag first - processingFlags[index] &= processedInverseMask; - - if (coefficentsMagnitude[index] || - !neighborsSignificance[index]) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision) { - var sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - decodeSignBit: function BitModel_decodeSignBit(row, column, index) { - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contribution, sign0, sign1, significance1; - var contextLabel, decoded; - - // calculate horizontal contribution - significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0); - if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { - sign1 = coefficentsSign[index + 1]; - if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign1 - sign0; - } else { - contribution = 1 - sign1 - sign1; - } - } else if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign0 - sign0; - } else { - contribution = 0; - } - var horizontalContribution = 3 * contribution; - - // calculate vertical contribution and combine with the horizontal - significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0); - if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { - sign1 = coefficentsSign[index + width]; - if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign1 - sign0 + horizontalContribution; - } else { - contribution = 1 - sign1 - sign1 + horizontalContribution; - } - } else if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign0 - sign0 + horizontalContribution; - } else { - contribution = horizontalContribution; - } - - if (contribution >= 0) { - contextLabel = 9 + contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel); - } else { - contextLabel = 9 - contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; - } - return decoded; - }, - runMagnitudeRefinementPass: - function BitModel_runMagnitudeRefinementPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var neighborsSignificance = this.neighborsSignificance; - var contexts = this.contexts; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var length = width * height; - var width4 = width * 4; - - for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { - indexNext = Math.min(length, index0 + width4); - for (var j = 0; j < width; j++) { - for (var index = index0 + j; index < indexNext; index += width) { - - // significant but not those that have just become - if (!coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = 16; - if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { - processingFlags[index] ^= firstMagnitudeBitMask; - // first refinement - var significance = neighborsSignificance[index] & 127; - contextLabel = significance === 0 ? 15 : 14; - } - - var bit = decoder.readBit(contexts, contextLabel); - coefficentsMagnitude[index] = - (coefficentsMagnitude[index] << 1) | bit; - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - runCleanupPass: function BitModel_runCleanupPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var neighborsSignificance = this.neighborsSignificance; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var oneRowDown = width; - var twoRowsDown = width * 2; - var threeRowsDown = width * 3; - var iNext; - for (var i0 = 0; i0 < height; i0 = iNext) { - iNext = Math.min(i0 + 4, height); - var indexBase = i0 * width; - var checkAllEmpty = i0 + 3 < height; - for (var j = 0; j < width; j++) { - var index0 = indexBase + j; - // using the property: labels[neighborsSignificance[index]] === 0 - // when neighborsSignificance[index] === 0 - var allEmpty = (checkAllEmpty && - processingFlags[index0] === 0 && - processingFlags[index0 + oneRowDown] === 0 && - processingFlags[index0 + twoRowsDown] === 0 && - processingFlags[index0 + threeRowsDown] === 0 && - neighborsSignificance[index0] === 0 && - neighborsSignificance[index0 + oneRowDown] === 0 && - neighborsSignificance[index0 + twoRowsDown] === 0 && - neighborsSignificance[index0 + threeRowsDown] === 0); - var i1 = 0, index = index0; - var i = i0, sign; - if (allEmpty) { - var hasSignificantCoefficent = - decoder.readBit(contexts, RUNLENGTH_CONTEXT); - if (!hasSignificantCoefficent) { - bitsDecoded[index0]++; - bitsDecoded[index0 + oneRowDown]++; - bitsDecoded[index0 + twoRowsDown]++; - bitsDecoded[index0 + threeRowsDown]++; - continue; // next column - } - i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (i1 !== 0) { - i = i0 + i1; - index += i1 * width; - } - - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - - index = index0; - for (var i2 = i0; i2 <= i; i2++, index += width) { - bitsDecoded[index]++; - } - - i1++; - } - for (i = i0 + i1; i < iNext; i++, index += width) { - if (coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision === 1) { - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - } - } - } - }, - checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { - var decoder = this.decoder; - var contexts = this.contexts; - var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (symbol !== 0xA) { - throw new Error('JPX Error: Invalid segmentation symbol'); - } - } - }; - - return BitModel; - })(); - - // Section F, Discrete wavelet transformation - var Transform = (function TransformClosure() { - function Transform() {} - - Transform.prototype.calculate = - function transformCalculate(subbands, u0, v0) { - var ll = subbands[0]; - for (var i = 1, ii = subbands.length; i < ii; i++) { - ll = this.iterate(ll, subbands[i], u0, v0); - } - return ll; - }; - Transform.prototype.extend = function extend(buffer, offset, size) { - // Section F.3.7 extending... using max extension of 4 - var i1 = offset - 1, j1 = offset + 1; - var i2 = offset + size - 2, j2 = offset + size; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1] = buffer[j1]; - buffer[j2] = buffer[i2]; - }; - Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, - u0, v0) { - var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; - var width = hl_lh_hh.width; - var height = hl_lh_hh.height; - var items = hl_lh_hh.items; - var i, j, k, l, u, v; - - // Interleave LL according to Section F.3.3 - for (k = 0, i = 0; i < llHeight; i++) { - l = i * 2 * width; - for (j = 0; j < llWidth; j++, k++, l += 2) { - items[l] = llItems[k]; - } - } - // The LL band is not needed anymore. - llItems = ll.items = null; - - var bufferPadding = 4; - var rowBuffer = new Float32Array(width + 2 * bufferPadding); - - // Section F.3.4 HOR_SR - if (width === 1) { - // if width = 1, when u0 even keep items as is, when odd divide by 2 - if ((u0 & 1) !== 0) { - for (v = 0, k = 0; v < height; v++, k += width) { - items[k] *= 0.5; - } - } - } else { - for (v = 0, k = 0; v < height; v++, k += width) { - rowBuffer.set(items.subarray(k, k + width), bufferPadding); - - this.extend(rowBuffer, bufferPadding, width); - this.filter(rowBuffer, bufferPadding, width); - - items.set( - rowBuffer.subarray(bufferPadding, bufferPadding + width), - k); - } - } - - // Accesses to the items array can take long, because it may not fit into - // CPU cache and has to be fetched from main memory. Since subsequent - // accesses to the items array are not local when reading columns, we - // have a cache miss every time. To reduce cache misses, get up to - // 'numBuffers' items at a time and store them into the individual - // buffers. The colBuffers should be small enough to fit into CPU cache. - var numBuffers = 16; - var colBuffers = []; - for (i = 0; i < numBuffers; i++) { - colBuffers.push(new Float32Array(height + 2 * bufferPadding)); - } - var b, currentBuffer = 0; - ll = bufferPadding + height; - - // Section F.3.5 VER_SR - if (height === 1) { - // if height = 1, when v0 even keep items as is, when odd divide by 2 - if ((v0 & 1) !== 0) { - for (u = 0; u < width; u++) { - items[u] *= 0.5; - } - } - } else { - for (u = 0; u < width; u++) { - // if we ran out of buffers, copy several image columns at once - if (currentBuffer === 0) { - numBuffers = Math.min(width - u, numBuffers); - for (k = u, l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - colBuffers[b][l] = items[k + b]; - } - } - currentBuffer = numBuffers; - } - - currentBuffer--; - var buffer = colBuffers[currentBuffer]; - this.extend(buffer, bufferPadding, height); - this.filter(buffer, bufferPadding, height); - - // If this is last buffer in this group of buffers, flush all buffers. - if (currentBuffer === 0) { - k = u - numBuffers + 1; - for (l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - items[k + b] = colBuffers[b][l]; - } - } - } - } - } - - return { - width: width, - height: height, - items: items - }; - }; - return Transform; - })(); - - // Section 3.8.2 Irreversible 9-7 filter - var IrreversibleTransform = (function IrreversibleTransformClosure() { - function IrreversibleTransform() { - Transform.call(this); - } - - IrreversibleTransform.prototype = Object.create(Transform.prototype); - IrreversibleTransform.prototype.filter = - function irreversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n, current, next; - - var alpha = -1.586134342059924; - var beta = -0.052980118572961; - var gamma = 0.882911075530934; - var delta = 0.443506852043971; - var K = 1.230174104914001; - var K_ = 1 / K; - - // step 1 is combined with step 3 - - // step 2 - j = offset - 3; - for (n = len + 4; n--; j += 2) { - x[j] *= K_; - } - - // step 1 & 3 - j = offset - 2; - current = delta * x[j -1]; - for (n = len + 3; n--; j += 2) { - next = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - if (n--) { - j += 2; - current = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - } else { - break; - } - } - - // step 4 - j = offset - 1; - current = gamma * x[j - 1]; - for (n = len + 2; n--; j += 2) { - next = gamma * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = gamma * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 5 - j = offset; - current = beta * x[j - 1]; - for (n = len + 1; n--; j += 2) { - next = beta * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = beta * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 6 - if (len !== 0) { - j = offset + 1; - current = alpha * x[j - 1]; - for (n = len; n--; j += 2) { - next = alpha * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = alpha * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - } - }; - - return IrreversibleTransform; - })(); - - // Section 3.8.1 Reversible 5-3 filter - var ReversibleTransform = (function ReversibleTransformClosure() { - function ReversibleTransform() { - Transform.call(this); - } - - ReversibleTransform.prototype = Object.create(Transform.prototype); - ReversibleTransform.prototype.filter = - function reversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n; - - for (j = offset, n = len + 1; n--; j += 2) { - x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2; - } - - for (j = offset + 1, n = len; n--; j += 2) { - x[j] += (x[j - 1] + x[j + 1]) >> 1; - } - }; - - return ReversibleTransform; - })(); - - return JpxImage; -})(); - - -var Jbig2Image = (function Jbig2ImageClosure() { - // Utility data structures - function ContextCache() {} - - ContextCache.prototype = { - getContexts: function(id) { - if (id in this) { - return this[id]; - } - return (this[id] = new Int8Array(1 << 16)); - } - }; - - function DecodingContext(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - - DecodingContext.prototype = { - get decoder() { - var decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, 'decoder', decoder); - }, - get contextCache() { - var cache = new ContextCache(); - return shadow(this, 'contextCache', cache); - } - }; - - // Annex A. Arithmetic Integer Decoding Procedure - // A.2 Procedure for decoding values - function decodeInteger(contextCache, procedure, decoder) { - var contexts = contextCache.getContexts(procedure); - var prev = 1; - - function readBits(length) { - var v = 0; - for (var i = 0; i < length; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev < 256 ? (prev << 1) | bit : - (((prev << 1) | bit) & 511) | 256); - v = (v << 1) | bit; - } - return v >>> 0; - } - - var sign = readBits(1); - var value = readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(32) + 4436) : - readBits(12) + 340) : - readBits(8) + 84) : - readBits(6) + 20) : - readBits(4) + 4) : - readBits(2); - return (sign === 0 ? value : (value > 0 ? -value : null)); - } - - // A.3 The IAID decoding procedure - function decodeIAID(contextCache, decoder, codeLength) { - var contexts = contextCache.getContexts('IAID'); - - var prev = 1; - for (var i = 0; i < codeLength; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev << 1) | bit; - } - if (codeLength < 31) { - return prev & ((1 << codeLength) - 1); - } - return prev & 0x7FFFFFFF; - } - - // 7.3 Segment types - var SegmentTypes = [ - 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, - 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, - null, null, null, null, null, 'patternDictionary', null, null, null, - 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', - 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, - null, null, null, null, null, 'IntermediateGenericRegion', null, - 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', - 'IntermediateGenericRefinementRegion', null, - 'ImmediateGenericRefinementRegion', - 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, - 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', - 'Tables', null, null, null, null, null, null, null, null, - 'Extension' - ]; - - var CodingTemplates = [ - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1}, - {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2}, - {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, - {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0}, - {x: -1, y: 0}], - [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, - {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}] - ]; - - var RefinementTemplates = [ - { - coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, - {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}] - }, - { - coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0}, - {x: 0, y: 1}, {x: 1, y: 1}] - } - ]; - - // See 6.2.5.7 Decoding the bitmap. - var ReusedContexts = [ - 0x9B25, // 10011 0110010 0101 - 0x0795, // 0011 110010 101 - 0x00E5, // 001 11001 01 - 0x0195 // 011001 0101 - ]; - - var RefinementReusedContexts = [ - 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference) - 0x0008 // '0000' + '001000' - ]; - - function decodeBitmapTemplate0(width, height, decodingContext) { - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; - - // ...ooooo.... - // ..ooooooo... Context template for current pixel (X) - // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel) - var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111 - - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = (i < 1) ? row : bitmap[i - 1]; - row2 = (i < 2) ? row : bitmap[i - 2]; - - // At the beginning of each row: - // Fill contextLabel with pixels that are above/right of (X) - contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) | - (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) | - (row1[3] << 4); - - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - - // At each pixel: Clear contextLabel pixels that are shifted - // out of the context, then add new ones. - contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) | - (j + 3 < width ? row2[j + 3] << 11 : 0) | - (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - - return bitmap; - } - - // 6.2 Generic Region Decoding Procedure - function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, - decodingContext) { - if (mmr) { - error('JBIG2 error: MMR encoding is not supported'); - } - - // Use optimized version for the most common case - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && - at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && - at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - - var useskip = !!skip; - var template = CodingTemplates[templateIndex].concat(at); - - // Sorting is non-standard, and it is not required. But sorting increases - // the number of template bits that can be reused from the previous - // contextLabel in the main loop. - template.sort(function (a, b) { - return (a.y - b.y) || (a.x - b.x); - }); - - var templateLength = template.length; - var templateX = new Int8Array(templateLength); - var templateY = new Int8Array(templateLength); - var changingTemplateEntries = []; - var reuseMask = 0, minX = 0, maxX = 0, minY = 0; - var c, k; - - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - // Check if the template pixel appears in two consecutive context labels, - // so it can be reused. Otherwise, we add it to the list of changing - // template entries. - if (k < templateLength - 1 && - template[k].y === template[k + 1].y && - template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << (templateLength - 1 - k); - } else { - changingTemplateEntries.push(k); - } - } - var changingEntriesLength = changingTemplateEntries.length; - - var changingTemplateX = new Int8Array(changingEntriesLength); - var changingTemplateY = new Int8Array(changingEntriesLength); - var changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << (templateLength - 1 - k); - } - - // Get the safe bounding box edges from the width, height, minX, maxX, minY - var sbb_left = -minX; - var sbb_top = -minY; - var sbb_right = width - maxX; - - var pseudoPixelContext = ReusedContexts[templateIndex]; - var row = new Uint8Array(width); - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - - var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); // duplicate previous row - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - // Are we in the middle of a scanline, so we can reuse contextLabel - // bits? - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - // If yes, we can just shift the bits that are reusable and only - // fetch the remaining ones. - contextLabel = (contextLabel << 1) & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - // compute the contextLabel from scratch - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; - } - } - } - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; - } - - // 6.3.2 Generic Refinement Region Decoding Procedure - function decodeRefinement(width, height, templateIndex, referenceBitmap, - offsetX, offsetY, prediction, at, - decodingContext) { - var codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([at[0]]); - } - var codingTemplateLength = codingTemplate.length; - var codingTemplateX = new Int32Array(codingTemplateLength); - var codingTemplateY = new Int32Array(codingTemplateLength); - var k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - - var referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([at[1]]); - } - var referenceTemplateLength = referenceTemplate.length; - var referenceTemplateX = new Int32Array(referenceTemplateLength); - var referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - var referenceWidth = referenceBitmap[0].length; - var referenceHeight = referenceBitmap.length; - - var pseudoPixelContext = RefinementReusedContexts[templateIndex]; - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GR'); - - var ltp = 0; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - error('JBIG2 error: prediction is not supported'); - } - } - var row = new Uint8Array(width); - bitmap.push(row); - for (var j = 0; j < width; j++) { - var i0, j0; - var contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] + offsetY; - j0 = j + referenceTemplateX[k] + offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || - j0 >= referenceWidth) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - - return bitmap; - } - - // 6.5.5 Decoding the symbol dictionary - function decodeSymbolDictionary(huffman, refinement, symbols, - numberOfNewSymbols, numberOfExportedSymbols, - huffmanTables, templateIndex, at, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - var newSymbols = []; - var currentHeight = 0; - var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - - while (newSymbols.length < numberOfNewSymbols) { - var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6 - currentHeight += deltaHeight; - var currentWidth = 0; - var totalWidth = 0; - while (true) { - var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7 - if (deltaWidth === null) { - break; // OOB - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - var bitmap; - if (refinement) { - // 6.5.8.2 Refinement/aggregate-coded symbol bitmap - var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, - currentWidth, currentHeight, 0, - numberOfInstances, 1, //strip size - symbols.concat(newSymbols), - symbolCodeLength, - 0, //transposed - 0, //ds offset - 1, //top left 7.4.3.1.1 - 0, //OR operator - huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext); - } else { - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - var symbol = (symbolId < symbols.length ? symbols[symbolId] : - newSymbols[symbolId - symbols.length]); - bitmap = decodeRefinement(currentWidth, currentHeight, - refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, - decodingContext); - } - } else { - // 6.5.8.1 Direct-coded symbol bitmap - bitmap = decodeBitmap(false, currentWidth, currentHeight, - templateIndex, false, null, at, decodingContext); - } - newSymbols.push(bitmap); - } - } - // 6.5.10 Exported symbols - var exportedSymbols = []; - var flags = [], currentFlag = false; - var totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - var runLength = decodeInteger(contextCache, 'IAEX', decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (var i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (var j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; - } - - function decodeTextRegion(huffman, refinement, width, height, - defaultPixelValue, numberOfSymbolInstances, - stripSize, inputSymbols, symbolCodeLength, - transposed, dsOffset, referenceCorner, - combinationOperator, huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Prepare bitmap - var bitmap = []; - var i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - for (var j = 0; j < width; j++) { - row[j] = defaultPixelValue; - } - } - bitmap.push(row); - } - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - var firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - stripT += deltaT; - - var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7 - firstS += deltaFirstS; - var currentS = firstS; - do { - var currentT = (stripSize === 1 ? 0 : - decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9 - var t = stripSize * stripT + currentT; - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var applyRefinement = (refinement && - decodeInteger(contextCache, 'IARI', decoder)); - var symbolBitmap = inputSymbols[symbolId]; - var symbolWidth = symbolBitmap[0].length; - var symbolHeight = symbolBitmap.length; - if (applyRefinement) { - var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1 - var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2 - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, - refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, - (rdh >> 1) + rdy, false, refinementAt, - decodingContext); - } - var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight); - var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0); - var s2, t2, symbolRow; - if (transposed) { - // Place Symbol Bitmap from T1,S1 - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - // To ignore Parts of Symbol bitmap which goes - // outside bitmap region - var maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: // OR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - case 2: // XOR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolHeight - 1; - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: // OR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; - } - break; - case 2: // XOR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolWidth - 1; - } - i++; - var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8 - if (deltaS === null) { - break; // OOB - } - currentS += deltaS + dsOffset; - } while (true); - } - return bitmap; - } - - function readSegmentHeader(data, start) { - var segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - var flags = data[start + 4]; - var segmentType = flags & 0x3F; - if (!SegmentTypes[segmentType]) { - error('JBIG2 error: invalid segment type: ' + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 0x80); - - var pageAssociationFieldSize = !!(flags & 0x40); - var referredFlags = data[start + 5]; - var referredToCount = (referredFlags >> 5) & 7; - var retainBits = [referredFlags & 31]; - var position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF; - position += 3; - var bytes = (referredToCount + 7) >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - error('JBIG2 error: invalid referred-to flags'); - } - - segmentHeader.retainBits = retainBits; - var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 : - (segmentHeader.number <= 65536 ? 2 : 4)); - var referredTo = []; - var i, ii; - for (i = 0; i < referredToCount; i++) { - var number = (referredToSegmentNumberSize === 1 ? data[position] : - (referredToSegmentNumberSize === 2 ? readUint16(data, position) : - readUint32(data, position))); - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - - if (segmentHeader.length === 0xFFFFFFFF) { - // 7.2.7 Segment data length, unknown segment length - if (segmentType === 38) { // ImmediateGenericRegion - var genericRegionInfo = readRegionSegmentInformation(data, position); - var genericRegionSegmentFlags = data[position + - RegionSegmentInformationFieldLength]; - var genericRegionMmr = !!(genericRegionSegmentFlags & 1); - // searching for the segment end - var searchPatternLength = 6; - var searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 0xFF; - searchPattern[1] = 0xAC; - } - searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF; - searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF; - searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF; - searchPattern[5] = genericRegionInfo.height & 0xFF; - for (i = position, ii = data.length; i < ii; i++) { - var j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 0xFFFFFFFF) { - error('JBIG2 error: segment end was not found'); - } - } else { - error('JBIG2 error: invalid unknown segment length'); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; - } - - function readSegments(header, data, start, end) { - var segments = []; - var position = start; - while (position < end) { - var segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - var segment = { - header: segmentHeader, - data: data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; // end of file is found - } - } - if (header.randomAccess) { - for (var i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; - } - - // 7.4.1 Region segment information field - function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; - } - var RegionSegmentInformationFieldLength = 17; - - function processSegment(segment, visitor) { - var header = segment.header; - - var data = segment.data, position = segment.start, end = segment.end; - var args, at, i, atLength; - switch (header.type) { - case 0: // SymbolDictionary - // 7.4.2 Symbol dictionary segment syntax - var dictionary = {}; - var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1 - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3; - dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3; - dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1; - dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = (dictionaryFlags >> 10) & 3; - dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [dictionary, header.number, header.referredTo, - data, position, end]; - break; - case 6: // ImmediateTextRegion - case 7: // ImmediateLosslessTextRegion - var textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3); - textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3; - textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1; - textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27; - textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1; - if (textRegion.huffman) { - var textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = (textRegionHuffmanFlags) & 3; - textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3; - textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3; - textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3; - textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3; - textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3; - textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3; - textRegion.huffmanRefinementSizeSelector = - !!(textRegionHuffmanFlags & 14); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - // TODO 7.4.3.1.7 Symbol ID Huffman table decoding - if (textRegion.huffman) { - error('JBIG2 error: huffman is not supported'); - } - args = [textRegion, header.referredTo, data, position, end]; - break; - case 38: // ImmediateGenericRegion - case 39: // ImmediateLosslessGenericRegion - var genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = (genericRegionSegmentFlags >> 1) & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [genericRegion, data, position, end]; - break; - case 48: // PageInformation - var pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 0xFFFFFFFF) { - delete pageInfo.height; - } - var pageSegmentFlags = data[position + 16]; - var pageStripingInformatiom = readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1; - pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [pageInfo]; - break; - case 49: // EndOfPage - break; - case 50: // EndOfStripe - break; - case 51: // EndOfFile - break; - case 62: // 7.4.15 defines 2 extension types which - // are comments and can be ignored. - break; - default: - error('JBIG2 error: segment type ' + header.typeName + '(' + - header.type + ') is not implemented'); - } - var callbackName = 'on' + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } - } - - function processSegments(segments, visitor) { - for (var i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } - } - - function parseJbig2(data, start, end) { - var position = start; - if (data[position] !== 0x97 || data[position + 1] !== 0x4A || - data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || - data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || - data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) { - error('JBIG2 error: invalid header'); - } - var header = {}; - position += 8; - var flags = data[position++]; - header.randomAccess = !(flags & 1); - if (!(flags & 2)) { - header.numberOfPages = readUint32(data, position); - position += 4; - } - var segments = readSegments(header, data, position, end); - error('Not implemented'); - // processSegments(segments, new SimpleSegmentVisitor()); - } - - function parseJbig2Chunks(chunks) { - var visitor = new SimpleSegmentVisitor(); - for (var i = 0, ii = chunks.length; i < ii; i++) { - var chunk = chunks[i]; - var segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor.buffer; - } - - function SimpleSegmentVisitor() {} - - SimpleSegmentVisitor.prototype = { - onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { - this.currentPageInfo = info; - var rowSize = (info.width + 7) >> 3; - var buffer = new Uint8Array(rowSize * info.height); - // The contents of ArrayBuffers are initialized to 0. - // Fill the buffer with 0xFF only if info.defaultPixelValue is set - if (info.defaultPixelValue) { - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = 0xFF; - } - } - this.buffer = buffer; - }, - drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { - var pageInfo = this.currentPageInfo; - var width = regionInfo.width, height = regionInfo.height; - var rowSize = (pageInfo.width + 7) >> 3; - var combinationOperator = pageInfo.combinationOperatorOverride ? - regionInfo.combinationOperator : pageInfo.combinationOperator; - var buffer = this.buffer; - var mask0 = 128 >> (regionInfo.x & 7); - var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - var i, j, mask, offset; - switch (combinationOperator) { - case 0: // OR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - case 2: // XOR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - }, - onImmediateGenericRegion: - function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, - start, end) { - var regionInfo = region.info; - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, - region.template, region.prediction, null, - region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessGenericRegion: - function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion.apply(this, arguments); - }, - onSymbolDictionary: - function SimpleSegmentVisitor_onSymbolDictionary(dictionary, - currentSegment, - referredSegments, - data, start, end) { - var huffmanTables; - if (dictionary.huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - - var decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, - dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, - dictionary.numberOfExportedSymbols, huffmanTables, - dictionary.template, dictionary.at, - dictionary.refinementTemplate, dictionary.refinementAt, - decodingContext); - }, - onImmediateTextRegion: - function SimpleSegmentVisitor_onImmediateTextRegion(region, - referredSegments, - data, start, end) { - var regionInfo = region.info; - var huffmanTables; - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - var symbolCodeLength = log2(inputSymbols.length); - - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeTextRegion(region.huffman, region.refinement, - regionInfo.width, regionInfo.height, region.defaultPixelValue, - region.numberOfSymbolInstances, region.stripSize, inputSymbols, - symbolCodeLength, region.transposed, region.dsOffset, - region.referenceCorner, region.combinationOperator, huffmanTables, - region.refinementTemplate, region.refinementAt, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessTextRegion: - function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { - this.onImmediateTextRegion.apply(this, arguments); - } - }; - - function Jbig2Image() {} - - Jbig2Image.prototype = { - parseChunks: function Jbig2Image_parseChunks(chunks) { - return parseJbig2Chunks(chunks); - } - }; - - return Jbig2Image; -})(); - - -var bidi = PDFJS.bidi = (function bidiClosure() { - // Character types for symbols from 0000 to 00FF. - var baseTypes = [ - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', - 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN', - 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON', - 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', - 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', - 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' - ]; - - // Character types for symbols from 0600 to 06FF - var arabicTypes = [ - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', - 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM', - 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL' - ]; - - function isOdd(i) { - return (i & 1) !== 0; - } - - function isEven(i) { - return (i & 1) === 0; - } - - function findUnequal(arr, start, value) { - for (var j = start, jj = arr.length; j < jj; ++j) { - if (arr[j] !== value) { - return j; - } - } - return j; - } - - function setValues(arr, start, end, value) { - for (var j = start; j < end; ++j) { - arr[j] = value; - } - } - - function reverseValues(arr, start, end) { - for (var i = start, j = end - 1; i < j; ++i, --j) { - var temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - } - - function createBidiText(str, isLTR, vertical) { - return { - str: str, - dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl')) - }; - } - - // These are used in bidi(), which is called frequently. We re-use them on - // each call to avoid unnecessary allocations. - var chars = []; - var types = []; - - function bidi(str, startLevel, vertical) { - var isLTR = true; - var strLength = str.length; - if (strLength === 0 || vertical) { - return createBidiText(str, isLTR, vertical); - } - - // Get types and fill arrays - chars.length = strLength; - types.length = strLength; - var numBidi = 0; - - var i, ii; - for (i = 0; i < strLength; ++i) { - chars[i] = str.charAt(i); - - var charCode = str.charCodeAt(i); - var charType = 'L'; - if (charCode <= 0x00ff) { - charType = baseTypes[charCode]; - } else if (0x0590 <= charCode && charCode <= 0x05f4) { - charType = 'R'; - } else if (0x0600 <= charCode && charCode <= 0x06ff) { - charType = arabicTypes[charCode & 0xff]; - } else if (0x0700 <= charCode && charCode <= 0x08AC) { - charType = 'AL'; - } - if (charType === 'R' || charType === 'AL' || charType === 'AN') { - numBidi++; - } - types[i] = charType; - } - - // Detect the bidi method - // - If there are no rtl characters then no bidi needed - // - If less than 30% chars are rtl then string is primarily ltr - // - If more than 30% chars are rtl then string is primarily rtl - if (numBidi === 0) { - isLTR = true; - return createBidiText(str, isLTR); - } - - if (startLevel === -1) { - if ((strLength / numBidi) < 0.3) { - isLTR = true; - startLevel = 0; - } else { - isLTR = false; - startLevel = 1; - } - } - - var levels = []; - for (i = 0; i < strLength; ++i) { - levels[i] = startLevel; - } - - /* - X1-X10: skip most of this, since we are NOT doing the embeddings. - */ - var e = (isOdd(startLevel) ? 'R' : 'L'); - var sor = e; - var eor = sor; - - /* - W1. Examine each non-spacing mark (NSM) in the level run, and change the - type of the NSM to the type of the previous character. If the NSM is at the - start of the level run, it will get the type of sor. - */ - var lastType = sor; - for (i = 0; i < strLength; ++i) { - if (types[i] === 'NSM') { - types[i] = lastType; - } else { - lastType = types[i]; - } - } - - /* - W2. Search backwards from each instance of a European number until the - first strong type (R, L, AL, or sor) is found. If an AL is found, change - the type of the European number to Arabic number. - */ - lastType = sor; - var t; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = (lastType === 'AL') ? 'AN' : 'EN'; - } else if (t === 'R' || t === 'L' || t === 'AL') { - lastType = t; - } - } - - /* - W3. Change all ALs to R. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'AL') { - types[i] = 'R'; - } - } - - /* - W4. A single European separator between two European numbers changes to a - European number. A single common separator between two numbers of the same - type changes to that type: - */ - for (i = 1; i < strLength - 1; ++i) { - if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') { - types[i] = 'EN'; - } - if (types[i] === 'CS' && - (types[i - 1] === 'EN' || types[i - 1] === 'AN') && - types[i + 1] === types[i - 1]) { - types[i] = types[i - 1]; - } - } - - /* - W5. A sequence of European terminators adjacent to European numbers changes - to all European numbers: - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'EN') { - // do before - var j; - for (j = i - 1; j >= 0; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - // do after - for (j = i + 1; j < strLength; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - } - } - - /* - W6. Otherwise, separators and terminators change to Other Neutral: - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') { - types[i] = 'ON'; - } - } - - /* - W7. Search backwards from each instance of a European number until the - first strong type (R, L, or sor) is found. If an L is found, then change - the type of the European number to L. - */ - lastType = sor; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = ((lastType === 'L') ? 'L' : 'EN'); - } else if (t === 'R' || t === 'L') { - lastType = t; - } - } - - /* - N1. A sequence of neutrals takes the direction of the surrounding strong - text if the text on both sides has the same direction. European and Arabic - numbers are treated as though they were R. Start-of-level-run (sor) and - end-of-level-run (eor) are used at level run boundaries. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - var end = findUnequal(types, i + 1, 'ON'); - var before = sor; - if (i > 0) { - before = types[i - 1]; - } - - var after = eor; - if (end + 1 < strLength) { - after = types[end + 1]; - } - if (before !== 'L') { - before = 'R'; - } - if (after !== 'L') { - after = 'R'; - } - if (before === after) { - setValues(types, i, end, before); - } - i = end - 1; // reset to end (-1 so next iteration is ok) - } - } - - /* - N2. Any remaining neutrals take the embedding direction. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - types[i] = e; - } - } - - /* - I1. For all characters with an even (left-to-right) embedding direction, - those of type R go up one level and those of type AN or EN go up two - levels. - I2. For all characters with an odd (right-to-left) embedding direction, - those of type L, EN or AN go up one level. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (isEven(levels[i])) { - if (t === 'R') { - levels[i] += 1; - } else if (t === 'AN' || t === 'EN') { - levels[i] += 2; - } - } else { // isOdd - if (t === 'L' || t === 'AN' || t === 'EN') { - levels[i] += 1; - } - } - } - - /* - L1. On each line, reset the embedding level of the following characters to - the paragraph embedding level: - - segment separators, - paragraph separators, - any sequence of whitespace characters preceding a segment separator or - paragraph separator, and any sequence of white space characters at the end - of the line. - */ - - // don't bother as text is only single line - - /* - L2. From the highest level found in the text to the lowest odd level on - each line, reverse any contiguous sequence of characters that are at that - level or higher. - */ - - // find highest level & lowest odd level - var highestLevel = -1; - var lowestOddLevel = 99; - var level; - for (i = 0, ii = levels.length; i < ii; ++i) { - level = levels[i]; - if (highestLevel < level) { - highestLevel = level; - } - if (lowestOddLevel > level && isOdd(level)) { - lowestOddLevel = level; - } - } - - // now reverse between those limits - for (level = highestLevel; level >= lowestOddLevel; --level) { - // find segments to reverse - var start = -1; - for (i = 0, ii = levels.length; i < ii; ++i) { - if (levels[i] < level) { - if (start >= 0) { - reverseValues(chars, start, i); - start = -1; - } - } else if (start < 0) { - start = i; - } - } - if (start >= 0) { - reverseValues(chars, start, levels.length); - } - } - - /* - L3. Combining marks applied to a right-to-left base character will at this - point precede their base character. If the rendering engine expects them to - follow the base characters in the final display process, then the ordering - of the marks and the base character must be reversed. - */ - - // don't bother for now - - /* - L4. A character that possesses the mirrored property as specified by - Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved - directionality of that character is R. - */ - - // don't mirror as characters are already mirrored in the pdf - - // Finally, return string - for (i = 0, ii = chars.length; i < ii; ++i) { - var ch = chars[i]; - if (ch === '<' || ch === '>') { - chars[i] = ''; - } - } - return createBidiText(chars.join(''), isLTR); - } - - return bidi; -})(); - - - -var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) { - // Workaround for missing math precison in JS. - var MASK_HIGH = 0xffff0000; - var MASK_LOW = 0xffff; - - function MurmurHash3_64 (seed) { - var SEED = 0xc3d2e1f0; - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; - } - - var alwaysUseUint32ArrayView = false; - // old webkits have issues with non-aligned arrays - try { - new Uint32Array(new Uint8Array(5).buffer, 0, 1); - } catch (e) { - alwaysUseUint32ArrayView = true; - } - - MurmurHash3_64.prototype = { - update: function MurmurHash3_64_update(input) { - var useUint32ArrayView = alwaysUseUint32ArrayView; - var i; - if (typeof input === 'string') { - var data = new Uint8Array(input.length * 2); - var length = 0; - for (i = 0; i < input.length; i++) { - var code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; - } - else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; - } - } - } else if (input instanceof Uint8Array) { - data = input; - length = data.length; - } else if (typeof input === 'object' && ('length' in input)) { - // processing regular arrays as well, e.g. for IE9 - data = input; - length = data.length; - useUint32ArrayView = true; - } else { - throw new Error('Wrong data format in MurmurHash3_64_update. ' + - 'Input must be a string or array.'); - } - - var blockCounts = length >> 2; - var tailLength = length - blockCounts * 4; - // we don't care about endianness here - var dataUint32 = useUint32ArrayView ? - new Uint32ArrayView(data, blockCounts) : - new Uint32Array(data.buffer, 0, blockCounts); - var k1 = 0; - var k2 = 0; - var h1 = this.h1; - var h2 = this.h2; - var C1 = 0xcc9e2d51; - var C2 = 0x1b873593; - var C1_LOW = C1 & MASK_LOW; - var C2_LOW = C2 & MASK_LOW; - - for (i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW); - k2 = k2 << 15 | k2 >>> 17; - k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW); - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; - } - } - - k1 = 0; - - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - /* falls through */ - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - /* falls through */ - case 1: - k1 ^= data[blockCounts * 4]; - /* falls through */ - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } - } - - this.h1 = h1; - this.h2 = h2; - return this; - }, - - hexdigest: function MurmurHash3_64_hexdigest () { - var h1 = this.h1; - var h2 = this.h2; - - h1 ^= h2 >>> 1; - h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW); - h2 = (h2 * 0xff51afd7 & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW); - h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - - for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) { - var hex = (arr[i] >>> 0).toString(16); - while (hex.length < 8) { - hex = '0' + hex; - } - str += hex; - } - - return str; - } - }; - - return MurmurHash3_64; -})(); - - -}).call((typeof window === 'undefined') ? this : window); - -if (!PDFJS.workerSrc && typeof document !== 'undefined') { - // workerSrc is not set -- using last script url to define default location - PDFJS.workerSrc = (function () { - 'use strict'; - var pdfJsSrc = document.currentScript.src; - return pdfJsSrc && pdfJsSrc.replace(/\.js$/i, '.worker.js'); - })(); -} - - From 6cf847146a8448238ef1ea5e061146148d8c3c78 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 2 Mar 2017 09:33:08 +0000 Subject: [PATCH 10/60] delete pdfjs-1.3.91p1 --- .../js/libs/pdfjs-1.3.91p1/compatibility.js | 593 - .../web/public/js/libs/pdfjs-1.3.91p1/pdf.js | 9534 ---- .../js/libs/pdfjs-1.3.91p1/pdf.worker.js | 40698 ---------------- 3 files changed, 50825 deletions(-) delete mode 100644 services/web/public/js/libs/pdfjs-1.3.91p1/compatibility.js delete mode 100644 services/web/public/js/libs/pdfjs-1.3.91p1/pdf.js delete mode 100644 services/web/public/js/libs/pdfjs-1.3.91p1/pdf.worker.js diff --git a/services/web/public/js/libs/pdfjs-1.3.91p1/compatibility.js b/services/web/public/js/libs/pdfjs-1.3.91p1/compatibility.js deleted file mode 100644 index 1119a2742a..0000000000 --- a/services/web/public/js/libs/pdfjs-1.3.91p1/compatibility.js +++ /dev/null @@ -1,593 +0,0 @@ -/* Copyright 2012 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. - */ -/* globals VBArray, PDFJS */ - -'use strict'; - -// Initializing PDFJS global object here, it case if we need to change/disable -// some PDF.js features, e.g. range requests -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -// Checking if the typed arrays are supported -// Support: iOS<6.0 (subarray), IE<10, Android<4.0 -(function checkTypedArrayCompatibility() { - if (typeof Uint8Array !== 'undefined') { - // Support: iOS<6.0 - if (typeof Uint8Array.prototype.subarray === 'undefined') { - Uint8Array.prototype.subarray = function subarray(start, end) { - return new Uint8Array(this.slice(start, end)); - }; - Float32Array.prototype.subarray = function subarray(start, end) { - return new Float32Array(this.slice(start, end)); - }; - } - - // Support: Android<4.1 - if (typeof Float64Array === 'undefined') { - window.Float64Array = Float32Array; - } - return; - } - - function subarray(start, end) { - return new TypedArray(this.slice(start, end)); - } - - function setArrayOffset(array, offset) { - if (arguments.length < 2) { - offset = 0; - } - for (var i = 0, n = array.length; i < n; ++i, ++offset) { - this[offset] = array[i] & 0xFF; - } - } - - function TypedArray(arg1) { - var result, i, n; - if (typeof arg1 === 'number') { - result = []; - for (i = 0; i < arg1; ++i) { - result[i] = 0; - } - } else if ('slice' in arg1) { - result = arg1.slice(0); - } else { - result = []; - for (i = 0, n = arg1.length; i < n; ++i) { - result[i] = arg1[i]; - } - } - - result.subarray = subarray; - result.buffer = result; - result.byteLength = result.length; - result.set = setArrayOffset; - - if (typeof arg1 === 'object' && arg1.buffer) { - result.buffer = arg1.buffer; - } - return result; - } - - window.Uint8Array = TypedArray; - window.Int8Array = TypedArray; - - // we don't need support for set, byteLength for 32-bit array - // so we can use the TypedArray as well - window.Uint32Array = TypedArray; - window.Int32Array = TypedArray; - window.Uint16Array = TypedArray; - window.Float32Array = TypedArray; - window.Float64Array = TypedArray; -})(); - -// URL = URL || webkitURL -// Support: Safari<7, Android 4.2+ -(function normalizeURLObject() { - if (!window.URL) { - window.URL = window.webkitURL; - } -})(); - -// Object.defineProperty()? -// Support: Android<4.0, Safari<5.1 -(function checkObjectDefinePropertyCompatibility() { - if (typeof Object.defineProperty !== 'undefined') { - var definePropertyPossible = true; - try { - // some browsers (e.g. safari) cannot use defineProperty() on DOM objects - // and thus the native version is not sufficient - Object.defineProperty(new Image(), 'id', { value: 'test' }); - // ... another test for android gb browser for non-DOM objects - var Test = function Test() {}; - Test.prototype = { get id() { } }; - Object.defineProperty(new Test(), 'id', - { value: '', configurable: true, enumerable: true, writable: false }); - } catch (e) { - definePropertyPossible = false; - } - if (definePropertyPossible) { - return; - } - } - - Object.defineProperty = function objectDefineProperty(obj, name, def) { - delete obj[name]; - if ('get' in def) { - obj.__defineGetter__(name, def['get']); - } - if ('set' in def) { - obj.__defineSetter__(name, def['set']); - } - if ('value' in def) { - obj.__defineSetter__(name, function objectDefinePropertySetter(value) { - this.__defineGetter__(name, function objectDefinePropertyGetter() { - return value; - }); - return value; - }); - obj[name] = def.value; - } - }; -})(); - - -// No XMLHttpRequest#response? -// Support: IE<11, Android <4.0 -(function checkXMLHttpRequestResponseCompatibility() { - var xhrPrototype = XMLHttpRequest.prototype; - var xhr = new XMLHttpRequest(); - if (!('overrideMimeType' in xhr)) { - // IE10 might have response, but not overrideMimeType - // Support: IE10 - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - if ('responseType' in xhr) { - return; - } - - // The worker will be using XHR, so we can save time and disable worker. - PDFJS.disableWorker = true; - - Object.defineProperty(xhrPrototype, 'responseType', { - get: function xmlHttpRequestGetResponseType() { - return this._responseType || 'text'; - }, - set: function xmlHttpRequestSetResponseType(value) { - if (value === 'text' || value === 'arraybuffer') { - this._responseType = value; - if (value === 'arraybuffer' && - typeof this.overrideMimeType === 'function') { - this.overrideMimeType('text/plain; charset=x-user-defined'); - } - } - } - }); - - // Support: IE9 - if (typeof VBArray !== 'undefined') { - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType === 'arraybuffer') { - return new Uint8Array(new VBArray(this.responseBody).toArray()); - } else { - return this.responseText; - } - } - }); - return; - } - - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType !== 'arraybuffer') { - return this.responseText; - } - var text = this.responseText; - var i, n = text.length; - var result = new Uint8Array(n); - for (i = 0; i < n; ++i) { - result[i] = text.charCodeAt(i) & 0xFF; - } - return result.buffer; - } - }); -})(); - -// window.btoa (base64 encode function) ? -// Support: IE<10 -(function checkWindowBtoaCompatibility() { - if ('btoa' in window) { - return; - } - - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - window.btoa = function windowBtoa(chars) { - var buffer = ''; - var i, n; - for (i = 0, n = chars.length; i < n; i += 3) { - var b1 = chars.charCodeAt(i) & 0xFF; - var b2 = chars.charCodeAt(i + 1) & 0xFF; - var b3 = chars.charCodeAt(i + 2) & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < n ? (b3 & 0x3F) : 64; - buffer += (digits.charAt(d1) + digits.charAt(d2) + - digits.charAt(d3) + digits.charAt(d4)); - } - return buffer; - }; -})(); - -// window.atob (base64 encode function)? -// Support: IE<10 -(function checkWindowAtobCompatibility() { - if ('atob' in window) { - return; - } - - // https://github.com/davidchambers/Base64.js - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - window.atob = function (input) { - input = input.replace(/=+$/, ''); - if (input.length % 4 === 1) { - throw new Error('bad atob input'); - } - for ( - // initialize result and counters - var bc = 0, bs, buffer, idx = 0, output = ''; - // get next character - buffer = input.charAt(idx++); - // character found in table? - // initialize bit storage and add its ascii value - ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, - // and if not first of each 4 characters, - // convert the first 8 bits to one ascii character - bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 - ) { - // try to find character in table (0-63, not found => -1) - buffer = digits.indexOf(buffer); - } - return output; - }; -})(); - -// Function.prototype.bind? -// Support: Android<4.0, iOS<6.0 -(function checkFunctionPrototypeBindCompatibility() { - if (typeof Function.prototype.bind !== 'undefined') { - return; - } - - Function.prototype.bind = function functionPrototypeBind(obj) { - var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); - var bound = function functionPrototypeBindBound() { - var args = headArgs.concat(Array.prototype.slice.call(arguments)); - return fn.apply(obj, args); - }; - return bound; - }; -})(); - -// HTMLElement dataset property -// Support: IE<11, Safari<5.1, Android<4.0 -(function checkDatasetProperty() { - var div = document.createElement('div'); - if ('dataset' in div) { - return; // dataset property exists - } - - Object.defineProperty(HTMLElement.prototype, 'dataset', { - get: function() { - if (this._dataset) { - return this._dataset; - } - - var dataset = {}; - for (var j = 0, jj = this.attributes.length; j < jj; j++) { - var attribute = this.attributes[j]; - if (attribute.name.substring(0, 5) !== 'data-') { - continue; - } - var key = attribute.name.substring(5).replace(/\-([a-z])/g, - function(all, ch) { - return ch.toUpperCase(); - }); - dataset[key] = attribute.value; - } - - Object.defineProperty(this, '_dataset', { - value: dataset, - writable: false, - enumerable: false - }); - return dataset; - }, - enumerable: true - }); -})(); - -// HTMLElement classList property -// Support: IE<10, Android<4.0, iOS<5.0 -(function checkClassListProperty() { - var div = document.createElement('div'); - if ('classList' in div) { - return; // classList property exists - } - - function changeList(element, itemName, add, remove) { - var s = element.className || ''; - var list = s.split(/\s+/g); - if (list[0] === '') { - list.shift(); - } - var index = list.indexOf(itemName); - if (index < 0 && add) { - list.push(itemName); - } - if (index >= 0 && remove) { - list.splice(index, 1); - } - element.className = list.join(' '); - return (index >= 0); - } - - var classListPrototype = { - add: function(name) { - changeList(this.element, name, true, false); - }, - contains: function(name) { - return changeList(this.element, name, false, false); - }, - remove: function(name) { - changeList(this.element, name, false, true); - }, - toggle: function(name) { - changeList(this.element, name, true, true); - } - }; - - Object.defineProperty(HTMLElement.prototype, 'classList', { - get: function() { - if (this._classList) { - return this._classList; - } - - var classList = Object.create(classListPrototype, { - element: { - value: this, - writable: false, - enumerable: true - } - }); - Object.defineProperty(this, '_classList', { - value: classList, - writable: false, - enumerable: false - }); - return classList; - }, - enumerable: true - }); -})(); - -// Check console compatibility -// In older IE versions the console object is not available -// unless console is open. -// Support: IE<10 -(function checkConsoleCompatibility() { - if (!('console' in window)) { - window.console = { - log: function() {}, - error: function() {}, - warn: function() {} - }; - } else if (!('bind' in console.log)) { - // native functions in IE9 might not have bind - console.log = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.log); - console.error = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.error); - console.warn = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.warn); - } -})(); - -// Check onclick compatibility in Opera -// Support: Opera<15 -(function checkOnClickCompatibility() { - // workaround for reported Opera bug DSK-354448: - // onclick fires on disabled buttons with opaque content - function ignoreIfTargetDisabled(event) { - if (isDisabled(event.target)) { - event.stopPropagation(); - } - } - function isDisabled(node) { - return node.disabled || (node.parentNode && isDisabled(node.parentNode)); - } - if (navigator.userAgent.indexOf('Opera') !== -1) { - // use browser detection since we cannot feature-check this bug - document.addEventListener('click', ignoreIfTargetDisabled, true); - } -})(); - -// Checks if possible to use URL.createObjectURL() -// Support: IE -(function checkOnBlobSupport() { - // sometimes IE loosing the data created with createObjectURL(), see #3977 - if (navigator.userAgent.indexOf('Trident') >= 0) { - PDFJS.disableCreateObjectURL = true; - } -})(); - -// Checks if navigator.language is supported -(function checkNavigatorLanguage() { - if ('language' in navigator) { - return; - } - PDFJS.locale = navigator.userLanguage || 'en-US'; -})(); - -(function checkRangeRequests() { - // Safari has issues with cached range requests see: - // https://github.com/mozilla/pdf.js/issues/3260 - // Last tested with version 6.0.4. - // Support: Safari 6.0+ - var isSafari = Object.prototype.toString.call( - window.HTMLElement).indexOf('Constructor') > 0; - - // Older versions of Android (pre 3.0) has issues with range requests, see: - // https://github.com/mozilla/pdf.js/issues/3381. - // Make sure that we only match webkit-based Android browsers, - // since Firefox/Fennec works as expected. - // Support: Android<3.0 - var regex = /Android\s[0-2][^\d]/; - var isOldAndroid = regex.test(navigator.userAgent); - - // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 - var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); - - if (isSafari || isOldAndroid || isChromeWithRangeBug) { - PDFJS.disableRange = true; - PDFJS.disableStream = true; - } -})(); - -// Check if the browser supports manipulation of the history. -// Support: IE<10, Android<4.2 -(function checkHistoryManipulation() { - // Android 2.x has so buggy pushState support that it was removed in - // Android 3.0 and restored as late as in Android 4.2. - // Support: Android 2.x - if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { - PDFJS.disableHistory = true; - } -})(); - -// Support: IE<11, Chrome<21, Android<4.4, Safari<6 -(function checkSetPresenceInImageData() { - // IE < 11 will use window.CanvasPixelArray which lacks set function. - if (window.CanvasPixelArray) { - if (typeof window.CanvasPixelArray.prototype.set !== 'function') { - window.CanvasPixelArray.prototype.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - } - } else { - // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. - // Because we cannot feature detect it, we rely on user agent parsing. - var polyfill = false, versionMatch; - if (navigator.userAgent.indexOf('Chrom') >= 0) { - versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - // Chrome < 21 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[2]) < 21; - } else if (navigator.userAgent.indexOf('Android') >= 0) { - // Android < 4.4 lacks the set function. - // Android >= 4.4 will contain Chrome in the user agent, - // thus pass the Chrome check above and not reach this block. - polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); - } else if (navigator.userAgent.indexOf('Safari') >= 0) { - versionMatch = navigator.userAgent. - match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); - // Safari < 6 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[1]) < 6; - } - - if (polyfill) { - var contextPrototype = window.CanvasRenderingContext2D.prototype; - var createImageData = contextPrototype.createImageData; - contextPrototype.createImageData = function(w, h) { - var imageData = createImageData.call(this, w, h); - imageData.data.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - return imageData; - }; - // this closure will be kept referenced, so clear its vars - contextPrototype = null; - } - } -})(); - -// Support: IE<10, Android<4.0, iOS -(function checkRequestAnimationFrame() { - function fakeRequestAnimationFrame(callback) { - window.setTimeout(callback, 20); - } - - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - if (isIOS) { - // requestAnimationFrame on iOS is broken, replacing with fake one. - window.requestAnimationFrame = fakeRequestAnimationFrame; - return; - } - if ('requestAnimationFrame' in window) { - return; - } - window.requestAnimationFrame = - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - fakeRequestAnimationFrame; -})(); - -(function checkCanvasSizeLimitation() { - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - var isAndroid = /Android/g.test(navigator.userAgent); - if (isIOS || isAndroid) { - // 5MP - PDFJS.maxCanvasPixels = 5242880; - } -})(); - -// Disable fullscreen support for certain problematic configurations. -// Support: IE11+ (when embedded). -(function checkFullscreenSupport() { - var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && - window.parent !== window); - if (isEmbeddedIE) { - PDFJS.disableFullscreen = true; - } -})(); - -// Provides document.currentScript support -// Support: IE, Chrome<29. -(function checkCurrentScript() { - if ('currentScript' in document) { - return; - } - Object.defineProperty(document, 'currentScript', { - get: function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - }, - enumerable: true, - configurable: true - }); -})(); diff --git a/services/web/public/js/libs/pdfjs-1.3.91p1/pdf.js b/services/web/public/js/libs/pdfjs-1.3.91p1/pdf.js deleted file mode 100644 index 5079c5dcbf..0000000000 --- a/services/web/public/js/libs/pdfjs-1.3.91p1/pdf.js +++ /dev/null @@ -1,9534 +0,0 @@ -/* Copyright 2012 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 globalstrict: false */ -/* globals PDFJS */ - -// Initializing PDFJS global object (if still undefined) -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -PDFJS.version = '1.3.91'; -PDFJS.build = 'd1e83b5'; - -(function pdfjsWrapper() { - // Use strict in our context only - users might not want it - 'use strict'; - - - -var globalScope = (typeof window === 'undefined') ? this : window; - -var isWorker = (typeof window === 'undefined'); - -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 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -// 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; - -PDFJS.VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = PDFJS.OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- treated as warnings. -function deprecated(details) { - warn('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Combines two URLs. The baseUrl shall be absolute URL. If the url is an -// absolute URL, it will be returned as is. -function combineUrl(baseUrl, url) { - if (!url) { - return baseUrl; - } - return new URL(url, baseUrl).href; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url) { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} -PDFJS.isValidUrl = isValidUrl; - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} -PDFJS.shadow = shadow; - -var LinkTarget = PDFJS.LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -function isExternalLinkTargetSet() { - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; - -var PasswordResponses = PDFJS.PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); -PDFJS.PasswordException = PasswordException; - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); -PDFJS.UnknownErrorException = UnknownErrorException; - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); -PDFJS.InvalidPDFException = InvalidPDFException; - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); -PDFJS.MissingPDFException = MissingPDFException; - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); -PDFJS.UnexpectedResponseException = UnexpectedResponseException; - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - return shadow(PDFJS, 'isLittleEndian', isLittleEndian()); - } -}); - - // Lazy test if the userAgent support CanvasTypedArrays -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - 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; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PDFJS.PageViewport - */ -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - if (!(v instanceof Dict)) { - return false; - } - if (!type) { - return true; - } - var dictType = v.get('Type'); - return isName(dictType) && dictType.name === type; -} - -function isArray(v) { - return v instanceof Array; -} - -function isStream(v) { - return typeof v === 'object' && v !== null && v.getBytes !== undefined; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -function isRef(v) { - return v instanceof Ref; -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fullfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -PDFJS.createPromiseCapability = createPromiseCapability; - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libaries are: - * - There currently isn't a seperate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} array of data and/or promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -PDFJS.createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - 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); -}; - -PDFJS.createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType) { - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = PDFJS.createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = {}; - var ah = this.actionHandler = {}; - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - /* jshint ignore:start */ - - // feature detect for URL constructor - var hasWorkingUrl = false; - if (typeof URL === 'function' && ('origin' in URL.prototype)) { - try { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } catch(e) {} - } - - if (hasWorkingUrl) - return; - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' == h) { - invalid.call(this) - } - // XXX - return h.toLowerCase() - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF = undefined, - ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message) - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' == c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' == this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF == c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c) - break loop; - } - break; - - case 'scheme data': - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' == c && '/' == input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue - } - break; - - case 'relative': - this._isRelative = true; - if ('file' != this._scheme) - this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' == c || '\\' == c) { - if ('\\' == c) - err('\\ is an invalid code point.'); - state = 'relative slash'; - } else if ('?' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1] - var nextNextC = input[cursor+2] - if ( - 'file' != this._scheme || !ALPHA.test(c) || - (nextC != ':' && nextC != '|') || - (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' == c || '\\' == c) { - if ('\\' == c) { - err('\\ is an invalid code point.'); - } - if ('file' == this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' == c) { - state = 'authority second slash'; - } else { - err("Expected '/', got: " + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' != c && '\\' != c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' == c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' == cp || '\n' == cp || '\r' == cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' == cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - (null !== this._password) ? this._password += tempC : this._username += tempC; - } - buffer = ''; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { - state = 'relative path'; - } else if (buffer.length == 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' == c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' == stateOverride) { - break loop; - } - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' != c && '\n' != c && '\r' != c) { - if ('[' == c) { - seenBracket = true; - } else if (']' == c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { - if ('' != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' == c) - err("'\\' not allowed in path."); - state = 'relative path'; - if ('/' != c && '\\' != c) { - continue; - } - break; - - case 'relative path': - if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { - if ('\\' == c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' == buffer) { - this._path.pop(); - if ('/' != c && '\\' != c) { - this._path.push(''); - } - } else if ('.' == buffer && '/' != c && '\\' != c) { - this._path.push(''); - } else if ('.' != buffer) { - if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' != c && '\n' != c && '\r' != c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function jURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof jURL)) - base = new jURL(String(base)); - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) - return this._url; - - var authority = ''; - if ('' != this._username || null != this._password) { - authority = this._username + - (null != this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) - return; - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) - return; - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' == this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) - return; - this._query = '?'; - if ('?' == search[0]) - search = search.slice(1); - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' == this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) - return; - this._fragment = '#'; - if ('#' == hash[0]) - hash = hash.slice(1); - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = jURL; - /* jshint ignore:end */ -})(globalScope); - - -var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 - -/** - * 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); - -/** - * The url of where the predefined Adobe CMaps are located. Include trailing - * slash. - * @var {string} - */ -PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); - -/** - * Specifies if CMaps are binary packed. - * @var {boolean} - */ -PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; - -/** - * By default fonts are converted to OpenType fonts and loaded via font face - * rules. If disabled, the font will be rendered using a built in font renderer - * that constructs the glyphs with primitive path commands. - * @var {boolean} - */ -PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? - false : PDFJS.disableFontFace); - -/** - * Path for image resources, mainly for annotation icons. Include trailing - * slash. - * @var {string} - */ -PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? - '' : PDFJS.imageResourcesPath); - -/** - * Disable the web worker and run all code on the main thread. This will happen - * automatically if the browser doesn't support workers or sending typed arrays - * to workers. - * @var {boolean} - */ -PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? - false : PDFJS.disableWorker); - -/** - * Path and filename of the worker file. Required when the worker is enabled in - * development mode. If unspecified in the production build, the worker will be - * loaded based on the location of the pdf.js file. It is recommended that - * the workerSrc is set in a custom application to prevent issues caused by - * third-party frameworks and libraries. - * @var {string} - */ -PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); - -/** - * Disable range request loading of PDF files. When enabled and if the server - * supports partial content requests then the PDF will be fetched in chunks. - * Enabled (false) by default. - * @var {boolean} - */ -PDFJS.disableRange = (PDFJS.disableRange === undefined ? - false : PDFJS.disableRange); - -/** - * Disable streaming of PDF file data. By default PDF.js attempts to load PDF - * in chunks. This default behavior can be disabled. - * @var {boolean} - */ -PDFJS.disableStream = (PDFJS.disableStream === undefined ? - false : PDFJS.disableStream); - -/** - * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js - * will automatically keep fetching more data even if it isn't needed to display - * the current page. This default behavior can be disabled. - * - * NOTE: It is also necessary to disable streaming, see above, - * in order for disabling of pre-fetching to work correctly. - * @var {boolean} - */ -PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? - false : PDFJS.disableAutoFetch); - -/** - * Enables special hooks for debugging PDF.js. - * @var {boolean} - */ -PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); - -/** - * Enables transfer usage in postMessage for ArrayBuffers. - * @var {boolean} - */ -PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? - true : PDFJS.postMessageTransfers); - -/** - * Disables URL.createObjectURL usage. - * @var {boolean} - */ -PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? - false : PDFJS.disableCreateObjectURL); - -/** - * Disables WebGL usage. - * @var {boolean} - */ -PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? - true : PDFJS.disableWebGL); - -/** - * Disables fullscreen support, and by extension Presentation Mode, - * in browsers which support the fullscreen API. - * @var {boolean} - */ -PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ? - false : PDFJS.disableFullscreen); - -/** - * Enables CSS only zooming. - * @var {boolean} - */ -PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ? - false : PDFJS.useOnlyCssZoom); - -/** - * Controls the logging level. - * The constants from PDFJS.VERBOSITY_LEVELS should be used: - * - errors - * - warnings [default] - * - infos - * @var {number} - */ -PDFJS.verbosity = (PDFJS.verbosity === undefined ? - PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity); - -/** - * The maximum supported canvas size in total pixels e.g. width * height. - * The default value is 4096 * 4096. Use -1 for no limit. - * @var {number} - */ -PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? - 16777216 : PDFJS.maxCanvasPixels); - -/** - * (Deprecated) Opens external links in a new window if enabled. - * The default behavior opens external links in the PDF.js window. - * - * NOTE: This property has been deprecated, please use - * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. - * @var {boolean} - */ -PDFJS.openExternalLinksInNewWindow = ( - PDFJS.openExternalLinksInNewWindow === undefined ? - false : PDFJS.openExternalLinksInNewWindow); - -/** - * Specifies the |target| attribute for external links. - * The constants from PDFJS.LinkTarget should be used: - * - NONE [default] - * - SELF - * - BLANK - * - PARENT - * - TOP - * @var {number} - */ -PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? - PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget); - -/** - * Determines if we can eval strings as JS. Primarily used to improve - * performance for font rendering. - * @var {boolean} - */ -PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? - true : PDFJS.isEvalSupported); - -/** - * Document initialization / loading parameters object. - * - * @typedef {Object} DocumentInitParameters - * @property {string} url - The URL of the PDF. - * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays - * (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded, - * use atob() to convert it to a binary string first. - * @property {Object} httpHeaders - Basic authentication headers. - * @property {boolean} withCredentials - Indicates whether or not cross-site - * Access-Control requests should be made using credentials such as cookies - * or authorization headers. The default is false. - * @property {string} password - For decrypting password-protected PDFs. - * @property {TypedArray} initialData - A typed array with the first portion or - * all of the pdf data. Used by the extension since some data is already - * loaded before the switch to range requests. - * @property {number} length - The PDF file length. It's used for progress - * reports and range requests operations. - * @property {PDFDataRangeTransport} range - * @property {number} rangeChunkSize - Optional parameter to specify - * maximum number of bytes fetched per range request. The default value is - * 2^16 = 65536. - * @property {PDFWorker} worker - The worker that will be used for the loading - * and parsing of the PDF data. - */ - -/** - * @typedef {Object} PDFDocumentStats - * @property {Array} streamTypes - Used stream types in the document (an item - * is set to true if specific stream ID was used in the document). - * @property {Array} fontTypes - Used font type in the document (an item is set - * to true if specific font ID was used in the document). - */ - -/** - * 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|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src - * Can be a url to where a PDF is located, a typed array (Uint8Array) - * already populated with data or parameter object. - * - * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used - * if you want to manually serve range requests for data in the PDF. - * - * @param {function} passwordCallback (deprecated) 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}). - * - * @param {function} progressCallback (deprecated) It is used to be able to - * monitor the loading progress of the PDF file (necessary to implement e.g. - * a loading bar). The callback receives an {Object} with the properties: - * {number} loaded and {number} total. - * - * @return {PDFDocumentLoadingTask} - */ -PDFJS.getDocument = function getDocument(src, - pdfDataRangeTransport, - passwordCallback, - progressCallback) { - var task = new PDFDocumentLoadingTask(); - - // Support of the obsolete arguments (for compatibility with API v1.0) - if (arguments.length > 1) { - deprecated('getDocument is called with pdfDataRangeTransport, ' + - 'passwordCallback or progressCallback argument'); - } - if (pdfDataRangeTransport) { - if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) { - // Not a PDFDataRangeTransport instance, trying to add missing properties. - pdfDataRangeTransport = Object.create(pdfDataRangeTransport); - pdfDataRangeTransport.length = src.length; - pdfDataRangeTransport.initialData = src.initialData; - if (!pdfDataRangeTransport.abort) { - pdfDataRangeTransport.abort = function () {}; - } - } - src = Object.create(src); - src.range = pdfDataRangeTransport; - } - task.onPassword = passwordCallback || null; - task.onProgress = progressCallback || null; - - var source; - if (typeof src === 'string') { - source = { url: src }; - } else if (isArrayBuffer(src)) { - source = { data: src }; - } else if (src instanceof PDFDataRangeTransport) { - source = { range: src }; - } else { - if (typeof src !== 'object') { - error('Invalid parameter in getDocument, need either Uint8Array, ' + - 'string or a parameter object'); - } - if (!src.url && !src.data && !src.range) { - error('Invalid parameter object: need either .data, .range or .url'); - } - - source = src; - } - - var params = {}; - var rangeTransport = null; - var worker = null; - for (var key in source) { - if (key === 'url' && typeof window !== 'undefined') { - // The full path is required in the 'url' field. - params[key] = combineUrl(window.location.href, source[key]); - continue; - } else if (key === 'range') { - rangeTransport = source[key]; - continue; - } else if (key === 'worker') { - worker = source[key]; - continue; - } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { - // Converting string or array-like data to Uint8Array. - var pdfBytes = source[key]; - if (typeof pdfBytes === 'string') { - params[key] = stringToBytes(pdfBytes); - } else if (typeof pdfBytes === 'object' && pdfBytes !== null && - !isNaN(pdfBytes.length)) { - params[key] = new Uint8Array(pdfBytes); - } else if (isArrayBuffer(pdfBytes)) { - params[key] = new Uint8Array(pdfBytes); - } else { - error('Invalid PDF binary data: either typed array, string or ' + - 'array-like object is expected in the data property.'); - } - continue; - } - params[key] = source[key]; - } - - params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - - if (!worker) { - // Worker was not provided -- creating and owning our own. - worker = new PDFWorker(); - task._worker = worker; - } - var docId = task.docId; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - return _fetchDocument(worker, params, rangeTransport, docId).then( - function (workerId) { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - var messageHandler = new MessageHandler(docId, workerId, worker.port); - messageHandler.send('Ready', null); - var transport = new WorkerTransport(messageHandler, task, rangeTransport); - task._transport = transport; - }); - }, task._capability.reject); - - return task; -}; - -/** - * Starts fetching of specified PDF document/data. - * @param {PDFWorker} worker - * @param {Object} source - * @param {PDFDataRangeTransport} pdfDataRangeTransport - * @param {string} docId Unique document id, used as MessageHandler id. - * @returns {Promise} The promise, which is resolved when worker id of - * MessageHandler is known. - * @private - */ -function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { - if (worker.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); - } - - source.disableAutoFetch = PDFJS.disableAutoFetch; - source.disableStream = PDFJS.disableStream; - source.chunkedViewerLoading = !!pdfDataRangeTransport; - if (pdfDataRangeTransport) { - source.length = pdfDataRangeTransport.length; - source.initialData = pdfDataRangeTransport.initialData; - } - return worker.messageHandler.sendWithPromise('GetDocRequest', { - docId: docId, - source: source, - disableRange: PDFJS.disableRange, - maxImageSize: PDFJS.maxImageSize, - cMapUrl: PDFJS.cMapUrl, - cMapPacked: PDFJS.cMapPacked, - disableFontFace: PDFJS.disableFontFace, - disableCreateObjectURL: PDFJS.disableCreateObjectURL, - verbosity: PDFJS.verbosity - }).then(function (workerId) { - if (worker.destroyed) { - throw new Error('Worker was destroyed'); - } - return workerId; - }); -} - -/** - * PDF document loading operation. - * @class - * @alias PDFDocumentLoadingTask - */ -var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { - var nextDocumentId = 0; - - /** @constructs PDFDocumentLoadingTask */ - function PDFDocumentLoadingTask() { - this._capability = createPromiseCapability(); - this._transport = null; - this._worker = null; - - /** - * Unique document loading task id -- used in MessageHandlers. - * @type {string} - */ - this.docId = 'd' + (nextDocumentId++); - - /** - * Shows if loading task is destroyed. - * @type {boolean} - */ - this.destroyed = false; - - /** - * Callback 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}). - */ - this.onPassword = null; - - /** - * Callback to be able to monitor the loading progress of the PDF file - * (necessary to implement e.g. a loading bar). The callback receives - * an {Object} with the properties: {number} loaded and {number} total. - */ - this.onProgress = null; - - /** - * Callback to when unsupported feature is used. The callback receives - * an {PDFJS.UNSUPPORTED_FEATURES} argument. - */ - this.onUnsupportedFeature = null; - } - - PDFDocumentLoadingTask.prototype = - /** @lends PDFDocumentLoadingTask.prototype */ { - /** - * @return {Promise} - */ - get promise() { - return this._capability.promise; - }, - - /** - * Aborts all network requests and destroys worker. - * @return {Promise} A promise that is resolved after destruction activity - * is completed. - */ - destroy: function () { - this.destroyed = true; - - var transportDestroyed = !this._transport ? Promise.resolve() : - this._transport.destroy(); - return transportDestroyed.then(function () { - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - }.bind(this)); - }, - - /** - * Registers callbacks to indicate the document loading completion. - * - * @param {function} onFulfilled The callback for the loading completion. - * @param {function} onRejected The callback for the loading failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return PDFDocumentLoadingTask; -})(); - -/** - * Abstract class to support range requests file loading. - * @class - * @alias PDFJS.PDFDataRangeTransport - * @param {number} length - * @param {Uint8Array} initialData - */ -var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() { - function PDFDataRangeTransport(length, initialData) { - this.length = length; - this.initialData = initialData; - - this._rangeListeners = []; - this._progressListeners = []; - this._progressiveReadListeners = []; - this._readyCapability = createPromiseCapability(); - } - PDFDataRangeTransport.prototype = - /** @lends PDFDataRangeTransport.prototype */ { - addRangeListener: - function PDFDataRangeTransport_addRangeListener(listener) { - this._rangeListeners.push(listener); - }, - - addProgressListener: - function PDFDataRangeTransport_addProgressListener(listener) { - this._progressListeners.push(listener); - }, - - addProgressiveReadListener: - function PDFDataRangeTransport_addProgressiveReadListener(listener) { - this._progressiveReadListeners.push(listener); - }, - - onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) { - var listeners = this._rangeListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](begin, chunk); - } - }, - - onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) { - this._readyCapability.promise.then(function () { - var listeners = this._progressListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](loaded); - } - }.bind(this)); - }, - - onDataProgressiveRead: - function PDFDataRangeTransport_onDataProgress(chunk) { - this._readyCapability.promise.then(function () { - var listeners = this._progressiveReadListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](chunk); - } - }.bind(this)); - }, - - transportReady: function PDFDataRangeTransport_transportReady() { - this._readyCapability.resolve(); - }, - - requestDataRange: - function PDFDataRangeTransport_requestDataRange(begin, end) { - throw new Error('Abstract method PDFDataRangeTransport.requestDataRange'); - }, - - abort: function PDFDataRangeTransport_abort() { - } - }; - return PDFDataRangeTransport; -})(); - -PDFJS.PDFDataRangeTransport = PDFDataRangeTransport; - -/** - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used - * properties that can be read synchronously. - * @class - * @alias PDFDocumentProxy - */ -var PDFDocumentProxy = (function PDFDocumentProxyClosure() { - function PDFDocumentProxy(pdfInfo, transport, loadingTask) { - this.pdfInfo = pdfInfo; - this.transport = transport; - this.loadingTask = loadingTask; - } - PDFDocumentProxy.prototype = /** @lends 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; - }, - /** - * @param {number} pageNumber The page number to get. The first page is 1. - * @return {Promise} A promise that is resolved with a {@link PDFPageProxy} - * object. - */ - getPage: function PDFDocumentProxy_getPage(pageNumber) { - return this.transport.getPage(pageNumber); - }, - /** - * @param {{num: number, gen: number}} ref The page reference. Must have - * the 'num' and 'gen' properties. - * @return {Promise} A promise that is resolved with the page index that is - * associated with the reference. - */ - getPageIndex: function PDFDocumentProxy_getPageIndex(ref) { - return this.transport.getPageIndex(ref); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named destinations to reference numbers. - * - * This can be slow for large documents: use getDestination instead - */ - getDestinations: function PDFDocumentProxy_getDestinations() { - return this.transport.getDestinations(); - }, - /** - * @param {string} id The named destination to get. - * @return {Promise} A promise that is resolved with all information - * of the given named destination. - */ - getDestination: function PDFDocumentProxy_getDestination(id) { - return this.transport.getDestination(id); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named attachments to their content. - */ - getAttachments: function PDFDocumentProxy_getAttachments() { - return this.transport.getAttachments(); - }, - /** - * @return {Promise} A promise that is resolved with an array of all the - * JavaScript strings in the name tree. - */ - getJavaScript: function PDFDocumentProxy_getJavaScript() { - return this.transport.getJavaScript(); - }, - /** - * @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() { - return this.transport.getOutline(); - }, - /** - * @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() { - return this.transport.getMetadata(); - }, - /** - * @return {Promise} A promise that is resolved with a TypedArray that has - * the raw data from the PDF. - */ - getData: function PDFDocumentProxy_getData() { - return this.transport.getData(); - }, - /** - * @return {Promise} A promise that is resolved when the document's data - * is loaded. It is resolved with an {Object} that contains the length - * property that indicates size of the PDF data in bytes. - */ - getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() { - return this.transport.downloadInfoCapability.promise; - }, - /** - * @return {Promise} A promise this is resolved with current stats about - * document structures (see {@link PDFDocumentStats}). - */ - getStats: function PDFDocumentProxy_getStats() { - return this.transport.getStats(); - }, - /** - * Cleans up resources allocated by the document, e.g. created @font-face. - */ - cleanup: function PDFDocumentProxy_cleanup() { - this.transport.startCleanup(); - }, - /** - * Destroys current document instance and terminates worker. - */ - destroy: function PDFDocumentProxy_destroy() { - return this.loadingTask.destroy(); - } - }; - return PDFDocumentProxy; -})(); - -/** - * Page getTextContent parameters. - * - * @typedef {Object} getTextContentParameters - * @param {boolean} normalizeWhitespace - replaces all occurrences of - * whitespace with standard spaces (0x20). The default value is `false`. - */ - -/** - * Page text content. - * - * @typedef {Object} TextContent - * @property {array} items - array of {@link TextItem} - * @property {Object} styles - {@link TextStyles} objects, indexed by font - * name. - */ - -/** - * Page text content part. - * - * @typedef {Object} TextItem - * @property {string} str - text content. - * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'. - * @property {array} transform - transformation matrix. - * @property {number} width - width in device space. - * @property {number} height - height in device space. - * @property {string} fontName - font name used by pdf.js for converted font. - */ - -/** - * Text style. - * - * @typedef {Object} TextStyle - * @property {number} ascent - font ascent. - * @property {number} descent - font descent. - * @property {boolean} vertical - text is in vertical mode. - * @property {string} fontFamily - possible font family - */ - -/** - * Page annotation parameters. - * - * @typedef {Object} GetAnnotationsParameters - * @param {string} intent - Determines the annotations that will be fetched, - * can be either 'display' (viewable annotations) or 'print' - * (printable annotations). - * If the parameter is omitted, all annotations are fetched. - */ - -/** - * Page render parameters. - * - * @typedef {Object} RenderParameters - * @property {Object} canvasContext - A 2D context of a DOM Canvas object. - * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by - * calling of PDFPage.getViewport method. - * @property {string} intent - Rendering intent, can be 'display' or 'print' - * (default value is 'display'). - * @property {Array} transform - (optional) Additional transform, applied - * just before viewport transform. - * @property {Object} imageLayer - (optional) An object that has beginLayout, - * endLayout and appendImage functions. - * @property {function} continueCallback - (deprecated) 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. - */ - -/** - * PDF page operator list. - * - * @typedef {Object} PDFOperatorList - * @property {Array} fnArray - Array containing the operator functions. - * @property {Array} argsArray - Array containing the arguments of the - * functions. - */ - -/** - * Proxy to a PDFPage in the worker thread. - * @class - * @alias PDFPageProxy - */ -var PDFPageProxy = (function PDFPageProxyClosure() { - function PDFPageProxy(pageIndex, pageInfo, transport) { - this.pageIndex = pageIndex; - 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.cleanupAfterRender = false; - this.pendingCleanup = false; - this.intentStates = {}; - this.destroyed = false; - } - PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ { - /** - * @return {number} Page number of the page. First page is 1. - */ - get pageNumber() { - return this.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 {PDFJS.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); - }, - /** - * @param {GetAnnotationsParameters} params - Annotation parameters. - * @return {Promise} A promise that is resolved with an {Array} of the - * annotation objects. - */ - getAnnotations: function PDFPageProxy_getAnnotations(params) { - var intent = (params && params.intent) || null; - - if (!this.annotationsPromise || this.annotationsIntent !== intent) { - this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, - intent); - this.annotationsIntent = intent; - } - return this.annotationsPromise; - }, - /** - * Begins the process of rendering a page to the desired context. - * @param {RenderParameters} params Page render parameters. - * @return {RenderTask} An object that contains the promise, which - * is resolved when the page finishes rendering. - */ - 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.pendingCleanup = false; - - var renderingIntent = (params.intent === 'print' ? 'print' : 'display'); - - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = {}; - } - var intentState = this.intentStates[renderingIntent]; - - // If there's no displayReadyCapability yet, then the operatorList - // was never requested before. Make the request and create the promise. - if (!intentState.displayReadyCapability) { - intentState.receivingOperatorList = true; - intentState.displayReadyCapability = createPromiseCapability(); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.stats.time('Page Request'); - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageNumber - 1, - intent: renderingIntent - }); - } - - var internalRenderTask = new InternalRenderTask(complete, params, - this.objs, - this.commonObjs, - intentState.operatorList, - this.pageNumber); - internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print'; - if (!intentState.renderTasks) { - intentState.renderTasks = []; - } - intentState.renderTasks.push(internalRenderTask); - var renderTask = internalRenderTask.task; - - // Obsolete parameter support - if (params.continueCallback) { - deprecated('render is used with continueCallback parameter'); - renderTask.onContinue = params.continueCallback; - } - - var self = this; - intentState.displayReadyCapability.promise.then( - function pageDisplayReadyPromise(transparency) { - if (self.pendingCleanup) { - complete(); - return; - } - stats.time('Rendering'); - internalRenderTask.initalizeGraphics(transparency); - internalRenderTask.operatorListChanged(); - }, - function pageDisplayReadPromiseError(reason) { - complete(reason); - } - ); - - function complete(error) { - var i = intentState.renderTasks.indexOf(internalRenderTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } - - if (self.cleanupAfterRender) { - self.pendingCleanup = true; - } - self._tryCleanup(); - - if (error) { - internalRenderTask.capability.reject(error); - } else { - internalRenderTask.capability.resolve(); - } - stats.timeEnd('Rendering'); - stats.timeEnd('Overall'); - } - - return renderTask; - }, - - /** - * @return {Promise} A promise resolved with an {@link PDFOperatorList} - * object that represents page's operator list. - */ - getOperatorList: function PDFPageProxy_getOperatorList() { - function operatorListChanged() { - if (intentState.operatorList.lastChunk) { - intentState.opListReadCapability.resolve(intentState.operatorList); - } - } - - var renderingIntent = 'oplist'; - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = {}; - } - var intentState = this.intentStates[renderingIntent]; - - if (!intentState.opListReadCapability) { - var opListTask = {}; - opListTask.operatorListChanged = operatorListChanged; - intentState.receivingOperatorList = true; - intentState.opListReadCapability = createPromiseCapability(); - intentState.renderTasks = []; - intentState.renderTasks.push(opListTask); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageIndex, - intent: renderingIntent - }); - } - return intentState.opListReadCapability.promise; - }, - - /** - * @param {getTextContentParameters} params - getTextContent parameters. - * @return {Promise} That is resolved a {@link TextContent} - * object that represent the page text content. - */ - getTextContent: function PDFPageProxy_getTextContent(params) { - var normalizeWhitespace = (params && params.normalizeWhitespace) || false; - - return this.transport.messageHandler.sendWithPromise('GetTextContent', { - pageIndex: this.pageNumber - 1, - normalizeWhitespace: normalizeWhitespace, - }); - }, - - /** - * Destroys page object. - */ - _destroy: function PDFPageProxy_destroy() { - this.destroyed = true; - this.transport.pageCache[this.pageIndex] = null; - - var waitOn = []; - Object.keys(this.intentStates).forEach(function(intent) { - var intentState = this.intentStates[intent]; - intentState.renderTasks.forEach(function(renderTask) { - var renderCompleted = renderTask.capability.promise. - catch(function () {}); // ignoring failures - waitOn.push(renderCompleted); - renderTask.cancel(); - }); - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - return Promise.all(waitOn); - }, - - /** - * Cleans up resources allocated by the page. (deprecated) - */ - destroy: function() { - deprecated('page destroy method, use cleanup() instead'); - this.cleanup(); - }, - - /** - * Cleans up resources allocated by the page. - */ - cleanup: function PDFPageProxy_cleanup() { - this.pendingCleanup = true; - this._tryCleanup(); - }, - /** - * For internal use only. Attempts to clean up if rendering is in a state - * where that's possible. - * @ignore - */ - _tryCleanup: function PDFPageProxy_tryCleanup() { - if (!this.pendingCleanup || - Object.keys(this.intentStates).some(function(intent) { - var intentState = this.intentStates[intent]; - return (intentState.renderTasks.length !== 0 || - intentState.receivingOperatorList); - }, this)) { - return; - } - - Object.keys(this.intentStates).forEach(function(intent) { - delete this.intentStates[intent]; - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - }, - /** - * For internal use only. - * @ignore - */ - _startRenderPage: function PDFPageProxy_startRenderPage(transparency, - intent) { - var intentState = this.intentStates[intent]; - // TODO Refactor RenderPageRequest to separate rendering - // and operator list logic - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.resolve(transparency); - } - }, - /** - * For internal use only. - * @ignore - */ - _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, - intent) { - var intentState = this.intentStates[intent]; - var i, ii; - // Add the new chunk to the current operator list. - for (i = 0, ii = operatorListChunk.length; i < ii; i++) { - intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); - intentState.operatorList.argsArray.push( - operatorListChunk.argsArray[i]); - } - intentState.operatorList.lastChunk = operatorListChunk.lastChunk; - - // Notify all the rendering tasks there are more operators to be consumed. - for (i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); - } - - if (operatorListChunk.lastChunk) { - intentState.receivingOperatorList = false; - this._tryCleanup(); - } - } - }; - return PDFPageProxy; -})(); - -/** - * PDF.js web worker abstraction, it controls instantiation of PDF documents and - * WorkerTransport for them. If creation of a web worker is not possible, - * a "fake" worker will be used instead. - * @class - */ -var PDFWorker = (function PDFWorkerClosure() { - var nextFakeWorkerId = 0; - - // Loads worker code into main thread. - function setupFakeWorkerGlobal() { - if (!PDFJS.fakeWorkerFilesLoadedCapability) { - PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); - // In the developer build load worker_loader which in turn loads all the - // other files and resolves the promise. In production only the - // pdf.worker.js file is needed. - Util.loadScript(PDFJS.workerSrc, function() { - PDFJS.fakeWorkerFilesLoadedCapability.resolve(); - }); - } - return PDFJS.fakeWorkerFilesLoadedCapability.promise; - } - - function PDFWorker(name) { - this.name = name; - this.destroyed = false; - - this._readyCapability = createPromiseCapability(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - this._initialize(); - } - - PDFWorker.prototype = /** @lends PDFWorker.prototype */ { - get promise() { - return this._readyCapability.promise; - }, - - get port() { - return this._port; - }, - - get messageHandler() { - return this._messageHandler; - }, - - _initialize: function PDFWorker_initialize() { - // 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 v.15.) - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = PDFJS.workerSrc; - if (!workerSrc) { - 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', worker); - - messageHandler.on('test', function PDFWorker_test(data) { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); - return; // worker was destroyed - } - var supportTypedArray = data && data.supportTypedArray; - if (supportTypedArray) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - if (!data.supportTransfers) { - PDFJS.postMessageTransfers = false; - } - this._readyCapability.resolve(); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }.bind(this)); - - messageHandler.on('console_log', function (data) { - console.log.apply(console, data); - }); - messageHandler.on('console_error', function (data) { - console.error.apply(console, data); - }); - - var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]); - // Some versions of Opera throw a DATA_CLONE_ERR on serializing the - // typed array. Also, checking if we can use transfers. - try { - messageHandler.send('test', testObj, [testObj.buffer]); - } catch (ex) { - info('Cannot use postMessage transfers'); - testObj[0] = 0; - 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. - this._setupFakeWorker(); - }, - - _setupFakeWorker: function PDFWorker_setupFakeWorker() { - warn('Setting up fake worker.'); - globalScope.PDFJS.disableWorker = true; - - setupFakeWorkerGlobal().then(function () { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - return; - } - - // If we don't use a worker, just post/sendMessage to the main thread. - var port = { - _listeners: [], - postMessage: function (obj) { - var e = {data: obj}; - this._listeners.forEach(function (listener) { - listener.call(this, e); - }, this); - }, - addEventListener: function (name, listener) { - this._listeners.push(listener); - }, - removeEventListener: function (name, listener) { - var i = this._listeners.indexOf(listener); - this._listeners.splice(i, 1); - }, - terminate: function () {} - }; - this._port = port; - - // All fake workers use the same port, making id unique. - var id = 'fake' + (nextFakeWorkerId++); - - // If the main thread is our worker, setup the handling for the - // messages -- the main thread sends to it self. - var workerHandler = new MessageHandler(id + '_worker', id, port); - PDFJS.WorkerMessageHandler.setup(workerHandler, port); - - var messageHandler = new MessageHandler(id, id + '_worker', port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - }.bind(this)); - }, - - /** - * Destroys the worker instance. - */ - destroy: function PDFWorker_destroy() { - this.destroyed = true; - if (this._webWorker) { - // We need to terminate only web worker created resource. - this._webWorker.terminate(); - this._webWorker = null; - } - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - }; - - return PDFWorker; -})(); -PDFJS.PDFWorker = PDFWorker; - -/** - * For internal use only. - * @ignore - */ -var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; - this.pdfDataRangeTransport = pdfDataRangeTransport; - this.commonObjs = new PDFObjects(); - this.fontLoader = new FontLoader(loadingTask.docId); - - this.destroyed = false; - this.destroyCapability = null; - - this.pageCache = []; - this.pagePromises = []; - this.downloadInfoCapability = createPromiseCapability(); - - this.setupMessageHandler(); - } - WorkerTransport.prototype = { - destroy: function WorkerTransport_destroy() { - if (this.destroyCapability) { - return this.destroyCapability.promise; - } - - this.destroyed = true; - this.destroyCapability = createPromiseCapability(); - - var waitOn = []; - // We need to wait for all renderings to be completed, e.g. - // timeout/rAF can take a long time. - this.pageCache.forEach(function (page) { - if (page) { - waitOn.push(page._destroy()); - } - }); - this.pageCache = []; - this.pagePromises = []; - var self = this; - // We also need to wait for the worker to finish its long running tasks. - var terminated = this.messageHandler.sendWithPromise('Terminate', null); - waitOn.push(terminated); - Promise.all(waitOn).then(function () { - self.fontLoader.clear(); - if (self.pdfDataRangeTransport) { - self.pdfDataRangeTransport.abort(); - self.pdfDataRangeTransport = null; - } - if (self.messageHandler) { - self.messageHandler.destroy(); - self.messageHandler = null; - } - self.destroyCapability.resolve(); - }, this.destroyCapability.reject); - return this.destroyCapability.promise; - }, - - setupMessageHandler: - function WorkerTransport_setupMessageHandler() { - var messageHandler = this.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 - }); - }); - - pdfDataRangeTransport.addProgressiveReadListener(function(chunk) { - messageHandler.send('OnDataRange', { - chunk: chunk - }); - }); - - messageHandler.on('RequestDataRange', - function transportDataRange(data) { - pdfDataRangeTransport.requestDataRange(data.begin, data.end); - }, this); - } - - messageHandler.on('GetDoc', function transportDoc(data) { - var pdfInfo = data.pdfInfo; - this.numPages = data.pdfInfo.numPages; - var loadingTask = this.loadingTask; - var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); - this.pdfDocument = pdfDocument; - loadingTask._capability.resolve(pdfDocument); - }, this); - - messageHandler.on('NeedPassword', - function transportNeedPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.NEED_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('IncorrectPassword', - function transportIncorrectPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.INCORRECT_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { - this.loadingTask._capability.reject( - new InvalidPDFException(exception.message)); - }, this); - - messageHandler.on('MissingPDF', function transportMissingPDF(exception) { - this.loadingTask._capability.reject( - new MissingPDFException(exception.message)); - }, this); - - messageHandler.on('UnexpectedResponse', - function transportUnexpectedResponse(exception) { - this.loadingTask._capability.reject( - new UnexpectedResponseException(exception.message, exception.status)); - }, this); - - messageHandler.on('UnknownError', - function transportUnknownError(exception) { - this.loadingTask._capability.reject( - new UnknownErrorException(exception.message, exception.details)); - }, this); - - messageHandler.on('DataLoaded', function transportPage(data) { - this.downloadInfoCapability.resolve(data); - }, this); - - messageHandler.on('PDFManagerReady', function transportPage(data) { - if (this.pdfDataRangeTransport) { - this.pdfDataRangeTransport.transportReady(); - } - }, this); - - messageHandler.on('StartRenderPage', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page.stats.timeEnd('Page Request'); - page._startRenderPage(data.transparency, data.intent); - }, this); - - messageHandler.on('RenderPageChunk', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page._renderPageChunk(data.operatorList, data.intent); - }, this); - - messageHandler.on('commonobj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - 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 FontFaceObject(exportedData); - } - - this.fontLoader.bind( - [font], - function fontReady(fontObjs) { - this.commonObjs.resolve(id, font); - }.bind(this) - ); - break; - case 'FontPath': - this.commonObjs.resolve(id, data[2]); - break; - default: - error('Got unknown common object type ' + type); - } - }, this); - - messageHandler.on('obj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var id = data[0]; - var pageIndex = data[1]; - var type = data[2]; - var pageProxy = this.pageCache[pageIndex]; - var imageData; - if (pageProxy.objs.hasData(id)) { - return; - } - - switch (type) { - case 'JpegStream': - imageData = data[3]; - loadJpegStream(id, imageData, pageProxy.objs); - break; - case 'Image': - 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 (imageData && '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.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var loadingTask = this.loadingTask; - if (loadingTask.onProgress) { - loadingTask.onProgress({ - loaded: data.loaded, - total: data.total - }); - } - }, this); - - messageHandler.on('PageError', function transportError(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var page = this.pageCache[data.pageNum - 1]; - var intentState = page.intentStates[data.intent]; - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(data.error); - } else { - error(data.error); - } - }, this); - - messageHandler.on('UnsupportedFeature', - function transportUnsupportedFeature(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var featureId = data.featureId; - var loadingTask = this.loadingTask; - if (loadingTask.onUnsupportedFeature) { - loadingTask.onUnsupportedFeature(featureId); - } - PDFJS.UnsupportedManager.notify(featureId); - }, this); - - messageHandler.on('JpegDecode', function(data) { - if (this.destroyed) { - return Promise.reject('Worker was terminated'); - } - - var imageUrl = data[0]; - var components = data[1]; - if (components !== 3 && components !== 1) { - return Promise.reject( - new Error('Only 3 components or 1 component can be returned')); - } - - return new Promise(function (resolve, reject) { - var img = new Image(); - img.onload = function () { - 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; - var i, j; - - if (components === 3) { - for (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 (i = 0, j = 0; i < rgbaLength; i += 4, j++) { - buf[j] = data[i]; - } - } - resolve({ data: buf, width: width, height: height}); - }; - img.onerror = function () { - reject(new Error('JpegDecode failed to load image')); - }; - img.src = imageUrl; - }); - }, this); - }, - - getData: function WorkerTransport_getData() { - return this.messageHandler.sendWithPromise('GetData', null); - }, - - getPage: function WorkerTransport_getPage(pageNumber, capability) { - if (pageNumber <= 0 || pageNumber > this.numPages || - (pageNumber|0) !== pageNumber) { - return Promise.reject(new Error('Invalid page request')); - } - - var pageIndex = pageNumber - 1; - if (pageIndex in this.pagePromises) { - return this.pagePromises[pageIndex]; - } - var promise = this.messageHandler.sendWithPromise('GetPage', { - pageIndex: pageIndex - }).then(function (pageInfo) { - if (this.destroyed) { - throw new Error('Transport destroyed'); - } - var page = new PDFPageProxy(pageIndex, pageInfo, this); - this.pageCache[pageIndex] = page; - return page; - }.bind(this)); - this.pagePromises[pageIndex] = promise; - return promise; - }, - - getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { - return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); - }, - - getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise('GetAnnotations', { - pageIndex: pageIndex, - intent: intent, - }); - }, - - getDestinations: function WorkerTransport_getDestinations() { - return this.messageHandler.sendWithPromise('GetDestinations', null); - }, - - getDestination: function WorkerTransport_getDestination(id) { - return this.messageHandler.sendWithPromise('GetDestination', { id: id }); - }, - - getAttachments: function WorkerTransport_getAttachments() { - return this.messageHandler.sendWithPromise('GetAttachments', null); - }, - - getJavaScript: function WorkerTransport_getJavaScript() { - return this.messageHandler.sendWithPromise('GetJavaScript', null); - }, - - getOutline: function WorkerTransport_getOutline() { - return this.messageHandler.sendWithPromise('GetOutline', null); - }, - - getMetadata: function WorkerTransport_getMetadata() { - return this.messageHandler.sendWithPromise('GetMetadata', null). - then(function transportMetadata(results) { - return { - info: results[0], - metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null) - }; - }); - }, - - getStats: function WorkerTransport_getStats() { - return this.messageHandler.sendWithPromise('GetStats', null); - }, - - startCleanup: function WorkerTransport_startCleanup() { - this.messageHandler.sendWithPromise('Cleanup', null). - then(function endCleanup() { - for (var i = 0, ii = this.pageCache.length; i < ii; i++) { - var page = this.pageCache[i]; - if (page) { - page.cleanup(); - } - } - this.commonObjs.clear(); - this.fontLoader.clear(); - }.bind(this)); - } - }; - return WorkerTransport; - -})(); - -/** - * 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. - * @ignore - */ -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 = { - capability: createPromiseCapability(), - 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).capability.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.capability.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; -})(); - -/** - * Allows controlling of the rendering tasks. - * @class - * @alias RenderTask - */ -var RenderTask = (function RenderTaskClosure() { - function RenderTask(internalRenderTask) { - this._internalRenderTask = internalRenderTask; - - /** - * Callback for incremental rendering -- 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. - * @type {function} - */ - this.onContinue = null; - } - - RenderTask.prototype = /** @lends RenderTask.prototype */ { - /** - * Promise for rendering task completion. - * @return {Promise} - */ - get promise() { - return this._internalRenderTask.capability.promise; - }, - - /** - * Cancels the rendering task. If the task is currently rendering it will - * not be cancelled until graphics pauses with a timeout. The promise that - * this object extends will resolved when cancelled. - */ - cancel: function RenderTask_cancel() { - this._internalRenderTask.cancel(); - }, - - /** - * Registers callbacks to indicate the rendering task completion. - * - * @param {function} onFulfilled The callback for the rendering completion. - * @param {function} onRejected The callback for the rendering failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function RenderTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return RenderTask; -})(); - -/** - * For internal use only. - * @ignore - */ -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.useRequestAnimationFrame = false; - this.cancelled = false; - this.capability = createPromiseCapability(); - this.task = new RenderTask(this); - // caching this-bound methods - this._continueBound = this._continue.bind(this); - this._scheduleNextBound = this._scheduleNext.bind(this); - this._nextBound = this._next.bind(this); - } - - 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.imageLayer); - - this.gfx.beginDrawing(params.transform, 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._continueBound; - } - 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.task.onContinue) { - this.task.onContinue.call(this.task, this._scheduleNextBound); - } else { - this._scheduleNext(); - } - }, - - _scheduleNext: function InternalRenderTask__scheduleNext() { - if (this.useRequestAnimationFrame) { - window.requestAnimationFrame(this._nextBound); - } else { - Promise.resolve(undefined).then(this._nextBound); - } - }, - - _next: function InternalRenderTask__next() { - if (this.cancelled) { - return; - } - this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, - this.operatorListIdx, - this._continueBound, - this.stepper); - if (this.operatorListIdx === this.operatorList.argsArray.length) { - this.running = false; - if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); - this.callback(); - } - } - } - - }; - - return InternalRenderTask; -})(); - -/** - * (Deprecated) Global observer of unsupported feature usages. Use - * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. - */ -PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() { - var listeners = []; - return { - listen: function (cb) { - deprecated('Global UnsupportedManager.listen is used: ' + - ' use PDFDocumentLoadingTask.onUnsupportedFeature instead'); - listeners.push(cb); - }, - notify: function (featureId) { - for (var i = 0, ii = listeners.length; i < ii; i++) { - listeners[i](featureId); - } - } - }; -})(); - - -var Metadata = PDFJS.Metadata = (function MetadataClosure() { - function fixMetadata(meta) { - return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { - var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, - function(code, d1, d2, d3) { - return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }); - var chars = ''; - for (var i = 0; i < bytes.length; i += 2) { - var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); - chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && - code !== 38 && false ? String.fromCharCode(code) : - '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; - } - return '>' + chars; - }); - } - - function Metadata(meta) { - if (typeof meta === 'string') { - // Ghostscript produces invalid metadata - meta = fixMetadata(meta); - - var parser = new DOMParser(); - meta = parser.parseFromString(meta, 'application/xml'); - } else if (!(meta instanceof Document)) { - error('Metadata: Invalid metadata object'); - } - - this.metaDocument = meta; - this.metadata = {}; - this.parse(); - } - - Metadata.prototype = { - parse: function Metadata_parse() { - var doc = this.metaDocument; - var rdf = doc.documentElement; - - if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in - rdf = rdf.firstChild; - while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') { - rdf = rdf.nextSibling; - } - } - - var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null; - if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) { - return; - } - - var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength; - for (i = 0, length = children.length; i < length; i++) { - desc = children[i]; - if (desc.nodeName.toLowerCase() !== 'rdf:description') { - continue; - } - - for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { - if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') { - entry = desc.childNodes[ii]; - name = entry.nodeName.toLowerCase(); - this.metadata[name] = entry.textContent.trim(); - } - } - } - }, - - get: function Metadata_get(name) { - return this.metadata[name] || null; - }, - - has: function Metadata_has(name) { - return typeof this.metadata[name] !== 'undefined'; - } - }; - - return Metadata; -})(); - - -// contexts store most of the state we need natively. -// However, PDF needs a bit more state, which we store here. - -// Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 16; -// Maximum font size that would be used during canvas fillText operations. -var MAX_FONT_SIZE = 100; -var MAX_GROUP_SIZE = 4096; - -// Heuristic value used when enforcing minimum line widths. -var MIN_WIDTH_FACTOR = 0.65; - -var COMPILE_TYPE3_GLYPHS = true; -var MAX_SIZE_TO_COMPILE = 1000; - -var FULL_CHUNK_HEIGHT = 16; - -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 one. - if (!ctx.mozCurrentTransform) { - 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._transformMatrix || [1, 0, 0, 1, 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() { - function CachedCanvases() { - this.cache = Object.create(null); - } - CachedCanvases.prototype = { - getCanvas: function CachedCanvases_getCanvas(id, width, height, - trackTransform) { - var canvasEntry; - if (this.cache[id] !== undefined) { - canvasEntry = this.cache[id]; - canvasEntry.canvas.width = width; - canvasEntry.canvas.height = height; - // reset canvas transform for emulated mozCurrentTransform, if needed - canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0); - } else { - var canvas = createScratchCanvas(width, height); - var ctx = canvas.getContext('2d'); - if (trackTransform) { - addContextCurrentTransform(ctx); - } - this.cache[id] = canvasEntry = {canvas: canvas, context: ctx}; - } - return canvasEntry; - }, - clear: function () { - for (var id in this.cache) { - var canvasEntry = this.cache[id]; - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - canvasEntry.canvas.width = 0; - canvasEntry.canvas.height = 0; - delete this.cache[id]; - } - } - }; - return CachedCanvases; -})(); - -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]); - - // decodes bit-packed mask data - var lineSize = (width + 7) & ~7, data0 = imgData.data; - var data = new Uint8Array(lineSize * height), pos = 0, ii; - for (i = 0, ii = data0.length; i < ii; i++) { - var mask = 128, elem = data0[i]; - while (mask > 0) { - data[pos++] = (elem & mask) ? 0 : 255; - mask >>= 1; - } - } - - // 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 count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - 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 + 1] ? 4 : 0) + - (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - 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.textMatrixScale = 1; - 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; - // Default fore and background colors - this.fillColor = '#000000'; - this.strokeColor = '#000000'; - this.patternFill = false; - // Note: fill alpha applies to all non-stroking operations - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.activeSMask = null; // nonclonable field (see the save method below) - - 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; - // Defines the number of steps before checking the execution time - var EXECUTION_STEPS = 10; - - function CanvasGraphics(canvasCtx, commonObjs, objs, 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.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 = []; - this.groupLevel = 0; - this.smaskStack = []; - this.smaskCounter = 0; - this.tempSMask = null; - this.cachedCanvases = new CachedCanvases(); - if (canvasCtx) { - // NOTE: if mozCurrentTransform is polyfilled, then the current state of - // the transformation must already be set in canvasCtx._transformMatrix. - addContextCurrentTransform(canvasCtx); - } - this.cachedGetSinglePixelWidth = null; - } - - function putBinaryImageData(ctx, imgData) { - if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) { - ctx.putImageData(imgData, 0, 0); - return; - } - - // Put the image data to the canvas in chunks, rather than putting the - // whole image at once. This saves JS memory, because the ImageData object - // is smaller. It also possibly saves C++ memory within the implementation - // of putImageData(). (E.g. in Firefox we make two short-lived copies of - // the data passed to putImageData()). |n| shouldn't be too small, however, - // because too many putImageData() calls will slow things down. - // - // Note: as written, if the last chunk is partial, the putImageData() call - // will (conceptually) put pixels past the bounds of the canvas. But - // that's ok; any such pixels are ignored. - - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0, destPos; - var src = imgData.data; - var dest = chunkImgData.data; - var i, j, thisChunkHeight, elemsInThisChunk; - - // There are multiple forms in which the pixel data can be passed, and - // imgData.kind tells us which one this is. - if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { - // Grayscale, 1 bit per pixel (i.e. black-and-white). - var srcLength = src.byteLength; - var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) : - new Uint32ArrayView(dest); - var dest32DataLength = dest32.length; - var fullSrcDiff = (width + 7) >> 3; - var white = 0xFFFFFFFF; - var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ? - 0xFF000000 : 0x000000FF; - for (i = 0; i < totalChunks; i++) { - thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - destPos = 0; - for (j = 0; j < thisChunkHeight; j++) { - var srcDiff = srcLength - srcPos; - var k = 0; - var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7; - var kEndUnrolled = kEnd & ~7; - var mask = 0; - var srcByte = 0; - for (; k < kEndUnrolled; k += 8) { - srcByte = src[srcPos++]; - dest32[destPos++] = (srcByte & 128) ? white : black; - dest32[destPos++] = (srcByte & 64) ? white : black; - dest32[destPos++] = (srcByte & 32) ? white : black; - dest32[destPos++] = (srcByte & 16) ? white : black; - dest32[destPos++] = (srcByte & 8) ? white : black; - dest32[destPos++] = (srcByte & 4) ? white : black; - dest32[destPos++] = (srcByte & 2) ? white : black; - dest32[destPos++] = (srcByte & 1) ? white : black; - } - for (; k < kEnd; k++) { - if (mask === 0) { - srcByte = src[srcPos++]; - mask = 128; - } - - dest32[destPos++] = (srcByte & mask) ? white : black; - mask >>= 1; - } - } - // We ran out of input. Make all remaining pixels transparent. - while (destPos < dest32DataLength) { - dest32[destPos++] = 0; - } - - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else if (imgData.kind === ImageKind.RGBA_32BPP) { - // RGBA, 32-bits per pixel. - - j = 0; - elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; - for (i = 0; i < fullChunks; i++) { - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - srcPos += elemsInThisChunk; - - ctx.putImageData(chunkImgData, 0, j); - j += FULL_CHUNK_HEIGHT; - } - if (i < totalChunks) { - elemsInThisChunk = width * partialChunkHeight * 4; - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - ctx.putImageData(chunkImgData, 0, j); - } - - } else if (imgData.kind === ImageKind.RGB_24BPP) { - // RGB, 24-bits per pixel. - thisChunkHeight = FULL_CHUNK_HEIGHT; - elemsInThisChunk = width * thisChunkHeight; - for (i = 0; i < totalChunks; i++) { - if (i >= fullChunks) { - thisChunkHeight = partialChunkHeight; - elemsInThisChunk = width * thisChunkHeight; - } - - destPos = 0; - for (j = elemsInThisChunk; j--;) { - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = 255; - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else { - error('bad image kind: ' + imgData.kind); - } - } - - function putBinaryImageMask(ctx, imgData) { - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0; - var src = imgData.data; - var dest = chunkImgData.data; - - for (var i = 0; i < totalChunks; i++) { - var thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - - // Expand the mask so it can be used by the canvas. Any required - // inversion has already been handled. - var destPos = 3; // alpha component offset - for (var j = 0; j < thisChunkHeight; j++) { - var mask = 0; - for (var k = 0; k < width; k++) { - if (!mask) { - var elem = src[srcPos++]; - mask = 128; - } - dest[destPos] = (elem & mask) ? 0 : 255; - destPos += 4; - mask >>= 1; - } - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } - - 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 (sourceCtx[property] !== undefined) { - destCtx[property] = sourceCtx[property]; - } - } - if (sourceCtx.setLineDash !== undefined) { - destCtx.setLineDash(sourceCtx.getLineDash()); - destCtx.lineDashOffset = sourceCtx.lineDashOffset; - } else if (sourceCtx.mozDashOffset !== undefined) { - destCtx.mozDash = sourceCtx.mozDash; - destCtx.mozDashOffset = sourceCtx.mozDashOffset; - } - } - - function composeSMaskBackdrop(bytes, r0, g0, b0) { - var length = bytes.length; - for (var i = 3; i < length; i += 4) { - var alpha = bytes[i]; - if (alpha === 0) { - bytes[i - 3] = r0; - bytes[i - 2] = g0; - bytes[i - 1] = b0; - } else if (alpha < 255) { - var alpha_ = 255 - alpha; - bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8; - bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8; - bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8; - } - } - } - - function composeSMaskAlpha(maskData, layerData, transferMap) { - var length = maskData.length; - var scale = 1 / 255; - for (var i = 3; i < length; i += 4) { - var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; - layerData[i] = (layerData[i] * alpha * scale) | 0; - } - } - - function composeSMaskLuminosity(maskData, layerData, transferMap) { - var length = maskData.length; - for (var i = 3; i < length; i += 4) { - var y = (maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000 - (maskData[i - 2] * 152) + // * 0.59 .... - (maskData[i - 1] * 28); // * 0.11 .... - layerData[i] = transferMap ? - (layerData[i] * transferMap[y >> 8]) >> 8 : - (layerData[i] * y) >> 16; - } - } - - function genericComposeSMask(maskCtx, layerCtx, width, height, - subtype, backdrop, transferMap) { - var hasBackdrop = !!backdrop; - var r0 = hasBackdrop ? backdrop[0] : 0; - var g0 = hasBackdrop ? backdrop[1] : 0; - var b0 = hasBackdrop ? backdrop[2] : 0; - - var composeFn; - if (subtype === 'Luminosity') { - composeFn = composeSMaskLuminosity; - } else { - composeFn = composeSMaskAlpha; - } - - // processing image in chunks to save memory - var PIXELS_TO_PROCESS = 1048576; - var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (var row = 0; row < height; row += chunkSize) { - var chunkHeight = Math.min(chunkSize, height - row); - var maskData = maskCtx.getImageData(0, row, width, chunkHeight); - var layerData = layerCtx.getImageData(0, row, width, chunkHeight); - - if (hasBackdrop) { - composeSMaskBackdrop(maskData.data, r0, g0, b0); - } - composeFn(maskData.data, layerData.data, transferMap); - - maskCtx.putImageData(layerData, 0, row); - } - } - - function composeSMask(ctx, smask, layerCtx) { - var mask = smask.canvas; - var maskCtx = smask.context; - - ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, - smask.offsetX, smask.offsetY); - - var backdrop = smask.backdrop || null; - if (!smask.transferMap && WebGLUtils.isEnabled) { - var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask, - {subtype: smask.subtype, backdrop: backdrop}); - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(composed, smask.offsetX, smask.offsetY); - return; - } - genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, - smask.subtype, backdrop, smask.transferMap); - ctx.drawImage(mask, 0, 0); - } - - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; - - CanvasGraphics.prototype = { - - beginDrawing: function CanvasGraphics_beginDrawing(transform, 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, creating temporary - // transparent canvas when we have blend modes. - var width = this.ctx.canvas.width; - var height = this.ctx.canvas.height; - - this.ctx.save(); - this.ctx.fillStyle = 'rgb(255, 255, 255)'; - this.ctx.fillRect(0, 0, width, height); - this.ctx.restore(); - - if (transparency) { - var transparentCanvas = this.cachedCanvases.getCanvas( - 'transparent', width, height, true); - this.compositeCtx = this.ctx; - this.transparentCanvas = transparentCanvas.canvas; - this.ctx = transparentCanvas.context; - this.ctx.save(); - // The transform can be applied before rendering, transferring it to - // the new canvas. - this.ctx.transform.apply(this.ctx, - this.compositeCtx.mozCurrentTransform); - } - - this.ctx.save(); - if (transform) { - this.ctx.transform.apply(this.ctx, transform); - } - this.ctx.transform.apply(this.ctx, viewport.transform); - - this.baseTransform = this.ctx.mozCurrentTransform.slice(); - - 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 chunkOperations = (argsArrayLen - i > EXECUTION_STEPS && - typeof continueCallback === 'function'); - var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; - var steps = 0; - - var commonObjs = this.commonObjs; - var objs = this.objs; - var fnId; - - while (true) { - if (stepper !== undefined && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - - fnId = fnArray[i]; - - if (fnId !== OPS.dependency) { - this[fnId].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[0] === 'g' && depObjId[1] === '_'; - var objsPool = common ? commonObjs : objs; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objsPool.isResolved(depObjId)) { - objsPool.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 and - // `continueCallback` is specified, interrupt the execution. - if (chunkOperations && ++steps > EXECUTION_STEPS) { - if (Date.now() > endTime) { - continueCallback(); - return i; - } - steps = 0; - } - - // 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(); - - if (this.transparentCanvas) { - this.ctx = this.compositeCtx; - this.ctx.drawImage(this.transparentCanvas, 0, 0); - this.transparentCanvas = null; - } - - this.cachedCanvases.clear(); - WebGLUtils.clear(); - - 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 (ctx.setLineDash !== undefined) { - 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; - case 'SMask': - if (this.current.activeSMask) { - this.endSMaskGroup(); - } - this.current.activeSMask = value ? this.tempSMask : null; - if (this.current.activeSMask) { - this.beginSMaskGroup(); - } - this.tempSMask = null; - break; - } - } - }, - beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { - - var activeSMask = this.current.activeSMask; - var drawnWidth = activeSMask.canvas.width; - var drawnHeight = activeSMask.canvas.height; - var cacheId = 'smaskGroupAt' + this.groupLevel; - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - - var currentCtx = this.ctx; - var currentTransform = currentCtx.mozCurrentTransform; - this.ctx.save(); - - var groupCtx = scratchCanvas.context; - groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); - groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - copyCtxState(currentCtx, groupCtx); - this.ctx = groupCtx; - this.setGState([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - endSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.ctx; - this.groupLevel--; - this.ctx = this.groupStack.pop(); - - composeSMask(this.ctx, this.current.activeSMask, groupCtx); - this.ctx.restore(); - copyCtxState(groupCtx, this.ctx); - }, - save: function CanvasGraphics_save() { - this.ctx.save(); - var old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - this.current.activeSMask = null; - }, - restore: function CanvasGraphics_restore() { - if (this.stateStack.length !== 0) { - if (this.current.activeSMask !== null) { - this.endSMaskGroup(); - } - - this.current = this.stateStack.pop(); - this.ctx.restore(); - - // Ensure that the clipping path is reset (fixes issue6413.pdf). - this.pendingClip = null; - - this.cachedGetSinglePixelWidth = null; - } - }, - transform: function CanvasGraphics_transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - - this.cachedGetSinglePixelWidth = null; - }, - - // Path - constructPath: function CanvasGraphics_constructPath(ops, args) { - var ctx = this.ctx; - var current = this.current; - var x = current.x, y = current.y; - for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - if (width === 0) { - width = this.getSinglePixelWidth(); - } - if (height === 0) { - height = this.getSinglePixelWidth(); - } - var xw = x + width; - var yh = y + height; - this.ctx.moveTo(x, y); - this.ctx.lineTo(xw, y); - this.ctx.lineTo(xw, yh); - this.ctx.lineTo(x, yh); - this.ctx.lineTo(x, y); - this.ctx.closePath(); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - ctx.moveTo(x, y); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - ctx.lineTo(x, y); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], - x, y); - j += 6; - break; - case OPS.curveTo2: - ctx.bezierCurveTo(x, y, args[j], args[j + 1], - args[j + 2], args[j + 3]); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); - j += 4; - break; - case OPS.closePath: - ctx.closePath(); - break; - } - } - current.setCurrentPoint(x, y); - }, - closePath: function CanvasGraphics_closePath() { - this.ctx.closePath(); - }, - stroke: function CanvasGraphics_stroke(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; - // Prevent drawing too thin lines by enforcing a minimum line width. - ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, - this.current.lineWidth); - // 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, this); - 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 isPatternFill = this.current.patternFill; - var needRestore = false; - - if (isPatternFill) { - ctx.save(); - if (this.baseTransform) { - ctx.setTransform.apply(ctx, this.baseTransform); - } - ctx.fillStyle = fillColor.getPattern(ctx, this); - needRestore = true; - } - - if (this.pendingEOFill) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.fill(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.fill('evenodd'); - } - this.pendingEOFill = false; - } else { - 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.textMatrixScale = 1; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - endText: function CanvasGraphics_endText() { - var paths = this.pendingTextPaths; - var ctx = this.ctx; - if (paths === undefined) { - ctx.beginPath(); - return; - } - - 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.isType3Font) { - return; // we don't need ctx.font for Type3 fonts - } - - var name = fontObj.loadedName || 'sans-serif'; - var bold = fontObj.black ? (fontObj.bold ? '900' : '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 ? MIN_FONT_SIZE : - size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size; - this.current.fontSizeScale = size / browserFontSize; - - 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.textMatrixScale = Math.sqrt(a * a + b * b); - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - nextLine: function CanvasGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - paintChar: function CanvasGraphics_paintChar(character, x, y) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var textRenderingMode = current.textRenderingMode; - var fontSize = current.fontSize / current.fontSizeScale; - var fillStrokeMode = textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - var isAddToPathSet = !!(textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - - var addToPath; - if (font.disableFontFace || isAddToPathSet) { - addToPath = font.getPathGenerator(this.commonObjs, 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 - }); - } - }, - - get isFontSubpixelAAEnabled() { - // Checks if anti-aliasing is enabled when scaled text is painted. - // On Windows GDI scaled fonts looks bad. - var ctx = document.createElement('canvas').getContext('2d'); - ctx.scale(1.5, 1); - ctx.fillText('I', 0, 10); - var data = ctx.getImageData(0, 0, 10, 10).data; - var enabled = false; - for (var i = 3; i < data.length; i += 4) { - if (data[i] > 0 && data[i] < 255) { - enabled = true; - break; - } - } - return shadow(this, 'isFontSubpixelAAEnabled', enabled); - }, - - showText: function CanvasGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - if (font.isType3Font) { - return this.showType3Text(glyphs); - } - - var fontSize = current.fontSize; - if (fontSize === 0) { - return; - } - - var ctx = this.ctx; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var spacingDir = vertical ? 1 : -1; - var defaultVMetrics = font.defaultVMetrics; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var simpleFillText = - current.textRenderingMode === TextRenderingMode.FILL && - !font.disableFontFace; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - - if (fontDirection > 0) { - ctx.scale(textHScale, -1); - } else { - ctx.scale(textHScale, 1); - } - - var lineWidth = current.lineWidth; - var scale = current.textMatrixScale; - if (scale === 0 || lineWidth === 0) { - var fillStrokeMode = current.textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - this.cachedGetSinglePixelWidth = null; - lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; - } - } else { - lineWidth /= scale; - } - - if (fontSizeScale !== 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - - ctx.lineWidth = lineWidth; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (isNum(glyph)) { - x += spacingDir * glyph * fontSize / 1000; - continue; - } - - var restoreNeeded = false; - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var character = glyph.fontChar; - var accent = glyph.accent; - var scaledX, scaledY, scaledAccentX, scaledAccentY; - var width = glyph.width; - if (vertical) { - var vmetric, vx, vy; - vmetric = glyph.vmetric || defaultVMetrics; - vx = glyph.vmetric ? vmetric[1] : width * 0.5; - vx = -vx * widthAdvanceScale; - vy = vmetric[2] * widthAdvanceScale; - - width = vmetric ? -vmetric[0] : width; - 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: rescale per - // character if measured width is greater than expected glyph width - // and subpixel-aa is enabled, otherwise just center the glyph. - var measuredWidth = ctx.measureText(character).width * 1000 / - fontSize * fontSizeScale; - if (width < measuredWidth && this.isFontSubpixelAAEnabled) { - var characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - } else if (width !== measuredWidth) { - scaledX += (width - measuredWidth) / 2000 * - fontSize / fontSizeScale; - } - } - - if (simpleFillText && !accent) { - // common case - ctx.fillText(character, scaledX, scaledY); - } else { - 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); - } - } - - var charWidth = width * widthAdvanceScale + spacing * fontDirection; - x += charWidth; - - if (restoreNeeded) { - ctx.restore(); - } - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - ctx.restore(); - }, - - showType3Text: function CanvasGraphics_showType3Text(glyphs) { - // Type3 fonts - each glyph is a "mini-PDF" - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var fontDirection = current.fontDirection; - var spacingDir = font.vertical ? 1 : -1; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * fontDirection; - var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; - var glyphsLength = glyphs.length; - var isTextInvisible = - current.textRenderingMode === TextRenderingMode.INVISIBLE; - var i, glyph, width, spacingLength; - - if (isTextInvisible || fontSize === 0) { - return; - } - this.cachedGetSinglePixelWidth = null; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); - - ctx.scale(textHScale, fontDirection); - - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (isNum(glyph)) { - spacingLength = spacingDir * glyph * fontSize / 1000; - this.ctx.translate(spacingLength, 0); - current.x += spacingLength * textHScale; - continue; - } - - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var operatorList = font.charProcOperatorList[glyph.operatorListId]; - if (!operatorList) { - warn('Type3 character \"' + glyph.operatorListId + - '\" is not available'); - continue; - } - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - this.executeOperatorList(operatorList); - this.restore(); - - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + spacing; - - ctx.translate(width, 0); - current.x += width * textHScale; - } - ctx.restore(); - this.processingType3 = null; - }, - - // 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.ctx.rect(llx, lly, urx - llx, ury - lly); - this.clip(); - this.endPath(); - }, - - // Color - getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { - var pattern; - if (IR[0] === 'TilingPattern') { - var color = IR[1]; - var baseTransform = this.baseTransform || - this.ctx.mozCurrentTransform.slice(); - pattern = new TilingPattern(IR, color, this.ctx, this.objs, - this.commonObjs, baseTransform); - } else { - pattern = getShadingPatternFromIR(IR); - } - return pattern; - }, - setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { - this.current.strokeColor = this.getColorN_Pattern(arguments); - }, - setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { - this.current.fillColor = this.getColorN_Pattern(arguments); - this.current.patternFill = true; - }, - setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - this.current.patternFill = false; - }, - - shadingFill: function CanvasGraphics_shadingFill(patternIR) { - var ctx = this.ctx; - - this.save(); - var pattern = getShadingPatternFromIR(patternIR); - ctx.fillStyle = pattern.getPattern(ctx, this, true); - - 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); - } 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.baseTransformStack.push(this.baseTransform); - - if (isArray(matrix) && 6 === matrix.length) { - this.transform.apply(this, matrix); - } - - this.baseTransform = this.ctx.mozCurrentTransform; - - if (isArray(bbox) && 4 === bbox.length) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - this.ctx.rect(bbox[0], bbox[1], width, height); - this.clip(); - this.endPath(); - } - }, - - paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { - this.restore(); - 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) { - warn('Knockout groups not supported.'); - } - - 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); - // Clip the bounding box to the current canvas. - var canvasBounds = [0, - 0, - currentCtx.canvas.width, - currentCtx.canvas.height]; - bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; - // 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 offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - var scaleX = 1, scaleY = 1; - if (drawnWidth > MAX_GROUP_SIZE) { - scaleX = drawnWidth / MAX_GROUP_SIZE; - drawnWidth = MAX_GROUP_SIZE; - } - if (drawnHeight > MAX_GROUP_SIZE) { - scaleY = drawnHeight / MAX_GROUP_SIZE; - drawnHeight = MAX_GROUP_SIZE; - } - - var cacheId = 'groupAt' + this.groupLevel; - if (group.smask) { - // Using two cache entries is case if masks are used one after another. - cacheId += '_smask_' + ((this.smaskCounter++) % 2); - } - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - var groupCtx = scratchCanvas.context; - - // Since we created a new canvas that is just the size of the bounding box - // we have to translate the group ctx. - groupCtx.scale(1 / scaleX, 1 / scaleY); - groupCtx.translate(-offsetX, -offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - if (group.smask) { - // Saving state and cached mask to be used in setGState. - this.smaskStack.push({ - canvas: scratchCanvas.canvas, - context: groupCtx, - offsetX: offsetX, - offsetY: offsetY, - scaleX: scaleX, - scaleY: scaleY, - subtype: group.smask.subtype, - backdrop: group.smask.backdrop, - transferMap: group.smask.transferMap || null - }); - } else { - // Setup the current ctx so when the group is popped we draw it at the - // right location. - currentCtx.setTransform(1, 0, 0, 1, 0, 0); - currentCtx.translate(offsetX, offsetY); - currentCtx.scale(scaleX, scaleY); - } - // 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([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - - endGroup: function CanvasGraphics_endGroup(group) { - this.groupLevel--; - 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 (this.ctx.imageSmoothingEnabled !== undefined) { - this.ctx.imageSmoothingEnabled = false; - } else { - this.ctx.mozImageSmoothingEnabled = false; - } - if (group.smask) { - this.tempSMask = this.smaskStack.pop(); - } else { - 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 (isArray(rect) && 4 === rect.length) { - var width = rect[2] - rect[0]; - var height = rect[3] - rect[1]; - this.ctx.rect(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) { - warn('Dependent image isn\'t ready yet'); - return; - } - - 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 fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var glyph = this.processingType3; - - if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { - 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 = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, img); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - this.paintInlineImageXObject(maskCanvas.canvas); - }, - - paintImageMaskXObjectRepeat: - function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, - scaleY, positions) { - var width = imgData.width; - var height = imgData.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, imgData); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - var ctx = this.ctx; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - ctx.save(); - ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageMaskXObjectGroup: - function CanvasGraphics_paintImageMaskXObjectGroup(images) { - var ctx = this.ctx; - - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - for (var i = 0, ii = images.length; i < ii; i++) { - var image = images[i]; - var width = image.width, height = image.height; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, image); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - ctx.save(); - ctx.transform.apply(ctx, image.transform); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - this.paintInlineImageXObject(imgData); - }, - - paintImageXObjectRepeat: - function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, - positions) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - var width = imgData.width; - var height = imgData.height; - var map = []; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - map.push({transform: [scaleX, 0, 0, scaleY, positions[i], - positions[i + 1]], x: 0, y: 0, w: width, h: height}); - } - this.paintInlineImageXObjectGroup(imgData, map); - }, - - 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, tmpCanvas; - // instanceof HTMLElement does not work in jsdom node.js module - if (imgData instanceof HTMLElement || !imgData.data) { - imgToPaint = imgData; - } else { - tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', - width, height); - var tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - imgToPaint = tmpCanvas.canvas; - } - - 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; - } - tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, - newWidth, newHeight); - tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, newWidth, newHeight); - tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, - 0, 0, newWidth, newHeight); - imgToPaint = tmpCanvas.canvas; - 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 = this.cachedCanvases.getCanvas('inlineImage', w, h); - var tmpCtx = tmpCanvas.context; - 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.canvas, 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(); - } - }, - - paintSolidColorImageMask: - function CanvasGraphics_paintSolidColorImageMask() { - this.ctx.fillRect(0, 0, 1, 1); - }, - - paintXObject: function CanvasGraphics_paintXObject() { - warn('Unsupported \'paintXObject\' command.'); - }, - - // 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() { - var ctx = this.ctx; - if (this.pendingClip) { - if (this.pendingClip === EO_CLIP) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.clip(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.clip('evenodd'); - } - } else { - ctx.clip(); - } - this.pendingClip = null; - } - ctx.beginPath(); - }, - getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { - if (this.cachedGetSinglePixelWidth === null) { - var inverse = this.ctx.mozCurrentTransformInverse; - // max of the current horizontal and vertical scale - this.cachedGetSinglePixelWidth = Math.sqrt(Math.max( - (inverse[0] * inverse[0] + inverse[1] * inverse[1]), - (inverse[2] * inverse[2] + inverse[3] * inverse[3]))); - } - return this.cachedGetSinglePixelWidth; - }, - 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] - ]; - } - }; - - for (var op in OPS) { - CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; - } - - return CanvasGraphics; -})(); - - -var WebGLUtils = (function WebGLUtilsClosure() { - function loadShader(gl, code, shaderType) { - var shader = gl.createShader(shaderType); - gl.shaderSource(shader, code); - gl.compileShader(shader); - var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); - if (!compiled) { - var errorMsg = gl.getShaderInfoLog(shader); - throw new Error('Error during shader compilation: ' + errorMsg); - } - return shader; - } - function createVertexShader(gl, code) { - return loadShader(gl, code, gl.VERTEX_SHADER); - } - function createFragmentShader(gl, code) { - return loadShader(gl, code, gl.FRAGMENT_SHADER); - } - function createProgram(gl, shaders) { - var program = gl.createProgram(); - for (var i = 0, ii = shaders.length; i < ii; ++i) { - gl.attachShader(program, shaders[i]); - } - gl.linkProgram(program); - var linked = gl.getProgramParameter(program, gl.LINK_STATUS); - if (!linked) { - var errorMsg = gl.getProgramInfoLog(program); - throw new Error('Error during program linking: ' + errorMsg); - } - return program; - } - function createTexture(gl, image, textureId) { - gl.activeTexture(textureId); - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - - // Set the parameters so we can render any size image. - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - - // Upload the image into the texture. - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); - return texture; - } - - var currentGL, currentCanvas; - function generateGL() { - if (currentGL) { - return; - } - currentCanvas = document.createElement('canvas'); - currentGL = currentCanvas.getContext('webgl', - { premultipliedalpha: false }); - } - - var smaskVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec2 a_texCoord; \ - \ - uniform vec2 u_resolution; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_texCoord = a_texCoord; \ - } '; - - var smaskFragmentShaderCode = '\ - precision mediump float; \ - \ - uniform vec4 u_backdrop; \ - uniform int u_subtype; \ - uniform sampler2D u_image; \ - uniform sampler2D u_mask; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec4 imageColor = texture2D(u_image, v_texCoord); \ - vec4 maskColor = texture2D(u_mask, v_texCoord); \ - if (u_backdrop.a > 0.0) { \ - maskColor.rgb = maskColor.rgb * maskColor.a + \ - u_backdrop.rgb * (1.0 - maskColor.a); \ - } \ - float lum; \ - if (u_subtype == 0) { \ - lum = maskColor.a; \ - } else { \ - lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \ - maskColor.b * 0.11; \ - } \ - imageColor.a *= lum; \ - imageColor.rgb *= imageColor.a; \ - gl_FragColor = imageColor; \ - } '; - - var smaskCache = null; - - function initSmaskGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, smaskVertexShaderCode); - var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop'); - cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype'); - - var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord'); - var texLayerLocation = gl.getUniformLocation(program, 'u_image'); - var texMaskLocation = gl.getUniformLocation(program, 'u_mask'); - - // provide texture coordinates for the rectangle. - var texCoordBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 0.0, 1.0, - 1.0, 0.0, - 1.0, 1.0]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(texCoordLocation); - gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); - - gl.uniform1i(texLayerLocation, 0); - gl.uniform1i(texMaskLocation, 1); - - smaskCache = cache; - } - - function composeSMask(layer, mask, properties) { - var width = layer.width, height = layer.height; - - if (!smaskCache) { - initSmaskGL(); - } - var cache = smaskCache,canvas = cache.canvas, gl = cache.gl; - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - if (properties.backdrop) { - gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], - properties.backdrop[1], properties.backdrop[2], 1); - } else { - gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0); - } - gl.uniform1i(cache.subtypeLocation, - properties.subtype === 'Luminosity' ? 1 : 0); - - // Create a textures - var texture = createTexture(gl, layer, gl.TEXTURE0); - var maskTexture = createTexture(gl, mask, gl.TEXTURE1); - - - // Create a buffer and put a single clipspace rectangle in - // it (2 triangles) - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0, 0, - width, 0, - 0, height, - 0, height, - width, 0, - width, height]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - // draw - gl.clearColor(0, 0, 0, 0); - gl.enable(gl.BLEND); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.clear(gl.COLOR_BUFFER_BIT); - - gl.drawArrays(gl.TRIANGLES, 0, 6); - - gl.flush(); - - gl.deleteTexture(texture); - gl.deleteTexture(maskTexture); - gl.deleteBuffer(buffer); - - return canvas; - } - - var figuresVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec3 a_color; \ - \ - uniform vec2 u_resolution; \ - uniform vec2 u_scale; \ - uniform vec2 u_offset; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - vec2 position = (a_position + u_offset) * u_scale; \ - vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_color = vec4(a_color / 255.0, 1.0); \ - } '; - - var figuresFragmentShaderCode = '\ - precision mediump float; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - gl_FragColor = v_color; \ - } '; - - var figuresCache = null; - - function initFiguresGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, figuresVertexShaderCode); - var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.scaleLocation = gl.getUniformLocation(program, 'u_scale'); - cache.offsetLocation = gl.getUniformLocation(program, 'u_offset'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.colorLocation = gl.getAttribLocation(program, 'a_color'); - - figuresCache = cache; - } - - function drawFigures(width, height, backgroundColor, figures, context) { - if (!figuresCache) { - initFiguresGL(); - } - var cache = figuresCache, canvas = cache.canvas, gl = cache.gl; - - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - // count triangle points - var count = 0; - var i, ii, rows; - for (i = 0, ii = figures.length; i < ii; i++) { - switch (figures[i].type) { - case 'lattice': - rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0; - count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; - break; - case 'triangles': - count += figures[i].coords.length; - break; - } - } - // transfer data - var coords = new Float32Array(count * 2); - var colors = new Uint8Array(count * 3); - var coordsMap = context.coords, colorsMap = context.colors; - var pIndex = 0, cIndex = 0; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - switch (figure.type) { - case 'lattice': - var cols = figure.verticesPerRow; - rows = (ps.length / cols) | 0; - for (var row = 1; row < rows; row++) { - var offset = row * cols + 1; - for (var col = 1; col < cols; col++, offset++) { - coords[pIndex] = coordsMap[ps[offset - cols - 1]]; - coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; - coords[pIndex + 2] = coordsMap[ps[offset - cols]]; - coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1]; - coords[pIndex + 4] = coordsMap[ps[offset - 1]]; - coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1]; - colors[cIndex] = colorsMap[cs[offset - cols - 1]]; - colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1]; - colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2]; - colors[cIndex + 3] = colorsMap[cs[offset - cols]]; - colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1]; - colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2]; - colors[cIndex + 6] = colorsMap[cs[offset - 1]]; - colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1]; - colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2]; - - coords[pIndex + 6] = coords[pIndex + 2]; - coords[pIndex + 7] = coords[pIndex + 3]; - coords[pIndex + 8] = coords[pIndex + 4]; - coords[pIndex + 9] = coords[pIndex + 5]; - coords[pIndex + 10] = coordsMap[ps[offset]]; - coords[pIndex + 11] = coordsMap[ps[offset] + 1]; - colors[cIndex + 9] = colors[cIndex + 3]; - colors[cIndex + 10] = colors[cIndex + 4]; - colors[cIndex + 11] = colors[cIndex + 5]; - colors[cIndex + 12] = colors[cIndex + 6]; - colors[cIndex + 13] = colors[cIndex + 7]; - colors[cIndex + 14] = colors[cIndex + 8]; - colors[cIndex + 15] = colorsMap[cs[offset]]; - colors[cIndex + 16] = colorsMap[cs[offset] + 1]; - colors[cIndex + 17] = colorsMap[cs[offset] + 2]; - pIndex += 12; - cIndex += 18; - } - } - break; - case 'triangles': - for (var j = 0, jj = ps.length; j < jj; j++) { - coords[pIndex] = coordsMap[ps[j]]; - coords[pIndex + 1] = coordsMap[ps[j] + 1]; - colors[cIndex] = colorsMap[cs[j]]; - colors[cIndex + 1] = colorsMap[cs[j] + 1]; - colors[cIndex + 2] = colorsMap[cs[j] + 2]; - pIndex += 2; - cIndex += 3; - } - break; - } - } - - // draw - if (backgroundColor) { - gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, - backgroundColor[2] / 255, 1.0); - } else { - gl.clearColor(0, 0, 0, 0); - } - gl.clear(gl.COLOR_BUFFER_BIT); - - var coordsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - var colorsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.colorLocation); - gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, - 0, 0); - - gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY); - gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY); - - gl.drawArrays(gl.TRIANGLES, 0, count); - - gl.flush(); - - gl.deleteBuffer(coordsBuffer); - gl.deleteBuffer(colorsBuffer); - - return canvas; - } - - function cleanup() { - if (smaskCache && smaskCache.canvas) { - smaskCache.canvas.width = 0; - smaskCache.canvas.height = 0; - } - if (figuresCache && figuresCache.canvas) { - figuresCache.canvas.width = 0; - figuresCache.canvas.height = 0; - } - smaskCache = null; - figuresCache = null; - } - - return { - get isEnabled() { - if (PDFJS.disableWebGL) { - return false; - } - var enabled = false; - try { - generateGL(); - enabled = !!currentGL; - } catch (e) { } - return shadow(this, 'isEnabled', enabled); - }, - composeSMask: composeSMask, - drawFigures: drawFigures, - clear: cleanup - }; -})(); - - -var ShadingIRs = {}; - -ShadingIRs.RadialAxial = { - fromIR: function RadialAxial_fromIR(raw) { - var type = raw[1]; - var colorStops = raw[2]; - var p0 = raw[3]; - var p1 = raw[4]; - var r0 = raw[5]; - var r1 = raw[6]; - return { - type: 'Pattern', - getPattern: function RadialAxial_getPattern(ctx) { - var grad; - if (type === 'axial') { - grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); - } else if (type === 'radial') { - grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); - } - - for (var i = 0, ii = colorStops.length; i < ii; ++i) { - var c = colorStops[i]; - grad.addColorStop(c[0], c[1]); - } - return grad; - } - }; - } -}; - -var createMeshCanvas = (function createMeshCanvasClosure() { - function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { - // Very basic Gouraud-shaded triangle rasterization algorithm. - var coords = context.coords, colors = context.colors; - var bytes = data.data, rowSize = data.width * 4; - var tmp; - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - if (coords[p2 + 1] > coords[p3 + 1]) { - tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp; - } - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - var x1 = (coords[p1] + context.offsetX) * context.scaleX; - var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - var x2 = (coords[p2] + context.offsetX) * context.scaleX; - var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - var x3 = (coords[p3] + context.offsetX) * context.scaleX; - var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; - if (y1 >= y3) { - return; - } - var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2]; - var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2]; - var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2]; - - var minY = Math.round(y1), maxY = Math.round(y3); - var xa, car, cag, cab; - var xb, cbr, cbg, cbb; - var k; - for (var y = minY; y <= maxY; y++) { - if (y < y2) { - k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2); - xa = x1 - (x1 - x2) * k; - car = c1r - (c1r - c2r) * k; - cag = c1g - (c1g - c2g) * k; - cab = c1b - (c1b - c2b) * k; - } else { - k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3); - xa = x2 - (x2 - x3) * k; - car = c2r - (c2r - c3r) * k; - cag = c2g - (c2g - c3g) * k; - cab = c2b - (c2b - c3b) * k; - } - k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3); - xb = x1 - (x1 - x3) * k; - cbr = c1r - (c1r - c3r) * k; - cbg = c1g - (c1g - c3g) * k; - cbb = c1b - (c1b - c3b) * k; - var x1_ = Math.round(Math.min(xa, xb)); - var x2_ = Math.round(Math.max(xa, xb)); - var j = rowSize * y + x1_ * 4; - for (var x = x1_; x <= x2_; x++) { - k = (xa - x) / (xa - xb); - k = k < 0 ? 0 : k > 1 ? 1 : k; - bytes[j++] = (car - (car - cbr) * k) | 0; - bytes[j++] = (cag - (cag - cbg) * k) | 0; - bytes[j++] = (cab - (cab - cbb) * k) | 0; - bytes[j++] = 255; - } - } - } - - function drawFigure(data, figure, context) { - var ps = figure.coords; - var cs = figure.colors; - var i, ii; - switch (figure.type) { - case 'lattice': - var verticesPerRow = figure.verticesPerRow; - var rows = Math.floor(ps.length / verticesPerRow) - 1; - var cols = verticesPerRow - 1; - for (i = 0; i < rows; i++) { - var q = i * verticesPerRow; - for (var j = 0; j < cols; j++, q++) { - drawTriangle(data, context, - ps[q], ps[q + 1], ps[q + verticesPerRow], - cs[q], cs[q + 1], cs[q + verticesPerRow]); - drawTriangle(data, context, - ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], - cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); - } - } - break; - case 'triangles': - for (i = 0, ii = ps.length; i < ii; i += 3) { - drawTriangle(data, context, - ps[i], ps[i + 1], ps[i + 2], - cs[i], cs[i + 1], cs[i + 2]); - } - break; - default: - error('illigal figure'); - break; - } - } - - function createMeshCanvas(bounds, combinesScale, coords, colors, figures, - backgroundColor, cachedCanvases) { - // we will increase scale on some weird factor to let antialiasing take - // care of "rough" edges - var EXPECTED_SCALE = 1.1; - // MAX_PATTERN_SIZE is used to avoid OOM situation. - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var boundsWidth = Math.ceil(bounds[2]) - offsetX; - var boundsHeight = Math.ceil(bounds[3]) - offsetY; - - var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var scaleX = boundsWidth / width; - var scaleY = boundsHeight / height; - - var context = { - coords: coords, - colors: colors, - offsetX: -offsetX, - offsetY: -offsetY, - scaleX: 1 / scaleX, - scaleY: 1 / scaleY - }; - - var canvas, tmpCanvas, i, ii; - if (WebGLUtils.isEnabled) { - canvas = WebGLUtils.drawFigures(width, height, backgroundColor, - figures, context); - - // https://bugzilla.mozilla.org/show_bug.cgi?id=972126 - tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false); - tmpCanvas.context.drawImage(canvas, 0, 0); - canvas = tmpCanvas.canvas; - } else { - tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false); - var tmpCtx = tmpCanvas.context; - - var data = tmpCtx.createImageData(width, height); - if (backgroundColor) { - var bytes = data.data; - for (i = 0, ii = bytes.length; i < ii; i += 4) { - bytes[i] = backgroundColor[0]; - bytes[i + 1] = backgroundColor[1]; - bytes[i + 2] = backgroundColor[2]; - bytes[i + 3] = 255; - } - } - for (i = 0; i < figures.length; i++) { - drawFigure(data, figures[i], context); - } - tmpCtx.putImageData(data, 0, 0); - canvas = tmpCanvas.canvas; - } - - return {canvas: canvas, offsetX: offsetX, offsetY: offsetY, - scaleX: scaleX, scaleY: scaleY}; - } - return createMeshCanvas; -})(); - -ShadingIRs.Mesh = { - fromIR: function Mesh_fromIR(raw) { - //var type = raw[1]; - var coords = raw[2]; - var colors = raw[3]; - var figures = raw[4]; - var bounds = raw[5]; - var matrix = raw[6]; - //var bbox = raw[7]; - var background = raw[8]; - return { - type: 'Pattern', - getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { - var scale; - if (shadingFill) { - scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); - } else { - // Obtain scale from matrix and current transformation matrix. - scale = Util.singularValueDecompose2dScale(owner.baseTransform); - if (matrix) { - var matrixScale = Util.singularValueDecompose2dScale(matrix); - scale = [scale[0] * matrixScale[0], - scale[1] * matrixScale[1]]; - } - } - - - // Rasterizing on the main thread since sending/queue large canvases - // might cause OOM. - var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, - colors, figures, shadingFill ? null : background, - owner.cachedCanvases); - - if (!shadingFill) { - ctx.setTransform.apply(ctx, owner.baseTransform); - if (matrix) { - ctx.transform.apply(ctx, matrix); - } - } - - ctx.translate(temporaryPatternCanvas.offsetX, - temporaryPatternCanvas.offsetY); - ctx.scale(temporaryPatternCanvas.scaleX, - temporaryPatternCanvas.scaleY); - - return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat'); - } - }; - } -}; - -ShadingIRs.Dummy = { - fromIR: function Dummy_fromIR() { - return { - type: 'Pattern', - getPattern: function Dummy_fromIR_getPattern() { - return 'hotpink'; - } - }; - } -}; - -function getShadingPatternFromIR(raw) { - var shadingIR = ShadingIRs[raw[0]]; - if (!shadingIR) { - error('Unknown IR type: ' + raw[0]); - } - return shadingIR.fromIR(raw); -} - -var TilingPattern = (function TilingPatternClosure() { - var PaintType = { - COLORED: 1, - UNCOLORED: 2 - }; - - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) { - this.operatorList = IR[2]; - this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; - this.bbox = IR[4]; - this.xstep = IR[5]; - this.ystep = IR[6]; - this.paintType = IR[7]; - this.tilingType = IR[8]; - this.color = color; - this.objs = objs; - this.commonObjs = commonObjs; - this.baseTransform = baseTransform; - this.type = 'Pattern'; - this.ctx = ctx; - } - - TilingPattern.prototype = { - createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { - var operatorList = this.operatorList; - var bbox = this.bbox; - var xstep = this.xstep; - var ystep = this.ystep; - var paintType = this.paintType; - var tilingType = this.tilingType; - var color = this.color; - var objs = this.objs; - var commonObjs = this.commonObjs; - - info('TilingType: ' + tilingType); - - var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; - - var topLeft = [x0, y0]; - // we want the canvas to be as large as the step size - var botRight = [x0 + xstep, y0 + ystep]; - - var width = botRight[0] - topLeft[0]; - var height = botRight[1] - topLeft[1]; - - // Obtain scale from matrix and current transformation matrix. - var matrixScale = Util.singularValueDecompose2dScale(this.matrix); - var curMatrixScale = Util.singularValueDecompose2dScale( - this.baseTransform); - var combinedScale = [matrixScale[0] * curMatrixScale[0], - matrixScale[1] * curMatrixScale[1]]; - - // MAX_PATTERN_SIZE is used to avoid OOM situation. - // Use width and height values that are as close as possible to the end - // result when the pattern is used. Too low value makes the pattern look - // blurry. Too large value makes it look too crispy. - width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), - MAX_PATTERN_SIZE); - - height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), - MAX_PATTERN_SIZE); - - var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', - width, height, true); - var tmpCtx = tmpCanvas.context; - var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs); - graphics.groupLevel = owner.groupLevel; - - this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color); - - this.setScale(width, height, xstep, ystep); - this.transformToScale(graphics); - - // transform coordinates to pattern space - var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; - graphics.transform.apply(graphics, tmpTranslate); - - this.clipBbox(graphics, bbox, x0, y0, x1, y1); - - graphics.executeOperatorList(operatorList); - return tmpCanvas.canvas; - }, - - setScale: function TilingPattern_setScale(width, height, xstep, ystep) { - this.scale = [width / xstep, height / ystep]; - }, - - transformToScale: function TilingPattern_transformToScale(graphics) { - var scale = this.scale; - var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; - graphics.transform.apply(graphics, tmpScale); - }, - - scaleToContext: function TilingPattern_scaleToContext() { - var scale = this.scale; - this.ctx.scale(1 / scale[0], 1 / scale[1]); - }, - - clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { - if (bbox && isArray(bbox) && bbox.length === 4) { - var bboxWidth = x1 - x0; - var bboxHeight = y1 - y0; - graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); - graphics.clip(); - graphics.endPath(); - } - }, - - setFillAndStrokeStyleToContext: - function setFillAndStrokeStyleToContext(context, paintType, color) { - switch (paintType) { - case PaintType.COLORED: - var ctx = this.ctx; - context.fillStyle = ctx.fillStyle; - context.strokeStyle = ctx.strokeStyle; - break; - case PaintType.UNCOLORED: - var cssColor = Util.makeCssRgb(color[0], color[1], color[2]); - context.fillStyle = cssColor; - context.strokeStyle = cssColor; - break; - default: - error('Unsupported paint type: ' + paintType); - } - }, - - getPattern: function TilingPattern_getPattern(ctx, owner) { - var temporaryPatternCanvas = this.createPatternCanvas(owner); - - ctx = this.ctx; - ctx.setTransform.apply(ctx, this.baseTransform); - ctx.transform.apply(ctx, this.matrix); - this.scaleToContext(); - - return ctx.createPattern(temporaryPatternCanvas, 'repeat'); - } - }; - - return TilingPattern; -})(); - - -function FontLoader(docId) { - this.docId = docId; - this.styleElement = null; - this.nativeFontFaces = []; - this.loadTestFontId = 0; - this.loadingContext = { - requests: [], - nextRequestId: 0 - }; -} -FontLoader.prototype = { - insertRule: function fontLoaderInsertRule(rule) { - var styleElement = this.styleElement; - if (!styleElement) { - styleElement = this.styleElement = document.createElement('style'); - styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; - document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); - } - - var styleSheet = styleElement.sheet; - styleSheet.insertRule(rule, styleSheet.cssRules.length); - }, - - clear: function fontLoaderClear() { - var styleElement = this.styleElement; - if (styleElement) { - styleElement.parentNode.removeChild(styleElement); - styleElement = this.styleElement = null; - } - this.nativeFontFaces.forEach(function(nativeFontFace) { - document.fonts.delete(nativeFontFace); - }); - this.nativeFontFaces.length = 0; - }, - get loadTestFont() { - // This is a CFF font with 1 glyph for '.' that fills its entire width and - // height. - return shadow(this, 'loadTestFont', atob( - 'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + - 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + - 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + - 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + - 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + - 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + - 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + - 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + - 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + - 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + - 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + - 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + - 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + - 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + - 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + - 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + - 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + - 'ABAAAAAAAAAAAD6AAAAAAAAA==' - )); - }, - - addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) { - this.nativeFontFaces.push(nativeFontFace); - document.fonts.add(nativeFontFace); - }, - - bind: function fontLoaderBind(fonts, callback) { - assert(!isWorker, 'bind() shall be called from main thread'); - - var rules = []; - var fontsToLoad = []; - var fontLoadPromises = []; - var getNativeFontPromise = function(nativeFontFace) { - // Return a promise that is always fulfilled, even when the font fails to - // load. - return nativeFontFace.loaded.catch(function(e) { - warn('Failed to load font "' + nativeFontFace.family + '": ' + e); - }); - }; - for (var i = 0, ii = fonts.length; i < ii; i++) { - var font = fonts[i]; - - // Add the font to the DOM only once or skip if the font - // is already loaded. - if (font.attached || font.loading === false) { - continue; - } - font.attached = true; - - if (FontLoader.isFontLoadingAPISupported) { - var nativeFontFace = font.createNativeFontFace(); - if (nativeFontFace) { - this.addNativeFontFace(nativeFontFace); - fontLoadPromises.push(getNativeFontPromise(nativeFontFace)); - } - } else { - var rule = font.createFontFaceRule(); - if (rule) { - this.insertRule(rule); - rules.push(rule); - fontsToLoad.push(font); - } - } - } - - var request = this.queueLoadingCallback(callback); - if (FontLoader.isFontLoadingAPISupported) { - Promise.all(fontLoadPromises).then(function() { - request.complete(); - }); - } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) { - this.prepareFontLoadEvent(rules, fontsToLoad, request); - } else { - request.complete(); - } - }, - - queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) { - function LoadLoader_completeRequest() { - assert(!request.end, 'completeRequest() cannot be called twice'); - request.end = Date.now(); - - // sending all completed requests in order how they were queued - while (context.requests.length > 0 && context.requests[0].end) { - var otherRequest = context.requests.shift(); - setTimeout(otherRequest.callback, 0); - } - } - - var context = this.loadingContext; - var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++); - var request = { - id: requestId, - complete: LoadLoader_completeRequest, - callback: callback, - started: Date.now() - }; - context.requests.push(request); - return request; - }, - - prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, - fonts, - request) { - /** Hack begin */ - // There's currently no event when a font has finished downloading so the - // following code is a dirty hack to 'guess' when a font is - // ready. It's assumed fonts are loaded in order, so add a known test - // font after the desired fonts and then test for the loading of that - // test font. - - function int32(data, offset) { - return (data.charCodeAt(offset) << 24) | - (data.charCodeAt(offset + 1) << 16) | - (data.charCodeAt(offset + 2) << 8) | - (data.charCodeAt(offset + 3) & 0xff); - } - - function spliceString(s, offset, remove, insert) { - var chunk1 = s.substr(0, offset); - var chunk2 = s.substr(offset + remove); - return chunk1 + insert + chunk2; - } - - var i, ii; - - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - - var called = 0; - function isFontReady(name, callback) { - called++; - // With setTimeout clamping this gives the font ~100ms to load. - if(called > 30) { - warn('Load test font never loaded.'); - callback(); - return; - } - ctx.font = '30px ' + name; - ctx.fillText('.', 0, 20); - var imageData = ctx.getImageData(0, 0, 1, 1); - if (imageData.data[3] > 0) { - callback(); - return; - } - setTimeout(isFontReady.bind(null, name, callback)); - } - - var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++; - // Chromium seems to cache fonts based on a hash of the actual font data, - // so the font must be modified for each load test else it will appear to - // be loaded already. - // TODO: This could maybe be made faster by avoiding the btoa of the full - // font by splitting it in chunks before hand and padding the font id. - var data = this.loadTestFont; - var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum) - data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, - loadTestFontId); - // CFF checksum is important for IE, adjusting it - var CFF_CHECKSUM_OFFSET = 16; - var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X' - var checksum = int32(data, CFF_CHECKSUM_OFFSET); - for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { - checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0; - } - if (i < loadTestFontId.length) { // align to 4 bytes boundary - checksum = (checksum - XXXX_VALUE + - int32(loadTestFontId + 'XXX', i)) | 0; - } - data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); - - var url = 'url(data:font/opentype;base64,' + btoa(data) + ');'; - var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' + - url + '}'; - this.insertRule(rule); - - var names = []; - for (i = 0, ii = fonts.length; i < ii; i++) { - names.push(fonts[i].loadedName); - } - names.push(loadTestFontId); - - var div = document.createElement('div'); - div.setAttribute('style', - 'visibility: hidden;' + - 'width: 10px; height: 10px;' + - 'position: absolute; top: 0px; left: 0px;'); - for (i = 0, ii = names.length; i < ii; ++i) { - var span = document.createElement('span'); - span.textContent = 'Hi'; - span.style.fontFamily = names[i]; - div.appendChild(span); - } - document.body.appendChild(div); - - isFontReady(loadTestFontId, function() { - document.body.removeChild(div); - request.complete(); - }); - /** Hack end */ - } -}; -FontLoader.isFontLoadingAPISupported = (!isWorker && - typeof document !== 'undefined' && !!document.fonts); -Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { - get: function () { - var supported = false; - - // User agent string sniffing is bad, but there is no reliable way to tell - // if font is fully loaded and ready to be used with canvas. - var userAgent = window.navigator.userAgent; - var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent); - if (m && m[1] >= 14) { - supported = true; - } - // TODO other browsers - if (userAgent === 'node') { - supported = true; - } - return shadow(FontLoader, 'isSyncFontLoadingSupported', supported); - }, - enumerable: true, - configurable: true -}); - -var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData) { - this.compiledGlyphs = {}; - // importing translated data - for (var i in translatedData) { - this[i] = translatedData[i]; - } - } - Object.defineProperty(FontFaceObject, 'isEvalSupported', { - get: function () { - var evalSupport = false; - if (PDFJS.isEvalSupported) { - try { - /* jshint evil: true */ - new Function(''); - evalSupport = true; - } catch (e) {} - } - return shadow(this, 'isEvalSupported', evalSupport); - }, - enumerable: true, - configurable: true - }); - FontFaceObject.prototype = { - createNativeFontFace: function FontFaceObject_createNativeFontFace() { - if (!this.data) { - return null; - } - - if (PDFJS.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var nativeFontFace = new FontFace(this.loadedName, this.data, {}); - - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this); - } - return nativeFontFace; - }, - - createFontFaceRule: function FontFaceObject_createFontFaceRule() { - if (!this.data) { - return null; - } - - if (PDFJS.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var data = bytesToString(new Uint8Array(this.data)); - var fontName = this.loadedName; - - // Add the font-face rule to the document - var url = ('url(data:' + this.mimetype + ';base64,' + - window.btoa(data) + ');'); - var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this, url); - } - - return rule; - }, - - getPathGenerator: - function FontFaceObject_getPathGenerator(objs, character) { - if (!(character in this.compiledGlyphs)) { - var cmds = objs.get(this.loadedName + '_path_' + character); - var current, i, len; - - // If we can, compile cmds into JS for MAXIMUM SPEED - if (FontFaceObject.isEvalSupported) { - var args, js = ''; - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.args !== undefined) { - args = current.args.join(','); - } else { - args = ''; - } - - js += 'c.' + current.cmd + '(' + args + ');\n'; - } - /* jshint -W054 */ - this.compiledGlyphs[character] = new Function('c', 'size', js); - } else { - // But fall back on using Function.prototype.apply() if we're - // blocked from using eval() for whatever reason (like CSP policies) - this.compiledGlyphs[character] = function(c, size) { - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.cmd === 'scale') { - current.args = [size, -size]; - } - - c[current.cmd].apply(c, current.args); - } - }; - } - } - return this.compiledGlyphs[character]; - } - }; - return FontFaceObject; -})(); - - -/** - * Optimised CSS custom property getter/setter. - * @class - */ -var CustomStyle = (function CustomStyleClosure() { - - // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ - // animate-css-transforms-firefox-webkit.html - // in some versions of IE9 it is critical that ms appear in this list - // before Moz - var prefixes = ['ms', 'Moz', 'Webkit', 'O']; - var _cache = {}; - - function CustomStyle() {} - - CustomStyle.getProp = function get(propName, element) { - // check cache only when no element is given - if (arguments.length === 1 && typeof _cache[propName] === 'string') { - return _cache[propName]; - } - - element = element || document.documentElement; - var style = element.style, prefixed, uPropName; - - // test standard property first - if (typeof style[propName] === 'string') { - return (_cache[propName] = propName); - } - - // capitalize - uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); - - // test vendor specific properties - for (var i = 0, l = prefixes.length; i < l; i++) { - prefixed = prefixes[i] + uPropName; - if (typeof style[prefixed] === 'string') { - return (_cache[propName] = prefixed); - } - } - - //if all fails then set to undefined - return (_cache[propName] = 'undefined'); - }; - - CustomStyle.setProp = function set(propName, element, str) { - var prop = this.getProp(propName); - if (prop !== 'undefined') { - element.style[prop] = str; - } - }; - - return CustomStyle; -})(); - -PDFJS.CustomStyle = CustomStyle; - - -var ANNOT_MIN_SIZE = 10; // px - -var AnnotationLayer = (function AnnotationLayerClosure() { - // 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; - } - - function getContainer(data, page, viewport) { - var container = document.createElement('section'); - var width = data.rect[2] - data.rect[0]; - var height = data.rect[3] - data.rect[1]; - - container.setAttribute('data-annotation-id', data.id); - - data.rect = Util.normalizeRect([ - data.rect[0], - page.view[3] - data.rect[1] + page.view[1], - data.rect[2], - page.view[3] - data.rect[3] + page.view[1] - ]); - - CustomStyle.setProp('transform', container, - 'matrix(' + viewport.transform.join(',') + ')'); - CustomStyle.setProp('transformOrigin', container, - -data.rect[0] + 'px ' + -data.rect[1] + 'px'); - - if (data.borderStyle.width > 0) { - container.style.borderWidth = data.borderStyle.width + 'px'; - if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { - // Underline styles only have a bottom border, so we do not need - // to adjust for all borders. This yields a similar result as - // Adobe Acrobat/Reader. - width = width - 2 * data.borderStyle.width; - height = height - 2 * data.borderStyle.width; - } - - var horizontalRadius = data.borderStyle.horizontalCornerRadius; - var verticalRadius = data.borderStyle.verticalCornerRadius; - if (horizontalRadius > 0 || verticalRadius > 0) { - var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; - CustomStyle.setProp('borderRadius', container, radius); - } - - switch (data.borderStyle.style) { - case AnnotationBorderStyleType.SOLID: - container.style.borderStyle = 'solid'; - break; - - case AnnotationBorderStyleType.DASHED: - container.style.borderStyle = 'dashed'; - break; - - case AnnotationBorderStyleType.BEVELED: - warn('Unimplemented border style: beveled'); - break; - - case AnnotationBorderStyleType.INSET: - warn('Unimplemented border style: inset'); - break; - - case AnnotationBorderStyleType.UNDERLINE: - container.style.borderBottomStyle = 'solid'; - break; - - default: - break; - } - - if (data.color) { - container.style.borderColor = - Util.makeCssRgb(data.color[0] | 0, - data.color[1] | 0, - data.color[2] | 0); - } else { - // Transparent (invisible) border, so do not draw it at all. - container.style.borderWidth = 0; - } - } - - container.style.left = data.rect[0] + 'px'; - container.style.top = data.rect[1] + 'px'; - - container.style.width = width + 'px'; - container.style.height = height + 'px'; - - return container; - } - - function getHtmlElementForTextWidgetAnnotation(item, page) { - var element = document.createElement('div'); - var width = item.rect[2] - item.rect[0]; - var height = item.rect[3] - item.rect[1]; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - 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 ? - page.commonObjs.getData(item.fontRefName) : null; - setTextStyles(content, item, fontObj); - - element.appendChild(content); - - return element; - } - - function getHtmlElementForTextAnnotation(item, page, viewport) { - 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 = getContainer(item, page, viewport); - container.className = 'annotText'; - - var image = document.createElement('img'); - image.style.height = container.style.height; - image.style.width = container.style.width; - 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 contentWrapper = document.createElement('div'); - contentWrapper.className = 'annotTextContentWrapper'; - contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px'; - contentWrapper.style.top = '-10px'; - - var content = document.createElement('div'); - content.className = 'annotTextContent'; - content.setAttribute('hidden', true); - - var i, ii; - if (item.hasBgColor && item.color) { - var color = item.color; - - // Enlighten the color (70%) - var BACKGROUND_ENLIGHT = 0.7; - var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; - var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; - var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; - content.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0); - } - - var title = document.createElement('h1'); - var text = document.createElement('p'); - 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 (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); - - var pinned = false; - - var showAnnotation = function showAnnotation(pin) { - if (pin) { - pinned = true; - } - if (content.hasAttribute('hidden')) { - container.style.zIndex += 1; - content.removeAttribute('hidden'); - } - }; - - var hideAnnotation = function hideAnnotation(unpin) { - if (unpin) { - pinned = false; - } - if (!content.hasAttribute('hidden') && !pinned) { - container.style.zIndex -= 1; - content.setAttribute('hidden', true); - } - }; - - var toggleAnnotation = function toggleAnnotation() { - if (pinned) { - hideAnnotation(true); - } else { - showAnnotation(true); - } - }; - - image.addEventListener('click', function image_clickHandler() { - toggleAnnotation(); - }, false); - image.addEventListener('mouseover', function image_mouseOverHandler() { - showAnnotation(); - }, false); - image.addEventListener('mouseout', function image_mouseOutHandler() { - hideAnnotation(); - }, false); - - content.addEventListener('click', function content_clickHandler() { - hideAnnotation(true); - }, false); - } - - content.appendChild(title); - content.appendChild(text); - contentWrapper.appendChild(content); - container.appendChild(image); - container.appendChild(contentWrapper); - - return container; - } - - function getHtmlElementForLinkAnnotation(item, page, viewport, linkService) { - function bindLink(link, dest) { - link.href = linkService.getDestinationHash(dest); - link.onclick = function annotationsLayerBuilderLinksOnclick() { - if (dest) { - linkService.navigateTo(dest); - } - return false; - }; - if (dest) { - link.className = 'internalLink'; - } - } - - function bindNamedAction(link, action) { - link.href = linkService.getAnchorUrl(''); - link.onclick = function annotationsLayerBuilderNamedActionOnClick() { - linkService.executeNamedAction(action); - return false; - }; - link.className = 'internalLink'; - } - - var container = getContainer(item, page, viewport); - container.className = 'annotLink'; - - var link = document.createElement('a'); - link.href = link.title = item.url || ''; - - if (item.url && isExternalLinkTargetSet()) { - link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; - } - - if (!item.url) { - if (item.action) { - bindNamedAction(link, item.action); - } else { - bindLink(link, ('dest' in item) ? item.dest : null); - } - } - - container.appendChild(link); - - return container; - } - - function getHtmlElement(data, page, viewport, linkService) { - switch (data.annotationType) { - case AnnotationType.WIDGET: - return getHtmlElementForTextWidgetAnnotation(data, page); - case AnnotationType.TEXT: - return getHtmlElementForTextAnnotation(data, page, viewport); - case AnnotationType.LINK: - return getHtmlElementForLinkAnnotation(data, page, viewport, - linkService); - default: - throw new Error('Unsupported annotationType: ' + data.annotationType); - } - } - - function render(viewport, div, annotations, page, linkService) { - for (var i = 0, ii = annotations.length; i < ii; i++) { - var data = annotations[i]; - if (!data || !data.hasHtml) { - continue; - } - - var element = getHtmlElement(data, page, viewport, linkService); - div.appendChild(element); - } - } - - function update(viewport, div, annotations) { - for (var i = 0, ii = annotations.length; i < ii; i++) { - var data = annotations[i]; - var element = div.querySelector( - '[data-annotation-id="' + data.id + '"]'); - if (element) { - CustomStyle.setProp('transform', element, - 'matrix(' + viewport.transform.join(',') + ')'); - } - } - div.removeAttribute('hidden'); - } - - return { - render: render, - update: update - }; -})(); - -PDFJS.AnnotationLayer = AnnotationLayer; - - -/** - * Text layer render parameters. - * - * @typedef {Object} TextLayerRenderParameters - * @property {TextContent} textContent - Text content to render (the object is - * returned by the page's getTextContent() method). - * @property {HTMLElement} container - HTML element that will contain text runs. - * @property {PDFJS.PageViewport} viewport - The target viewport to properly - * layout the text runs. - * @property {Array} textDivs - (optional) HTML elements that are correspond - * the text items of the textContent input. This is output and shall be - * initially be set to empty array. - * @property {number} timeout - (optional) Delay in milliseconds before - * rendering of the text runs occurs. - */ -var renderTextLayer = (function renderTextLayerClosure() { - var MAX_TEXT_DIVS_TO_RENDER = 100000; - - var NonWhitespaceRegexp = /\S/; - - function isAllWhitespace(str) { - return !NonWhitespaceRegexp.test(str); - } - - function appendText(textDivs, viewport, geom, styles) { - var style = styles[geom.fontName]; - var textDiv = document.createElement('div'); - textDivs.push(textDiv); - if (isAllWhitespace(geom.str)) { - textDiv.dataset.isWhitespace = true; - return; - } - var tx = PDFJS.Util.transform(viewport.transform, geom.transform); - var angle = Math.atan2(tx[1], tx[0]); - if (style.vertical) { - angle += Math.PI / 2; - } - var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3])); - var fontAscent = fontHeight; - if (style.ascent) { - fontAscent = style.ascent * fontAscent; - } else if (style.descent) { - fontAscent = (1 + style.descent) * fontAscent; - } - - var left; - var top; - if (angle === 0) { - left = tx[4]; - top = tx[5] - fontAscent; - } else { - left = tx[4] + (fontAscent * Math.sin(angle)); - top = tx[5] - (fontAscent * Math.cos(angle)); - } - textDiv.style.left = left + 'px'; - textDiv.style.top = top + 'px'; - textDiv.style.fontSize = fontHeight + 'px'; - textDiv.style.fontFamily = style.fontFamily; - - textDiv.textContent = geom.str; - // |fontName| is only used by the Font Inspector. This test will succeed - // when e.g. the Font Inspector is off but the Stepper is on, but it's - // not worth the effort to do a more accurate test. - if (PDFJS.pdfBug) { - textDiv.dataset.fontName = geom.fontName; - } - // Storing into dataset will convert number into string. - if (angle !== 0) { - textDiv.dataset.angle = angle * (180 / Math.PI); - } - // We don't bother scaling single-char text divs, because it has very - // little effect on text highlighting. This makes scrolling on docs with - // lots of such divs a lot faster. - if (geom.str.length > 1) { - if (style.vertical) { - textDiv.dataset.canvasWidth = geom.height * viewport.scale; - } else { - textDiv.dataset.canvasWidth = geom.width * viewport.scale; - } - } - } - - function render(task) { - if (task._canceled) { - return; - } - var textLayerFrag = task._container; - var textDivs = task._textDivs; - var capability = task._capability; - var textDivsLength = textDivs.length; - - // No point in rendering many divs as it would make the browser - // unusable even after the divs are rendered. - if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { - capability.resolve(); - return; - } - - var canvas = document.createElement('canvas'); - canvas.mozOpaque = true; - var ctx = canvas.getContext('2d', {alpha: false}); - - var lastFontSize; - var lastFontFamily; - for (var i = 0; i < textDivsLength; i++) { - var textDiv = textDivs[i]; - if (textDiv.dataset.isWhitespace !== undefined) { - continue; - } - - var fontSize = textDiv.style.fontSize; - var fontFamily = textDiv.style.fontFamily; - - // Only build font string and set to context if different from last. - if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { - ctx.font = fontSize + ' ' + fontFamily; - lastFontSize = fontSize; - lastFontFamily = fontFamily; - } - - var width = ctx.measureText(textDiv.textContent).width; - if (width > 0) { - textLayerFrag.appendChild(textDiv); - var transform; - if (textDiv.dataset.canvasWidth !== undefined) { - // Dataset values come of type string. - var textScale = textDiv.dataset.canvasWidth / width; - transform = 'scaleX(' + textScale + ')'; - } else { - transform = ''; - } - var rotation = textDiv.dataset.angle; - if (rotation) { - transform = 'rotate(' + rotation + 'deg) ' + transform; - } - if (transform) { - PDFJS.CustomStyle.setProp('transform' , textDiv, transform); - } - } - } - capability.resolve(); - } - - /** - * Text layer rendering task. - * - * @param {TextContent} textContent - * @param {HTMLElement} container - * @param {PDFJS.PageViewport} viewport - * @param {Array} textDivs - * @private - */ - function TextLayerRenderTask(textContent, container, viewport, textDivs) { - this._textContent = textContent; - this._container = container; - this._viewport = viewport; - textDivs = textDivs || []; - this._textDivs = textDivs; - this._canceled = false; - this._capability = createPromiseCapability(); - this._renderTimer = null; - } - TextLayerRenderTask.prototype = { - get promise() { - return this._capability.promise; - }, - - cancel: function TextLayer_cancel() { - this._canceled = true; - if (this._renderTimer !== null) { - clearTimeout(this._renderTimer); - this._renderTimer = null; - } - this._capability.reject('canceled'); - }, - - _render: function TextLayer_render(timeout) { - var textItems = this._textContent.items; - var styles = this._textContent.styles; - var textDivs = this._textDivs; - var viewport = this._viewport; - for (var i = 0, len = textItems.length; i < len; i++) { - appendText(textDivs, viewport, textItems[i], styles); - } - - if (!timeout) { // Render right away - render(this); - } else { // Schedule - var self = this; - this._renderTimer = setTimeout(function() { - render(self); - self._renderTimer = null; - }, timeout); - } - } - }; - - - /** - * Starts rendering of the text layer. - * - * @param {TextLayerRenderParameters} renderParameters - * @returns {TextLayerRenderTask} - */ - function renderTextLayer(renderParameters) { - var task = new TextLayerRenderTask(renderParameters.textContent, - renderParameters.container, - renderParameters.viewport, - renderParameters.textDivs); - task._render(renderParameters.timeout); - return task; - } - - return renderTextLayer; -})(); - -PDFJS.renderTextLayer = renderTextLayer; - - -var SVG_DEFAULTS = { - fontStyle: 'normal', - fontWeight: 'normal', - fillColor: '#000000' -}; - -var convertImgDataToPng = (function convertImgDataToPngClosure() { - var PNG_HEADER = - new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); - - var CHUNK_WRAPPER_SIZE = 12; - - var crcTable = new Int32Array(256); - for (var i = 0; i < 256; i++) { - var c = i; - for (var h = 0; h < 8; h++) { - if (c & 1) { - c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff); - } else { - c = (c >> 1) & 0x7fffffff; - } - } - crcTable[i] = c; - } - - function crc32(data, start, end) { - var crc = -1; - for (var i = start; i < end; i++) { - var a = (crc ^ data[i]) & 0xff; - var b = crcTable[a]; - crc = (crc >>> 8) ^ b; - } - return crc ^ -1; - } - - function writePngChunk(type, body, data, offset) { - var p = offset; - var len = body.length; - - data[p] = len >> 24 & 0xff; - data[p + 1] = len >> 16 & 0xff; - data[p + 2] = len >> 8 & 0xff; - data[p + 3] = len & 0xff; - p += 4; - - data[p] = type.charCodeAt(0) & 0xff; - data[p + 1] = type.charCodeAt(1) & 0xff; - data[p + 2] = type.charCodeAt(2) & 0xff; - data[p + 3] = type.charCodeAt(3) & 0xff; - p += 4; - - data.set(body, p); - p += body.length; - - var crc = crc32(data, offset + 4, p); - - data[p] = crc >> 24 & 0xff; - data[p + 1] = crc >> 16 & 0xff; - data[p + 2] = crc >> 8 & 0xff; - data[p + 3] = crc & 0xff; - } - - function adler32(data, start, end) { - var a = 1; - var b = 0; - for (var i = start; i < end; ++i) { - a = (a + (data[i] & 0xff)) % 65521; - b = (b + a) % 65521; - } - return (b << 16) | a; - } - - function encode(imgData, kind) { - var width = imgData.width; - var height = imgData.height; - var bitDepth, colorType, lineSize; - var bytes = imgData.data; - - switch (kind) { - case ImageKind.GRAYSCALE_1BPP: - colorType = 0; - bitDepth = 1; - lineSize = (width + 7) >> 3; - break; - case ImageKind.RGB_24BPP: - colorType = 2; - bitDepth = 8; - lineSize = width * 3; - break; - case ImageKind.RGBA_32BPP: - colorType = 6; - bitDepth = 8; - lineSize = width * 4; - break; - default: - throw new Error('invalid format'); - } - - // prefix every row with predictor 0 - var literals = new Uint8Array((1 + lineSize) * height); - var offsetLiterals = 0, offsetBytes = 0; - var y, i; - for (y = 0; y < height; ++y) { - literals[offsetLiterals++] = 0; // no prediction - literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), - offsetLiterals); - offsetBytes += lineSize; - offsetLiterals += lineSize; - } - - if (kind === ImageKind.GRAYSCALE_1BPP) { - // inverting for B/W - offsetLiterals = 0; - for (y = 0; y < height; y++) { - offsetLiterals++; // skipping predictor - for (i = 0; i < lineSize; i++) { - literals[offsetLiterals++] ^= 0xFF; - } - } - } - - var ihdr = new Uint8Array([ - width >> 24 & 0xff, - width >> 16 & 0xff, - width >> 8 & 0xff, - width & 0xff, - height >> 24 & 0xff, - height >> 16 & 0xff, - height >> 8 & 0xff, - height & 0xff, - bitDepth, // bit depth - colorType, // color type - 0x00, // compression method - 0x00, // filter method - 0x00 // interlace method - ]); - - var len = literals.length; - var maxBlockLength = 0xFFFF; - - var deflateBlocks = Math.ceil(len / maxBlockLength); - var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); - var pi = 0; - idat[pi++] = 0x78; // compression method and flags - idat[pi++] = 0x9c; // flags - - var pos = 0; - while (len > maxBlockLength) { - // writing non-final DEFLATE blocks type 0 and length of 65535 - idat[pi++] = 0x00; - idat[pi++] = 0xff; - idat[pi++] = 0xff; - idat[pi++] = 0x00; - idat[pi++] = 0x00; - idat.set(literals.subarray(pos, pos + maxBlockLength), pi); - pi += maxBlockLength; - pos += maxBlockLength; - len -= maxBlockLength; - } - - // writing non-final DEFLATE blocks type 0 - idat[pi++] = 0x01; - idat[pi++] = len & 0xff; - idat[pi++] = len >> 8 & 0xff; - idat[pi++] = (~len & 0xffff) & 0xff; - idat[pi++] = (~len & 0xffff) >> 8 & 0xff; - idat.set(literals.subarray(pos), pi); - pi += literals.length - pos; - - var adler = adler32(literals, 0, literals.length); // checksum - idat[pi++] = adler >> 24 & 0xff; - idat[pi++] = adler >> 16 & 0xff; - idat[pi++] = adler >> 8 & 0xff; - idat[pi++] = adler & 0xff; - - // PNG will consists: header, IHDR+data, IDAT+data, and IEND. - var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) + - ihdr.length + idat.length; - var data = new Uint8Array(pngLength); - var offset = 0; - data.set(PNG_HEADER, offset); - offset += PNG_HEADER.length; - writePngChunk('IHDR', ihdr, data, offset); - offset += CHUNK_WRAPPER_SIZE + ihdr.length; - writePngChunk('IDATA', idat, data, offset); - offset += CHUNK_WRAPPER_SIZE + idat.length; - writePngChunk('IEND', new Uint8Array(0), data, offset); - - return PDFJS.createObjectURL(data, 'image/png'); - } - - return function convertImgDataToPng(imgData) { - var kind = (imgData.kind === undefined ? - ImageKind.GRAYSCALE_1BPP : imgData.kind); - return encode(imgData, kind); - }; -})(); - -var SVGExtraState = (function SVGExtraStateClosure() { - function SVGExtraState() { - this.fontSizeScale = 1; - this.fontWeight = SVG_DEFAULTS.fontWeight; - this.fontSize = 0; - - 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.textRise = 0; - - // Default foreground and background colors - this.fillColor = SVG_DEFAULTS.fillColor; - this.strokeColor = '#000000'; - - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.lineJoin = ''; - this.lineCap = ''; - this.miterLimit = 0; - - this.dashArray = []; - this.dashPhase = 0; - - this.dependencies = []; - - // Clipping - this.clipId = ''; - this.pendingClip = false; - - this.maskId = ''; - } - - SVGExtraState.prototype = { - clone: function SVGExtraState_clone() { - return Object.create(this); - }, - setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - }; - return SVGExtraState; -})(); - -var SVGGraphics = (function SVGGraphicsClosure() { - function createScratchSVG(width, height) { - var NS = 'http://www.w3.org/2000/svg'; - var svg = document.createElementNS(NS, 'svg:svg'); - svg.setAttributeNS(null, 'version', '1.1'); - svg.setAttributeNS(null, 'width', width + 'px'); - svg.setAttributeNS(null, 'height', height + 'px'); - svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height); - return svg; - } - - function opListToTree(opList) { - var opTree = []; - var tmp = []; - var opListLen = opList.length; - - for (var x = 0; x < opListLen; x++) { - if (opList[x].fn === 'save') { - opTree.push({'fnId': 92, 'fn': 'group', 'items': []}); - tmp.push(opTree); - opTree = opTree[opTree.length - 1].items; - continue; - } - - if(opList[x].fn === 'restore') { - opTree = tmp.pop(); - } else { - opTree.push(opList[x]); - } - } - return opTree; - } - - /** - * Formats float number. - * @param value {number} number to format. - * @returns {string} - */ - function pf(value) { - if (value === (value | 0)) { // integer number - return value.toString(); - } - var s = value.toFixed(10); - var i = s.length - 1; - if (s[i] !== '0') { - return s; - } - // removing trailing zeros - do { - i--; - } while (s[i] === '0'); - return s.substr(0, s[i] === '.' ? i : i + 1); - } - - /** - * Formats transform matrix. The standard rotation, scale and translate - * matrices are replaced by their shorter forms, and for identity matrix - * returns empty string to save the memory. - * @param m {Array} matrix to format. - * @returns {string} - */ - function pm(m) { - if (m[4] === 0 && m[5] === 0) { - if (m[1] === 0 && m[2] === 0) { - if (m[0] === 1 && m[3] === 1) { - return ''; - } - return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; - } - if (m[0] === m[3] && m[1] === -m[2]) { - var a = Math.acos(m[0]) * 180 / Math.PI; - return 'rotate(' + pf(a) + ')'; - } - } else { - if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { - return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - } - return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + - pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - - function SVGGraphics(commonObjs, objs) { - this.current = new SVGExtraState(); - this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix - this.transformStack = []; - this.extraStack = []; - this.commonObjs = commonObjs; - this.objs = objs; - this.pendingEOFill = false; - - this.embedFonts = false; - this.embeddedFonts = {}; - this.cssStyle = null; - } - - var NS = 'http://www.w3.org/2000/svg'; - var XML_NS = 'http://www.w3.org/XML/1998/namespace'; - var XLINK_NS = 'http://www.w3.org/1999/xlink'; - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var clipCount = 0; - var maskCount = 0; - - SVGGraphics.prototype = { - save: function SVGGraphics_save() { - this.transformStack.push(this.transformMatrix); - var old = this.current; - this.extraStack.push(old); - this.current = old.clone(); - }, - - restore: function SVGGraphics_restore() { - this.transformMatrix = this.transformStack.pop(); - this.current = this.extraStack.pop(); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.pgrp.appendChild(this.tgrp); - }, - - group: function SVGGraphics_group(items) { - this.save(); - this.executeOpTree(items); - this.restore(); - }, - - loadDependencies: function SVGGraphics_loadDependencies(operatorList) { - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var argsArray = operatorList.argsArray; - - var self = this; - for (var i = 0; i < fnArrayLen; i++) { - if (OPS.dependency === fnArray[i]) { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var obj = deps[n]; - var common = obj.substring(0, 2) === 'g_'; - var promise; - if (common) { - promise = new Promise(function(resolve) { - self.commonObjs.get(obj, resolve); - }); - } else { - promise = new Promise(function(resolve) { - self.objs.get(obj, resolve); - }); - } - this.current.dependencies.push(promise); - } - } - } - return Promise.all(this.current.dependencies); - }, - - transform: function SVGGraphics_transform(a, b, c, d, e, f) { - var transformMatrix = [a, b, c, d, e, f]; - this.transformMatrix = PDFJS.Util.transform(this.transformMatrix, - transformMatrix); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - getSVG: function SVGGraphics_getSVG(operatorList, viewport) { - this.svg = createScratchSVG(viewport.width, viewport.height); - this.viewport = viewport; - - return this.loadDependencies(operatorList).then(function () { - this.transformMatrix = IDENTITY_MATRIX; - this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group - this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform)); - this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.defs = document.createElementNS(NS, 'svg:defs'); - this.pgrp.appendChild(this.defs); - this.pgrp.appendChild(this.tgrp); - this.svg.appendChild(this.pgrp); - var opTree = this.convertOpList(operatorList); - this.executeOpTree(opTree); - return this.svg; - }.bind(this)); - }, - - convertOpList: function SVGGraphics_convertOpList(operatorList) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var REVOPS = []; - var opList = []; - - for (var op in OPS) { - REVOPS[OPS[op]] = op; - } - - for (var x = 0; x < fnArrayLen; x++) { - var fnId = fnArray[x]; - opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]}); - } - return opListToTree(opList); - }, - - executeOpTree: function SVGGraphics_executeOpTree(opTree) { - var opTreeLen = opTree.length; - for(var x = 0; x < opTreeLen; x++) { - var fn = opTree[x].fn; - var fnId = opTree[x].fnId; - var args = opTree[x].args; - - switch (fnId | 0) { - case OPS.beginText: - this.beginText(); - break; - case OPS.setLeading: - this.setLeading(args); - break; - case OPS.setLeadingMoveText: - this.setLeadingMoveText(args[0], args[1]); - break; - case OPS.setFont: - this.setFont(args); - break; - case OPS.showText: - this.showText(args[0]); - break; - case OPS.showSpacedText: - this.showText(args[0]); - break; - case OPS.endText: - this.endText(); - break; - case OPS.moveText: - this.moveText(args[0], args[1]); - break; - case OPS.setCharSpacing: - this.setCharSpacing(args[0]); - break; - case OPS.setWordSpacing: - this.setWordSpacing(args[0]); - break; - case OPS.setHScale: - this.setHScale(args[0]); - break; - case OPS.setTextMatrix: - this.setTextMatrix(args[0], args[1], args[2], - args[3], args[4], args[5]); - break; - case OPS.setLineWidth: - this.setLineWidth(args[0]); - break; - case OPS.setLineJoin: - this.setLineJoin(args[0]); - break; - case OPS.setLineCap: - this.setLineCap(args[0]); - break; - case OPS.setMiterLimit: - this.setMiterLimit(args[0]); - break; - case OPS.setFillRGBColor: - this.setFillRGBColor(args[0], args[1], args[2]); - break; - case OPS.setStrokeRGBColor: - this.setStrokeRGBColor(args[0], args[1], args[2]); - break; - case OPS.setDash: - this.setDash(args[0], args[1]); - break; - case OPS.setGState: - this.setGState(args[0]); - break; - case OPS.fill: - this.fill(); - break; - case OPS.eoFill: - this.eoFill(); - break; - case OPS.stroke: - this.stroke(); - break; - case OPS.fillStroke: - this.fillStroke(); - break; - case OPS.eoFillStroke: - this.eoFillStroke(); - break; - case OPS.clip: - this.clip('nonzero'); - break; - case OPS.eoClip: - this.clip('evenodd'); - break; - case OPS.paintSolidColorImageMask: - this.paintSolidColorImageMask(); - break; - case OPS.paintJpegXObject: - this.paintJpegXObject(args[0], args[1], args[2]); - break; - case OPS.paintImageXObject: - this.paintImageXObject(args[0]); - break; - case OPS.paintInlineImageXObject: - this.paintInlineImageXObject(args[0]); - break; - case OPS.paintImageMaskXObject: - this.paintImageMaskXObject(args[0]); - break; - case OPS.paintFormXObjectBegin: - this.paintFormXObjectBegin(args[0], args[1]); - break; - case OPS.paintFormXObjectEnd: - this.paintFormXObjectEnd(); - break; - case OPS.closePath: - this.closePath(); - break; - case OPS.closeStroke: - this.closeStroke(); - break; - case OPS.closeFillStroke: - this.closeFillStroke(); - break; - case OPS.nextLine: - this.nextLine(); - break; - case OPS.transform: - this.transform(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.constructPath: - this.constructPath(args[0], args[1]); - break; - case OPS.endPath: - this.endPath(); - break; - case 92: - this.group(opTree[x].items); - break; - default: - warn('Unimplemented method '+ fn); - break; - } - } - }, - - setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { - this.current.wordSpacing = wordSpacing; - }, - - setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { - this.current.charSpacing = charSpacing; - }, - - nextLine: function SVGGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { - var current = this.current; - this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f]; - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - - current.txtElement = document.createElementNS(NS, 'svg:text'); - current.txtElement.appendChild(current.tspan); - }, - - beginText: function SVGGraphics_beginText() { - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - this.current.textMatrix = IDENTITY_MATRIX; - this.current.lineMatrix = IDENTITY_MATRIX; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.txtElement = document.createElementNS(NS, 'svg:text'); - this.current.txtgrp = document.createElementNS(NS, 'svg:g'); - this.current.xcoords = []; - }, - - moveText: function SVGGraphics_moveText(x, y) { - var current = this.current; - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - }, - - showText: function SVGGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - - if (fontSize === 0) { - return; - } - - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += fontDirection * wordSpacing; - continue; - } else if (isNum(glyph)) { - x += -glyph * fontSize * 0.001; - continue; - } - current.xcoords.push(current.x + x * textHScale); - - var width = glyph.width; - var character = glyph.fontChar; - var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; - x += charWidth; - - current.tspan.textContent += character; - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - - current.tspan.setAttributeNS(null, 'x', - current.xcoords.map(pf).join(' ')); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { - current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); - } - if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { - current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight); - } - if (current.fillColor !== SVG_DEFAULTS.fillColor) { - current.tspan.setAttributeNS(null, 'fill', current.fillColor); - } - - current.txtElement.setAttributeNS(null, 'transform', - pm(current.textMatrix) + - ' scale(1, -1)' ); - current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); - current.txtElement.appendChild(current.tspan); - current.txtgrp.appendChild(current.txtElement); - - this.tgrp.appendChild(current.txtElement); - - }, - - setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - }, - - addFontStyle: function SVGGraphics_addFontStyle(fontObj) { - if (!this.cssStyle) { - this.cssStyle = document.createElementNS(NS, 'svg:style'); - this.cssStyle.setAttributeNS(null, 'type', 'text/css'); - this.defs.appendChild(this.cssStyle); - } - - var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype); - this.cssStyle.textContent += - '@font-face { font-family: "' + fontObj.loadedName + '";' + - ' src: url(' + url + '); }\n'; - }, - - setFont: function SVGGraphics_setFont(details) { - var current = this.current; - var fontObj = this.commonObjs.get(details[0]); - var size = details[1]; - this.current.font = fontObj; - - if (this.embedFonts && fontObj.data && - !this.embeddedFonts[fontObj.loadedName]) { - this.addFontStyle(fontObj); - this.embeddedFonts[fontObj.loadedName] = fontObj; - } - - current.fontMatrix = (fontObj.fontMatrix ? - fontObj.fontMatrix : FONT_IDENTITY_MATRIX); - - var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - var italic = fontObj.italic ? 'italic' : 'normal'; - - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - current.fontSize = size; - current.fontFamily = fontObj.loadedName; - current.fontWeight = bold; - current.fontStyle = italic; - - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.xcoords = []; - }, - - endText: function SVGGraphics_endText() { - if (this.current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - // Path properties - setLineWidth: function SVGGraphics_setLineWidth(width) { - this.current.lineWidth = width; - }, - setLineCap: function SVGGraphics_setLineCap(style) { - this.current.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function SVGGraphics_setLineJoin(style) { - this.current.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function SVGGraphics_setMiterLimit(limit) { - this.current.miterLimit = limit; - }, - setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.strokeColor = color; - }, - setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.fillColor = color; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.xcoords = []; - }, - setDash: function SVGGraphics_setDash(dashArray, dashPhase) { - this.current.dashArray = dashArray; - this.current.dashPhase = dashPhase; - }, - - constructPath: function SVGGraphics_constructPath(ops, args) { - var current = this.current; - var x = current.x, y = current.y; - current.path = document.createElementNS(NS, 'svg:path'); - var d = []; - var opLength = ops.length; - - for (var i = 0, j = 0; i < opLength; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - var xw = x + width; - var yh = y + height; - d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh), - 'L', pf(x), pf(yh), 'Z'); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - d.push('M', pf(x), pf(y)); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - d.push('L', pf(x) , pf(y)); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), - pf(args[j + 3]), pf(x), pf(y)); - j += 6; - break; - case OPS.curveTo2: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), - pf(args[j + 2]), pf(args[j + 3])); - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), - pf(x), pf(y)); - j += 4; - break; - case OPS.closePath: - d.push('Z'); - break; - } - } - current.path.setAttributeNS(null, 'd', d.join(' ')); - current.path.setAttributeNS(null, 'stroke-miterlimit', - pf(current.miterLimit)); - current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap); - current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); - current.path.setAttributeNS(null, 'stroke-width', - pf(current.lineWidth) + 'px'); - current.path.setAttributeNS(null, 'stroke-dasharray', - current.dashArray.map(pf).join(' ')); - current.path.setAttributeNS(null, 'stroke-dashoffset', - pf(current.dashPhase) + 'px'); - current.path.setAttributeNS(null, 'fill', 'none'); - - this.tgrp.appendChild(current.path); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - // Saving a reference in current.element so that it can be addressed - // in 'fill' and 'stroke' - current.element = current.path; - current.setCurrentPoint(x, y); - }, - - endPath: function SVGGraphics_endPath() { - var current = this.current; - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - clip: function SVGGraphics_clip(type) { - var current = this.current; - // Add current path to clipping path - current.clipId = 'clippath' + clipCount; - clipCount++; - this.clippath = document.createElementNS(NS, 'svg:clipPath'); - this.clippath.setAttributeNS(null, 'id', current.clipId); - var clipElement = current.element.cloneNode(); - if (type === 'evenodd') { - clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); - } else { - clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); - } - this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.clippath.appendChild(clipElement); - this.defs.appendChild(this.clippath); - - // Create a new group with that attribute - current.pendingClip = true; - this.cgrp = document.createElementNS(NS, 'svg:g'); - this.cgrp.setAttributeNS(null, 'clip-path', - 'url(#' + current.clipId + ')'); - this.pgrp.appendChild(this.cgrp); - }, - - closePath: function SVGGraphics_closePath() { - var current = this.current; - var d = current.path.getAttributeNS(null, 'd'); - d += 'Z'; - current.path.setAttributeNS(null, 'd', d); - }, - - setLeading: function SVGGraphics_setLeading(leading) { - this.current.leading = -leading; - }, - - setTextRise: function SVGGraphics_setTextRise(textRise) { - this.current.textRise = textRise; - }, - - setHScale: function SVGGraphics_setHScale(scale) { - this.current.textHScale = scale / 100; - }, - - setGState: function SVGGraphics_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': - break; - case 'FL': - break; - case 'Font': - this.setFont(value); - break; - case 'CA': - break; - case 'ca': - break; - case 'BM': - break; - case 'SMask': - break; - } - } - }, - - fill: function SVGGraphics_fill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - }, - - stroke: function SVGGraphics_stroke() { - var current = this.current; - current.element.setAttributeNS(null, 'stroke', current.strokeColor); - current.element.setAttributeNS(null, 'fill', 'none'); - }, - - eoFill: function SVGGraphics_eoFill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - }, - - fillStroke: function SVGGraphics_fillStroke() { - // Order is important since stroke wants fill to be none. - // First stroke, then if fill needed, it will be overwritten. - this.stroke(); - this.fill(); - }, - - eoFillStroke: function SVGGraphics_eoFillStroke() { - this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - this.fillStroke(); - }, - - closeStroke: function SVGGraphics_closeStroke() { - this.closePath(); - this.stroke(); - }, - - closeFillStroke: function SVGGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - - paintSolidColorImageMask: - function SVGGraphics_paintSolidColorImageMask() { - var current = this.current; - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', '1px'); - rect.setAttributeNS(null, 'height', '1px'); - rect.setAttributeNS(null, 'fill', current.fillColor); - this.tgrp.appendChild(rect); - }, - - paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { - var current = this.current; - var imgObj = this.objs.get(objId); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); - imgEl.setAttributeNS(null, 'width', imgObj.width + 'px'); - imgEl.setAttributeNS(null, 'height', imgObj.height + 'px'); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-h)); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); - - this.tgrp.appendChild(imgEl); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageXObject: function SVGGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - this.paintInlineImageXObject(imgData); - }, - - paintInlineImageXObject: - function SVGGraphics_paintInlineImageXObject(imgData, mask) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - - var imgSrc = convertImgDataToPng(imgData); - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', '0'); - cliprect.setAttributeNS(null, 'y', '0'); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - current.element = cliprect; - this.clip('nonzero'); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-height)); - imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); - imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / width) + ' ' + - pf(-1 / height) + ')'); - if (mask) { - mask.appendChild(imgEl); - } else { - this.tgrp.appendChild(imgEl); - } - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageMaskXObject: - function SVGGraphics_paintImageMaskXObject(imgData) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - var fillColor = current.fillColor; - - current.maskId = 'mask' + maskCount++; - var mask = document.createElementNS(NS, 'svg:mask'); - mask.setAttributeNS(null, 'id', current.maskId); - - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', pf(width)); - rect.setAttributeNS(null, 'height', pf(height)); - rect.setAttributeNS(null, 'fill', fillColor); - rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')'); - this.defs.appendChild(mask); - this.tgrp.appendChild(rect); - - this.paintInlineImageXObject(imgData, mask); - }, - - paintFormXObjectBegin: - function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { - this.save(); - - if (isArray(matrix) && matrix.length === 6) { - this.transform(matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); - } - - if (isArray(bbox) && bbox.length === 4) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', bbox[0]); - cliprect.setAttributeNS(null, 'y', bbox[1]); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - this.current.element = cliprect; - this.clip('nonzero'); - this.endPath(); - } - }, - - paintFormXObjectEnd: - function SVGGraphics_paintFormXObjectEnd() { - this.restore(); - } - }; - return SVGGraphics; -})(); - -PDFJS.SVGGraphics = SVGGraphics; - - -}).call((typeof window === 'undefined') ? this : window); - -if (!PDFJS.workerSrc && typeof document !== 'undefined') { - // workerSrc is not set -- using last script url to define default location - PDFJS.workerSrc = (function () { - 'use strict'; - var pdfJsSrc = document.currentScript.src; - return pdfJsSrc && pdfJsSrc.replace(/\.js$/i, '.worker.js'); - })(); -} - - diff --git a/services/web/public/js/libs/pdfjs-1.3.91p1/pdf.worker.js b/services/web/public/js/libs/pdfjs-1.3.91p1/pdf.worker.js deleted file mode 100644 index 6ea741047f..0000000000 --- a/services/web/public/js/libs/pdfjs-1.3.91p1/pdf.worker.js +++ /dev/null @@ -1,40698 +0,0 @@ -/* Copyright 2012 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 globalstrict: false */ -/* globals PDFJS */ - -// Initializing PDFJS global object (if still undefined) -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -PDFJS.version = '1.3.91'; -PDFJS.build = 'd1e83b5'; - -(function pdfjsWrapper() { - // Use strict in our context only - users might not want it - 'use strict'; - - - -var globalScope = (typeof window === 'undefined') ? this : window; - -var isWorker = (typeof window === 'undefined'); - -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 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -// 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; - -PDFJS.VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = PDFJS.OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- treated as warnings. -function deprecated(details) { - warn('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Combines two URLs. The baseUrl shall be absolute URL. If the url is an -// absolute URL, it will be returned as is. -function combineUrl(baseUrl, url) { - if (!url) { - return baseUrl; - } - return new URL(url, baseUrl).href; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url) { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} -PDFJS.isValidUrl = isValidUrl; - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} -PDFJS.shadow = shadow; - -var LinkTarget = PDFJS.LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -function isExternalLinkTargetSet() { - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; - -var PasswordResponses = PDFJS.PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); -PDFJS.PasswordException = PasswordException; - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); -PDFJS.UnknownErrorException = UnknownErrorException; - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); -PDFJS.InvalidPDFException = InvalidPDFException; - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); -PDFJS.MissingPDFException = MissingPDFException; - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); -PDFJS.UnexpectedResponseException = UnexpectedResponseException; - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - return shadow(PDFJS, 'isLittleEndian', isLittleEndian()); - } -}); - - // Lazy test if the userAgent support CanvasTypedArrays -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - 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; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PDFJS.PageViewport - */ -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - if (!(v instanceof Dict)) { - return false; - } - if (!type) { - return true; - } - var dictType = v.get('Type'); - return isName(dictType) && dictType.name === type; -} - -function isArray(v) { - return v instanceof Array; -} - -function isStream(v) { - return typeof v === 'object' && v !== null && v.getBytes !== undefined; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -function isRef(v) { - return v instanceof Ref; -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fullfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -PDFJS.createPromiseCapability = createPromiseCapability; - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libaries are: - * - There currently isn't a seperate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} array of data and/or promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -PDFJS.createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - 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); -}; - -PDFJS.createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType) { - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = PDFJS.createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = {}; - var ah = this.actionHandler = {}; - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - /* jshint ignore:start */ - - // feature detect for URL constructor - var hasWorkingUrl = false; - if (typeof URL === 'function' && ('origin' in URL.prototype)) { - try { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } catch(e) {} - } - - if (hasWorkingUrl) - return; - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' == h) { - invalid.call(this) - } - // XXX - return h.toLowerCase() - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF = undefined, - ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message) - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' == c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' == this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF == c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c) - break loop; - } - break; - - case 'scheme data': - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' == c && '/' == input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue - } - break; - - case 'relative': - this._isRelative = true; - if ('file' != this._scheme) - this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' == c || '\\' == c) { - if ('\\' == c) - err('\\ is an invalid code point.'); - state = 'relative slash'; - } else if ('?' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1] - var nextNextC = input[cursor+2] - if ( - 'file' != this._scheme || !ALPHA.test(c) || - (nextC != ':' && nextC != '|') || - (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' == c || '\\' == c) { - if ('\\' == c) { - err('\\ is an invalid code point.'); - } - if ('file' == this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' == c) { - state = 'authority second slash'; - } else { - err("Expected '/', got: " + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' != c && '\\' != c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' == c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' == cp || '\n' == cp || '\r' == cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' == cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - (null !== this._password) ? this._password += tempC : this._username += tempC; - } - buffer = ''; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { - state = 'relative path'; - } else if (buffer.length == 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' == c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' == stateOverride) { - break loop; - } - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' != c && '\n' != c && '\r' != c) { - if ('[' == c) { - seenBracket = true; - } else if (']' == c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { - if ('' != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' == c) - err("'\\' not allowed in path."); - state = 'relative path'; - if ('/' != c && '\\' != c) { - continue; - } - break; - - case 'relative path': - if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { - if ('\\' == c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' == buffer) { - this._path.pop(); - if ('/' != c && '\\' != c) { - this._path.push(''); - } - } else if ('.' == buffer && '/' != c && '\\' != c) { - this._path.push(''); - } else if ('.' != buffer) { - if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' != c && '\n' != c && '\r' != c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function jURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof jURL)) - base = new jURL(String(base)); - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) - return this._url; - - var authority = ''; - if ('' != this._username || null != this._password) { - authority = this._username + - (null != this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) - return; - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) - return; - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' == this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) - return; - this._query = '?'; - if ('?' == search[0]) - search = search.slice(1); - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' == this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) - return; - this._fragment = '#'; - if ('#' == hash[0]) - hash = hash.slice(1); - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = jURL; - /* jshint ignore:end */ -})(globalScope); - - - - -var NetworkManager = (function NetworkManagerClosure() { - - var OK_RESPONSE = 200; - var PARTIAL_CONTENT_RESPONSE = 206; - - function NetworkManager(url, args) { - this.url = url; - args = args || {}; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = (this.isHttp && args.httpHeaders) || {}; - this.withCredentials = args.withCredentials || false; - this.getXhr = args.getXhr || - function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; - - this.currXhrId = 0; - this.pendingRequests = {}; - this.loadedRequests = {}; - } - - function getArrayBuffer(xhr) { - var data = xhr.response; - if (typeof data !== 'string') { - return data; - } - var length = data.length; - var array = new Uint8Array(length); - for (var i = 0; i < length; i++) { - array[i] = data.charCodeAt(i) & 0xFF; - } - return array.buffer; - } - - var supportsMozChunked = (function supportsMozChunkedClosure() { - try { - var x = new XMLHttpRequest(); - // Firefox 37- required .open() to be called before setting responseType. - // https://bugzilla.mozilla.org/show_bug.cgi?id=707484 - // Even though the URL is not visited, .open() could fail if the URL is - // blocked, e.g. via the connect-src CSP directive or the NoScript addon. - // When this error occurs, this feature detection method will mistakenly - // report that moz-chunked-arraybuffer is not supported in Firefox 37-. - x.open('GET', 'https://example.com'); - x.responseType = 'moz-chunked-arraybuffer'; - return x.responseType === 'moz-chunked-arraybuffer'; - } catch (e) { - return false; - } - })(); - - NetworkManager.prototype = { - requestRange: function NetworkManager_requestRange(begin, end, listeners) { - var args = { - begin: begin, - end: end - }; - for (var prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - }, - - requestFull: function NetworkManager_requestFull(listeners) { - return this.request(listeners); - }, - - request: function NetworkManager_request(args) { - var xhr = this.getXhr(); - var xhrId = this.currXhrId++; - var pendingRequest = this.pendingRequests[xhrId] = { - xhr: xhr - }; - - xhr.open('GET', this.url); - xhr.withCredentials = this.withCredentials; - for (var property in this.httpHeaders) { - var value = this.httpHeaders[property]; - if (typeof value === 'undefined') { - continue; - } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && 'begin' in args && 'end' in args) { - var rangeStr = args.begin + '-' + (args.end - 1); - xhr.setRequestHeader('Range', 'bytes=' + rangeStr); - pendingRequest.expectedStatus = 206; - } else { - pendingRequest.expectedStatus = 200; - } - - var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; - if (useMozChunkedLoading) { - xhr.responseType = 'moz-chunked-arraybuffer'; - pendingRequest.onProgressiveData = args.onProgressiveData; - pendingRequest.mozChunked = true; - } else { - xhr.responseType = 'arraybuffer'; - } - - if (args.onError) { - xhr.onerror = function(evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - - xhr.send(null); - - return xhrId; - }, - - onProgress: function NetworkManager_onProgress(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - if (pendingRequest.mozChunked) { - var chunk = getArrayBuffer(pendingRequest.xhr); - pendingRequest.onProgressiveData(chunk); - } - - var onProgress = pendingRequest.onProgress; - if (onProgress) { - onProgress(evt); - } - }, - - onStateChange: function NetworkManager_onStateChange(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - var xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - - if (xhr.readyState !== 4) { - return; - } - - if (!(xhrId in this.pendingRequests)) { - // The XHR request might have been aborted in onHeadersReceived() - // callback, in which case we should abort request - return; - } - - delete this.pendingRequests[xhrId]; - - // success status == 0 can be on ftp, file and other protocols - if (xhr.status === 0 && this.isHttp) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - var xhrStatus = xhr.status || OK_RESPONSE; - - // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: - // "A server MAY ignore the Range header". This means it's possible to - // get a 200 rather than a 206 response from a range request. - var ok_response_on_range_request = - xhrStatus === OK_RESPONSE && - pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - - if (!ok_response_on_range_request && - xhrStatus !== pendingRequest.expectedStatus) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - - this.loadedRequests[xhrId] = true; - - var chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - var rangeHeader = xhr.getResponseHeader('Content-Range'); - var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - var begin = parseInt(matches[1], 10); - pendingRequest.onDone({ - begin: begin, - chunk: chunk - }); - } else if (pendingRequest.onProgressiveData) { - pendingRequest.onDone(null); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk: chunk - }); - } else if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - }, - - hasPendingRequests: function NetworkManager_hasPendingRequests() { - for (var xhrId in this.pendingRequests) { - return true; - } - return false; - }, - - getRequestXhr: function NetworkManager_getXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - }, - - isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { - return !!(this.pendingRequests[xhrId].onProgressiveData); - }, - - isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - }, - - isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { - return xhrId in this.loadedRequests; - }, - - abortAllRequests: function NetworkManager_abortAllRequests() { - for (var xhrId in this.pendingRequests) { - this.abortRequest(xhrId | 0); - } - }, - - abortRequest: function NetworkManager_abortRequest(xhrId) { - var xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } - }; - - return NetworkManager; -})(); - - -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; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache - } - - // 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 (!this.loadedChunks[chunk]) { - chunks.push(chunk); - } - } - return chunks; - }, - - getBaseStreams: function ChunkedStream_getBaseStreams() { - return [this]; - }, - - allChunksLoaded: function ChunkedStream_allChunksLoaded() { - return this.numChunksLoaded === this.numChunks; - }, - - onReceiveData: function ChunkedStream_onReceiveData(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; - var curChunk; - - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - onReceiveProgressiveData: - function ChunkedStream_onReceiveProgressiveData(data) { - var position = this.progressiveDataLength; - var beginChunk = Math.floor(position / this.chunkSize); - - this.bytes.set(new Uint8Array(data), position); - position += data.byteLength; - this.progressiveDataLength = position; - var endChunk = position >= this.end ? this.numChunks : - Math.floor(position / this.chunkSize); - var curChunk; - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - ensureByte: function ChunkedStream_ensureByte(pos) { - var chunk = Math.floor(pos / this.chunkSize); - if (chunk === this.lastSuccessfulEnsureByteChunk) { - return; - } - - if (!this.loadedChunks[chunk]) { - throw new MissingDataException(pos, pos + 1); - } - this.lastSuccessfulEnsureByteChunk = chunk; - }, - - ensureRange: function ChunkedStream_ensureRange(begin, end) { - if (begin >= end) { - return; - } - - if (end <= this.progressiveDataLength) { - 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 (!this.loadedChunks[chunk]) { - throw new MissingDataException(begin, end); - } - } - }, - - nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) { - var chunk, numChunks = this.numChunks; - for (var i = 0; i < numChunks; ++i) { - chunk = (beginChunk + i) % numChunks; // Wrap around to beginning - if (!this.loadedChunks[chunk]) { - return chunk; - } - } - return null; - }, - - hasChunk: function ChunkedStream_hasChunk(chunk) { - return !!this.loadedChunks[chunk]; - }, - - get length() { - return this.end - this.start; - }, - - get isEmpty() { - return this.length === 0; - }, - - getByte: function ChunkedStream_getByte() { - var pos = this.pos; - if (pos >= this.end) { - return -1; - } - this.ensureByte(pos); - return this.bytes[this.pos++]; - }, - - getUint16: function ChunkedStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - - getInt32: function ChunkedStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - - // 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); - }, - - peekByte: function ChunkedStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - - 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) { - this.ensureRange(start, start + length); - - 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 (!this.loadedChunks[chunk]) { - 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) { - 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, - withCredentials: args.withCredentials - }); - 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.promisesByRequest = {}; - this.progressiveDataLength = 0; - - this._loadedStreamCapability = createPromiseCapability(); - - if (args.initialData) { - this.onReceiveData({chunk: args.initialData}); - } - } - - ChunkedStreamManager.prototype = { - onLoadedStream: function ChunkedStreamManager_getLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - // 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._loadedStreamCapability.promise; - }, - - _requestChunks: function ChunkedStreamManager_requestChunks(chunks) { - var requestId = this.currRequestId++; - - var chunksNeeded; - var i, ii; - this.chunksNeededByRequest[requestId] = chunksNeeded = {}; - for (i = 0, ii = chunks.length; i < ii; i++) { - if (!this.stream.hasChunk(chunks[i])) { - chunksNeeded[chunks[i]] = true; - } - } - - if (isEmptyObj(chunksNeeded)) { - return Promise.resolve(); - } - - var capability = createPromiseCapability(); - this.promisesByRequest[requestId] = capability; - - 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 capability.promise; - } - - var groupedChunksToRequest = this.groupChunks(chunksToRequest); - - for (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); - } - - return capability.promise; - }, - - 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) { - - 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); - } - - return this._requestChunks(chunks); - }, - - requestRanges: function ChunkedStreamManager_requestRanges(ranges) { - 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; }); - return this._requestChunks(chunksToRequest); - }, - - // Groups a sorted array of chunks into as few contiguous larger - // chunks as possible - groupChunks: function ChunkedStreamManager_groupChunks(chunks) { - var groupedChunks = []; - var beginChunk = -1; - var prevChunk = -1; - for (var i = 0; i < chunks.length; ++i) { - var chunk = chunks[i]; - - if (beginChunk < 0) { - beginChunk = chunk; - } - - if (prevChunk >= 0 && 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 isProgressive = args.begin === undefined; - var begin = isProgressive ? this.progressiveDataLength : args.begin; - var end = begin + chunk.byteLength; - - var beginChunk = Math.floor(begin / this.chunkSize); - var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : - Math.ceil(end / this.chunkSize); - - if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; - } else { - this.stream.onReceiveData(begin, chunk); - } - - if (this.stream.allChunksLoaded()) { - this._loadedStreamCapability.resolve(this.stream); - } - - var loadedRequests = []; - var i, requestId; - for (chunk = beginChunk; chunk < endChunk; ++chunk) { - // The server might return more chunks than requested - var requestIds = this.requestsByChunk[chunk] || []; - delete this.requestsByChunk[chunk]; - - for (i = 0; i < requestIds.length; ++i) { - 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 (i = 0; i < loadedRequests.length; ++i) { - requestId = loadedRequests[i]; - var capability = this.promisesByRequest[requestId]; - delete this.promisesByRequest[requestId]; - capability.resolve(); - } - - this.msgHandler.send('DocProgress', { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length - }); - }, - - onError: function ChunkedStreamManager_onError(err) { - this._loadedStreamCapability.reject(err); - }, - - getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) { - var chunk = Math.floor(begin / this.chunkSize); - return chunk; - }, - - getEndChunk: function ChunkedStreamManager_getEndChunk(end) { - var chunk = Math.floor((end - 1) / this.chunkSize) + 1; - return chunk; - }, - - abort: function ChunkedStreamManager_abort() { - if (this.networkManager) { - this.networkManager.abortAllRequests(); - } - for(var requestId in this.promisesByRequest) { - var capability = this.promisesByRequest[requestId]; - capability.reject(new Error('Request was aborted')); - } - } - }; - - return ChunkedStreamManager; -})(); - - -var BasePdfManager = (function BasePdfManagerClosure() { - function BasePdfManager() { - throw new Error('Cannot initialize BaseManagerManager'); - } - - BasePdfManager.prototype = { - get docId() { - return this._docId; - }, - - onLoadedStream: function BasePdfManager_onLoadedStream() { - throw new NotImplementedException(); - }, - - ensureDoc: function BasePdfManager_ensureDoc(prop, args) { - return this.ensure(this.pdfDocument, prop, args); - }, - - ensureXRef: function BasePdfManager_ensureXRef(prop, args) { - return this.ensure(this.pdfDocument.xref, prop, args); - }, - - ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { - return this.ensure(this.pdfDocument.catalog, prop, args); - }, - - getPage: function BasePdfManager_getPage(pageIndex) { - return this.pdfDocument.getPage(pageIndex); - }, - - cleanup: function BasePdfManager_cleanup() { - return this.pdfDocument.cleanup(); - }, - - ensure: function BasePdfManager_ensure(obj, prop, args) { - return new NotImplementedException(); - }, - - requestRange: function BasePdfManager_requestRange(begin, end) { - return new NotImplementedException(); - }, - - requestLoadedStream: function BasePdfManager_requestLoadedStream() { - return new NotImplementedException(); - }, - - sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { - return new NotImplementedException(); - }, - - updatePassword: function BasePdfManager_updatePassword(password) { - this.pdfDocument.xref.password = this.password = password; - if (this._passwordChangedCapability) { - this._passwordChangedCapability.resolve(); - } - }, - - passwordChanged: function BasePdfManager_passwordChanged() { - this._passwordChangedCapability = createPromiseCapability(); - return this._passwordChangedCapability.promise; - }, - - terminate: function BasePdfManager_terminate() { - return new NotImplementedException(); - } - }; - - return BasePdfManager; -})(); - -var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(docId, data, password) { - this._docId = docId; - var stream = new Stream(data); - this.pdfDocument = new PDFDocument(this, stream, password); - this._loadedStreamCapability = createPromiseCapability(); - this._loadedStreamCapability.resolve(stream); - } - - Util.inherit(LocalPdfManager, BasePdfManager, { - ensure: function LocalPdfManager_ensure(obj, prop, args) { - return new Promise(function (resolve, reject) { - try { - var value = obj[prop]; - var result; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch (e) { - reject(e); - } - }); - }, - - requestRange: function LocalPdfManager_requestRange(begin, end) { - return Promise.resolve(); - }, - - requestLoadedStream: function LocalPdfManager_requestLoadedStream() { - return; - }, - - onLoadedStream: function LocalPdfManager_onLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - terminate: function LocalPdfManager_terminate() { - return; - } - }); - - return LocalPdfManager; -})(); - -var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(docId, args, msgHandler) { - this._docId = docId; - this.msgHandler = msgHandler; - - var params = { - msgHandler: msgHandler, - httpHeaders: args.httpHeaders, - withCredentials: args.withCredentials, - chunkedViewerLoading: args.chunkedViewerLoading, - disableAutoFetch: args.disableAutoFetch, - initialData: args.initialData - }; - this.streamManager = new ChunkedStreamManager(args.length, - args.rangeChunkSize, - args.url, params); - this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(), - args.password); - } - - Util.inherit(NetworkPdfManager, BasePdfManager, { - ensure: function NetworkPdfManager_ensure(obj, prop, args) { - var pdfManager = this; - - return new Promise(function (resolve, reject) { - function ensureHelper() { - try { - var result; - var value = obj[prop]; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch(e) { - if (!(e instanceof MissingDataException)) { - reject(e); - return; - } - pdfManager.streamManager.requestRange(e.begin, e.end). - then(ensureHelper, reject); - } - } - - ensureHelper(); - }); - }, - - requestRange: function NetworkPdfManager_requestRange(begin, end) { - return this.streamManager.requestRange(begin, end); - }, - - requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { - this.streamManager.requestAllChunks(); - }, - - sendProgressiveData: - function NetworkPdfManager_sendProgressiveData(chunk) { - this.streamManager.onReceiveData({ chunk: chunk }); - }, - - onLoadedStream: function NetworkPdfManager_onLoadedStream() { - return this.streamManager.onLoadedStream(); - }, - - terminate: function NetworkPdfManager_terminate() { - this.streamManager.abort(); - } - }); - - return NetworkPdfManager; -})(); - - -var Page = (function PageClosure() { - - var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; - - function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { - this.pdfManager = pdfManager; - this.pageIndex = pageIndex; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - this.fontCache = fontCache; - this.idCounters = { - obj: 0 - }; - this.resourcesPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - - getInheritedPageProp: function Page_getInheritedPageProp(key) { - var dict = this.pageDict, valueArray = null, loopCount = 0; - var MAX_LOOP_COUNT = 100; - // Always walk up the entire parent chain, to be able to find - // e.g. \Resources placed on multiple levels of the tree. - while (dict) { - var value = dict.get(key); - if (value) { - if (!valueArray) { - valueArray = []; - } - valueArray.push(value); - } - if (++loopCount > MAX_LOOP_COUNT) { - warn('Page_getInheritedPageProp: maximum loop count exceeded.'); - break; - } - dict = dict.get('Parent'); - } - if (!valueArray) { - return Dict.empty; - } - if (valueArray.length === 1 || !isDict(valueArray[0]) || - loopCount > MAX_LOOP_COUNT) { - return valueArray[0]; - } - return Dict.merge(this.xref, valueArray); - }, - - get content() { - return this.getPageProp('Contents'); - }, - - get resources() { - // For robustness: The spec states that a \Resources entry has to be - // present, but can be empty. Some document omit it still, in this case - // we return an empty dictionary. - return shadow(this, 'resources', this.getInheritedPageProp('Resources')); - }, - - get mediaBox() { - var obj = this.getInheritedPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) { - obj = LETTER_SIZE_MEDIABOX; - } - return shadow(this, 'mediaBox', obj); - }, - - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.getInheritedPageProp('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 rotate() { - var rotate = this.getInheritedPageProp('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 Page_loadResources(keys) { - if (!this.resourcesPromise) { - // TODO: add async getInheritedPageProp and remove this. - this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); - } - return this.resourcesPromise.then(function resourceSuccess() { - var objectLoader = new ObjectLoader(this.resources.map, - keys, - this.xref); - return objectLoader.load(); - }.bind(this)); - }, - - getOperatorList: function Page_getOperatorList(handler, task, intent) { - var self = this; - - 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, - this.fontCache); - - var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - var pageListPromise = dataPromises.then(function(data) { - var contentStream = data[0]; - var opList = new OperatorList(intent, handler, self.pageIndex); - - handler.send('StartRenderPage', { - transparency: partialEvaluator.hasBlendModes(self.resources), - pageIndex: self.pageIndex, - intent: intent - }); - return partialEvaluator.getOperatorList(contentStream, task, - self.resources, opList).then(function () { - return opList; - }); - }); - - var annotationsPromise = pdfManager.ensure(this, 'annotations'); - return Promise.all([pageListPromise, annotationsPromise]).then( - function(datas) { - var pageOpList = datas[0]; - var annotations = datas[1]; - - if (annotations.length === 0) { - pageOpList.flush(true); - return pageOpList; - } - - var annotationsReadyPromise = Annotation.appendToOperatorList( - annotations, pageOpList, partialEvaluator, task, intent); - return annotationsReadyPromise.then(function () { - pageOpList.flush(true); - return pageOpList; - }); - }); - }, - - extractTextContent: function Page_extractTextContent(task, - normalizeWhitespace) { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'XObject', - 'Font' - ]); - - var dataPromises = Promise.all([contentStreamPromise, - resourcesPromise]); - return dataPromises.then(function(data) { - var contentStream = data[0]; - var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, - handler, self.pageIndex, - 'p' + self.pageIndex + '_', - self.idCounters, - self.fontCache); - - return partialEvaluator.getTextContent(contentStream, - task, - self.resources, - /* stateManager = */ null, - normalizeWhitespace); - }); - }, - - getAnnotationsData: function Page_getAnnotationsData(intent) { - var annotations = this.annotations; - var annotationsData = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } - } - annotationsData.push(annotations[i].data); - } - return annotationsData; - }, - - get annotations() { - var annotations = []; - var annotationRefs = this.getInheritedPageProp('Annots') || []; - var annotationFactory = new AnnotationFactory(); - for (var i = 0, n = annotationRefs.length; i < n; ++i) { - var annotationRef = annotationRefs[i]; - var annotation = annotationFactory.create(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() { - var FINGERPRINT_FIRST_BYTES = 1024; - var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + - '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; - - 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) { - assert(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 strBuf = []; - if (pos + limit > end) { - limit = end - pos; - } - for (var n = 0; n < limit; ++n) { - strBuf.push(String.fromCharCode(stream.getByte())); - } - var str = strBuf.join(''); - 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); - var version = this.catalog.catDict.get('Version'); - if (isName(version)) { - this.pdfFormatVersion = version.name; - } - try { - // checking if AcroForm is present - this.acroForm = this.catalog.catDict.get('AcroForm'); - if (this.acroForm) { - this.xfa = this.acroForm.get('XFA'); - var fields = this.acroForm.get('Fields'); - if ((!fields || !isArray(fields) || fields.length === 0) && - !this.xfa) { - // no fields and no XFA -- not a form (?) - this.acroForm = null; - } - } - } catch (ex) { - info('Something wrong with AcroForm entry'); - this.acroForm = null; - } - }, - - get linearization() { - var linearization = null; - if (this.stream.length) { - try { - linearization = Linearization.create(this.stream); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info(err); - } - } - // 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); - } - if (!this.pdfFormatVersion) { - // 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, - IsXFAPresent: !!this.xfa - }; - 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, hash, fileID = ''; - var idArray = xref.trailer.get('ID'); - - if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && - idArray[0] !== EMPTY_FINGERPRINT) { - hash = stringToBytes(idArray[0]); - } else { - if (this.stream.ensureRange) { - this.stream.ensureRange(0, - Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); - } - hash = calculateMD5(this.stream.bytes.subarray(0, - FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); - } - - for (var i = 0, n = hash.length; i < n; i++) { - var hex = hash[i].toString(16); - fileID += hex.length === 1 ? '0' + hex : hex; - } - - return shadow(this, 'fingerprint', fileID); - }, - - getPage: function PDFDocument_getPage(pageIndex) { - return this.catalog.getPage(pageIndex); - }, - - cleanup: function PDFDocument_cleanup() { - return this.catalog.cleanup(); - } - }; - - return PDFDocument; -})(); - - -var Name = (function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - - var nameCache = {}; - - Name.get = function Name_get(name) { - var nameValue = nameCache[name]; - return (nameValue ? nameValue : (nameCache[name] = new Name(name))); - }; - - 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]; - return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd))); - }; - - return Cmd; -})(); - -var Dict = (function DictClosure() { - var nonSerializable = function nonSerializableClosure() { - return nonSerializable; // creating closure on some variable - }; - - var GETALL_DICTIONARY_TYPES_WHITELIST = { - 'Background': true, - 'ExtGState': true, - 'Halftone': true, - 'Layout': true, - 'Mask': true, - 'Pagination': true, - 'Printing': true - }; - - function isRecursionAllowedFor(dict) { - if (!isName(dict.Type)) { - return true; - } - var dictType = dict.Type.name; - return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true; - } - - // 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.objId = null; - 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 xref = this.xref; - if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || - typeof key2 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || - typeof key3 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - value = this.map[key3] || null; - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - }, - - // Same as get(), but dereferences all elements if the result is an Array. - getArray: function Dict_getArray(key1, key2, key3) { - var value = this.get(key1, key2, key3); - var xref = this.xref; - if (!isArray(value) || !xref) { - return value; - } - value = value.slice(); // Ensure that we don't modify the Dict data. - for (var i = 0, ii = value.length; i < ii; i++) { - if (!isRef(value[i])) { - continue; - } - value[i] = xref.fetch(value[i]); - } - return value; - }, - - // no dereferencing - getRaw: function Dict_getRaw(key) { - return this.map[key]; - }, - - // creates new map and dereferences all Refs - getAll: function Dict_getAll() { - var all = Object.create(null); - var queue = null; - var key, obj; - for (key in this.map) { - obj = this.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - (queue || (queue = [])).push({target: all, key: key, obj: obj}); - } else { - all[key] = this.getRaw(key); - } - } else { - all[key] = obj; - } - } - if (!queue) { - return all; - } - - // trying to take cyclic references into the account - var processed = Object.create(null); - while (queue.length > 0) { - var item = queue.shift(); - var itemObj = item.obj; - var objId = itemObj.objId; - if (objId && objId in processed) { - item.target[item.key] = processed[objId]; - continue; - } - var dereferenced = Object.create(null); - for (key in itemObj.map) { - obj = itemObj.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - queue.push({target: dereferenced, key: key, obj: obj}); - } else { - dereferenced[key] = itemObj.getRaw(key); - } - } else { - dereferenced[key] = obj; - } - } - if (objId) { - processed[objId] = dereferenced; - } - item.target[item.key] = dereferenced; - } - return all; - }, - - getKeys: function Dict_getKeys() { - return Object.keys(this.map); - }, - - 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)); - } - } - }; - - Dict.empty = new Dict(null); - - Dict.merge = function Dict_merge(xref, dictArray) { - var mergedDict = new Dict(xref); - - for (var i = 0, ii = dictArray.length; i < ii; i++) { - var dict = dictArray[i]; - if (!isDict(dict)) { - continue; - } - for (var keyName in dict.map) { - if (mergedDict.map[keyName]) { - continue; - } - mergedDict.map[keyName] = dict.map[keyName]; - } - } - return mergedDict; - }; - - return Dict; -})(); - -var Ref = (function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = { - toString: function Ref_toString() { - // This function is hot, so we make the string as compact as possible. - // |this.gen| is almost always zero, so we treat that case specially. - var str = this.num + 'R'; - if (this.gen !== 0) { - str += this.gen; - } - return str; - } - }; - - 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 ref.toString() in this.dict; - }, - - put: function RefSet_put(ref) { - this.dict[ref.toString()] = true; - }, - - remove: function RefSet_remove(ref) { - delete this.dict[ref.toString()]; - } - }; - - return RefSet; -})(); - -var RefSetCache = (function RefSetCacheClosure() { - function RefSetCache() { - this.dict = Object.create(null); - } - - RefSetCache.prototype = { - get: function RefSetCache_get(ref) { - return this.dict[ref.toString()]; - }, - - has: function RefSetCache_has(ref) { - return ref.toString() in this.dict; - }, - - put: function RefSetCache_put(ref, obj) { - this.dict[ref.toString()] = obj; - }, - - putAlias: function RefSetCache_putAlias(ref, aliasRef) { - this.dict[ref.toString()] = this.get(aliasRef); - }, - - forEach: function RefSetCache_forEach(fn, thisArg) { - for (var i in this.dict) { - fn.call(thisArg, this.dict[i]); - } - }, - - clear: function RefSetCache_clear() { - this.dict = Object.create(null); - } - }; - - return RefSetCache; -})(); - -var Catalog = (function CatalogClosure() { - function Catalog(pdfManager, xref) { - this.pdfManager = pdfManager; - this.xref = xref; - this.catDict = xref.getCatalogObj(); - this.fontCache = new RefSetCache(); - assert(isDict(this.catDict), - 'catalog object is not a dictionary'); - - this.pagePromises = []; - } - - 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'); - assert(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'); - assert( - 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 && obj.has('Dests')) { - 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); - }, - getDestination: function Catalog_getDestination(destinationId) { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dest = null, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { // Simple destination dictionary. - var value = nameDictionaryRef.get(destinationId); - if (value) { - dest = fetchDestination(value); - } - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - dest = fetchDestination(nameTree.get(destinationId)); - } - return dest; - }, - get attachments() { - var xref = this.xref; - var attachments = null, nameTreeRef; - var obj = this.catDict.get('Names'); - if (obj) { - nameTreeRef = obj.getRaw('EmbeddedFiles'); - } - - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - if (!names.hasOwnProperty(name)) { - continue; - } - var fs = new FileSpec(names[name], xref); - if (!attachments) { - attachments = {}; - } - attachments[stringToPDFString(name)] = fs.serializable; - } - } - return shadow(this, 'attachments', attachments); - }, - get javaScript() { - var xref = this.xref; - var obj = this.catDict.get('Names'); - - var javaScript = []; - function appendIfJavaScriptDict(jsDict) { - var type = jsDict.get('S'); - if (!isName(type) || type.name !== 'JavaScript') { - return; - } - var js = jsDict.get('JS'); - if (isStream(js)) { - js = bytesToString(js.getBytes()); - } else if (!isString(js)) { - return; - } - javaScript.push(stringToPDFString(js)); - } - 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. This code is - // defensive so we don't cause errors on document load. - var jsDict = names[name]; - if (isDict(jsDict)) { - appendIfJavaScriptDict(jsDict); - } - } - } - - // Append OpenAction actions to javaScript array - var openactionDict = this.catDict.get('OpenAction'); - if (isDict(openactionDict, 'Action')) { - var actionType = openactionDict.get('S'); - if (isName(actionType) && actionType.name === 'Named') { - // The named Print action is not a part of the PDF 1.7 specification, - // but is supported by many PDF readers/writers (including Adobe's). - var action = openactionDict.get('N'); - if (isName(action) && action.name === 'Print') { - javaScript.push('print({});'); - } - } else { - appendIfJavaScriptDict(openactionDict); - } - } - - return shadow(this, 'javaScript', javaScript); - }, - - cleanup: function Catalog_cleanup() { - var promises = []; - this.fontCache.forEach(function (promise) { - promises.push(promise); - }); - return Promise.all(promises).then(function (translatedFonts) { - for (var i = 0, ii = translatedFonts.length; i < ii; i++) { - var font = translatedFonts[i].dict; - delete font.translated; - } - this.fontCache.clear(); - }.bind(this)); - }, - - getPage: function Catalog_getPage(pageIndex) { - if (!(pageIndex in this.pagePromises)) { - this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then( - function (a) { - var dict = a[0]; - var ref = a[1]; - return new Page(this.pdfManager, this.xref, pageIndex, dict, ref, - this.fontCache); - }.bind(this) - ); - } - return this.pagePromises[pageIndex]; - }, - - getPageDict: function Catalog_getPageDict(pageIndex) { - var capability = createPromiseCapability(); - var nodesToVisit = [this.catDict.getRaw('Pages')]; - var currentPageIndex = 0; - var xref = this.xref; - var checkAllKids = false; - - function next() { - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - if (isRef(currentNode)) { - xref.fetchAsync(currentNode).then(function (obj) { - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - if (pageIndex === currentPageIndex) { - capability.resolve([obj, currentNode]); - } else { - currentPageIndex++; - next(); - } - return; - } - nodesToVisit.push(obj); - next(); - }, capability.reject); - return; - } - - // Must be a child page dictionary. - assert( - isDict(currentNode), - 'page dictionary kid reference points to wrong type of object' - ); - var count = currentNode.get('Count'); - // If the current node doesn't have any children, avoid getting stuck - // in an empty node further down in the tree (see issue5644.pdf). - if (count === 0) { - checkAllKids = true; - } - // Skip nodes where the page can't be. - if (currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - - var kids = currentNode.get('Kids'); - assert(isArray(kids), 'page dictionary kids object is not an array'); - if (!checkAllKids && count === kids.length) { - // Nodes that don't have the page have been skipped and this is the - // bottom of the tree which means the page requested must be a - // descendant of this pages node. Ideally we would just resolve the - // promise with the page ref here, but there is the case where more - // pages nodes could link to single a page (see issue 3666 pdf). To - // handle this push it back on the queue so if it is a pages node it - // will be descended into. - nodesToVisit = [kids[pageIndex - currentPageIndex]]; - currentPageIndex = pageIndex; - continue; - } else { - for (var last = kids.length - 1; last >= 0; last--) { - nodesToVisit.push(kids[last]); - } - } - } - capability.reject('Page index ' + pageIndex + ' not found.'); - } - next(); - return capability.promise; - }, - - getPageIndex: function Catalog_getPageIndex(ref) { - // The page tree nodes have the count of all the leaves below them. To get - // how many pages are before we just have to walk up the tree and keep - // adding the count of siblings to the left of the node. - var xref = this.xref; - function pagesBeforeRef(kidRef) { - var total = 0; - var parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (!node) { - return null; - } - parentRef = node.getRaw('Parent'); - return node.getAsync('Parent'); - }).then(function (parent) { - if (!parent) { - return null; - } - return parent.getAsync('Kids'); - }).then(function (kids) { - if (!kids) { - return null; - } - var kidPromises = []; - var found = false; - for (var i = 0; i < kids.length; i++) { - var kid = kids[i]; - assert(isRef(kid), 'kids must be a ref'); - if (kid.num === kidRef.num) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (kid) { - if (kid.has('Count')) { - var count = kid.get('Count'); - total += count; - } else { // page leaf node - total++; - } - })); - } - if (!found) { - error('kid ref not found in parents kids'); - } - return Promise.all(kidPromises).then(function () { - return [total, parentRef]; - }); - }); - } - - var total = 0; - function next(ref) { - return pagesBeforeRef(ref).then(function (args) { - if (!args) { - return total; - } - var count = args[0]; - var parentRef = args[1]; - total += count; - return next(parentRef); - }); - } - - return next(ref); - } - }; - - 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; - this.stats = { - streamTypes: [], - fontTypes: [] - }; - } - - 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(); - - // The pdflib PDF generator can generate a nested trailer dictionary - if (!isDict(dict) && dict.dict) { - dict = dict.dict; - } - 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)) { - 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 is 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. - var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; - var PERCENT = 0x25, LT = 0x3C; - - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== LF && ch !== CR && ch !== LT) { - 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 objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; - 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]); - - // Clear out any existing entries, since they may be bogus. - this.entries.length = 0; - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - while (position < length) { - var ch = buffer[position]; - if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { - ++position; - continue; - } - if (ch === PERCENT) { // %-comment - do { - ++position; - if (position >= length) { - break; - } - ch = buffer[position]; - } while (ch !== LF && ch !== CR); - continue; - } - var token = readToken(buffer, position); - var m; - if (token.indexOf('xref') === 0 && - (token.length === 4 || /\s/.test(token[4]))) { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = objRegExp.exec(token))) { - if (typeof this.entries[m[1]] === 'undefined') { - this.entries[m[1]] = { - offset: position - stream.start, - 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 - stream.start); - this.xrefstms[position - stream.start] = 1; // Avoid recursion - } - - position += contentLength; - } else if (token.indexOf('trailer') === 0 && - (token.length === 7 || /\s/.test(token[7]))) { - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else { - position += token.length + 1; - } - } - // reading XRef streams - var i, ii; - for (i = 0, ii = xrefStms.length; i < ii; ++i) { - this.startXRefQueue.push(xrefStms[i]); - this.readXRef(/* recoveryMode */ true); - } - // finding main trailer - var dict; - for (i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), true, this); - 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 + stream.start; - - var parser = new Parser(new Lexer(stream), true, this); - 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'); - } - } else { - error('Invalid XRef stream header'); - } - - // 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; - } - info('(while reading XRef): ' + e); - } - - if (recoveryMode) { - return; - } - throw new XRefParseException(); - }, - - getEntry: function XRef_getEntry(i) { - var xrefEntry = this.entries[i]; - if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { - return xrefEntry; - } - return null; - }, - - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) { - return obj; - } - return this.fetch(obj); - }, - - fetch: function XRef_fetch(ref, suppressEncryption) { - assert(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) { - var cacheEntry = this.cache[num]; - return cacheEntry; - } - - var xrefEntry = this.getEntry(num); - - // the referenced entry can be free - if (xrefEntry === null) { - return (this.cache[num] = null); - } - - if (xrefEntry.uncompressed) { - xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); - } else { - xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); - } - if (isDict(xrefEntry)){ - xrefEntry.objId = ref.toString(); - } else if (isStream(xrefEntry)) { - xrefEntry.dict.objId = ref.toString(); - } - return xrefEntry; - }, - - fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, - suppressEncryption) { - var gen = ref.gen; - var num = ref.num; - if (xrefEntry.gen !== gen) { - error('inconsistent generation in XRef'); - } - var stream = this.stream.makeSubStream(xrefEntry.offset + - this.stream.start); - var parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || parseInt(obj1, 10) !== num || - !isInt(obj2) || parseInt(obj2, 10) !== 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) { - xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } else { - xrefEntry = parser.getObj(); - } - if (!isStream(xrefEntry)) { - this.cache[num] = xrefEntry; - } - return xrefEntry; - }, - - fetchCompressed: function XRef_fetchCompressed(xrefEntry, - suppressEncryption) { - var tableOffset = xrefEntry.offset; - var 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'); - } - var parser = new Parser(new Lexer(stream), false, this); - parser.allowStreams = true; - var i, entries = [], num, 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]; - } - } - xrefEntry = entries[xrefEntry.gen]; - if (xrefEntry === undefined) { - error('bad XRef entry for compressed object'); - } - return xrefEntry; - }, - - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { - if (!isRef(obj)) { - return Promise.resolve(obj); - } - return this.fetchAsync(obj); - }, - - fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { - var streamManager = this.stream.manager; - var xref = this; - return new Promise(function tryFetch(resolve, reject) { - try { - resolve(xref.fetch(ref, suppressEncryption)); - } catch (e) { - if (e instanceof MissingDataException) { - streamManager.requestRange(e.begin, e.end).then(function () { - tryFetch(resolve, reject); - }, reject); - return; - } - reject(e); - } - }); - }, - - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * A NameTree is like a Dict but has some advantageous 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[xref.fetchIfRef(names[i])] = xref.fetchIfRef(names[i + 1]); - } - } - } - return dict; - }, - - get: function NameTree_get(destinationId) { - if (!this.root) { - return null; - } - - var xref = this.xref; - var kidsOrNames = xref.fetchIfRef(this.root); - var loopCount = 0; - var MAX_NAMES_LEVELS = 10; - var l, r, m; - - // Perform a binary search to quickly find the entry that - // contains the named destination we are looking for. - while (kidsOrNames.has('Kids')) { - loopCount++; - if (loopCount > MAX_NAMES_LEVELS) { - warn('Search depth limit for named destionations has been reached.'); - return null; - } - - var kids = kidsOrNames.get('Kids'); - if (!isArray(kids)) { - return null; - } - - l = 0; - r = kids.length - 1; - while (l <= r) { - m = (l + r) >> 1; - var kid = xref.fetchIfRef(kids[m]); - var limits = kid.get('Limits'); - - if (destinationId < xref.fetchIfRef(limits[0])) { - r = m - 1; - } else if (destinationId > xref.fetchIfRef(limits[1])) { - l = m + 1; - } else { - kidsOrNames = xref.fetchIfRef(kids[m]); - break; - } - } - if (l > r) { - return null; - } - } - - // If we get here, then we have found the right entry. Now - // go through the named destinations in the Named dictionary - // until we find the exact destination we're looking for. - var names = kidsOrNames.get('Names'); - if (isArray(names)) { - // Perform a binary search to reduce the lookup time. - l = 0; - r = names.length - 2; - while (l <= r) { - // Check only even indices (0, 2, 4, ...) because the - // odd indices contain the actual D array. - m = (l + r) & ~1; - if (destinationId < xref.fetchIfRef(names[m])) { - r = m - 2; - } else if (destinationId > xref.fetchIfRef(names[m])) { - l = m + 2; - } else { - return xref.fetchIfRef(names[m + 1]); - } - } - } - return null; - } - }; - return NameTree; -})(); - -/** - * "A PDF file can refer to the contents of another file by using a File - * Specification (PDF 1.1)", see the spec (7.11) for more details. - * NOTE: Only embedded files are supported (as part of the attachments support) - * TODO: support the 'URL' file system (with caching if !/V), portable - * collections attributes and related files (/RF) - */ -var FileSpec = (function FileSpecClosure() { - function FileSpec(root, xref) { - if (!root || !isDict(root)) { - return; - } - this.xref = xref; - this.root = root; - if (root.has('FS')) { - this.fs = root.get('FS'); - } - this.description = root.has('Desc') ? - stringToPDFString(root.get('Desc')) : - ''; - if (root.has('RF')) { - warn('Related file specifications are not supported'); - } - this.contentAvailable = true; - if (!root.has('EF')) { - this.contentAvailable = false; - warn('Non-embedded file specifications are not supported'); - } - } - - function pickPlatformItem(dict) { - // Look for the filename in this order: - // UF, F, Unix, Mac, DOS - if (dict.has('UF')) { - return dict.get('UF'); - } else if (dict.has('F')) { - return dict.get('F'); - } else if (dict.has('Unix')) { - return dict.get('Unix'); - } else if (dict.has('Mac')) { - return dict.get('Mac'); - } else if (dict.has('DOS')) { - return dict.get('DOS'); - } else { - return null; - } - } - - FileSpec.prototype = { - get filename() { - if (!this._filename && this.root) { - var filename = pickPlatformItem(this.root) || 'unnamed'; - this._filename = stringToPDFString(filename). - replace(/\\\\/g, '\\'). - replace(/\\\//g, '/'). - replace(/\\/g, '/'); - } - return this._filename; - }, - get content() { - if (!this.contentAvailable) { - return null; - } - if (!this.contentRef && this.root) { - this.contentRef = pickPlatformItem(this.root.get('EF')); - } - var content = null; - if (this.contentRef) { - var xref = this.xref; - var fileObj = xref.fetchIfRef(this.contentRef); - if (fileObj && isStream(fileObj)) { - content = fileObj.getBytes(); - } else { - warn('Embedded file specification points to non-existing/invalid ' + - 'content'); - } - } else { - warn('Embedded file specification does not have a content'); - } - return content; - }, - get serializable() { - return { - filename: this.filename, - content: this.content - }; - } - }; - return FileSpec; -})(); - -/** - * 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) { - var value; - if (isDict(node) || isStream(node)) { - var map; - if (isDict(node)) { - map = node.map; - } else { - map = node.dict.map; - } - for (var key in map) { - value = map[key]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } else if (isArray(node)) { - for (var i = 0, ii = node.length; i < ii; i++) { - 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; - this.capability = null; - } - - ObjectLoader.prototype = { - load: function ObjectLoader_load() { - var keys = this.keys; - this.capability = createPromiseCapability(); - // 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.capability.resolve(); - return this.capability.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.capability.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).then( - 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), this.capability.reject); - return; - } - // Everything is loaded. - this.refSet = null; - this.capability.resolve(); - } - }; - - return ObjectLoader; -})(); - - -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 DEFAULT_ICON_SIZE = 22; // px - -/** - * @class - * @alias AnnotationFactory - */ -function AnnotationFactory() {} -AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { - /** - * @param {XRef} xref - * @param {Object} ref - * @returns {Annotation} - */ - create: function AnnotationFactory_create(xref, ref) { - var dict = xref.fetchIfRef(ref); - if (!isDict(dict)) { - return; - } - - // Determine the annotation's subtype. - var subtype = dict.get('Subtype'); - subtype = isName(subtype) ? subtype.name : ''; - - // Return the right annotation object based on the subtype and field type. - var parameters = { - dict: dict, - ref: ref - }; - - switch (subtype) { - case 'Link': - return new LinkAnnotation(parameters); - - case 'Text': - return new TextAnnotation(parameters); - - case 'Widget': - var fieldType = Util.getInheritableProperty(dict, 'FT'); - if (isName(fieldType) && fieldType.name === 'Tx') { - return new TextWidgetAnnotation(parameters); - } - return new WidgetAnnotation(parameters); - - default: - warn('Unimplemented annotation type "' + subtype + '", ' + - 'falling back to base annotation'); - return new Annotation(parameters); - } - } -}; - -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); - } - } else { - appearance = appearances; - } - return appearance; - } - - function Annotation(params) { - var dict = params.dict; - - this.setFlags(dict.get('F')); - this.setRectangle(dict.get('Rect')); - this.setColor(dict.get('C')); - this.setBorderStyle(dict); - this.appearance = getDefaultAppearance(dict); - - // Expose public properties using a data object. - this.data = {}; - this.data.id = params.ref.num; - this.data.subtype = dict.get('Subtype').name; - this.data.annotationFlags = this.flags; - this.data.rect = this.rectangle; - this.data.color = this.color; - this.data.borderStyle = this.borderStyle; - this.data.hasAppearance = !!this.appearance; - } - - Annotation.prototype = { - /** - * @return {boolean} - */ - get viewable() { - if (this.flags) { - return !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN) && - !this.hasFlag(AnnotationFlag.NOVIEW); - } - return true; - }, - - /** - * @return {boolean} - */ - get printable() { - if (this.flags) { - return this.hasFlag(AnnotationFlag.PRINT) && - !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN); - } - return false; - }, - - /** - * Set the flags. - * - * @public - * @memberof Annotation - * @param {number} flags - Unsigned 32-bit integer specifying annotation - * characteristics - * @see {@link shared/util.js} - */ - setFlags: function Annotation_setFlags(flags) { - if (isInt(flags)) { - this.flags = flags; - } else { - this.flags = 0; - } - }, - - /** - * Check if a provided flag is set. - * - * @public - * @memberof Annotation - * @param {number} flag - Hexadecimal representation for an annotation - * characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFlag: function Annotation_hasFlag(flag) { - if (this.flags) { - return (this.flags & flag) > 0; - } - return false; - }, - - /** - * Set the rectangle. - * - * @public - * @memberof Annotation - * @param {Array} rectangle - The rectangle array with exactly four entries - */ - setRectangle: function Annotation_setRectangle(rectangle) { - if (isArray(rectangle) && rectangle.length === 4) { - this.rectangle = Util.normalizeRect(rectangle); - } else { - this.rectangle = [0, 0, 0, 0]; - } - }, - - /** - * Set the color and take care of color space conversion. - * - * @public - * @memberof Annotation - * @param {Array} color - The color array containing either 0 - * (transparent), 1 (grayscale), 3 (RGB) or - * 4 (CMYK) elements - */ - setColor: function Annotation_setColor(color) { - var rgbColor = new Uint8Array(3); // Black in RGB color space (default) - if (!isArray(color)) { - this.color = rgbColor; - return; - } - - switch (color.length) { - case 0: // Transparent, which we indicate with a null value - this.color = null; - break; - - case 1: // Convert grayscale to RGB - ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 3: // Convert RGB percentages to RGB - ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 4: // Convert CMYK to RGB - ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - default: - this.color = rgbColor; - break; - } - }, - - /** - * Set the border style (as AnnotationBorderStyle object). - * - * @public - * @memberof Annotation - * @param {Dict} borderStyle - The border style dictionary - */ - setBorderStyle: function Annotation_setBorderStyle(borderStyle) { - this.borderStyle = new AnnotationBorderStyle(); - if (!isDict(borderStyle)) { - return; - } - if (borderStyle.has('BS')) { - var dict = borderStyle.get('BS'); - var dictType; - - if (!dict.has('Type') || (isName(dictType = dict.get('Type')) && - dictType.name === 'Border')) { - this.borderStyle.setWidth(dict.get('W')); - this.borderStyle.setStyle(dict.get('S')); - this.borderStyle.setDashArray(dict.get('D')); - } - } else if (borderStyle.has('Border')) { - var array = borderStyle.get('Border'); - if (isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2]); - - if (array.length === 4) { // Dash array available - this.borderStyle.setDashArray(array[3]); - } - } - } else { - // There are no border entries in the dictionary. According to the - // specification, we should draw a solid border of width 1 in that - // case, but Adobe Reader did not implement that part of the - // specification and instead draws no border at all, so we do the same. - // See also https://github.com/mozilla/pdf.js/issues/6179. - this.borderStyle.setWidth(0); - } - }, - - loadResources: function Annotation_loadResources(keys) { - return new Promise(function (resolve, reject) { - this.appearance.dict.getAsync('Resources').then(function (resources) { - if (!resources) { - resolve(); - return; - } - var objectLoader = new ObjectLoader(resources.map, - keys, - resources.xref); - objectLoader.load().then(function() { - resolve(resources); - }, reject); - }, reject); - }.bind(this)); - }, - - getOperatorList: function Annotation_getOperatorList(evaluator, task) { - if (!this.appearance) { - return Promise.resolve(new OperatorList()); - } - - 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 self = this; - - return resourcesPromise.then(function(resources) { - var opList = new OperatorList(); - opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]); - return evaluator.getOperatorList(self.appearance, task, - resources, opList). - then(function () { - opList.addOp(OPS.endAnnotation, []); - self.appearance.reset(); - return opList; - }); - }); - } - }; - - Annotation.appendToOperatorList = function Annotation_appendToOperatorList( - annotations, opList, partialEvaluator, task, intent) { - var annotationPromises = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if ((intent === 'display' && annotations[i].viewable) || - (intent === 'print' && annotations[i].printable)) { - annotationPromises.push( - annotations[i].getOperatorList(partialEvaluator, task)); - } - } - return Promise.all(annotationPromises).then(function(operatorLists) { - opList.addOp(OPS.beginAnnotations, []); - for (var i = 0, n = operatorLists.length; i < n; ++i) { - opList.addOpList(operatorLists[i]); - } - opList.addOp(OPS.endAnnotations, []); - }); - }; - - return Annotation; -})(); - -/** - * Contains all data regarding an annotation's border style. - * - * @class - */ -var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() { - /** - * @constructor - * @private - */ - function AnnotationBorderStyle() { - this.width = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } - - AnnotationBorderStyle.prototype = { - /** - * Set the width. - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} width - The width - */ - setWidth: function AnnotationBorderStyle_setWidth(width) { - if (width === (width | 0)) { - this.width = width; - } - }, - - /** - * Set the style. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Object} style - The style object - * @see {@link shared/util.js} - */ - setStyle: function AnnotationBorderStyle_setStyle(style) { - if (!style) { - return; - } - switch (style.name) { - case 'S': - this.style = AnnotationBorderStyleType.SOLID; - break; - - case 'D': - this.style = AnnotationBorderStyleType.DASHED; - break; - - case 'B': - this.style = AnnotationBorderStyleType.BEVELED; - break; - - case 'I': - this.style = AnnotationBorderStyleType.INSET; - break; - - case 'U': - this.style = AnnotationBorderStyleType.UNDERLINE; - break; - - default: - break; - } - }, - - /** - * Set the dash array. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Array} dashArray - The dash array with at least one element - */ - setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { - // We validate the dash array, but we do not use it because CSS does not - // allow us to change spacing of dashes. For more information, visit - // http://www.w3.org/TR/css3-background/#the-border-style. - if (isArray(dashArray) && dashArray.length > 0) { - // According to the PDF specification: the elements in a dashArray - // shall be numbers that are nonnegative and not all equal to zero. - var isValid = true; - var allZeros = true; - for (var i = 0, len = dashArray.length; i < len; i++) { - var element = dashArray[i]; - var validNumber = (+element >= 0); - if (!validNumber) { - isValid = false; - break; - } else if (element > 0) { - allZeros = false; - } - } - if (isValid && !allZeros) { - this.dashArray = dashArray; - } else { - this.width = 0; // Adobe behavior when the array is invalid. - } - } else if (dashArray) { - this.width = 0; // Adobe behavior when the array is invalid. - } - }, - - /** - * Set the horizontal corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The horizontal corner radius - */ - setHorizontalCornerRadius: - function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.horizontalCornerRadius = radius; - } - }, - - /** - * Set the vertical corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The vertical corner radius - */ - setVerticalCornerRadius: - function AnnotationBorderStyle_setVerticalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.verticalCornerRadius = radius; - } - } - }; - - return AnnotationBorderStyle; -})(); - -var WidgetAnnotation = (function WidgetAnnotationClosure() { - function WidgetAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - data.annotationType = AnnotationType.WIDGET; - 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') || Dict.empty; - - // Hide unsupported Widget signatures. - if (data.fieldType === 'Sig') { - warn('unimplemented annotation type: Widget signature'); - this.setFlags(AnnotationFlag.HIDDEN); - } - - // 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 if (parent && ref) { - // 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('.'); - } - - Util.inherit(WidgetAnnotation, Annotation, {}); - - return WidgetAnnotation; -})(); - -var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { - function TextWidgetAnnotation(params) { - WidgetAnnotation.call(this, params); - - this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q'); - this.data.hasHtml = !this.data.hasAppearance && !!this.data.fieldValue; - } - - Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { - getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, - task) { - if (this.appearance) { - return Annotation.prototype.getOperatorList.call(this, evaluator, task); - } - - 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. - if (!data.defaultAppearance) { - return Promise.resolve(opList); - } - - var stream = new Stream(stringToBytes(data.defaultAppearance)); - return evaluator.getOperatorList(stream, task, - this.fieldResources, opList). - then(function () { - return opList; - }); - } - }); - - return TextWidgetAnnotation; -})(); - -var TextAnnotation = (function TextAnnotationClosure() { - function TextAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - var content = dict.get('Contents'); - var title = dict.get('T'); - data.annotationType = AnnotationType.TEXT; - data.content = stringToPDFString(content || ''); - data.title = stringToPDFString(title || ''); - data.hasHtml = true; - - if (data.hasAppearance) { - data.name = 'NoIcon'; - } else { - data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE; - data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE; - data.name = dict.has('Name') ? dict.get('Name').name : 'Note'; - } - - if (dict.has('C')) { - data.hasBgColor = true; - } - } - - Util.inherit(TextAnnotation, Annotation, {}); - - return TextAnnotation; -})(); - -var LinkAnnotation = (function LinkAnnotationClosure() { - function LinkAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - data.annotationType = AnnotationType.LINK; - data.hasHtml = true; - - var action = dict.get('A'); - if (action && isDict(action)) { - var linkType = action.get('S').name; - if (linkType === 'URI') { - var url = action.get('URI'); - if (isName(url)) { - // Some bad PDFs do not put parentheses around relative URLs. - url = '/' + url.name; - } else if (url) { - url = addDefaultProtocolToUrl(url); - } - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - if (!isValidUrl(url, false)) { - url = ''; - } - // According to ISO 32000-1:2008, section 12.6.4.7, - // URI should to be encoded in 7-bit ASCII. - // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280. - try { - data.url = stringToUTF8String(url); - } catch (e) { - // Fall back to a simple copy. - 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 if (linkType === 'Named') { - data.action = action.get('N').name; - } else { - warn('unrecognized link type: ' + linkType); - } - } else if (dict.has('Dest')) { - // simple destination link - var dest = dict.get('Dest'); - data.dest = isName(dest) ? dest.name : dest; - } - } - - // Lets URLs beginning with 'www.' default to using the 'http://' protocol. - function addDefaultProtocolToUrl(url) { - if (url && url.indexOf('www.') === 0) { - return ('http://' + url); - } - return url; - } - - Util.inherit(LinkAnnotation, Annotation, {}); - - 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 i, ii; - var length = 1; - for (i = 0, ii = size.length; i < ii; i++) { - length *= size[i]; - } - length *= outputSize; - - var array = new Array(length); - 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 (i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array[i] = (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); - }, - - parseArray: function PDFFunction_parseArray(xref, fnObj) { - if (!isArray(fnObj)) { - // not an array -- parsing as regular function - return this.parse(xref, fnObj); - } - - var fnArray = []; - for (var j = 0, jj = fnObj.length; j < jj; j++) { - var obj = xref.fetchIfRef(fnObj[j]); - fnArray.push(PDFFunction.parse(xref, obj)); - } - return function (src, srcOffset, dest, destOffset) { - for (var i = 0, ii = fnArray.length; i < ii; i++) { - fnArray[i](src, srcOffset, dest, destOffset + i); - } - }; - }, - - constructSampled: function PDFFunction_constructSampled(str, dict) { - function toMultiArray(arr) { - var inputLength = arr.length; - 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 - info('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(src, srcOffset, - dest, destOffset) { - // 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]; - - // 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); - var i, j; - for (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 (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(src[srcOffset +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 (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; - } - - for (j = 0; j < n; ++j) { - // Sum all cube vertices' samples portions - var rj = 0; - for (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) - dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), - range[j][1]); - } - }; - }, - - 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(src, srcOffset, - dest, destOffset) { - var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n); - - for (var j = 0; j < length; ++j) { - dest[destOffset + j] = c0[j] + (x * diff[j]); - } - }; - }, - - 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 = []; - var tmpBuf = new Float32Array(1); - - for (var i = 0, ii = fnsIR.length; i < ii; i++) { - fns.push(PDFFunction.fromIR(fnsIR[i])); - } - - return function constructStichedFromIRResult(src, srcOffset, - dest, destOffset) { - 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(src[srcOffset], 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]; - - // Prevent the value from becoming NaN as a result - // of division by zero (fixes issue6113.pdf). - tmpBuf[0] = dmin === dmax ? rmin : - rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - - // call the appropriate function - fns[i](tmpBuf, 0, dest, destOffset); - }; - }, - - 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 compiled = (new PostScriptCompiler()).compile(code, domain, range); - if (compiled) { - // Compiled function consists of simple expressions such as addition, - // subtraction, Math.max, and also contains 'var' and 'return' - // statements. See the generation in the PostScriptCompiler below. - /*jshint -W054 */ - return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); - } - - info('Unable to compile PS function'); - - var numOutputs = range.length >> 1; - var numInputs = domain.length >> 1; - 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 = {}; - // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values - // seen in our tests. - var MAX_CACHE_SIZE = 2048 * 4; - var cache_available = MAX_CACHE_SIZE; - var tmpBuf = new Float32Array(numInputs); - - return function constructPostScriptFromIRResult(src, srcOffset, - dest, destOffset) { - var i, value; - var key = ''; - var input = tmpBuf; - for (i = 0; i < numInputs; i++) { - value = src[srcOffset + i]; - input[i] = value; - key += value + '_'; - } - - var cachedValue = cache[key]; - if (cachedValue !== undefined) { - dest.set(cachedValue, destOffset); - return; - } - - var output = new Float32Array(numOutputs); - var stack = evaluator.execute(input); - var stackIndex = stack.length - numOutputs; - for (i = 0; i < numOutputs; i++) { - value = stack[stackIndex + i]; - var bound = range[i * 2]; - if (value < bound) { - value = bound; - } else { - bound = range[i * 2 +1]; - if (value > bound) { - value = bound; - } - } - output[i] = value; - } - if (cache_available > 0) { - cache_available--; - cache[key] = output; - } - dest.set(output, destOffset); - }; - } - }; -})(); - -function isPDFFunction(v) { - var fnDict; - if (typeof v !== 'object') { - return false; - } else if (isDict(v)) { - fnDict = v; - } else if (isStream(v)) { - fnDict = v.dict; - } else { - return false; - } - return fnDict.has('FunctionType'); -} - -var PostScriptStack = (function PostScriptStackClosure() { - var MAX_STACK_SIZE = 100; - function PostScriptStack(initialStack) { - this.stack = !initialStack ? [] : - Array.prototype.slice.call(initialStack, 0); - } - - 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) { - this.operators = operators; - } - 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(-a); - break; - case 'not': - a = stack.pop(); - if (isBool(a)) { - stack.push(!a); - } else { - stack.push(~a); - } - 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; -})(); - -// Most of the PDFs functions consist of simple operations such as: -// roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add. -// -// We can compile most of such programs, and at the same moment, we can -// optimize some expressions using basic math properties. Keeping track of -// min/max values will allow us to avoid extra Math.min/Math.max calls. -var PostScriptCompiler = (function PostScriptCompilerClosure() { - function AstNode(type) { - this.type = type; - } - AstNode.prototype.visit = function (visitor) { - throw new Error('abstract method'); - }; - - function AstArgument(index, min, max) { - AstNode.call(this, 'args'); - this.index = index; - this.min = min; - this.max = max; - } - AstArgument.prototype = Object.create(AstNode.prototype); - AstArgument.prototype.visit = function (visitor) { - visitor.visitArgument(this); - }; - - function AstLiteral(number) { - AstNode.call(this, 'literal'); - this.number = number; - this.min = number; - this.max = number; - } - AstLiteral.prototype = Object.create(AstNode.prototype); - AstLiteral.prototype.visit = function (visitor) { - visitor.visitLiteral(this); - }; - - function AstBinaryOperation(op, arg1, arg2, min, max) { - AstNode.call(this, 'binary'); - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - this.min = min; - this.max = max; - } - AstBinaryOperation.prototype = Object.create(AstNode.prototype); - AstBinaryOperation.prototype.visit = function (visitor) { - visitor.visitBinaryOperation(this); - }; - - function AstMin(arg, max) { - AstNode.call(this, 'max'); - this.arg = arg; - this.min = arg.min; - this.max = max; - } - AstMin.prototype = Object.create(AstNode.prototype); - AstMin.prototype.visit = function (visitor) { - visitor.visitMin(this); - }; - - function AstVariable(index, min, max) { - AstNode.call(this, 'var'); - this.index = index; - this.min = min; - this.max = max; - } - AstVariable.prototype = Object.create(AstNode.prototype); - AstVariable.prototype.visit = function (visitor) { - visitor.visitVariable(this); - }; - - function AstVariableDefinition(variable, arg) { - AstNode.call(this, 'definition'); - this.variable = variable; - this.arg = arg; - } - AstVariableDefinition.prototype = Object.create(AstNode.prototype); - AstVariableDefinition.prototype.visit = function (visitor) { - visitor.visitVariableDefinition(this); - }; - - function ExpressionBuilderVisitor() { - this.parts = []; - } - ExpressionBuilderVisitor.prototype = { - visitArgument: function (arg) { - this.parts.push('Math.max(', arg.min, ', Math.min(', - arg.max, ', src[srcOffset + ', arg.index, ']))'); - }, - visitVariable: function (variable) { - this.parts.push('v', variable.index); - }, - visitLiteral: function (literal) { - this.parts.push(literal.number); - }, - visitBinaryOperation: function (operation) { - this.parts.push('('); - operation.arg1.visit(this); - this.parts.push(' ', operation.op, ' '); - operation.arg2.visit(this); - this.parts.push(')'); - }, - visitVariableDefinition: function (definition) { - this.parts.push('var '); - definition.variable.visit(this); - this.parts.push(' = '); - definition.arg.visit(this); - this.parts.push(';'); - }, - visitMin: function (max) { - this.parts.push('Math.min('); - max.arg.visit(this); - this.parts.push(', ', max.max, ')'); - }, - toString: function () { - return this.parts.join(''); - } - }; - - function buildAddOperation(num1, num2) { - if (num2.type === 'literal' && num2.number === 0) { - // optimization: second operand is 0 - return num1; - } - if (num1.type === 'literal' && num1.number === 0) { - // optimization: first operand is 0 - return num2; - } - if (num2.type === 'literal' && num1.type === 'literal') { - // optimization: operands operand are literals - return new AstLiteral(num1.number + num2.number); - } - return new AstBinaryOperation('+', num1, num2, - num1.min + num2.min, num1.max + num2.max); - } - - function buildMulOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num2.number === 1) { - return num1; // and it's 1 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number * num2.number); - } - } - if (num1.type === 'literal') { - // optimization: first operands is a literal... - if (num1.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num1.number === 1) { - return num2; // and it's 1 - } - } - var min = Math.min(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - var max = Math.max(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - return new AstBinaryOperation('*', num1, num2, min, max); - } - - function buildSubOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return num1; // ... and it's 0 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number - num2.number); - } - } - if (num2.type === 'binary' && num2.op === '-' && - num1.type === 'literal' && num1.number === 1 && - num2.arg1.type === 'literal' && num2.arg1.number === 1) { - // optimization for case: 1 - (1 - x) - return num2.arg2; - } - return new AstBinaryOperation('-', num1, num2, - num1.min - num2.max, num1.max - num2.min); - } - - function buildMinOperation(num1, max) { - if (num1.min >= max) { - // optimization: num1 min value is not less than required max - return new AstLiteral(max); // just returning max - } else if (num1.max <= max) { - // optimization: num1 max value is not greater than required max - return num1; // just returning an argument - } - return new AstMin(num1, max); - } - - function PostScriptCompiler() {} - PostScriptCompiler.prototype = { - compile: function PostScriptCompiler_compile(code, domain, range) { - var stack = []; - var i, ii; - var instructions = []; - var inputSize = domain.length >> 1, outputSize = range.length >> 1; - var lastRegister = 0; - var n, j, min, max; - var num1, num2, ast1, ast2, tmpVar, item; - for (i = 0; i < inputSize; i++) { - stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); - } - - for (i = 0, ii = code.length; i < ii; i++) { - item = code[i]; - if (typeof item === 'number') { - stack.push(new AstLiteral(item)); - continue; - } - - switch (item) { - case 'add': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildAddOperation(num1, num2)); - break; - case 'cvr': - if (stack.length < 1) { - return null; - } - break; - case 'mul': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildMulOperation(num1, num2)); - break; - case 'sub': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildSubOperation(num1, num2)); - break; - case 'exch': - if (stack.length < 2) { - return null; - } - ast1 = stack.pop(); ast2 = stack.pop(); - stack.push(ast1, ast2); - break; - case 'pop': - if (stack.length < 1) { - return null; - } - stack.pop(); - break; - case 'index': - if (stack.length < 1) { - return null; - } - num1 = stack.pop(); - if (num1.type !== 'literal') { - return null; - } - n = num1.number; - if (n < 0 || (n|0) !== n || stack.length < n) { - return null; - } - ast1 = stack[stack.length - n - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - n - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'dup': - if (stack.length < 1) { - return null; - } - if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && - code[i + 3] === i + 7 && code[i + 4] === 'jz' && - code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) { - // special case of the commands sequence for the min operation - num1 = stack.pop(); - stack.push(buildMinOperation(num1, code[i + 1])); - i += 6; - break; - } - ast1 = stack[stack.length - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - // we don't have to save into intermediate variable a literal or - // variable. - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'roll': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - if (num2.type !== 'literal' || num1.type !== 'literal') { - // both roll operands must be numbers - return null; - } - j = num2.number; - n = num1.number; - if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) { - // ... and integers - return null; - } - j = ((j % n) + n) % n; - if (j === 0) { - break; // just skipping -- there are nothing to rotate - } - Array.prototype.push.apply(stack, - stack.splice(stack.length - n, n - j)); - break; - default: - return null; // unsupported operator - } - } - - if (stack.length !== outputSize) { - return null; - } - - var result = []; - instructions.forEach(function (instruction) { - var statementBuilder = new ExpressionBuilderVisitor(); - instruction.visit(statementBuilder); - result.push(statementBuilder.toString()); - }); - stack.forEach(function (expr, i) { - var statementBuilder = new ExpressionBuilderVisitor(); - expr.visit(statementBuilder); - var min = range[i * 2], max = range[i * 2 + 1]; - var out = [statementBuilder.toString()]; - if (min > expr.min) { - out.unshift('Math.max(', min, ', '); - out.push(')'); - } - if (max < expr.max) { - out.unshift('Math.min(', max, ', '); - out.push(')'); - } - out.unshift('dest[destOffset + ', i, '] = '); - out.push(';'); - result.push(out.join('')); - }); - return result.join('\n'); - } - }; - - return PostScriptCompiler; -})(); - - -var ColorSpace = (function ColorSpaceClosure() { - // Constructor should define this.numComps, this.defaultColor, this.name - function ColorSpace() { - error('should not call ColorSpace constructor'); - } - - ColorSpace.prototype = { - /** - * Converts the color value to the RGB color. The color components are - * located in the src array starting from the srcOffset. Returns the array - * of the rgb components, each value ranging from [0,255]. - */ - getRgb: function ColorSpace_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - /** - * Converts the color value to the RGB color, similar to the getRgb method. - * The result placed into the dest array starting from the destOffset. - */ - getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, - dest, destOffset) { - error('Should not call ColorSpace.getRgbItem'); - }, - /** - * Converts the specified number of the color values to the RGB colors. - * The colors are located in the src array starting from the srcOffset. - * The result is placed into the dest array starting from the destOffset. - * The src array items shall be in [0,2^bits) range, the dest array items - * will be in [0,255] range. alpha01 indicates how many alpha components - * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA - * array). - */ - getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - error('Should not call ColorSpace.getRgbBuffer'); - }, - /** - * Determines the number of bytes required to store the result of the - * conversion done by the getRgbBuffer method. As in getRgbBuffer, - * |alpha01| is either 0 (RGB output) or 1 (RGBA output). - */ - getOutputLength: function ColorSpace_getOutputLength(inputLength, - alpha01) { - error('Should not call ColorSpace.getOutputLength'); - }, - /** - * Returns true if source data will be equal the result/output data. - */ - isPassthrough: function ColorSpace_isPassthrough(bits) { - return false; - }, - /** - * Fills in the RGB colors in the destination buffer. alpha01 indicates - * how many alpha components there are in the dest array; it will be either - * 0 (RGB array) or 1 (RGBA array). - */ - fillRgb: function ColorSpace_fillRgb(dest, originalWidth, - originalHeight, width, height, - actualHeight, bpc, comps, alpha01) { - var count = originalWidth * originalHeight; - var rgbBuf = null; - var numComponentColors = 1 << bpc; - var needsResizing = originalHeight !== height || originalWidth !== width; - var i, ii; - - if (this.isPassthrough(bpc)) { - rgbBuf = comps; - } else if (this.numComps === 1 && count > numComponentColors && - this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') { - // Optimization: create a color map when there is just one component and - // we are converting more colors than the size of the color map. We - // don't build the map if the colorspace is gray or rgb since those - // methods are faster than building a map. This mainly offers big speed - // ups for indexed and alternate colorspaces. - // - // TODO it may be worth while to cache the color map. While running - // testing I never hit a cache so I will leave that out for now (perhaps - // we are reparsing colorspaces too much?). - var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : - new Uint16Array(numComponentColors); - var key; - for (i = 0; i < numComponentColors; i++) { - allColors[i] = i; - } - var colorMap = new Uint8Array(numComponentColors * 3); - this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, - /* alpha01 = */ 0); - - var destPos, rgbPos; - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - destPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - dest[destPos++] = colorMap[key]; - dest[destPos++] = colorMap[key + 1]; - dest[destPos++] = colorMap[key + 2]; - destPos += alpha01; - } - } else { - rgbBuf = new Uint8Array(count * 3); - rgbPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - rgbBuf[rgbPos++] = colorMap[key]; - rgbBuf[rgbPos++] = colorMap[key + 1]; - rgbBuf[rgbPos++] = colorMap[key + 2]; - } - } - } else { - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, - alpha01); - } else { - rgbBuf = new Uint8Array(count * 3); - this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, - /* alpha01 = */ 0); - } - } - - if (rgbBuf) { - if (needsResizing) { - PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width, - height, dest, alpha01); - } else { - rgbPos = 0; - destPos = 0; - for (i = 0, ii = width * actualHeight; i < ii; i++) { - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - destPos += alpha01; - } - } - } - }, - /** - * True if the colorspace has components in the default range of [0, 1]. - * This should be true for all colorspaces except for lab color spaces - * which are [0,100], [-128, 127], [-128, 127]. - */ - usesZeroToOneRange: true - }; - - ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { - var IR = ColorSpace.parseToIR(cs, xref, res); - if (IR instanceof AlternateCS) { - return IR; - } - return ColorSpace.fromIR(IR); - }; - - ColorSpace.fromIR = function ColorSpace_fromIR(IR) { - var name = isArray(IR) ? IR[0] : IR; - var whitePoint, blackPoint, gamma; - - switch (name) { - case 'DeviceGrayCS': - return this.singletons.gray; - case 'DeviceRgbCS': - return this.singletons.rgb; - case 'DeviceCmykCS': - return this.singletons.cmyk; - case 'CalGrayCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - gamma = IR[1].Gamma; - return new CalGrayCS(whitePoint, blackPoint, gamma); - case 'CalRGBCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - gamma = IR[1].Gamma; - var matrix = IR[1].Matrix; - return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); - case 'PatternCS': - var basePatternCS = IR[1]; - if (basePatternCS) { - basePatternCS = ColorSpace.fromIR(basePatternCS); - } - return new PatternCS(basePatternCS); - case 'IndexedCS': - var baseIndexedCS = IR[1]; - var hiVal = IR[2]; - var lookup = IR[3]; - return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); - case 'AlternateCS': - var numComps = IR[1]; - var alt = IR[2]; - var tintFnIR = IR[3]; - - return new AlternateCS(numComps, ColorSpace.fromIR(alt), - PDFFunction.fromIR(tintFnIR)); - case 'LabCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - var range = IR[1].Range; - return new LabCS(whitePoint, blackPoint, range); - default: - error('Unknown name ' + name); - } - return null; - }; - - ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { - if (isName(cs)) { - var colorSpaces = res.get('ColorSpace'); - if (isDict(colorSpaces)) { - var refcs = colorSpaces.get(cs.name); - if (refcs) { - cs = refcs; - } - } - } - - cs = xref.fetchIfRef(cs); - var mode; - - if (isName(cs)) { - mode = cs.name; - this.mode = mode; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'Pattern': - return ['PatternCS', null]; - default: - error('unrecognized colorspace ' + mode); - } - } else if (isArray(cs)) { - mode = xref.fetchIfRef(cs[0]).name; - this.mode = mode; - var numComps, params, alt; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'CalGray': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['CalGrayCS', params]; - case 'CalRGB': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['CalRGBCS', params]; - case 'ICCBased': - var stream = xref.fetchIfRef(cs[1]); - var dict = stream.dict; - numComps = dict.get('N'); - alt = dict.get('Alternate'); - if (alt) { - var altIR = ColorSpace.parseToIR(alt, xref, res); - // Parse the /Alternate CS to ensure that the number of components - // are correct, and also (indirectly) that it is not a PatternCS. - var altCS = ColorSpace.fromIR(altIR); - if (altCS.numComps === numComps) { - return altIR; - } - warn('ICCBased color space: Ignoring incorrect /Alternate entry.'); - } - if (numComps === 1) { - return 'DeviceGrayCS'; - } else if (numComps === 3) { - return 'DeviceRgbCS'; - } else if (numComps === 4) { - return 'DeviceCmykCS'; - } - break; - case 'Pattern': - var basePatternCS = cs[1] || null; - if (basePatternCS) { - basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); - } - return ['PatternCS', basePatternCS]; - case 'Indexed': - case 'I': - var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); - var hiVal = xref.fetchIfRef(cs[2]) + 1; - var lookup = xref.fetchIfRef(cs[3]); - if (isStream(lookup)) { - lookup = lookup.getBytes(); - } - return ['IndexedCS', baseIndexedCS, hiVal, lookup]; - case 'Separation': - case 'DeviceN': - var name = xref.fetchIfRef(cs[1]); - numComps = 1; - if (isName(name)) { - numComps = 1; - } else if (isArray(name)) { - numComps = name.length; - } - alt = ColorSpace.parseToIR(cs[2], xref, res); - var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); - return ['AlternateCS', numComps, alt, tintFnIR]; - case 'Lab': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['LabCS', params]; - default: - error('unimplemented color space object "' + mode + '"'); - } - } else { - error('unrecognized color space object: "' + cs + '"'); - } - return null; - }; - /** - * Checks if a decode map matches the default decode map for a color space. - * This handles the general decode maps where there are two values per - * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. - * This does not handle Lab, Indexed, or Pattern decode maps since they are - * slightly different. - * @param {Array} decode Decode map (usually from an image). - * @param {Number} n Number of components the color space has. - */ - ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { - if (!isArray(decode)) { - return true; - } - - if (n * 2 !== decode.length) { - warn('The decode map is not the correct length'); - return true; - } - for (var i = 0, ii = decode.length; i < ii; i += 2) { - if (decode[i] !== 0 || decode[i + 1] !== 1) { - return false; - } - } - return true; - }; - - ColorSpace.singletons = { - get gray() { - return shadow(this, 'gray', new DeviceGrayCS()); - }, - get rgb() { - return shadow(this, 'rgb', new DeviceRgbCS()); - }, - get cmyk() { - return shadow(this, 'cmyk', new DeviceCmykCS()); - } - }; - - return ColorSpace; -})(); - -/** - * Alternate color space handles both Separation and DeviceN color spaces. A - * Separation color space is actually just a DeviceN with one color component. - * Both color spaces use a tinting function to convert colors to a base color - * space. - */ -var AlternateCS = (function AlternateCSClosure() { - function AlternateCS(numComps, base, tintFn) { - this.name = 'Alternate'; - this.numComps = numComps; - this.defaultColor = new Float32Array(numComps); - for (var i = 0; i < numComps; ++i) { - this.defaultColor[i] = 1; - } - this.base = base; - this.tintFn = tintFn; - this.tmpBuf = new Float32Array(base.numComps); - } - - AlternateCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var tmpBuf = this.tmpBuf; - this.tintFn(src, srcOffset, tmpBuf, 0); - this.base.getRgbItem(tmpBuf, 0, dest, destOffset); - }, - getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var tintFn = this.tintFn; - var base = this.base; - var scale = 1 / ((1 << bits) - 1); - var baseNumComps = base.numComps; - var usesZeroToOneRange = base.usesZeroToOneRange; - var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && - alpha01 === 0; - var pos = isPassthrough ? destOffset : 0; - var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count); - var numComps = this.numComps; - - var scaled = new Float32Array(numComps); - var tinted = new Float32Array(baseNumComps); - var i, j; - if (usesZeroToOneRange) { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - for (j = 0; j < baseNumComps; j++) { - baseBuf[pos++] = tinted[j] * 255; - } - } - } else { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - base.getRgbItem(tinted, 0, baseBuf, pos); - pos += baseNumComps; - } - } - if (!isPassthrough) { - base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); - } - }, - getOutputLength: function AlternateCS_getOutputLength(inputLength, - alpha01) { - return this.base.getOutputLength(inputLength * - this.base.numComps / this.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return AlternateCS; -})(); - -var PatternCS = (function PatternCSClosure() { - function PatternCS(baseCS) { - this.name = 'Pattern'; - this.base = baseCS; - } - PatternCS.prototype = {}; - - return PatternCS; -})(); - -var IndexedCS = (function IndexedCSClosure() { - function IndexedCS(base, highVal, lookup) { - this.name = 'Indexed'; - this.numComps = 1; - this.defaultColor = new Uint8Array([0]); - this.base = base; - this.highVal = highVal; - - var baseNumComps = base.numComps; - var length = baseNumComps * highVal; - var lookupArray; - - if (isStream(lookup)) { - lookupArray = new Uint8Array(length); - var bytes = lookup.getBytes(length); - lookupArray.set(bytes); - } else if (isString(lookup)) { - lookupArray = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - lookupArray[i] = lookup.charCodeAt(i); - } - } else if (lookup instanceof Uint8Array || lookup instanceof Array) { - lookupArray = lookup; - } else { - error('Unrecognized lookup table: ' + lookup); - } - this.lookup = lookupArray; - } - - IndexedCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var numComps = this.base.numComps; - var start = src[srcOffset] * numComps; - this.base.getRgbItem(this.lookup, start, dest, destOffset); - }, - getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var base = this.base; - var numComps = base.numComps; - var outputDelta = base.getOutputLength(numComps, alpha01); - var lookup = this.lookup; - - for (var i = 0; i < count; ++i) { - var lookupPos = src[srcOffset++] * numComps; - base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); - destOffset += outputDelta; - } - }, - getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) { - return this.base.getOutputLength(inputLength * this.base.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { - // indexed color maps shouldn't be changed - return true; - }, - usesZeroToOneRange: true - }; - return IndexedCS; -})(); - -var DeviceGrayCS = (function DeviceGrayCSClosure() { - function DeviceGrayCS() { - this.name = 'DeviceGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - } - - DeviceGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var c = (src[srcOffset] * 255) | 0; - c = c < 0 ? 0 : c > 255 ? 255 : c; - dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; - }, - getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - var c = (scale * src[j++]) | 0; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; - q += alpha01; - } - }, - getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, - alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceGrayCS; -})(); - -var DeviceRgbCS = (function DeviceRgbCSClosure() { - function DeviceRgbCS() { - this.name = 'DeviceRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - } - DeviceRgbCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var r = (src[srcOffset] * 255) | 0; - var g = (src[srcOffset + 1] * 255) | 0; - var b = (src[srcOffset + 2] * 255) | 0; - dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r; - dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g; - dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b; - }, - getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - if (bits === 8 && alpha01 === 0) { - dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); - return; - } - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - q += alpha01; - } - }, - getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, - alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: function DeviceRgbCS_isPassthrough(bits) { - return bits === 8; - }, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceRgbCS; -})(); - -var DeviceCmykCS = (function DeviceCmykCSClosure() { - // The coefficients below was found using numerical analysis: the method of - // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors, - // where color_value is the tabular value from the table of sampled RGB colors - // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding - // CMYK color conversion using the estimation below: - // f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255 - function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { - var c = src[srcOffset + 0] * srcScale; - var m = src[srcOffset + 1] * srcScale; - var y = src[srcOffset + 2] * srcScale; - var k = src[srcOffset + 3] * srcScale; - - var r = - (c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k + - -285.2331026137004) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y + - -17.873870861415444 * k - 5.497006427196366) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 17.5119270841813) + - k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0; - var g = - (c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k + - -79.2970844816548) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 190.9453302588951) + - y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + - k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0; - var b = - (c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k + - -14.183576799673286) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 112.23884253719248) + - y * (0.03296041114873217 * y + 115.60384449646641 * k + - -193.58209356861505) + - k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0; - - dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r; - dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g; - dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b; - } - - function DeviceCmykCS() { - this.name = 'DeviceCMYK'; - this.numComps = 4; - this.defaultColor = new Float32Array([0, 0, 0, 1]); - } - DeviceCmykCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(src, srcOffset, 1, dest, destOffset); - }, - getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - for (var i = 0; i < count; i++) { - convertToRgb(src, srcOffset, scale, dest, destOffset); - srcOffset += 4; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, - alpha01) { - return (inputLength / 4 * (3 + alpha01)) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return DeviceCmykCS; -})(); - -// -// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245 -// -var CalGrayCS = (function CalGrayCSClosure() { - function CalGrayCS(whitePoint, blackPoint, gamma) { - this.name = 'CalGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalGray'); - } - blackPoint = blackPoint || [0, 0, 0]; - gamma = gamma || 1; - - // Translate arguments to spec variables. - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - this.G = gamma; - - // Validate variables as per spec. - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ', falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + - ', ZB: ' + this.ZB + ', only default values are supported.'); - } - - if (this.G < 1) { - info('Invalid Gamma: ' + this.G + ' for ' + this.name + - ', falling back to default'); - this.G = 1; - } - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A represents a gray component of a calibrated gray space. - // A <---> AG in the spec - var A = src[srcOffset] * scale; - var AG = Math.pow(A, cs.G); - - // Computes L as per spec. ( = cs.YW * AG ) - // Except if other than default BlackPoint values are used. - var L = cs.YW * AG; - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // Convert values to rgb range [0, 255]. - var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; - dest[destOffset] = val; - dest[destOffset + 1] = val; - dest[destOffset + 2] = val; - } - - CalGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 1; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalGrayCS; -})(); - -// -// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247 -// -var CalRGBCS = (function CalRGBCSClosure() { - - // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these - // matrices. - var BRADFORD_SCALE_MATRIX = new Float32Array([ - 0.8951, 0.2664, -0.1614, - -0.7502, 1.7135, 0.0367, - 0.0389, -0.0685, 1.0296]); - - var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ - 0.9869929, -0.1470543, 0.1599627, - 0.4323053, 0.5183603, 0.0492912, - -0.0085287, 0.0400428, 0.9684867]); - - // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html. - var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ - 3.2404542, -1.5371385, -0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434, -0.2040259, 1.0572252]); - - var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); - - var tempNormalizeMatrix = new Float32Array(3); - var tempConvertMatrix1 = new Float32Array(3); - var tempConvertMatrix2 = new Float32Array(3); - - var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0; - - function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { - this.name = 'CalRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array(3); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalRGB'); - } - blackPoint = blackPoint || new Float32Array(3); - gamma = gamma || new Float32Array([1, 1, 1]); - matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - - // Translate arguments to spec variables. - var XW = whitePoint[0]; - var YW = whitePoint[1]; - var ZW = whitePoint[2]; - this.whitePoint = whitePoint; - - var XB = blackPoint[0]; - var YB = blackPoint[1]; - var ZB = blackPoint[2]; - this.blackPoint = blackPoint; - - this.GR = gamma[0]; - this.GG = gamma[1]; - this.GB = gamma[2]; - - this.MXA = matrix[0]; - this.MYA = matrix[1]; - this.MZA = matrix[2]; - this.MXB = matrix[3]; - this.MYB = matrix[4]; - this.MZB = matrix[5]; - this.MXC = matrix[6]; - this.MYC = matrix[7]; - this.MZC = matrix[8]; - - // Validate variables as per spec. - if (XW < 0 || ZW < 0 || YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (XB < 0 || YB < 0 || ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + - ', ' + ZB + '], falling back to default'); - this.blackPoint = new Float32Array(3); - } - - if (this.GR < 0 || this.GG < 0 || this.GB < 0) { - info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + - '] for ' + this.name + ', falling back to default'); - this.GR = this.GG = this.GB = 1; - } - - if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || - this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || - this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { - info('Invalid Matrix for ' + this.name + ' [' + - this.MXA + ', ' + this.MYA + ', ' + this.MZA + - this.MXB + ', ' + this.MYB + ', ' + this.MZB + - this.MXC + ', ' + this.MYC + ', ' + this.MZC + - '], falling back to default'); - this.MXA = this.MYB = this.MZC = 1; - this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; - } - } - - function matrixProduct(a, b, result) { - result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; - result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; - } - - function convertToFlat(sourceWhitePoint, LMS, result) { - result[0] = LMS[0] * 1 / sourceWhitePoint[0]; - result[1] = LMS[1] * 1 / sourceWhitePoint[1]; - result[2] = LMS[2] * 1 / sourceWhitePoint[2]; - } - - function convertToD65(sourceWhitePoint, LMS, result) { - var D65X = 0.95047; - var D65Y = 1; - var D65Z = 1.08883; - - result[0] = LMS[0] * D65X / sourceWhitePoint[0]; - result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; - result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; - } - - function sRGBTransferFunction(color) { - // See http://en.wikipedia.org/wiki/SRGB. - if (color <= 0.0031308){ - return adjustToRange(0, 1, 12.92 * color); - } - - return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); - } - - function adjustToRange(min, max, value) { - return Math.max(min, Math.min(max, value)); - } - - function decodeL(L) { - if (L < 0) { - return -decodeL(-L); - } - - if (L > 8.0) { - return Math.pow(((L + 16) / 116), 3); - } - - return L * DECODE_L_CONSTANT; - } - - function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { - - // In case the blackPoint is already the default blackPoint then there is - // no need to do compensation. - if (sourceBlackPoint[0] === 0 && - sourceBlackPoint[1] === 0 && - sourceBlackPoint[2] === 0) { - result[0] = XYZ_Flat[0]; - result[1] = XYZ_Flat[1]; - result[2] = XYZ_Flat[2]; - return; - } - - // For the blackPoint calculation details, please see - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - // The destination blackPoint is the default blackPoint [0, 0, 0]. - var zeroDecodeL = decodeL(0); - - var X_DST = zeroDecodeL; - var X_SRC = decodeL(sourceBlackPoint[0]); - - var Y_DST = zeroDecodeL; - var Y_SRC = decodeL(sourceBlackPoint[1]); - - var Z_DST = zeroDecodeL; - var Z_SRC = decodeL(sourceBlackPoint[2]); - - var X_Scale = (1 - X_DST) / (1 - X_SRC); - var X_Offset = 1 - X_Scale; - - var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); - var Y_Offset = 1 - Y_Scale; - - var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); - var Z_Offset = 1 - Z_Scale; - - result[0] = XYZ_Flat[0] * X_Scale + X_Offset; - result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; - result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; - } - - function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { - - // In case the whitePoint is already flat then there is no need to do - // normalization. - if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { - result[0] = XYZ_In[0]; - result[1] = XYZ_In[1]; - result[2] = XYZ_In[2]; - return; - } - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_Flat = tempNormalizeMatrix; - convertToFlat(sourceWhitePoint, LMS, LMS_Flat); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); - } - - function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_D65 = tempNormalizeMatrix; - convertToD65(sourceWhitePoint, LMS, LMS_D65); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A, B and C represent a red, green and blue components of a calibrated - // rgb space. - var A = adjustToRange(0, 1, src[srcOffset] * scale); - var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); - var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); - - // A <---> AGR in the spec - // B <---> BGG in the spec - // C <---> CGB in the spec - var AGR = Math.pow(A, cs.GR); - var BGG = Math.pow(B, cs.GG); - var CGB = Math.pow(C, cs.GB); - - // Computes intermediate variables L, M, N as per spec. - // To decode X, Y, Z values map L, M, N directly to them. - var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; - var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; - var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; - - // The following calculations are based on this document: - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - var XYZ = tempConvertMatrix1; - XYZ[0] = X; - XYZ[1] = Y; - XYZ[2] = Z; - var XYZ_Flat = tempConvertMatrix2; - - normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); - - var XYZ_Black = tempConvertMatrix1; - compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); - - var XYZ_D65 = tempConvertMatrix2; - normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); - - var SRGB = tempConvertMatrix1; - matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); - - var sR = sRGBTransferFunction(SRGB[0]); - var sG = sRGBTransferFunction(SRGB[1]); - var sB = sRGBTransferFunction(SRGB[2]); - - // Convert the values to rgb range [0, 255]. - dest[destOffset] = Math.round(sR * 255); - dest[destOffset + 1] = Math.round(sG * 255); - dest[destOffset + 2] = Math.round(sB * 255); - } - - CalRGBCS.prototype = { - getRgb: function CalRGBCS_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalRGBCS; -})(); - -// -// LabCS: Based on "PDF Reference, Sixth Ed", p.250 -// -var LabCS = (function LabCSClosure() { - function LabCS(whitePoint, blackPoint, range) { - this.name = 'Lab'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space Lab'); - } - blackPoint = blackPoint || [0, 0, 0]; - range = range || [-100, 100, -100, 100]; - - // Translate args to spec variables - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - this.amin = range[0]; - this.amax = range[1]; - this.bmin = range[2]; - this.bmax = range[3]; - - // These are here just for completeness - the spec doesn't offer any - // formulas that use BlackPoint in Lab - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - // Validate vars as per spec - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components, no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.amin > this.amax || this.bmin > this.bmax) { - info('Invalid Range, falling back to defaults'); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - } - - // Function g(x) from spec - function fn_g(x) { - if (x >= 6 / 29) { - return x * x * x; - } else { - return (108 / 841) * (x - 4 / 29); - } - } - - function decode(value, high1, low2, high2) { - return low2 + (value) * (high2 - low2) / (high1); - } - - // If decoding is needed maxVal should be 2^bits per component - 1. - function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { - // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax] - // not the usual [0, 1]. If a command like setFillColor is used the src - // values will already be within the correct range. However, if we are - // converting an image we have to map the values to the correct range given - // above. - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = src[srcOffset]; - var as = src[srcOffset + 1]; - var bs = src[srcOffset + 2]; - if (maxVal !== false) { - Ls = decode(Ls, maxVal, 0, 100); - as = decode(as, maxVal, cs.amin, cs.amax); - bs = decode(bs, maxVal, cs.bmin, cs.bmax); - } - - // Adjust limits of 'as' and 'bs' - as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; - bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; - - // Computes intermediate variables X,Y,Z as per spec - var M = (Ls + 16) / 116; - var L = M + (as / 500); - var N = M - (bs / 200); - - var X = cs.XW * fn_g(L); - var Y = cs.YW * fn_g(M); - var Z = cs.ZW * fn_g(N); - - var r, g, b; - // Using different conversions for D50 and D65 white points, - // per http://www.color.org/srgb.pdf - if (cs.ZW < 1) { - // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249) - r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; - g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; - b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; - } else { - // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888) - r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; - g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; - b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; - } - // clamp color values to [0,1] range then convert to [0,255] range. - dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; - dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; - dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; - } - - LabCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { - convertToRgb(this, src, srcOffset, false, dest, destOffset); - }, - getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var maxVal = (1 << bits) - 1; - for (var i = 0; i < count; i++) { - convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // XXX: Decoding is handled with the lab conversion because of the strange - // ranges that are used. - return true; - }, - usesZeroToOneRange: false - }; - return LabCS; -})(); - - -var ARCFourCipher = (function ARCFourCipherClosure() { - function ARCFourCipher(key) { - this.a = 0; - this.b = 0; - var s = new Uint8Array(256); - var i, j = 0, tmp, keyLength = key.length; - for (i = 0; i < 256; ++i) { - s[i] = i; - } - for (i = 0; i < 256; ++i) { - tmp = s[i]; - j = (j + tmp + key[i % keyLength]) & 0xFF; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - - ARCFourCipher.prototype = { - encryptBlock: function ARCFourCipher_encryptBlock(data) { - var i, n = data.length, tmp, tmp2; - var a = this.a, b = this.b, s = this.s; - var output = new Uint8Array(n); - for (i = 0; i < n; ++i) { - a = (a + 1) & 0xFF; - tmp = s[a]; - b = (b + tmp) & 0xFF; - tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; - } - this.a = a; - this.b = b; - return output; - } - }; - ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; - - return ARCFourCipher; -})(); - -var calculateMD5 = (function calculateMD5Closure() { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551]); - - function hash(data, offset, length) { - var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, b = h1, c = h2, d = h3, f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - - return hash; -})(); -var Word64 = (function Word64Closure() { - function Word64(highInteger, lowInteger) { - this.high = highInteger | 0; - this.low = lowInteger | 0; - } - Word64.prototype = { - and: function Word64_and(word) { - this.high &= word.high; - this.low &= word.low; - }, - xor: function Word64_xor(word) { - this.high ^= word.high; - this.low ^= word.low; - }, - - or: function Word64_or(word) { - this.high |= word.high; - this.low |= word.low; - }, - - shiftRight: function Word64_shiftRight(places) { - if (places >= 32) { - this.low = (this.high >>> (places - 32)) | 0; - this.high = 0; - } else { - this.low = (this.low >>> places) | (this.high << (32 - places)); - this.high = (this.high >>> places) | 0; - } - }, - - shiftLeft: function Word64_shiftLeft(places) { - if (places >= 32) { - this.high = this.low << (places - 32); - this.low = 0; - } else { - this.high = (this.high << places) | (this.low >>> (32 - places)); - this.low = this.low << places; - } - }, - - rotateRight: function Word64_rotateRight(places) { - var low, high; - if (places & 32) { - high = this.low; - low = this.high; - } else { - low = this.low; - high = this.high; - } - places &= 31; - this.low = (low >>> places) | (high << (32 - places)); - this.high = (high >>> places) | (low << (32 - places)); - }, - - not: function Word64_not() { - this.high = ~this.high; - this.low = ~this.low; - }, - - add: function Word64_add(word) { - var lowAdd = (this.low >>> 0) + (word.low >>> 0); - var highAdd = (this.high >>> 0) + (word.high >>> 0); - if (lowAdd > 0xFFFFFFFF) { - highAdd += 1; - } - this.low = lowAdd | 0; - this.high = highAdd | 0; - }, - - copyTo: function Word64_copyTo(bytes, offset) { - bytes[offset] = (this.high >>> 24) & 0xFF; - bytes[offset + 1] = (this.high >> 16) & 0xFF; - bytes[offset + 2] = (this.high >> 8) & 0xFF; - bytes[offset + 3] = this.high & 0xFF; - bytes[offset + 4] = (this.low >>> 24) & 0xFF; - bytes[offset + 5] = (this.low >> 16) & 0xFF; - bytes[offset + 6] = (this.low >> 8) & 0xFF; - bytes[offset + 7] = this.low & 0xFF; - }, - - assign: function Word64_assign(word) { - this.high = word.high; - this.low = word.low; - } - }; - return Word64; -})(); - -var calculateSHA256 = (function calculateSHA256Closure() { - function rotr(x, n) { - return (x >>> n) | (x << 32 - n); - } - - function ch(x, y, z) { - return (x & y) ^ (~x & z); - } - - function maj(x, y, z) { - return (x & y) ^ (x & z) ^ (y & z); - } - - function sigma(x) { - return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); - } - - function sigmaPrime(x) { - return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); - } - - function littleSigma(x) { - return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; - } - - function littleSigmaPrime(x) { - return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; - } - - var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; - - function hash(data, offset, length) { - // initial hash values - var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, - h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, - h6 = 0x1f83d9ab, h7 = 0x5be0cd19; - // pre-processing - var paddedLength = Math.ceil((length + 9) / 64) * 64; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - var w = new Uint32Array(64); - // for each 512 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j] = (padded[i] << 24 | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3])); - i += 4; - } - - for (j = 16; j < 64; ++j) { - w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + - littleSigma(w[j - 15]) + w[j - 16] | 0; - } - var a = h0, b = h1, c = h2, d = h3, e = h4, - f = h5, g = h6, h = h7, t1, t2; - for (j = 0; j < 64; ++j) { - t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; - t2 = sigma(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - h4 = (h4 + e) | 0; - h5 = (h5 + f) | 0; - h6 = (h6 + g) | 0; - h7 = (h7 + h) | 0; - } - return new Uint8Array([ - (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF, - (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF, - (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF, - (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF, - (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF, - (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF, - (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF, - (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF - ]); - } - - return hash; -})(); - -var calculateSHA512 = (function calculateSHA512Closure() { - function ch(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.not(); - tmp.and(z); - result.xor(tmp); - } - - function maj(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.and(z); - result.xor(tmp); - tmp.assign(y); - tmp.and(z); - result.xor(tmp); - } - - function sigma(result, x, tmp) { - result.assign(x); - result.rotateRight(28); - tmp.assign(x); - tmp.rotateRight(34); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(39); - result.xor(tmp); - } - - function sigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(14); - tmp.assign(x); - tmp.rotateRight(18); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(41); - result.xor(tmp); - } - - function littleSigma(result, x, tmp) { - result.assign(x); - result.rotateRight(1); - tmp.assign(x); - tmp.rotateRight(8); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(7); - result.xor(tmp); - } - - function littleSigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(19); - tmp.assign(x); - tmp.rotateRight(61); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(6); - result.xor(tmp); - } - - var k = [ - new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), - new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), - new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), - new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), - new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), - new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), - new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), - new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), - new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), - new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), - new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), - new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), - new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), - new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), - new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), - new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), - new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), - new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), - new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), - new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), - new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), - new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), - new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), - new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), - new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), - new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), - new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), - new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), - new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), - new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), - new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), - new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), - new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), - new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), - new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), - new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), - new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), - new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), - new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), - new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; - - function hash(data, offset, length, mode384) { - mode384 = !!mode384; - // initial hash values - var h0, h1, h2, h3, h4, h5, h6, h7; - if (!mode384) { - h0 = new Word64(0x6a09e667, 0xf3bcc908); - h1 = new Word64(0xbb67ae85, 0x84caa73b); - h2 = new Word64(0x3c6ef372, 0xfe94f82b); - h3 = new Word64(0xa54ff53a, 0x5f1d36f1); - h4 = new Word64(0x510e527f, 0xade682d1); - h5 = new Word64(0x9b05688c, 0x2b3e6c1f); - h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); - h7 = new Word64(0x5be0cd19, 0x137e2179); - } - else { - // SHA384 is exactly the same - // except with different starting values and a trimmed result - h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); - h1 = new Word64(0x629a292a, 0x367cd507); - h2 = new Word64(0x9159015a, 0x3070dd17); - h3 = new Word64(0x152fecd8, 0xf70e5939); - h4 = new Word64(0x67332667, 0xffc00b31); - h5 = new Word64(0x8eb44a87, 0x68581511); - h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); - h7 = new Word64(0x47b5481d, 0xbefa4fa4); - } - - // pre-processing - var paddedLength = Math.ceil((length + 17) / 128) * 128; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 16; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - - var w = new Array(80); - for (i = 0; i < 80; i++) { - w[i] = new Word64(0, 0); - } - var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0); - var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0); - var g = new Word64(0, 0), h = new Word64(0, 0); - var t1 = new Word64(0, 0), t2 = new Word64(0, 0); - var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3; - - // for each 1024 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3]); - w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 | - (padded[i + 6]) << 8 | (padded[i + 7]); - i += 8; - } - for (j = 16; j < 80; ++j) { - tmp3 = w[j]; - littleSigmaPrime(tmp3, w[j - 2], tmp2); - tmp3.add(w[j - 7]); - littleSigma(tmp1, w[j - 15], tmp2); - tmp3.add(tmp1); - tmp3.add(w[j - 16]); - } - - a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3); - e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7); - for (j = 0; j < 80; ++j) { - t1.assign(h); - sigmaPrime(tmp1, e, tmp2); - t1.add(tmp1); - ch(tmp1, e, f, g, tmp2); - t1.add(tmp1); - t1.add(k[j]); - t1.add(w[j]); - - sigma(t2, a, tmp2); - maj(tmp1, a, b, c, tmp2); - t2.add(tmp1); - - tmp3 = h; - h = g; - g = f; - f = e; - d.add(t1); - e = d; - d = c; - c = b; - b = a; - tmp3.assign(t1); - tmp3.add(t2); - a = tmp3; - } - h0.add(a); - h1.add(b); - h2.add(c); - h3.add(d); - h4.add(e); - h5.add(f); - h6.add(g); - h7.add(h); - } - - var result; - if (!mode384) { - result = new Uint8Array(64); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - h6.copyTo(result,48); - h7.copyTo(result,56); - } - else { - result = new Uint8Array(48); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - } - return result; - } - - return hash; -})(); -var calculateSHA384 = (function calculateSHA384Closure() { - function hash(data, offset, length) { - return calculateSHA512(data, offset, length, true); - } - - return hash; -})(); -var NullCipher = (function NullCipherClosure() { - function NullCipher() { - } - - NullCipher.prototype = { - decryptBlock: function NullCipher_decryptBlock(data) { - return data; - } - }; - - return NullCipher; -})(); - -var AES128Cipher = (function AES128CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey128(cipherKey) { - var b = 176, result = new Uint8Array(b); - result.set(cipherKey); - for (var j = 16, i = 1; j < b; ++i) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ rcon[i]; - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 16]); - j++; - result[j] = (t2 ^= result[j - 16]); - j++; - result[j] = (t3 ^= result[j - 16]); - j++; - result[j] = (t4 ^= result[j - 16]); - j++; - } - } - return result; - } - - function decrypt128(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 9; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt128(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 10; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - return state; - } - - function AES128Cipher(key) { - this.key = expandKey128(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt128(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - - AES128Cipher.prototype = { - decryptBlock: function AES128Cipher_decryptBlock(data, finalize) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // waiting for IV values -- they are at the start of the stream - for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - // need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data.subarray(16), finalize); - }, - encrypt: function AES128Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt128(buffer, this.key); - iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES128Cipher; -})(); - -var AES256Cipher = (function AES256CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey256(cipherKey) { - var b = 240, result = new Uint8Array(b); - var r = 1; - - result.set(cipherKey); - for (var j = 32, i = 1; j < b; ++i) { - if (j % 32 === 16) { - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - } else if (j % 32 === 0) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ r; - if ((r <<= 1) >= 256) { - r = (r ^ 0x1b) & 0xFF; - } - } - - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 32]); - j++; - result[j] = (t2 ^= result[j - 32]); - j++; - result[j] = (t3 ^= result[j - 32]); - j++; - result[j] = (t4 ^= result[j - 32]); - j++; - } - } - return result; - } - - function decrypt256(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 13; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt256(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 14; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - - return state; - - } - - function AES256Cipher(key) { - this.key = expandKey256(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt256(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - - } - - AES256Cipher.prototype = { - decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // if not supplied an IV wait for IV values - // they are at the start of the stream - if (iv) { - this.iv = iv; - } else { - for (i = 0; bufferLength < 16 && - i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - //need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - data = data.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data, finalize); - }, - encrypt: function AES256Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt256(buffer, this.key); - this.iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES256Cipher; -})(); - -var PDF17 = (function PDF17Closure() { - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - function PDF17() { - } - - PDF17.prototype = { - checkOwnerPassword: function PDF17_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF17_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF17_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF17; -})(); - -var PDF20 = (function PDF20Closure() { - - function concatArrays(array1, array2) { - var t = new Uint8Array(array1.length + array2.length); - t.set(array1, 0); - t.set(array2, array1.length); - return t; - } - - function calculatePDF20Hash(password, input, userBytes) { - //This refers to Algorithm 2.B as defined in ISO 32000-2 - var k = calculateSHA256(input, 0, input.length).subarray(0, 32); - var e = [0]; - var i = 0; - while (i < 64 || e[e.length - 1] > i - 32) { - var arrayLength = password.length + k.length + userBytes.length; - - var k1 = new Uint8Array(arrayLength * 64); - var array = concatArrays(password, k); - array = concatArrays(array, userBytes); - for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) { - k1.set(array, pos); - } - //AES128 CBC NO PADDING with - //first 16 bytes of k as the key and the second 16 as the iv. - var cipher = new AES128Cipher(k.subarray(0, 16)); - e = cipher.encrypt(k1, k.subarray(16, 32)); - //Now we have to take the first 16 bytes of an unsigned - //big endian integer... and compute the remainder - //modulo 3.... That is a fairly large number and - //JavaScript isn't going to handle that well... - //So we're using a trick that allows us to perform - //modulo math byte by byte - var remainder = 0; - for (var z = 0; z < 16; z++) { - remainder *= (256 % 3); - remainder %= 3; - remainder += ((e[z] >>> 0) % 3); - remainder %= 3; - } - if (remainder === 0) { - k = calculateSHA256(e, 0, e.length); - } - else if (remainder === 1) { - k = calculateSHA384(e, 0, e.length); - } - else if (remainder === 2) { - k = calculateSHA512(e, 0, e.length); - } - i++; - } - return k.subarray(0, 32); - } - - function PDF20() { - } - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - PDF20.prototype = { - hash: function PDF20_hash(password, concatBytes, userBytes) { - return calculatePDF20Hash(password, concatBytes, userBytes); - }, - checkOwnerPassword: function PDF20_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculatePDF20Hash(password, hashData, userBytes); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF20_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculatePDF20Hash(password, hashData, []); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculatePDF20Hash(password, hashData, userBytes); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF20_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculatePDF20Hash(password, hashData, []); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF20; -})(); - -var CipherTransform = (function CipherTransformClosure() { - function CipherTransform(stringCipherConstructor, streamCipherConstructor) { - this.stringCipherConstructor = stringCipherConstructor; - this.streamCipherConstructor = streamCipherConstructor; - } - - CipherTransform.prototype = { - createStream: function CipherTransform_createStream(stream, length) { - var cipher = new this.streamCipherConstructor(); - return new DecryptStream(stream, length, - function cipherTransformDecryptStream(data, finalize) { - return cipher.decryptBlock(data, finalize); - } - ); - }, - decryptString: function CipherTransform_decryptString(s) { - var cipher = new this.stringCipherConstructor(); - var data = stringToBytes(s); - data = cipher.decryptBlock(data, true); - return bytesToString(data); - } - }; - return CipherTransform; -})(); - -var CipherTransformFactory = (function CipherTransformFactoryClosure() { - var defaultPasswordBytes = new Uint8Array([ - 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, - 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, - 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, - 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); - - function createEncryptionKey20(revision, password, ownerPassword, - ownerValidationSalt, ownerKeySalt, uBytes, - userPassword, userValidationSalt, userKeySalt, - ownerEncryption, userEncryption, perms) { - if (password) { - var passwordLength = Math.min(127, password.length); - password = password.subarray(0, passwordLength); - } else { - password = []; - } - var pdfAlgorithm; - if (revision === 6) { - pdfAlgorithm = new PDF20(); - } else { - pdfAlgorithm = new PDF17(); - } - - if (pdfAlgorithm) { - if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, - userPassword)) { - return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); - } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, - ownerValidationSalt, - uBytes, - ownerPassword)) { - return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, - ownerEncryption); - } - } - - return null; - } - - function prepareKeyData(fileId, password, ownerPassword, userPassword, - flags, revision, keyLength, encryptMetadata) { - var hashDataSize = 40 + ownerPassword.length + fileId.length; - var hashData = new Uint8Array(hashDataSize), i = 0, j, n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - // as now the padded password in the hashData[0..i] - for (j = 0, n = ownerPassword.length; j < n; ++j) { - hashData[i++] = ownerPassword[j]; - } - hashData[i++] = flags & 0xFF; - hashData[i++] = (flags >> 8) & 0xFF; - hashData[i++] = (flags >> 16) & 0xFF; - hashData[i++] = (flags >>> 24) & 0xFF; - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - if (revision >= 4 && !encryptMetadata) { - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } - } - var encryptionKey = hash.subarray(0, keyLengthInBytes); - var cipher, checkData; - - if (revision >= 3) { - for (i = 0; i < 32; ++i) { - hashData[i] = defaultPasswordBytes[i]; - } - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - var derivedKey = new Uint8Array(n), k; - for (j = 1; j <= 19; ++j) { - for (k = 0; k < n; ++k) { - derivedKey[k] = encryptionKey[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(defaultPasswordBytes); - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } - return encryptionKey; - } - - function decodeUserPassword(password, ownerPassword, revision, keyLength) { - var hashData = new Uint8Array(32), i = 0, j, n; - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); - } - } - - var cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - var derivedKey = new Uint8Array(keyLengthInBytes), k; - for (j = 19; j >= 0; j--) { - for (k = 0; k < keyLengthInBytes; ++k) { - derivedKey[k] = hash[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); - } - } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); - } - return userPassword; - } - - var identityName = Name.get('Identity'); - - function CipherTransformFactory(dict, fileId, password) { - var filter = dict.get('Filter'); - if (!isName(filter) || filter.name !== 'Standard') { - error('unknown encryption method'); - } - this.dict = dict; - var algorithm = dict.get('V'); - if (!isInt(algorithm) || - (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && - algorithm !== 5)) { - error('unsupported encryption algorithm'); - } - this.algorithm = algorithm; - var keyLength = dict.get('Length') || 40; - if (!isInt(keyLength) || - keyLength < 40 || (keyLength % 8) !== 0) { - error('invalid key length'); - } - - // prepare keys - var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32); - var userPassword = stringToBytes(dict.get('U')).subarray(0, 32); - var flags = dict.get('P'); - var revision = dict.get('R'); - // meaningful when V is 4 or 5 - var encryptMetadata = ((algorithm === 4 || algorithm === 5) && - dict.get('EncryptMetadata') !== false); - this.encryptMetadata = encryptMetadata; - - var fileIdBytes = stringToBytes(fileId); - var passwordBytes; - if (password) { - if (revision === 6) { - try { - password = utf8StringToString(password); - } catch (ex) { - warn('CipherTransformFactory: ' + - 'Unable to convert UTF8 encoded password.'); - } - } - passwordBytes = stringToBytes(password); - } - - var encryptionKey; - if (algorithm !== 5) { - encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - else { - var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40); - var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48); - var uBytes = stringToBytes(dict.get('U')).subarray(0, 48); - var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40); - var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48); - var ownerEncryption = stringToBytes(dict.get('OE')); - var userEncryption = stringToBytes(dict.get('UE')); - var perms = stringToBytes(dict.get('Perms')); - encryptionKey = - createEncryptionKey20(revision, passwordBytes, - ownerPassword, ownerValidationSalt, - ownerKeySalt, uBytes, - userPassword, userValidationSalt, - userKeySalt, ownerEncryption, - userEncryption, perms); - } - if (!encryptionKey && !password) { - throw new PasswordException('No password given', - PasswordResponses.NEED_PASSWORD); - } else if (!encryptionKey && password) { - // Attempting use the password as an owner password - var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, - revision, keyLength); - encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - - if (!encryptionKey) { - throw new PasswordException('Incorrect Password', - PasswordResponses.INCORRECT_PASSWORD); - } - - this.encryptionKey = encryptionKey; - - if (algorithm >= 4) { - this.cf = dict.get('CF'); - this.stmf = dict.get('StmF') || identityName; - this.strf = dict.get('StrF') || identityName; - this.eff = dict.get('EFF') || this.stmf; - } - } - - function buildObjectKey(num, gen, encryptionKey, isAes) { - var key = new Uint8Array(encryptionKey.length + 9), i, n; - for (i = 0, n = encryptionKey.length; i < n; ++i) { - key[i] = encryptionKey[i]; - } - key[i++] = num & 0xFF; - key[i++] = (num >> 8) & 0xFF; - key[i++] = (num >> 16) & 0xFF; - key[i++] = gen & 0xFF; - key[i++] = (gen >> 8) & 0xFF; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6C; - key[i++] = 0x54; - } - var hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); - } - - function buildCipherConstructor(cf, name, num, gen, key) { - var cryptFilter = cf.get(name.name); - var cfm; - if (cryptFilter !== null && cryptFilter !== undefined) { - cfm = cryptFilter.get('CFM'); - } - if (!cfm || cfm.name === 'None') { - return function cipherTransformFactoryBuildCipherConstructorNone() { - return new NullCipher(); - }; - } - if ('V2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorV2() { - return new ARCFourCipher(buildObjectKey(num, gen, key, false)); - }; - } - if ('AESV2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV2() { - return new AES128Cipher(buildObjectKey(num, gen, key, true)); - }; - } - if ('AESV3' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV3() { - return new AES256Cipher(key); - }; - } - error('Unknown crypto method'); - } - - CipherTransformFactory.prototype = { - createCipherTransform: - function CipherTransformFactory_createCipherTransform(num, gen) { - if (this.algorithm === 4 || this.algorithm === 5) { - return new CipherTransform( - buildCipherConstructor(this.cf, this.stmf, - num, gen, this.encryptionKey), - buildCipherConstructor(this.cf, this.strf, - num, gen, this.encryptionKey)); - } - // algorithms 1 and 2 - var key = buildObjectKey(num, gen, this.encryptionKey, false); - var cipherConstructor = function buildCipherCipherConstructor() { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); - } - }; - - return CipherTransformFactory; -})(); - - -var ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; - -var Pattern = (function PatternClosure() { - // Constructor should define this.getPattern - function Pattern() { - error('should not call Pattern constructor'); - } - - Pattern.prototype = { - // Input: current Canvas context - // Output: the appropriate fillStyle or strokeStyle - getPattern: function Pattern_getPattern(ctx) { - error('Should not call Pattern.getStyle: ' + ctx); - } - }; - - Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, - res, handler) { - - var dict = isStream(shading) ? shading.dict : shading; - var type = dict.get('ShadingType'); - - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - // Both radial and axial shadings are handled by RadialAxial shading. - return new Shadings.RadialAxial(dict, matrix, xref, res); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new Shadings.Mesh(shading, matrix, xref, res); - default: - throw new Error('Unsupported ShadingType: ' + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.shadingPattern}); - warn(ex); - return new Shadings.Dummy(); - } - }; - return Pattern; -})(); - -var Shadings = {}; - -// A small number to offset the first/last color stops so we can insert ones to -// support extend. Number.MIN_VALUE appears to be too small and breaks the -// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number -// internally so we have to go bigger. -Shadings.SMALL_NUMBER = 1e-2; - -// Radial and axial shading have very similar implementations -// If needed, the implementations can be broken into two classes -Shadings.RadialAxial = (function RadialAxialClosure() { - function RadialAxial(dict, matrix, xref, res) { - this.matrix = matrix; - this.coordsArr = dict.get('Coords'); - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - - var t0 = 0.0, t1 = 1.0; - if (dict.has('Domain')) { - var domainArr = dict.get('Domain'); - t0 = domainArr[0]; - t1 = domainArr[1]; - } - - var extendStart = false, extendEnd = false; - if (dict.has('Extend')) { - var extendArr = dict.get('Extend'); - extendStart = extendArr[0]; - extendEnd = extendArr[1]; - } - - if (this.shadingType === ShadingType.RADIAL && - (!extendStart || !extendEnd)) { - // Radial gradient only currently works if either circle is fully within - // the other circle. - var x1 = this.coordsArr[0]; - var y1 = this.coordsArr[1]; - var r1 = this.coordsArr[2]; - var x2 = this.coordsArr[3]; - var y2 = this.coordsArr[4]; - var r2 = this.coordsArr[5]; - var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - if (r1 <= r2 + distance && - r2 <= r1 + distance) { - warn('Unsupported radial gradient.'); - } - } - - this.extendStart = extendStart; - this.extendEnd = extendEnd; - - var fnObj = dict.get('Function'); - var fn = PDFFunction.parseArray(xref, fnObj); - - // 10 samples seems good enough for now, but probably won't work - // if there are sharp color changes. Ideally, we would implement - // the spec faithfully and add lossless optimizations. - var diff = t1 - t0; - var step = diff / 10; - - var colorStops = this.colorStops = []; - - // Protect against bad domains so we don't end up in an infinte loop below. - if (t0 >= t1 || step <= 0) { - // Acrobat doesn't seem to handle these cases so we'll ignore for - // now. - info('Bad shading domain.'); - return; - } - - var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); - var rgbColor; - for (var i = t0; i <= t1; i += step) { - ratio[0] = i; - fn(ratio, 0, color, 0); - rgbColor = cs.getRgb(color, 0); - var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - colorStops.push([(i - t0) / diff, cssColor]); - } - - var background = 'transparent'; - if (dict.has('Background')) { - rgbColor = cs.getRgb(dict.get('Background'), 0); - background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - } - - if (!extendStart) { - // Insert a color stop at the front and offset the first real color stop - // so it doesn't conflict with the one we insert. - colorStops.unshift([0, background]); - colorStops[1][0] += Shadings.SMALL_NUMBER; - } - if (!extendEnd) { - // Same idea as above in extendStart but for the end. - colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; - colorStops.push([1, background]); - } - - this.colorStops = colorStops; - } - - RadialAxial.prototype = { - getIR: function RadialAxial_getIR() { - var coordsArr = this.coordsArr; - var shadingType = this.shadingType; - var type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = 'axial'; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = 'radial'; - } else { - error('getPattern type unknown: ' + shadingType); - } - - var matrix = this.matrix; - if (matrix) { - p0 = Util.applyTransform(p0, matrix); - p1 = Util.applyTransform(p1, matrix); - if (shadingType === ShadingType.RADIAL) { - var scale = Util.singularValueDecompose2dScale(matrix); - r0 *= scale[0]; - r1 *= scale[1]; - } - } - - return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; - } - }; - - return RadialAxial; -})(); - -// All mesh shading. For now, they will be presented as set of the triangles -// to be drawn on the canvas and rgb color for each vertex. -Shadings.Mesh = (function MeshClosure() { - function MeshStreamReader(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - - var numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - var csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : - this.tmpCompsBuf; - } - MeshStreamReader.prototype = { - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - var nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - }, - readBits: function MeshStreamReader_readBits(n) { - var buffer = this.buffer; - var bufferLength = this.bufferLength; - if (n === 32) { - if (bufferLength === 0) { - return ((this.stream.getByte() << 24) | - (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | - this.stream.getByte()) >>> 0; - } - buffer = (buffer << 24) | (this.stream.getByte() << 16) | - (this.stream.getByte() << 8) | this.stream.getByte(); - var nextByte = this.stream.getByte(); - this.buffer = nextByte & ((1 << bufferLength) - 1); - return ((buffer << (8 - bufferLength)) | - ((nextByte & 0xFF) >> bufferLength)) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return this.stream.getByte(); - } - while (bufferLength < n) { - buffer = (buffer << 8) | this.stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & ((1 << bufferLength) - 1); - return buffer >> bufferLength; - }, - align: function MeshStreamReader_align() { - this.buffer = 0; - this.bufferLength = 0; - }, - readFlag: function MeshStreamReader_readFlag() { - return this.readBits(this.context.bitsPerFlag); - }, - readCoordinate: function MeshStreamReader_readCoordinate() { - var bitsPerCoordinate = this.context.bitsPerCoordinate; - var xi = this.readBits(bitsPerCoordinate); - var yi = this.readBits(bitsPerCoordinate); - var decode = this.context.decode; - var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - return [ - xi * scale * (decode[1] - decode[0]) + decode[0], - yi * scale * (decode[3] - decode[2]) + decode[2] - ]; - }, - readComponents: function MeshStreamReader_readComponents() { - var numComps = this.context.numComps; - var bitsPerComponent = this.context.bitsPerComponent; - var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - var decode = this.context.decode; - var components = this.tmpCompsBuf; - for (var i = 0, j = 4; i < numComps; i++, j += 2) { - var ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - var color = this.tmpCsCompsBuf; - if (this.context.colorFn) { - this.context.colorFn(components, 0, color, 0); - } - return this.context.colorSpace.getRgb(color, 0); - } - }; - - function decodeType4Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var operators = []; - var ps = []; // not maintaining cs since that will match ps - var verticesLeft = 0; // assuming we have all data to start a new triangle - while (reader.hasData) { - var f = reader.readFlag(); - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - if (verticesLeft === 0) { // ignoring flags if we started a triangle - assert(0 <= f && f <= 2, 'Unknown type4 flag'); - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps[ps.length - 2], ps[ps.length - 1]); - verticesLeft = 1; - break; - case 2: - ps.push(ps[ps.length - 3], ps[ps.length - 1]); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - - reader.align(); - } - mesh.figures.push({ - type: 'triangles', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - }); - } - - function decodeType5Shading(mesh, reader, verticesPerRow) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = []; // not maintaining cs since that will match ps - while (reader.hasData) { - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - mesh.figures.push({ - type: 'lattice', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow: verticesPerRow - }); - } - - var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - - var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds - - var getB = (function getBClosure() { - function buildB(count) { - var lut = []; - for (var i = 0; i <= count; i++) { - var t = i / count, t_ = 1 - t; - lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, - 3 * t * t * t_, t * t * t])); - } - return lut; - } - var cache = []; - return function getB(count) { - if (!cache[count]) { - cache[count] = buildB(count); - } - return cache[count]; - }; - })(); - - function buildFigureFromPatch(mesh, index) { - var figure = mesh.figures[index]; - assert(figure.type === 'patch', 'Unexpected patch mesh figure'); - - var coords = mesh.coords, colors = mesh.colors; - var pi = figure.coords; - var ci = figure.colors; - - var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / - (mesh.bounds[2] - mesh.bounds[0])); - splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); - var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / - (mesh.bounds[3] - mesh.bounds[1])); - splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); - - var verticesPerRow = splitXBy + 1; - var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - var k = 0; - var cl = new Uint8Array(3), cr = new Uint8Array(3); - var c0 = colors[ci[0]], c1 = colors[ci[1]], - c2 = colors[ci[2]], c3 = colors[ci[3]]; - var bRow = getB(splitYBy), bCol = getB(splitXBy); - for (var row = 0; row <= splitYBy; row++) { - cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0; - cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0; - cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0; - - cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0; - cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0; - cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0; - - for (var col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && - (col === 0 || col === splitXBy)) { - continue; - } - var x = 0, y = 0; - var q = 0; - for (var i = 0; i <= 3; i++) { - for (var j = 0; j <= 3; j++, q++) { - var m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - var newColor = new Uint8Array(3); - newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0; - newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0; - newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - - mesh.figures[index] = { - type: 'lattice', - coords: figureCoords, - colors: figureColors, - verticesPerRow: verticesPerRow - }; - } - - function decodeType6Shading(mesh, reader) { - // A special case of Type 7. The p11, p12, p21, p22 automatically filled - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type6 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; - ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - // set p11, p12, p21, p22 - ps[5] = coords.length; - coords.push([ - (-4 * coords[ps[0]][0] - coords[ps[15]][0] + - 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, - (-4 * coords[ps[0]][1] - coords[ps[15]][1] + - 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 - ]); - ps[6] = coords.length; - coords.push([ - (-4 * coords[ps[3]][0] - coords[ps[12]][0] + - 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, - (-4 * coords[ps[3]][1] - coords[ps[12]][1] + - 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 - ]); - ps[9] = coords.length; - coords.push([ - (-4 * coords[ps[12]][0] - coords[ps[3]][0] + - 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, - (-4 * coords[ps[12]][1] - coords[ps[3]][1] + - 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 - ]); - ps[10] = coords.length; - coords.push([ - (-4 * coords[ps[15]][0] - coords[ps[0]][0] + - 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, - (-4 * coords[ps[15]][1] - coords[ps[0]][1] + - 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 - ]); - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function decodeType7Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type7 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7; - ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = ps[2]; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function updateBounds(mesh) { - var minX = mesh.coords[0][0], minY = mesh.coords[0][1], - maxX = minX, maxY = minY; - for (var i = 1, ii = mesh.coords.length; i < ii; i++) { - var x = mesh.coords[i][0], y = mesh.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - mesh.bounds = [minX, minY, maxX, maxY]; - } - - function packData(mesh) { - var i, ii, j, jj; - - var coords = mesh.coords; - var coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - var xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - mesh.coords = coordsPacked; - - var colors = mesh.colors; - var colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - var c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - mesh.colors = colorsPacked; - - var figures = mesh.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - - function Mesh(stream, matrix, xref, res) { - assert(isStream(stream), 'Mesh data is not a stream'); - var dict = stream.dict; - this.matrix = matrix; - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - this.bbox = dict.get('BBox'); - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - this.background = dict.has('Background') ? - cs.getRgb(dict.get('Background'), 0) : null; - - var fnObj = dict.get('Function'); - var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; - - this.coords = []; - this.colors = []; - this.figures = []; - - var decodeContext = { - bitsPerCoordinate: dict.get('BitsPerCoordinate'), - bitsPerComponent: dict.get('BitsPerComponent'), - bitsPerFlag: dict.get('BitsPerFlag'), - decode: dict.get('Decode'), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - var reader = new MeshStreamReader(stream, decodeContext); - - var patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - decodeType4Shading(this, reader); - break; - case ShadingType.LATTICE_FORM_MESH: - var verticesPerRow = dict.get('VerticesPerRow') | 0; - assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); - decodeType5Shading(this, reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - decodeType6Shading(this, reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - decodeType7Shading(this, reader); - patchMesh = true; - break; - default: - error('Unsupported mesh type.'); - break; - } - - if (patchMesh) { - // dirty bounds calculation for determining, how dense shall be triangles - updateBounds(this); - for (var i = 0, ii = this.figures.length; i < ii; i++) { - buildFigureFromPatch(this, i); - } - } - // calculate bounds - updateBounds(this); - - packData(this); - } - - Mesh.prototype = { - getIR: function Mesh_getIR() { - return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, - this.bounds, this.matrix, this.bbox, this.background]; - } - }; - - return Mesh; -})(); - -Shadings.Dummy = (function DummyClosure() { - function Dummy() { - this.type = 'Pattern'; - } - - Dummy.prototype = { - getIR: function Dummy_getIR() { - return ['Dummy']; - } - }; - return Dummy; -})(); - -function getTilingPatternIR(operatorList, dict, args) { - var matrix = dict.get('Matrix'); - var bbox = dict.get('BBox'); - var xstep = dict.get('XStep'); - var ystep = dict.get('YStep'); - var paintType = dict.get('PaintType'); - var tilingType = dict.get('TilingType'); - - return [ - 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, - paintType, tilingType - ]; -} - - -var PartialEvaluator = (function PartialEvaluatorClosure() { - function PartialEvaluator(pdfManager, xref, handler, pageIndex, - uniquePrefix, idCounters, fontCache) { - this.pdfManager = pdfManager; - this.xref = xref; - this.handler = handler; - this.pageIndex = pageIndex; - this.uniquePrefix = uniquePrefix; - this.idCounters = idCounters; - this.fontCache = fontCache; - } - - // Trying to minimize Date.now() usage and check every 100 time - var TIME_SLOT_DURATION_MS = 20; - var CHECK_TIME_EVERY = 100; - function TimeSlotManager() { - this.reset(); - } - TimeSlotManager.prototype = { - check: function TimeSlotManager_check() { - if (++this.checked < CHECK_TIME_EVERY) { - return false; - } - this.checked = 0; - return this.endTime <= Date.now(); - }, - reset: function TimeSlotManager_reset() { - this.endTime = Date.now() + TIME_SLOT_DURATION_MS; - this.checked = 0; - } - }; - - var deferred = Promise.resolve(); - - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - PartialEvaluator.prototype = { - hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { - if (!isDict(resources)) { - return false; - } - - var processed = Object.create(null); - if (resources.objId) { - processed[resources.objId] = true; - } - - var nodes = [resources]; - while (nodes.length) { - var key; - var node = nodes.shift(); - // First check the current resources for blend modes. - var graphicStates = node.get('ExtGState'); - if (isDict(graphicStates)) { - graphicStates = graphicStates.getAll(); - for (key in graphicStates) { - var graphicState = graphicStates[key]; - var bm = graphicState['BM']; - if (isName(bm) && bm.name !== 'Normal') { - return true; - } - } - } - // Descend into the XObjects to look for more resources and blend modes. - var xObjects = node.get('XObject'); - if (!isDict(xObjects)) { - continue; - } - xObjects = xObjects.getAll(); - for (key in xObjects) { - var xObject = xObjects[key]; - if (!isStream(xObject)) { - continue; - } - if (xObject.dict.objId) { - if (processed[xObject.dict.objId]) { - // stream has objId and is processed already - continue; - } - processed[xObject.dict.objId] = true; - } - var xResources = xObject.dict.get('Resources'); - // Checking objId to detect an infinite loop. - if (isDict(xResources) && - (!xResources.objId || !processed[xResources.objId])) { - nodes.push(xResources); - if (xResources.objId) { - processed[xResources.objId] = true; - } - } - } - } - return false; - }, - - buildFormXObject: function PartialEvaluator_buildFormXObject(resources, - xobj, smask, - operatorList, - task, - initialState) { - var matrix = xobj.dict.getArray('Matrix'); - var bbox = xobj.dict.getArray('BBox'); - var group = xobj.dict.get('Group'); - if (group) { - var groupOptions = { - matrix: matrix, - bbox: bbox, - smask: smask, - isolated: false, - knockout: false - }; - - var groupSubtype = group.get('S'); - var colorSpace; - if (isName(groupSubtype) && groupSubtype.name === 'Transparency') { - groupOptions.isolated = (group.get('I') || false); - groupOptions.knockout = (group.get('K') || false); - colorSpace = (group.has('CS') ? - ColorSpace.parse(group.get('CS'), this.xref, resources) : null); - } - - if (smask && smask.backdrop) { - colorSpace = colorSpace || ColorSpace.singletons.rgb; - smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); - } - - operatorList.addOp(OPS.beginGroup, [groupOptions]); - } - - operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); - - return this.getOperatorList(xobj, task, - (xobj.dict.get('Resources') || resources), operatorList, initialState). - then(function () { - operatorList.addOp(OPS.paintFormXObjectEnd, []); - - if (group) { - operatorList.addOp(OPS.endGroup, [groupOptions]); - } - }); - }, - - buildPaintImageXObject: - function PartialEvaluator_buildPaintImageXObject(resources, image, - inline, operatorList, - cacheKey, imageCache) { - var self = this; - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - if (!(w && isNum(w)) || !(h && isNum(h))) { - warn('Image dimensions are missing, or not numbers.'); - return; - } - if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) { - warn('Image exceeded maximum allowed size and was removed.'); - return; - } - - var imageMask = (dict.get('ImageMask', 'IM') || false); - var imgData, args; - if (imageMask) { - // This depends on a tmpCanvas being filled with the - // current fillStyle, such that processing the pixel - // data can't be done here. Instead of creating a - // complete PDFImage, only read the information needed - // for later. - - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = (width + 7) >> 3; - var imgArray = image.getBytes(bitStrideLength * height); - var decode = dict.get('Decode', 'D'); - var inverseDecode = (!!decode && decode[0] > 0); - - imgData = PDFImage.createMask(imgArray, width, height, - image instanceof DecodeStream, - inverseDecode); - imgData.cached = true; - args = [imgData]; - operatorList.addOp(OPS.paintImageMaskXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageMaskXObject, - args: args - }; - } - return; - } - - var softMask = (dict.get('SMask', 'SM') || false); - var mask = (dict.get('Mask') || false); - - var SMALL_IMAGE_DIMENSIONS = 200; - // Inlining small images into the queue as RGB data - if (inline && !softMask && !mask && !(image instanceof JpegStream) && - (w + h) < SMALL_IMAGE_DIMENSIONS) { - var imageObj = new PDFImage(this.xref, resources, image, - inline, null, null); - // We force the use of RGBA_32BPP images here, because we can't handle - // any other kind. - imgData = imageObj.createImageData(/* forceRGBA = */ true); - operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var uniquePrefix = (this.uniquePrefix || ''); - var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); - operatorList.addDependency(objId); - args = [objId, w, h]; - - if (!softMask && !mask && image instanceof JpegStream && - image.isNativelySupported(this.xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - operatorList.addOp(OPS.paintJpegXObject, args); - this.handler.send('obj', - [objId, this.pageIndex, 'JpegStream', image.getIR()]); - return; - } - - PDFImage.buildImage(self.handler, self.xref, resources, image, inline). - then(function(imageObj) { - var imgData = imageObj.createImageData(/* forceRGBA = */ false); - self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData], - [imgData.data.buffer]); - }).then(undefined, function (reason) { - warn('Unable to decode image: ' + reason); - self.handler.send('obj', [objId, self.pageIndex, 'Image', null]); - }); - - operatorList.addOp(OPS.paintImageXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageXObject, - args: args - }; - } - }, - - handleSMask: function PartialEvaluator_handleSmask(smask, resources, - operatorList, task, - stateManager) { - var smaskContent = smask.get('G'); - var smaskOptions = { - subtype: smask.get('S').name, - backdrop: smask.get('BC') - }; - - // The SMask might have a alpha/luminosity value transfer function -- - // we will build a map of integer values in range 0..255 to be fast. - var transferObj = smask.get('TR'); - if (isPDFFunction(transferObj)) { - var transferFn = PDFFunction.parse(this.xref, transferObj); - var transferMap = new Uint8Array(256); - var tmp = new Float32Array(1); - for (var i = 0; i < 255; i++) { - tmp[0] = i / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[i] = (tmp[0] * 255) | 0; - } - smaskOptions.transferMap = transferMap; - } - - return this.buildFormXObject(resources, smaskContent, smaskOptions, - operatorList, task, stateManager.state.clone()); - }, - - handleTilingType: - function PartialEvaluator_handleTilingType(fn, args, resources, - pattern, patternDict, - operatorList, task) { - // Create an IR of the pattern code. - var tilingOpList = new OperatorList(); - // Merge the available resources, to prevent issues when the patternDict - // is missing some /Resources entries (fixes issue6541.pdf). - var resourcesArray = [patternDict.get('Resources'), resources]; - var patternResources = Dict.merge(this.xref, resourcesArray); - - return this.getOperatorList(pattern, task, patternResources, - tilingOpList).then(function () { - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - operatorList.addDependencies(tilingOpList.dependencies); - operatorList.addOp(fn, getTilingPatternIR({ - fnArray: tilingOpList.fnArray, - argsArray: tilingOpList.argsArray - }, patternDict, args)); - }); - }, - - handleSetFont: - function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, - operatorList, task, state) { - // TODO(mack): Not needed? - var fontName; - if (fontArgs) { - fontArgs = fontArgs.slice(); - fontName = fontArgs[0].name; - } - - var self = this; - return this.loadFont(fontName, fontRef, this.xref, resources).then( - function (translated) { - if (!translated.font.isType3Font) { - return translated; - } - return translated.loadType3Data(self, resources, operatorList, task). - then(function () { - return translated; - }, function (reason) { - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - return new TranslatedFont('g_font_error', - new ErrorFont('Type3 font load error: ' + reason), translated.font); - }); - }).then(function (translated) { - state.font = translated.font; - translated.send(self.handler); - return translated.loadedName; - }); - }, - - handleText: function PartialEvaluator_handleText(chars, state) { - var font = state.font; - var glyphs = font.charsToGlyphs(chars); - var isAddToPathSet = !!(state.textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) { - var buildPath = function (fontChar) { - if (!font.renderer.hasBuiltPath(fontChar)) { - var path = font.renderer.getPathJs(fontChar); - this.handler.send('commonobj', [ - font.loadedName + '_path_' + fontChar, - 'FontPath', - path - ]); - } - }.bind(this); - - for (var i = 0, ii = glyphs.length; i < ii; i++) { - var glyph = glyphs[i]; - buildPath(glyph.fontChar); - - // If the glyph has an accent we need to build a path for its - // fontChar too, otherwise CanvasGraphics_paintChar will fail. - var accent = glyph.accent; - if (accent && accent.fontChar) { - buildPath(accent.fontChar); - } - } - } - - return glyphs; - }, - - setGState: function PartialEvaluator_setGState(resources, gState, - operatorList, task, - xref, stateManager) { - // This array holds the converted/processed state data. - var gStateObj = []; - var gStateMap = gState.map; - var self = this; - var promise = Promise.resolve(); - for (var key in gStateMap) { - var value = gStateMap[key]; - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gStateObj.push([key, value]); - break; - case 'Font': - promise = promise.then(function () { - return self.handleSetFont(resources, null, value[0], operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - gStateObj.push([key, [loadedName, value[1]]]); - }); - }); - break; - case 'BM': - gStateObj.push([key, value]); - break; - case 'SMask': - if (isName(value) && value.name === 'None') { - gStateObj.push([key, false]); - break; - } - var dict = xref.fetchIfRef(value); - if (isDict(dict)) { - promise = promise.then(function () { - return self.handleSMask(dict, resources, operatorList, - task, stateManager); - }); - gStateObj.push([key, true]); - } else { - warn('Unsupported SMask type'); - } - - break; - // Only generate info log messages for the following since - // they are unlikely to have a big impact on the rendering. - case 'OP': - case 'op': - case 'OPM': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - case 'TR': - case 'TR2': - case 'HT': - case 'SM': - case 'SA': - case 'AIS': - case 'TK': - // TODO implement these operators. - info('graphic state operator ' + key); - break; - default: - info('Unknown graphic state operator ' + key); - break; - } - } - return promise.then(function () { - if (gStateObj.length >= 0) { - operatorList.addOp(OPS.setGState, [gStateObj]); - } - }); - }, - - loadFont: function PartialEvaluator_loadFont(fontName, font, xref, - resources) { - - function errorFont() { - return Promise.resolve(new TranslatedFont('g_font_error', - new ErrorFont('Font ' + fontName + ' is not available'), font)); - } - var fontRef; - if (font) { // Loading by ref. - assert(isRef(font)); - fontRef = font; - } else { // Loading by name. - var fontRes = resources.get('Font'); - if (fontRes) { - fontRef = fontRes.getRaw(fontName); - } else { - warn('fontRes not available'); - return errorFont(); - } - } - if (!fontRef) { - warn('fontRef not available'); - return errorFont(); - } - - if (this.fontCache.has(fontRef)) { - return this.fontCache.get(fontRef); - } - - font = xref.fetchIfRef(fontRef); - if (!isDict(font)) { - return errorFont(); - } - - // We are holding font.translated references just for fontRef that are not - // dictionaries (Dict). See explanation below. - if (font.translated) { - return font.translated; - } - - var fontCapability = createPromiseCapability(); - - var preEvaluatedFont = this.preEvaluateFont(font, xref); - var descriptor = preEvaluatedFont.descriptor; - var fontID = fontRef.num + '_' + fontRef.gen; - if (isDict(descriptor)) { - if (!descriptor.fontAliases) { - descriptor.fontAliases = Object.create(null); - } - - var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; - if (fontAliases[hash]) { - var aliasFontRef = fontAliases[hash].aliasRef; - if (aliasFontRef && this.fontCache.has(aliasFontRef)) { - this.fontCache.putAlias(fontRef, aliasFontRef); - return this.fontCache.get(fontRef); - } - } - - if (!fontAliases[hash]) { - fontAliases[hash] = { - fontID: Font.getFontID() - }; - } - - fontAliases[hash].aliasRef = fontRef; - fontID = fontAliases[hash].fontID; - } - - // Workaround for bad PDF generators that don't reference fonts - // properly, i.e. by not using an object identifier. - // Check if the fontRef is a Dict (as opposed to a standard object), - // in which case we don't cache the font and instead reference it by - // fontName in font.loadedName below. - var fontRefIsDict = isDict(fontRef); - if (!fontRefIsDict) { - this.fontCache.put(fontRef, fontCapability.promise); - } - - // Keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page. - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + (fontRefIsDict ? - fontName.replace(/\W/g, '') : fontID); - - font.translated = fontCapability.promise; - - // TODO move promises into translate font - var translatedPromise; - try { - translatedPromise = Promise.resolve( - this.translateFont(preEvaluatedFont, xref)); - } catch (e) { - translatedPromise = Promise.reject(e); - } - - var self = this; - translatedPromise.then(function (translatedFont) { - if (translatedFont.fontType !== undefined) { - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[translatedFont.fontType] = true; - } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - translatedFont, font)); - }, function (reason) { - // TODO fontCapability.reject? - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - - try { - // error, but it's still nice to have font type reported - var descriptor = preEvaluatedFont.descriptor; - var fontFile3 = descriptor && descriptor.get('FontFile3'); - var subtype = fontFile3 && fontFile3.get('Subtype'); - var fontType = getFontType(preEvaluatedFont.type, - subtype && subtype.name); - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[fontType] = true; - } catch (ex) { } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - new ErrorFont(reason instanceof Error ? reason.message : reason), - font)); - }); - return fontCapability.promise; - }, - - buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { - var lastIndex = operatorList.length - 1; - if (!args) { - args = []; - } - if (lastIndex < 0 || - operatorList.fnArray[lastIndex] !== OPS.constructPath) { - operatorList.addOp(OPS.constructPath, [[fn], args]); - } else { - var opArgs = operatorList.argsArray[lastIndex]; - opArgs[0].push(fn); - Array.prototype.push.apply(opArgs[1], args); - } - }, - - handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, - cs, patterns, resources, task, xref) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - var pattern; - if (isName(patternName) && - (pattern = patterns.get(patternName.name))) { - var dict = (isStream(pattern) ? pattern.dict : pattern); - var typeNum = dict.get('PatternType'); - - if (typeNum === TILING_PATTERN) { - var color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, - dict, operatorList, task); - } else if (typeNum === SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.get('Matrix'); - pattern = Pattern.parseShading(shading, matrix, xref, resources, - this.handler); - operatorList.addOp(fn, pattern.getIR()); - return Promise.resolve(); - } else { - return Promise.reject('Unknown PatternType: ' + typeNum); - } - } - // TODO shall we fail here? - operatorList.addOp(fn, args); - return Promise.resolve(); - }, - - getOperatorList: function PartialEvaluator_getOperatorList(stream, - task, - resources, - operatorList, - initialState) { - - var self = this; - var xref = this.xref; - var imageCache = {}; - - assert(operatorList); - - resources = (resources || Dict.empty); - var xobjs = (resources.get('XObject') || Dict.empty); - var patterns = (resources.get('Pattern') || Dict.empty); - var stateManager = new StateManager(initialState || new EvalState()); - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function next(resolve, reject) { - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, i, ii, cs; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are used beyond this loop, so we - // cannot reuse the same array on each iteration. Therefore we pass - // in |null| as the initial value (see the comment on - // EvaluatorPreprocessor_read() for why). - operation.args = null; - if (!(preprocessor.read(operation))) { - break; - } - var args = operation.args; - var fn = operation.fn; - - switch (fn | 0) { - case OPS.paintXObject: - if (args[0].code) { - break; - } - // eagerly compile XForm objects - var name = args[0].name; - if (!name) { - warn('XObject must be referred to by name.'); - continue; - } - if (imageCache[name] !== undefined) { - operatorList.addOp(imageCache[name].fn, imageCache[name].args); - args = null; - continue; - } - - var xobj = xobjs.get(name); - if (xobj) { - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), - 'XObject should have a Name subtype'); - - if (type.name === 'Form') { - stateManager.save(); - return self.buildFormXObject(resources, xobj, null, - operatorList, task, - stateManager.state.clone()). - then(function () { - stateManager.restore(); - next(resolve, reject); - }, reject); - } else if (type.name === 'Image') { - self.buildPaintImageXObject(resources, xobj, false, - operatorList, name, imageCache); - args = null; - continue; - } else if (type.name === 'PS') { - // PostScript XObjects are unused when viewing documents. - // See section 4.7.1 of Adobe's PDF reference. - info('Ignored XObject subtype PS'); - continue; - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - break; - case OPS.setFont: - var fontSize = args[1]; - // eagerly collect all fonts - return self.handleSetFont(resources, args, null, operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - operatorList.addOp(OPS.setFont, [loadedName, fontSize]); - next(resolve, reject); - }, reject); - case OPS.endInlineImage: - var cacheKey = args[0].cacheKey; - if (cacheKey) { - var cacheEntry = imageCache[cacheKey]; - if (cacheEntry !== undefined) { - operatorList.addOp(cacheEntry.fn, cacheEntry.args); - args = null; - continue; - } - } - self.buildPaintImageXObject(resources, args[0], true, - operatorList, cacheKey, imageCache); - args = null; - continue; - case OPS.showText: - args[0] = self.handleText(args[0], stateManager.state); - break; - case OPS.showSpacedText: - var arr = args[0]; - var combinedGlyphs = []; - var arrLength = arr.length; - var state = stateManager.state; - for (i = 0; i < arrLength; ++i) { - var arrItem = arr[i]; - if (isString(arrItem)) { - Array.prototype.push.apply(combinedGlyphs, - self.handleText(arrItem, state)); - } else if (isNum(arrItem)) { - combinedGlyphs.push(arrItem); - } - } - args[0] = combinedGlyphs; - fn = OPS.showText; - break; - case OPS.nextLineShowText: - operatorList.addOp(OPS.nextLine); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.nextLineSetSpacingShowText: - operatorList.addOp(OPS.nextLine); - operatorList.addOp(OPS.setWordSpacing, [args.shift()]); - operatorList.addOp(OPS.setCharSpacing, [args.shift()]); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.setTextRenderingMode: - stateManager.state.textRenderingMode = args[0]; - break; - - case OPS.setFillColorSpace: - stateManager.state.fillColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setStrokeColorSpace: - stateManager.state.strokeColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setFillColor: - cs = stateManager.state.fillColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColor: - cs = stateManager.state.strokeColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; - if (cs.name === 'Pattern') { - return self.handleColorN(operatorList, OPS.setFillColorN, - args, cs, patterns, resources, task, xref).then(function() { - next(resolve, reject); - }, reject); - } - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; - if (cs.name === 'Pattern') { - return self.handleColorN(operatorList, OPS.setStrokeColorN, - args, cs, patterns, resources, task, xref).then(function() { - next(resolve, reject); - }, reject); - } - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - - case OPS.shadingFill: - var shadingRes = resources.get('Shading'); - if (!shadingRes) { - error('No shading resource found'); - } - - var shading = shadingRes.get(args[0].name); - if (!shading) { - error('No shading object found'); - } - - var shadingFill = Pattern.parseShading(shading, null, xref, - resources, self.handler); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = OPS.shadingFill; - break; - case OPS.setGState: - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gState = extGState.get(dictName.name); - return self.setGState(resources, gState, operatorList, task, - xref, stateManager).then(function() { - next(resolve, reject); - }, reject); - case OPS.moveTo: - case OPS.lineTo: - case OPS.curveTo: - case OPS.curveTo2: - case OPS.curveTo3: - case OPS.closePath: - self.buildPath(operatorList, fn, args); - continue; - case OPS.rectangle: - self.buildPath(operatorList, fn, args); - continue; - case OPS.markPoint: - case OPS.markPointProps: - case OPS.beginMarkedContent: - case OPS.beginMarkedContentProps: - case OPS.endMarkedContent: - case OPS.beginCompat: - case OPS.endCompat: - // Ignore operators where the corresponding handlers are known to - // be no-op in CanvasGraphics (display/canvas.js). This prevents - // serialization errors and is also a bit more efficient. - // We could also try to serialize all objects in a general way, - // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266, - // but doing so is meaningless without knowing the semantics. - continue; - default: - // Note: Let's hope that the ignored operator does not have any - // non-serializable arguments, otherwise postMessage will throw - // "An object could not be cloned.". - } - operatorList.addOp(fn, args); - } - if (stop) { - deferred.then(function () { - next(resolve, reject); - }, reject); - return; - } - // Some PDFs don't close all restores inside object/form. - // Closing those for them. - for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { - operatorList.addOp(OPS.restore, []); - } - resolve(); - }); - }, - - getTextContent: - function PartialEvaluator_getTextContent(stream, task, resources, - stateManager, - normalizeWhitespace) { - - stateManager = (stateManager || new StateManager(new TextState())); - - var WhitespaceRegexp = /\s/g; - - var textContent = { - items: [], - styles: Object.create(null) - }; - var textContentItem = { - initialized: false, - str: [], - width: 0, - height: 0, - vertical: false, - lastAdvanceWidth: 0, - lastAdvanceHeight: 0, - textAdvanceScale: 0, - spaceWidth: 0, - fakeSpaceMin: Infinity, - fakeMultiSpaceMin: Infinity, - fakeMultiSpaceMax: -0, - textRunBreakAllowed: false, - transform: null, - fontName: null - }; - var SPACE_FACTOR = 0.3; - var MULTI_SPACE_FACTOR = 1.5; - var MULTI_SPACE_FACTOR_MAX = 4; - - var self = this; - var xref = this.xref; - - resources = (xref.fetchIfRef(resources) || Dict.empty); - - // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd. - var xobjs = null; - var xobjsCache = {}; - - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - - var textState; - - function ensureTextContentItem() { - if (textContentItem.initialized) { - return textContentItem; - } - var font = textState.font; - if (!(font.loadedName in textContent.styles)) { - textContent.styles[font.loadedName] = { - fontFamily: font.fallbackName, - ascent: font.ascent, - descent: font.descent, - vertical: font.vertical - }; - } - textContentItem.fontName = font.loadedName; - - // 9.4.4 Text Space Details - var tsm = [textState.fontSize * textState.textHScale, 0, - 0, textState.fontSize, - 0, textState.textRise]; - - if (font.isType3Font && - textState.fontMatrix !== FONT_IDENTITY_MATRIX && - textState.fontSize === 1) { - var glyphHeight = font.bbox[3] - font.bbox[1]; - if (glyphHeight > 0) { - glyphHeight = glyphHeight * textState.fontMatrix[3]; - tsm[3] *= glyphHeight; - } - } - - var trm = Util.transform(textState.ctm, - Util.transform(textState.textMatrix, tsm)); - textContentItem.transform = trm; - if (!font.vertical) { - textContentItem.width = 0; - textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); - textContentItem.vertical = false; - } else { - textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); - textContentItem.height = 0; - textContentItem.vertical = true; - } - - var a = textState.textLineMatrix[0]; - var b = textState.textLineMatrix[1]; - var scaleLineX = Math.sqrt(a * a + b * b); - a = textState.ctm[0]; - b = textState.ctm[1]; - var scaleCtmX = Math.sqrt(a * a + b * b); - textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - textContentItem.lastAdvanceWidth = 0; - textContentItem.lastAdvanceHeight = 0; - - var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; - if (spaceWidth) { - textContentItem.spaceWidth = spaceWidth; - textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; - textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; - textContentItem.fakeMultiSpaceMax = - spaceWidth * MULTI_SPACE_FACTOR_MAX; - // It's okay for monospace fonts to fake as much space as needed. - textContentItem.textRunBreakAllowed = !font.isMonospace; - } else { - textContentItem.spaceWidth = 0; - textContentItem.fakeSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMax = 0; - textContentItem.textRunBreakAllowed = false; - } - - - textContentItem.initialized = true; - return textContentItem; - } - - function replaceWhitespace(str) { - // Replaces all whitespaces with standard spaces (0x20), to avoid - // alignment issues between the textLayer and the canvas if the text - // contains e.g. tabs (fixes issue6612.pdf). - var i = 0, ii = str.length, code; - while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { - i++; - } - return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); - } - - function runBidiTransform(textChunk) { - var str = textChunk.str.join(''); - var bidiResult = PDFJS.bidi(str, -1, textChunk.vertical); - return { - str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : - bidiResult.str), - dir: bidiResult.dir, - width: textChunk.width, - height: textChunk.height, - transform: textChunk.transform, - fontName: textChunk.fontName - }; - } - - function handleSetFont(fontName, fontRef) { - return self.loadFont(fontName, fontRef, xref, resources). - then(function (translated) { - textState.font = translated.font; - textState.fontMatrix = translated.font.fontMatrix || - FONT_IDENTITY_MATRIX; - }); - } - - function buildTextContentItem(chars) { - var font = textState.font; - var textChunk = ensureTextContentItem(); - var width = 0; - var height = 0; - var glyphs = font.charsToGlyphs(chars); - var defaultVMetrics = font.defaultVMetrics; - for (var i = 0; i < glyphs.length; i++) { - var glyph = glyphs[i]; - var vMetricX = null; - var vMetricY = null; - var glyphWidth = null; - if (font.vertical) { - if (glyph.vmetric) { - glyphWidth = glyph.vmetric[0]; - vMetricX = glyph.vmetric[1]; - vMetricY = glyph.vmetric[2]; - } else { - glyphWidth = glyph.width; - vMetricX = glyph.width * 0.5; - vMetricY = defaultVMetrics[2]; - } - } else { - glyphWidth = glyph.width; - } - - var glyphUnicode = glyph.unicode; - if (NormalizedUnicodes[glyphUnicode] !== undefined) { - glyphUnicode = NormalizedUnicodes[glyphUnicode]; - } - glyphUnicode = reverseIfRtl(glyphUnicode); - - // The following will calculate the x and y of the individual glyphs. - // if (font.vertical) { - // tsm[4] -= vMetricX * Math.abs(textState.fontSize) * - // textState.fontMatrix[0]; - // tsm[5] -= vMetricY * textState.fontSize * - // textState.fontMatrix[0]; - // } - // var trm = Util.transform(textState.textMatrix, tsm); - // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm); - // var x = pt[0]; - // var y = pt[1]; - - var charSpacing = textState.charSpacing; - if (glyph.isSpace) { - var wordSpacing = textState.wordSpacing; - charSpacing += wordSpacing; - if (wordSpacing > 0) { - addFakeSpaces(wordSpacing, textChunk.str); - } - } - - var tx = 0; - var ty = 0; - if (!font.vertical) { - var w0 = glyphWidth * textState.fontMatrix[0]; - tx = (w0 * textState.fontSize + charSpacing) * - textState.textHScale; - width += tx; - } else { - var w1 = glyphWidth * textState.fontMatrix[0]; - ty = w1 * textState.fontSize + charSpacing; - height += ty; - } - textState.translateTextMatrix(tx, ty); - - textChunk.str.push(glyphUnicode); - } - - if (!font.vertical) { - textChunk.lastAdvanceWidth = width; - textChunk.width += width * textChunk.textAdvanceScale; - } else { - textChunk.lastAdvanceHeight = height; - textChunk.height += Math.abs(height * textChunk.textAdvanceScale); - } - - return textChunk; - } - - function addFakeSpaces(width, strBuf) { - if (width < textContentItem.fakeSpaceMin) { - return; - } - if (width < textContentItem.fakeMultiSpaceMin) { - strBuf.push(' '); - return; - } - var fakeSpaces = Math.round(width / textContentItem.spaceWidth); - while (fakeSpaces-- > 0) { - strBuf.push(' '); - } - } - - function flushTextContentItem() { - if (!textContentItem.initialized) { - return; - } - textContent.items.push(runBidiTransform(textContentItem)); - - textContentItem.initialized = false; - textContentItem.str.length = 0; - } - - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function next(resolve, reject) { - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, args = []; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are not used beyond this loop, so - // we can reuse the same array on every iteration, thus avoiding - // unnecessary allocations. - args.length = 0; - operation.args = args; - if (!(preprocessor.read(operation))) { - break; - } - textState = stateManager.state; - var fn = operation.fn; - args = operation.args; - var advance; - - switch (fn | 0) { - case OPS.setFont: - flushTextContentItem(); - textState.fontSize = args[1]; - return handleSetFont(args[0].name).then(function() { - next(resolve, reject); - }, reject); - case OPS.setTextRise: - flushTextContentItem(); - textState.textRise = args[0]; - break; - case OPS.setHScale: - flushTextContentItem(); - textState.textHScale = args[0] / 100; - break; - case OPS.setLeading: - flushTextContentItem(); - textState.leading = args[0]; - break; - case OPS.moveText: - // Optimization to treat same line movement as advance - var isSameTextLine = !textState.font ? false : - ((textState.font.vertical ? args[0] : args[1]) === 0); - advance = args[0] - args[1]; - if (isSameTextLine && textContentItem.initialized && - advance > 0 && - advance <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(args[0], args[1]); - textContentItem.width += - (args[0] - textContentItem.lastAdvanceWidth); - textContentItem.height += - (args[1] - textContentItem.lastAdvanceHeight); - var diff = (args[0] - textContentItem.lastAdvanceWidth) - - (args[1] - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.setLeadingMoveText: - flushTextContentItem(); - textState.leading = -args[1]; - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.nextLine: - flushTextContentItem(); - textState.carriageReturn(); - break; - case OPS.setTextMatrix: - flushTextContentItem(); - textState.setTextMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - textState.setTextLineMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.setCharSpacing: - textState.charSpacing = args[0]; - break; - case OPS.setWordSpacing: - textState.wordSpacing = args[0]; - break; - case OPS.beginText: - flushTextContentItem(); - textState.textMatrix = IDENTITY_MATRIX.slice(); - textState.textLineMatrix = IDENTITY_MATRIX.slice(); - break; - case OPS.showSpacedText: - var items = args[0]; - var offset; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - buildTextContentItem(items[j]); - } else { - ensureTextContentItem(); - - // PDF Specification 5.3.2 states: - // The number is expressed in thousandths of a unit of text - // space. - // This amount is subtracted from the current horizontal or - // vertical coordinate, depending on the writing mode. - // In the default coordinate system, a positive adjustment - // has the effect of moving the next glyph painted either to - // the left or down by the given amount. - advance = items[j] * textState.fontSize / 1000; - var breakTextRun = false; - if (textState.font.vertical) { - offset = advance * - (textState.textHScale * textState.textMatrix[2] + - textState.textMatrix[3]); - textState.translateTextMatrix(0, advance); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be added to height to paint down. - textContentItem.height += offset; - } - } else { - advance = -advance; - offset = advance * ( - textState.textHScale * textState.textMatrix[0] + - textState.textMatrix[1]); - textState.translateTextMatrix(advance, 0); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be subtracted from width to paint left. - textContentItem.width += offset; - } - } - if (breakTextRun) { - flushTextContentItem(); - } else if (advance > 0) { - addFakeSpaces(advance, textContentItem.str); - } - } - } - break; - case OPS.showText: - buildTextContentItem(args[0]); - break; - case OPS.nextLineShowText: - flushTextContentItem(); - textState.carriageReturn(); - buildTextContentItem(args[0]); - break; - case OPS.nextLineSetSpacingShowText: - flushTextContentItem(); - textState.wordSpacing = args[0]; - textState.charSpacing = args[1]; - textState.carriageReturn(); - buildTextContentItem(args[2]); - break; - case OPS.paintXObject: - flushTextContentItem(); - if (args[0].code) { - break; - } - - if (!xobjs) { - xobjs = (resources.get('XObject') || Dict.empty); - } - - var name = args[0].name; - if (xobjsCache.key === name) { - if (xobjsCache.texts) { - Util.appendToArray(textContent.items, xobjsCache.texts.items); - Util.extendObj(textContent.styles, xobjsCache.texts.styles); - } - break; - } - - var xobj = xobjs.get(name); - if (!xobj) { - break; - } - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), - 'XObject should have a Name subtype'); - - if ('Form' !== type.name) { - xobjsCache.key = name; - xobjsCache.texts = null; - break; - } - - stateManager.save(); - var matrix = xobj.dict.get('Matrix'); - if (isArray(matrix) && matrix.length === 6) { - stateManager.transform(matrix); - } - - return self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager, - normalizeWhitespace).then(function (formTextContent) { - Util.appendToArray(textContent.items, formTextContent.items); - Util.extendObj(textContent.styles, formTextContent.styles); - stateManager.restore(); - - xobjsCache.key = name; - xobjsCache.texts = formTextContent; - - next(resolve, reject); - }, reject); - case OPS.setGState: - flushTextContentItem(); - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gsStateMap = extGState.get(dictName.name); - var gsStateFont = null; - for (var key in gsStateMap) { - if (key === 'Font') { - assert(!gsStateFont); - gsStateFont = gsStateMap[key]; - } - } - if (gsStateFont) { - textState.fontSize = gsStateFont[1]; - return handleSetFont(gsStateFont[0]).then(function() { - next(resolve, reject); - }, reject); - } - break; - } // switch - } // while - if (stop) { - deferred.then(function () { - next(resolve, reject); - }, reject); - return; - } - flushTextContentItem(); - resolve(textContent); - }); - }, - - extractDataStructures: function - partialEvaluatorExtractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); - if (toUnicode) { - properties.toUnicode = this.readToUnicode(toUnicode); - } - if (properties.composite) { - // CIDSystemInfo helps to match CID to glyphs - var cidSystemInfo = dict.get('CIDSystemInfo'); - if (isDict(cidSystemInfo)) { - properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), - supplement: cidSystemInfo.get('Supplement') - }; - } - - var cidToGidMap = dict.get('CIDToGIDMap'); - if (isStream(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); - } - } - - // Based on 9.6.6 of the spec the encoding can come from multiple places - // and depends on the font type. The base encoding and differences are - // read here, but the encoding that is actually used is chosen during - // glyph mapping in the font. - // TODO: Loading the built in encoding in the font would allow the - // differences to be merged in here not require us to hold on to it. - var differences = []; - var baseEncodingName = null; - var encoding; - if (dict.has('Encoding')) { - encoding = dict.get('Encoding'); - if (isDict(encoding)) { - baseEncodingName = encoding.get('BaseEncoding'); - baseEncodingName = (isName(baseEncodingName) ? - baseEncodingName.name : null); - // Load the differences between the base and original - if (encoding.has('Differences')) { - var diffEncoding = encoding.get('Differences'); - var index = 0; - for (var j = 0, jj = diffEncoding.length; j < jj; j++) { - var data = diffEncoding[j]; - if (isNum(data)) { - index = data; - } else if (isName(data)) { - differences[index++] = data.name; - } else if (isRef(data)) { - diffEncoding[j--] = xref.fetch(data); - continue; - } else { - error('Invalid entry in \'Differences\' array: ' + data); - } - } - } - } else if (isName(encoding)) { - baseEncodingName = encoding.name; - } else { - error('Encoding is not a Name nor a Dict'); - } - // According to table 114 if the encoding is a named encoding it must be - // one of these predefined encodings. - if ((baseEncodingName !== 'MacRomanEncoding' && - baseEncodingName !== 'MacExpertEncoding' && - baseEncodingName !== 'WinAnsiEncoding')) { - baseEncodingName = null; - } - } - - if (baseEncodingName) { - properties.defaultEncoding = Encodings[baseEncodingName].slice(); - } else { - encoding = (properties.type === 'TrueType' ? - Encodings.WinAnsiEncoding : Encodings.StandardEncoding); - // The Symbolic attribute can be misused for regular fonts - // Heuristic: we have to check if the font is a standard one also - if (!!(properties.flags & FontFlags.Symbolic)) { - encoding = Encodings.MacRomanEncoding; - if (!properties.file) { - if (/Symbol/i.test(properties.name)) { - encoding = Encodings.SymbolSetEncoding; - } else if (/Dingbats/i.test(properties.name)) { - encoding = Encodings.ZapfDingbatsEncoding; - } - } - } - properties.defaultEncoding = encoding; - } - - properties.differences = differences; - properties.baseEncodingName = baseEncodingName; - properties.dict = dict; - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmap, cmapObj = toUnicode; - if (isName(cmapObj)) { - cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - return new ToUnicodeMap(cmap.getMap()); - } else if (isStream(cmapObj)) { - cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - var map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) - // to iterate over all keys. - cmap.forEach(function(charCode, token) { - var str = []; - for (var k = 0; k < token.length; k += 2) { - var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCharCode.apply(String, str); - }); - return new ToUnicodeMap(map); - } - return null; - }, - - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); - - // Set encoding 0 to later verify the font has an encoding - var result = []; - for (var j = 0, jj = glyphsData.length; j < jj; j++) { - var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID === 0) { - continue; - } - var code = j >> 1; - result[code] = glyphID; - } - return result; - }, - - extractWidths: function PartialEvaluator_extractWidths(dict, xref, - descriptor, - properties) { - var glyphsWidths = []; - var defaultWidth = 0; - var glyphsVMetrics = []; - var defaultVMetrics; - var i, ii, j, jj, start, code, widths; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - widths = dict.get('W'); - if (widths) { - for (i = 0, ii = widths.length; i < ii; i++) { - start = widths[i++]; - code = xref.fetchIfRef(widths[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsWidths[start++] = code[j]; - } - } else { - var width = widths[++i]; - for (j = start; j <= code; j++) { - glyphsWidths[j] = width; - } - } - } - } - - if (properties.vertical) { - var vmetrics = (dict.get('DW2') || [880, -1000]); - defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; - vmetrics = dict.get('W2'); - if (vmetrics) { - for (i = 0, ii = vmetrics.length; i < ii; i++) { - start = vmetrics[i++]; - code = xref.fetchIfRef(vmetrics[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsVMetrics[start++] = [code[j++], code[j++], code[j]]; - } - } else { - var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]]; - for (j = start; j <= code; j++) { - glyphsVMetrics[j] = vmetric; - } - } - } - } - } - } else { - var firstChar = properties.firstChar; - widths = dict.get('Widths'); - if (widths) { - j = firstChar; - for (i = 0, ii = widths.length; i < ii; i++) { - glyphsWidths[j++] = widths[i]; - } - defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0); - } else { - // Trying get the BaseFont metrics (see comment above). - var baseFontName = dict.get('BaseFont'); - if (isName(baseFontName)) { - var metrics = this.getBaseFontMetrics(baseFontName.name); - - glyphsWidths = this.buildCharCodeToWidth(metrics.widths, - properties); - defaultWidth = metrics.defaultWidth; - } - } - } - - // Heuristic: detection of monospace font by checking all non-zero widths - var isMonospace = true; - var firstWidth = defaultWidth; - for (var glyph in glyphsWidths) { - var glyphWidth = glyphsWidths[glyph]; - if (!glyphWidth) { - continue; - } - if (!firstWidth) { - firstWidth = glyphWidth; - continue; - } - if (firstWidth !== glyphWidth) { - isMonospace = false; - break; - } - } - if (isMonospace) { - properties.flags |= FontFlags.FixedPitch; - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - properties.defaultVMetrics = defaultVMetrics; - properties.vmetrics = glyphsVMetrics; - }, - - isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - return (fontNameWoStyle in serifFonts) || - (fontNameWoStyle.search(/serif/gi) !== -1); - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0; - var widths = []; - var monospace = false; - var lookupName = (stdFontMap[name] || name); - - if (!(lookupName in Metrics)) { - // Use default fonts for looking up font metrics if the passed - // font is not a base font - if (this.isSerifFont(name)) { - lookupName = 'Times-Roman'; - } else { - lookupName = 'Helvetica'; - } - } - var glyphWidths = Metrics[lookupName]; - - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - monospace = true; - } else { - widths = glyphWidths; - } - - return { - defaultWidth: defaultWidth, - monospace: monospace, - widths: widths - }; - }, - - buildCharCodeToWidth: - function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, - properties) { - var widths = Object.create(null); - var differences = properties.differences; - var encoding = properties.defaultEncoding; - for (var charCode = 0; charCode < 256; charCode++) { - if (charCode in differences && - widthsByGlyphName[differences[charCode]]) { - widths[charCode] = widthsByGlyphName[differences[charCode]]; - continue; - } - if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { - widths[charCode] = widthsByGlyphName[encoding[charCode]]; - continue; - } - } - return widths; - }, - - preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { - var baseDict = dict; - var type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - - var composite = false; - var uint8array; - if (type.name === 'Type0') { - // If font is a composite - // - get the descendant font - // - set the type according to the descendant font - // - get the FontDescriptor from the descendant font - var df = dict.get('DescendantFonts'); - if (!df) { - error('Descendant fonts are not specified'); - } - dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df); - - type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - composite = true; - } - - var descriptor = dict.get('FontDescriptor'); - if (descriptor) { - var hash = new MurmurHash3_64(); - var encoding = baseDict.getRaw('Encoding'); - if (isName(encoding)) { - hash.update(encoding.name); - } else if (isRef(encoding)) { - hash.update(encoding.num + '_' + encoding.gen); - } else if (isDict(encoding)) { - var keys = encoding.getKeys(); - for (var i = 0, ii = keys.length; i < ii; i++) { - var entry = encoding.getRaw(keys[i]); - if (isName(entry)) { - hash.update(entry.name); - } else if (isRef(entry)) { - hash.update(entry.num + '_' + entry.gen); - } else if (isArray(entry)) { // 'Differences' entry. - // Ideally we should check the contents of the array, but to avoid - // parsing it here and then again in |extractDataStructures|, - // we only use the array length for now (fixes bug1157493.pdf). - hash.update(entry.length.toString()); - } - } - } - - var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); - if (isStream(toUnicode)) { - var stream = toUnicode.str || toUnicode; - uint8array = stream.buffer ? - new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : - new Uint8Array(stream.bytes.buffer, - stream.start, stream.end - stream.start); - hash.update(uint8array); - - } else if (isName(toUnicode)) { - hash.update(toUnicode.name); - } - - var widths = dict.get('Widths') || baseDict.get('Widths'); - if (widths) { - uint8array = new Uint8Array(new Uint32Array(widths).buffer); - hash.update(uint8array); - } - } - - return { - descriptor: descriptor, - dict: dict, - baseDict: baseDict, - composite: composite, - type: type.name, - hash: hash ? hash.hexdigest() : '' - }; - }, - - translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, - xref) { - var baseDict = preEvaluatedFont.baseDict; - var dict = preEvaluatedFont.dict; - var composite = preEvaluatedFont.composite; - var descriptor = preEvaluatedFont.descriptor; - var type = preEvaluatedFont.type; - var maxCharIndex = (composite ? 0xFFFF : 0xFF); - var properties; - - if (!descriptor) { - if (type === 'Type3') { - // FontDescriptor is only required for Type3 fonts when the document - // is a tagged pdf. Create a barbebones one to get by. - descriptor = new Dict(null); - descriptor.set('FontName', Name.get(type)); - descriptor.set('FontBBox', dict.get('FontBBox')); - } else { - // Before PDF 1.5 if the font was one of the base 14 fonts, having a - // FontDescriptor was not required. - // This case is here for compatibility. - var baseFontName = dict.get('BaseFont'); - if (!isName(baseFontName)) { - error('Base font is not specified'); - } - - // Using base font name as a font name. - baseFontName = baseFontName.name.replace(/[,_]/g, '-'); - var metrics = this.getBaseFontMetrics(baseFontName); - - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - var flags = - (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | - (metrics.monospace ? FontFlags.FixedPitch : 0) | - (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - properties = { - type: type, - name: baseFontName, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - this.extractDataStructures(dict, dict, xref, properties); - properties.widths = this.buildCharCodeToWidth(metrics.widths, - properties); - return new Font(baseFontName, null, properties); - } - } - - // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem - // to ignore this rule when a variant of a standart font is used. - // TODO Fill the width array depending on which of the base font this is - // a variant. - var firstChar = (dict.get('FirstChar') || 0); - var lastChar = (dict.get('LastChar') || maxCharIndex); - - var fontName = descriptor.get('FontName'); - var baseFont = dict.get('BaseFont'); - // Some bad PDFs have a string as the font name. - if (isString(fontName)) { - fontName = Name.get(fontName); - } - if (isString(baseFont)) { - baseFont = Name.get(baseFont); - } - - if (type !== 'Type3') { - var fontNameStr = fontName && fontName.name; - var baseFontStr = baseFont && baseFont.name; - if (fontNameStr !== baseFontStr) { - info('The FontDescriptor\'s FontName is "' + fontNameStr + - '" but should be the same as the Font\'s BaseFont "' + - baseFontStr + '"'); - // Workaround for cases where e.g. fontNameStr = 'Arial' and - // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). - if (fontNameStr && baseFontStr && - baseFontStr.indexOf(fontNameStr) === 0) { - fontName = baseFont; - } - } - } - fontName = (fontName || baseFont); - - assert(isName(fontName), 'invalid font name'); - - var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); - if (fontFile) { - if (fontFile.dict) { - var subtype = fontFile.dict.get('Subtype'); - if (subtype) { - subtype = subtype.name; - } - var length1 = fontFile.dict.get('Length1'); - var length2 = fontFile.dict.get('Length2'); - } - } - - properties = { - type: type, - name: fontName.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - loadedName: baseDict.loadedName, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX), - firstChar: firstChar || 0, - lastChar: (lastChar || maxCharIndex), - bbox: descriptor.get('FontBBox'), - ascent: descriptor.get('Ascent'), - descent: descriptor.get('Descent'), - xHeight: descriptor.get('XHeight'), - capHeight: descriptor.get('CapHeight'), - flags: descriptor.get('Flags'), - italicAngle: descriptor.get('ItalicAngle'), - coded: false - }; - - if (composite) { - var cidEncoding = baseDict.get('Encoding'); - if (isName(cidEncoding)) { - properties.cidEncoding = cidEncoding.name; - } - properties.cMap = CMapFactory.create(cidEncoding, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - properties.vertical = properties.cMap.vertical; - } - this.extractDataStructures(dict, baseDict, xref, properties); - this.extractWidths(dict, xref, descriptor, properties); - - if (type === 'Type3') { - properties.isType3Font = true; - } - - return new Font(fontName.name, fontFile, properties); - } - }; - - return PartialEvaluator; -})(); - -var TranslatedFont = (function TranslatedFontClosure() { - function TranslatedFont(loadedName, font, dict) { - this.loadedName = loadedName; - this.font = font; - this.dict = dict; - this.type3Loaded = null; - this.sent = false; - } - TranslatedFont.prototype = { - send: function (handler) { - if (this.sent) { - return; - } - var fontData = this.font.exportData(); - handler.send('commonobj', [ - this.loadedName, - 'Font', - fontData - ]); - this.sent = true; - }, - loadType3Data: function (evaluator, resources, parentOperatorList, task) { - assert(this.font.isType3Font); - - if (this.type3Loaded) { - return this.type3Loaded; - } - - var translatedFont = this.font; - var loadCharProcsPromise = Promise.resolve(); - var charProcs = this.dict.get('CharProcs').getAll(); - var fontResources = this.dict.get('Resources') || resources; - var charProcKeys = Object.keys(charProcs); - var charProcOperatorList = {}; - for (var i = 0, n = charProcKeys.length; i < n; ++i) { - loadCharProcsPromise = loadCharProcsPromise.then(function (key) { - var glyphStream = charProcs[key]; - var operatorList = new OperatorList(); - return evaluator.getOperatorList(glyphStream, task, fontResources, - operatorList).then(function () { - charProcOperatorList[key] = operatorList.getIR(); - - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - parentOperatorList.addDependencies(operatorList.dependencies); - }, function (reason) { - warn('Type3 font resource \"' + key + '\" is not available'); - var operatorList = new OperatorList(); - charProcOperatorList[key] = operatorList.getIR(); - }); - }.bind(this, charProcKeys[i])); - } - this.type3Loaded = loadCharProcsPromise.then(function () { - translatedFont.charProcOperatorList = charProcOperatorList; - }); - return this.type3Loaded; - } - }; - return TranslatedFont; -})(); - -var OperatorList = (function OperatorListClosure() { - var CHUNK_SIZE = 1000; - var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size - - function getTransfers(queue) { - var transfers = []; - var fnArray = queue.fnArray, argsArray = queue.argsArray; - for (var i = 0, ii = queue.length; i < ii; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - var arg = argsArray[i][0]; // first param in imgData - if (!arg.cached) { - transfers.push(arg.data.buffer); - } - break; - } - } - return transfers; - } - - function OperatorList(intent, messageHandler, pageIndex) { - this.messageHandler = messageHandler; - this.fnArray = []; - this.argsArray = []; - this.dependencies = {}; - this._totalLength = 0; - this.pageIndex = pageIndex; - this.intent = intent; - } - - OperatorList.prototype = { - get length() { - return this.argsArray.length; - }, - - /** - * @returns {number} The total length of the entire operator list, - * since `this.length === 0` after flushing. - */ - get totalLength() { - return (this._totalLength + this.length); - }, - - addOp: function(fn, args) { - this.fnArray.push(fn); - this.argsArray.push(args); - if (this.messageHandler) { - if (this.fnArray.length >= CHUNK_SIZE) { - this.flush(); - } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && - (fn === OPS.restore || fn === OPS.endText)) { - // heuristic to flush on boundary of restore or endText - this.flush(); - } - } - }, - - addDependency: function(dependency) { - if (dependency in this.dependencies) { - return; - } - this.dependencies[dependency] = true; - this.addOp(OPS.dependency, [dependency]); - }, - - addDependencies: function(dependencies) { - for (var key in dependencies) { - this.addDependency(key); - } - }, - - addOpList: function(opList) { - Util.extendObj(this.dependencies, opList.dependencies); - for (var i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - }, - - getIR: function() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - }, - - flush: function(lastChunk) { - if (this.intent !== 'oplist') { - new QueueOptimizer().optimize(this); - } - var transfers = getTransfers(this); - var length = this.length; - this._totalLength += length; - - this.messageHandler.send('RenderPageChunk', { - operatorList: { - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk: lastChunk, - length: length - }, - pageIndex: this.pageIndex, - intent: this.intent - }, transfers); - this.dependencies = {}; - this.fnArray.length = 0; - this.argsArray.length = 0; - } - }; - - return OperatorList; -})(); - -var StateManager = (function StateManagerClosure() { - function StateManager(initialState) { - this.state = initialState; - this.stateStack = []; - } - StateManager.prototype = { - save: function () { - var old = this.state; - this.stateStack.push(this.state); - this.state = old.clone(); - }, - restore: function () { - var prev = this.stateStack.pop(); - if (prev) { - this.state = prev; - } - }, - transform: function (args) { - this.state.ctm = Util.transform(this.state.ctm, args); - } - }; - return StateManager; -})(); - -var TextState = (function TextStateClosure() { - function TextState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontSize = 0; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - - TextState.prototype = { - setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textLineMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - translateTextMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textLineMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { - // 9.4.4 Text Space Details - var tsm = [this.fontSize * this.textHScale, 0, - 0, this.fontSize, - 0, this.textRise]; - return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); - }, - carriageReturn: function TextState_carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - }, - clone: function TextState_clone() { - var clone = Object.create(this); - clone.textMatrix = this.textMatrix.slice(); - clone.textLineMatrix = this.textLineMatrix.slice(); - clone.fontMatrix = this.fontMatrix.slice(); - return clone; - } - }; - return TextState; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; - } - EvalState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - }; - return EvalState; -})(); - -var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { - // Specifies properties for each command - // - // If variableArgs === true: [0, `numArgs`] expected - // If variableArgs === false: exactly `numArgs` expected - var OP_MAP = { - // Graphic state - w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }, - J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false }, - j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }, - M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }, - d: { id: OPS.setDash, numArgs: 2, variableArgs: false }, - ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }, - i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false }, - gs: { id: OPS.setGState, numArgs: 1, variableArgs: false }, - q: { id: OPS.save, numArgs: 0, variableArgs: false }, - Q: { id: OPS.restore, numArgs: 0, variableArgs: false }, - cm: { id: OPS.transform, numArgs: 6, variableArgs: false }, - - // Path - m: { id: OPS.moveTo, numArgs: 2, variableArgs: false }, - l: { id: OPS.lineTo, numArgs: 2, variableArgs: false }, - c: { id: OPS.curveTo, numArgs: 6, variableArgs: false }, - v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false }, - y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false }, - h: { id: OPS.closePath, numArgs: 0, variableArgs: false }, - re: { id: OPS.rectangle, numArgs: 4, variableArgs: false }, - S: { id: OPS.stroke, numArgs: 0, variableArgs: false }, - s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false }, - f: { id: OPS.fill, numArgs: 0, variableArgs: false }, - F: { id: OPS.fill, numArgs: 0, variableArgs: false }, - 'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false }, - B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false }, - 'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }, - b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }, - 'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }, - n: { id: OPS.endPath, numArgs: 0, variableArgs: false }, - - // Clipping - W: { id: OPS.clip, numArgs: 0, variableArgs: false }, - 'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false }, - - // Text - BT: { id: OPS.beginText, numArgs: 0, variableArgs: false }, - ET: { id: OPS.endText, numArgs: 0, variableArgs: false }, - Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }, - Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }, - Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false }, - TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false }, - Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false }, - Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }, - Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false }, - Td: { id: OPS.moveText, numArgs: 2, variableArgs: false }, - TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }, - Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }, - 'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false }, - Tj: { id: OPS.showText, numArgs: 1, variableArgs: false }, - TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }, - '\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }, - '"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3, - variableArgs: false }, - - // Type3 fonts - d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }, - d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false }, - - // Color - CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }, - cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }, - SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }, - SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }, - sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true }, - scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }, - G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }, - g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false }, - RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }, - rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }, - K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }, - k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }, - - // Shading - sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false }, - - // Images - BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }, - ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false }, - EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }, - - // XObjects - Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false }, - MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false }, - DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false }, - BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }, - BDC: { id: OPS.beginMarkedContentProps, numArgs: 2, - variableArgs: false }, - EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }, - - // Compatibility - BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false }, - EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false }, - - // (reserved partial commands for the lexer) - BM: null, - BD: null, - 'true': null, - fa: null, - fal: null, - fals: null, - 'false': null, - nu: null, - nul: null, - 'null': null - }; - - function EvaluatorPreprocessor(stream, xref, stateManager) { - // TODO(mduan): pass array of knownCommands rather than OP_MAP - // dictionary - this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref); - this.stateManager = stateManager; - this.nonProcessedArgs = []; - } - - EvaluatorPreprocessor.prototype = { - get savedStatesDepth() { - return this.stateManager.stateStack.length; - }, - - // |operation| is an object with two fields: - // - // - |fn| is an out param. - // - // - |args| is an inout param. On entry, it should have one of two values. - // - // - An empty array. This indicates that the caller is providing the - // array in which the args will be stored in. The caller should use - // this value if it can reuse a single array for each call to read(). - // - // - |null|. This indicates that the caller needs this function to create - // the array in which any args are stored in. If there are zero args, - // this function will leave |operation.args| as |null| (thus avoiding - // allocations that would occur if we used an empty array to represent - // zero arguments). Otherwise, it will replace |null| with a new array - // containing the arguments. The caller should use this value if it - // cannot reuse an array for each call to read(). - // - // These two modes are present because this function is very hot and so - // avoiding allocations where possible is worthwhile. - // - read: function EvaluatorPreprocessor_read(operation) { - var args = operation.args; - while (true) { - var obj = this.parser.getObj(); - if (isCmd(obj)) { - var cmd = obj.cmd; - // Check that the command is valid - var opSpec = OP_MAP[cmd]; - if (!opSpec) { - warn('Unknown command "' + cmd + '"'); - continue; - } - - var fn = opSpec.id; - var numArgs = opSpec.numArgs; - var argsLength = args !== null ? args.length : 0; - - if (!opSpec.variableArgs) { - // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf - if (argsLength !== numArgs) { - var nonProcessedArgs = this.nonProcessedArgs; - while (argsLength > numArgs) { - nonProcessedArgs.push(args.shift()); - argsLength--; - } - while (argsLength < numArgs && nonProcessedArgs.length !== 0) { - if (!args) { - args = []; - } - args.unshift(nonProcessedArgs.pop()); - argsLength++; - } - } - - if (argsLength < numArgs) { - // If we receive too few args, it's not possible to possible - // to execute the command, so skip the command - info('Command ' + fn + ': because expected ' + - numArgs + ' args, but received ' + argsLength + - ' args; skipping'); - args = null; - continue; - } - } else if (argsLength > numArgs) { - info('Command ' + fn + ': expected [0,' + numArgs + - '] args, but received ' + argsLength + ' args'); - } - - // TODO figure out how to type-check vararg functions - this.preprocessCommand(fn, args); - - operation.fn = fn; - operation.args = args; - return true; - } else { - if (isEOF(obj)) { - return false; // no more commands - } - // argument - if (obj !== null) { - if (!args) { - args = []; - } - args.push((obj instanceof Dict ? obj.getAll() : obj)); - assert(args.length <= 33, 'Too many arguments'); - } - } - } - }, - - preprocessCommand: - function EvaluatorPreprocessor_preprocessCommand(fn, args) { - switch (fn | 0) { - case OPS.save: - this.stateManager.save(); - break; - case OPS.restore: - this.stateManager.restore(); - break; - case OPS.transform: - this.stateManager.transform(args); - break; - } - } - }; - return EvaluatorPreprocessor; -})(); - -var QueueOptimizer = (function QueueOptimizerClosure() { - function addState(parentState, pattern, fn) { - var state = parentState; - for (var i = 0, ii = pattern.length - 1; i < ii; i++) { - var item = pattern[i]; - state = (state[item] || (state[item] = [])); - } - state[pattern[pattern.length - 1]] = fn; - } - - function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray) { - // Handles special case of mainly LaTeX documents which use image masks to - // draw lines with the current fill style. - // 'count' groups of (save, transform, paintImageMaskXObject, restore)+ - // have been found at iFirstSave. - var iFirstPIMXO = iFirstSave + 2; - for (var i = 0; i < count; i++) { - var arg = argsArray[iFirstPIMXO + 4 * i]; - var imageMask = arg.length === 1 && arg[0]; - if (imageMask && imageMask.width === 1 && imageMask.height === 1 && - (!imageMask.data.length || - (imageMask.data.length === 1 && imageMask.data[0] === 0))) { - fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; - continue; - } - break; - } - return count - i; - } - - var InitialState = []; - - // This replaces (save, transform, paintInlineImageXObject, restore)+ - // sequences with one |paintInlineImageXObjectGroup| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], - function foundInlineImageGroup(context) { - var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - var MAX_WIDTH = 1000; - var IMAGE_PADDING = 1; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIIXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintInlineImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, - MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i; - } - - // assuming that heights of those image is too small (~1 pixel) - // packing as much as possible by lines - var maxX = 0; - var map = [], maxLineHeight = 0; - var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; - var q; - for (q = 0; q < count; q++) { - var transform = argsArray[iFirstTransform + (q << 2)]; - var img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - // starting new line - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform: transform, - x: currentX, y: currentY, - w: img.width, h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - var imgData = new Uint8Array(imgWidth * imgHeight * 4); - var imgRowSize = imgWidth << 2; - for (q = 0; q < count; q++) { - var data = argsArray[iFirstPIIXO + (q << 2)][0].data; - // Copy image by lines and extends pixels into padding. - var rowSize = map[q].w << 2; - var dataOffset = 0; - var offset = (map[q].x + map[q].y * imgWidth) << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (var k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, - [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP, - data: imgData }, map]); - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageMaskXObject, restore)+ - // sequences with one |paintImageMaskXObjectGroup| or one - // |paintImageMaskXObjectRepeat| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], - function foundImageMaskGroup(context) { - var MIN_IMAGES_IN_MASKS_BLOCK = 10; - var MAX_IMAGES_IN_MASKS_BLOCK = 100; - var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIMXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageMaskXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = (i - iFirstSave) / 4; - count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i; - } - - var q; - var isSameImage = false; - var iTransform, transformArgs; - var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - if (argsArray[iFirstTransform][1] === 0 && - argsArray[iFirstTransform][2] === 0) { - isSameImage = true; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - iTransform = iFirstTransform + 4; - var iPIMXO = iFirstPIMXO + 4; - for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || - transformArgs[0] !== firstTransformArg0 || - transformArgs[1] !== 0 || - transformArgs[2] !== 0 || - transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; // different image or transform - } - } - } - - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - var positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, - [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - var images = []; - for (q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ data: maskParams.data, width: maskParams.width, - height: maskParams.height, - transform: transformArgs }); - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageXObject, restore)+ sequences - // with one paintImageXObjectRepeat operation, if the |transform| and - // |paintImageXObjectRepeat| ops are appropriate. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], - function (context) { - var MIN_IMAGES_IN_BLOCK = 3; - var MAX_IMAGES_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIXO = curr - 1; - var iFirstRestore = curr; - - if (argsArray[iFirstTransform][1] !== 0 || - argsArray[iFirstTransform][2] !== 0) { - return iFirstRestore + 1; // transform has the wrong form - } - - // Look for the quartets. - var firstPIXOArg0 = argsArray[iFirstPIXO][0]; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstTransformArg0 || - argsArray[i + 1][1] !== 0 || - argsArray[i + 1][2] !== 0 || - argsArray[i + 1][3] !== firstTransformArg3) { - break; // transforms don't match - } - if (argsArray[i + 2][0] !== firstPIXOArg0) { - break; // images don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i; - } - - // Extract the (x,y) positions from all of the matching transforms. - var positions = new Float32Array(count * 2); - var iTransform = iFirstTransform; - for (var q = 0; q < count; q++, iTransform += 4) { - var transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, - positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - - return iFirstSave + 1; - }); - - // This replaces (beginText, setFont, setTextMatrix, showText, endText)+ - // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+ - // sequences, if the font for each one is the same. - addState(InitialState, - [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], - function (context) { - var MIN_CHARS_IN_BLOCK = 3; - var MAX_CHARS_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstBeginText = curr - 4; - var iFirstSetFont = curr - 3; - var iFirstSetTextMatrix = curr - 2; - var iFirstShowText = curr - 1; - var iFirstEndText = curr; - - // Look for the quintets. - var firstSetFontArg0 = argsArray[iFirstSetFont][0]; - var firstSetFontArg1 = argsArray[iFirstSetFont][1]; - var i = iFirstBeginText + 5; - var ii = fnArray.length; - while (i + 4 < ii) { - if (fnArray[i] !== OPS.beginText || - fnArray[i + 1] !== OPS.setFont || - fnArray[i + 2] !== OPS.setTextMatrix || - fnArray[i + 3] !== OPS.showText || - fnArray[i + 4] !== OPS.endText) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstSetFontArg0 || - argsArray[i + 1][1] !== firstSetFontArg1) { - break; // fonts don't match - } - i += 5; - } - - // At this point, i is the index of the first op past the last valid - // quintet. - var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i; - } - - // If the preceding quintet is (, setFont, setTextMatrix, - // showText, endText), include that as well. (E.g. might be - // |dependency|.) - var iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && - fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && - fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && - fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && - fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && - argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && - argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - - // Remove (endText, beginText, setFont) trios. - var iEndText = iFirst + 4; - for (var q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - - return iEndText + 1; - }); - - function QueueOptimizer() {} - - QueueOptimizer.prototype = { - optimize: function QueueOptimizer_optimize(queue) { - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var context = { - iCurr: 0, - fnArray: fnArray, - argsArray: argsArray - }; - var state; - var i = 0, ii = fnArray.length; - while (i < ii) { - state = (state || InitialState)[fnArray[i]]; - if (typeof state === 'function') { // we found some handler - context.iCurr = i; - // state() returns the index of the first non-matching op (if we - // didn't match) or the first op past the modified ops (if we did - // match and replace). - i = state(context); - state = undefined; // reset the state machine - ii = context.fnArray.length; - } else { - i++; - } - } - } - }; - return QueueOptimizer; -})(); - - -var BUILT_IN_CMAPS = [ -// << Start unicode maps. -'Adobe-GB1-UCS2', -'Adobe-CNS1-UCS2', -'Adobe-Japan1-UCS2', -'Adobe-Korea1-UCS2', -// >> End unicode maps. -'78-EUC-H', -'78-EUC-V', -'78-H', -'78-RKSJ-H', -'78-RKSJ-V', -'78-V', -'78ms-RKSJ-H', -'78ms-RKSJ-V', -'83pv-RKSJ-H', -'90ms-RKSJ-H', -'90ms-RKSJ-V', -'90msp-RKSJ-H', -'90msp-RKSJ-V', -'90pv-RKSJ-H', -'90pv-RKSJ-V', -'Add-H', -'Add-RKSJ-H', -'Add-RKSJ-V', -'Add-V', -'Adobe-CNS1-0', -'Adobe-CNS1-1', -'Adobe-CNS1-2', -'Adobe-CNS1-3', -'Adobe-CNS1-4', -'Adobe-CNS1-5', -'Adobe-CNS1-6', -'Adobe-GB1-0', -'Adobe-GB1-1', -'Adobe-GB1-2', -'Adobe-GB1-3', -'Adobe-GB1-4', -'Adobe-GB1-5', -'Adobe-Japan1-0', -'Adobe-Japan1-1', -'Adobe-Japan1-2', -'Adobe-Japan1-3', -'Adobe-Japan1-4', -'Adobe-Japan1-5', -'Adobe-Japan1-6', -'Adobe-Korea1-0', -'Adobe-Korea1-1', -'Adobe-Korea1-2', -'B5-H', -'B5-V', -'B5pc-H', -'B5pc-V', -'CNS-EUC-H', -'CNS-EUC-V', -'CNS1-H', -'CNS1-V', -'CNS2-H', -'CNS2-V', -'ETHK-B5-H', -'ETHK-B5-V', -'ETen-B5-H', -'ETen-B5-V', -'ETenms-B5-H', -'ETenms-B5-V', -'EUC-H', -'EUC-V', -'Ext-H', -'Ext-RKSJ-H', -'Ext-RKSJ-V', -'Ext-V', -'GB-EUC-H', -'GB-EUC-V', -'GB-H', -'GB-V', -'GBK-EUC-H', -'GBK-EUC-V', -'GBK2K-H', -'GBK2K-V', -'GBKp-EUC-H', -'GBKp-EUC-V', -'GBT-EUC-H', -'GBT-EUC-V', -'GBT-H', -'GBT-V', -'GBTpc-EUC-H', -'GBTpc-EUC-V', -'GBpc-EUC-H', -'GBpc-EUC-V', -'H', -'HKdla-B5-H', -'HKdla-B5-V', -'HKdlb-B5-H', -'HKdlb-B5-V', -'HKgccs-B5-H', -'HKgccs-B5-V', -'HKm314-B5-H', -'HKm314-B5-V', -'HKm471-B5-H', -'HKm471-B5-V', -'HKscs-B5-H', -'HKscs-B5-V', -'Hankaku', -'Hiragana', -'KSC-EUC-H', -'KSC-EUC-V', -'KSC-H', -'KSC-Johab-H', -'KSC-Johab-V', -'KSC-V', -'KSCms-UHC-H', -'KSCms-UHC-HW-H', -'KSCms-UHC-HW-V', -'KSCms-UHC-V', -'KSCpc-EUC-H', -'KSCpc-EUC-V', -'Katakana', -'NWP-H', -'NWP-V', -'RKSJ-H', -'RKSJ-V', -'Roman', -'UniCNS-UCS2-H', -'UniCNS-UCS2-V', -'UniCNS-UTF16-H', -'UniCNS-UTF16-V', -'UniCNS-UTF32-H', -'UniCNS-UTF32-V', -'UniCNS-UTF8-H', -'UniCNS-UTF8-V', -'UniGB-UCS2-H', -'UniGB-UCS2-V', -'UniGB-UTF16-H', -'UniGB-UTF16-V', -'UniGB-UTF32-H', -'UniGB-UTF32-V', -'UniGB-UTF8-H', -'UniGB-UTF8-V', -'UniJIS-UCS2-H', -'UniJIS-UCS2-HW-H', -'UniJIS-UCS2-HW-V', -'UniJIS-UCS2-V', -'UniJIS-UTF16-H', -'UniJIS-UTF16-V', -'UniJIS-UTF32-H', -'UniJIS-UTF32-V', -'UniJIS-UTF8-H', -'UniJIS-UTF8-V', -'UniJIS2004-UTF16-H', -'UniJIS2004-UTF16-V', -'UniJIS2004-UTF32-H', -'UniJIS2004-UTF32-V', -'UniJIS2004-UTF8-H', -'UniJIS2004-UTF8-V', -'UniJISPro-UCS2-HW-V', -'UniJISPro-UCS2-V', -'UniJISPro-UTF8-V', -'UniJISX0213-UTF32-H', -'UniJISX0213-UTF32-V', -'UniJISX02132004-UTF32-H', -'UniJISX02132004-UTF32-V', -'UniKS-UCS2-H', -'UniKS-UCS2-V', -'UniKS-UTF16-H', -'UniKS-UTF16-V', -'UniKS-UTF32-H', -'UniKS-UTF32-V', -'UniKS-UTF8-H', -'UniKS-UTF8-V', -'V', -'WP-Symbol']; - -// CMap, not to be confused with TrueType's cmap. -var CMap = (function CMapClosure() { - function CMap(builtInCMap) { - // Codespace ranges are stored as follows: - // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]] - // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] - this.codespaceRanges = [[], [], [], []]; - this.numCodespaceRanges = 0; - // Map entries have one of two forms. - // - cid chars are 16-bit unsigned integers, stored as integers. - // - bf chars are variable-length byte sequences, stored as strings, with - // one byte per character. - this._map = []; - this.name = ''; - this.vertical = false; - this.useCMap = null; - this.builtInCMap = builtInCMap; - } - CMap.prototype = { - addCodespaceRange: function(n, low, high) { - this.codespaceRanges[n - 1].push(low, high); - this.numCodespaceRanges++; - }, - - mapCidRange: function(low, high, dstLow) { - while (low <= high) { - this._map[low++] = dstLow++; - } - }, - - mapBfRange: function(low, high, dstLow) { - var lastByte = dstLow.length - 1; - while (low <= high) { - this._map[low++] = dstLow; - // Only the last byte has to be incremented. - dstLow = dstLow.substr(0, lastByte) + - String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); - } - }, - - mapBfRangeToArray: function(low, high, array) { - var i = 0, ii = array.length; - while (low <= high && i < ii) { - this._map[low] = array[i++]; - ++low; - } - }, - - // This is used for both bf and cid chars. - mapOne: function(src, dst) { - this._map[src] = dst; - }, - - lookup: function(code) { - return this._map[code]; - }, - - contains: function(code) { - return this._map[code] !== undefined; - }, - - forEach: function(callback) { - // Most maps have fewer than 65536 entries, and for those we use normal - // array iteration. But really sparse tables are possible -- e.g. with - // indices in the *billions*. For such tables we use for..in, which isn't - // ideal because it stringifies the indices for all present elements, but - // it does avoid iterating over every undefined entry. - var map = this._map; - var length = map.length; - var i; - if (length <= 0x10000) { - for (i = 0; i < length; i++) { - if (map[i] !== undefined) { - callback(i, map[i]); - } - } - } else { - for (i in this._map) { - callback(i, map[i]); - } - } - }, - - charCodeOf: function(value) { - return this._map.indexOf(value); - }, - - getMap: function() { - return this._map; - }, - - readCharCode: function(str, offset, out) { - var c = 0; - var codespaceRanges = this.codespaceRanges; - var codespaceRangesLen = this.codespaceRanges.length; - // 9.7.6.2 CMap Mapping - // The code length is at most 4. - for (var n = 0; n < codespaceRangesLen; n++) { - c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0; - // Check each codespace range to see if it falls within. - var codespaceRange = codespaceRanges[n]; - for (var k = 0, kk = codespaceRange.length; k < kk;) { - var low = codespaceRange[k++]; - var high = codespaceRange[k++]; - if (c >= low && c <= high) { - out.charcode = c; - out.length = n + 1; - return; - } - } - } - out.charcode = 0; - out.length = 1; - }, - - get length() { - return this._map.length; - }, - - get isIdentityCMap() { - if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) { - return false; - } - if (this._map.length !== 0x10000) { - return false; - } - for (var i = 0; i < 0x10000; i++) { - if (this._map[i] !== i) { - return false; - } - } - return true; - } - }; - return CMap; -})(); - -// A special case of CMap, where the _map array implicitly has a length of -// 65536 and each element is equal to its index. -var IdentityCMap = (function IdentityCMapClosure() { - function IdentityCMap(vertical, n) { - CMap.call(this); - this.vertical = vertical; - this.addCodespaceRange(n, 0, 0xffff); - } - Util.inherit(IdentityCMap, CMap, {}); - - IdentityCMap.prototype = { - addCodespaceRange: CMap.prototype.addCodespaceRange, - - mapCidRange: function(low, high, dstLow) { - error('should not call mapCidRange'); - }, - - mapBfRange: function(low, high, dstLow) { - error('should not call mapBfRange'); - }, - - mapBfRangeToArray: function(low, high, array) { - error('should not call mapBfRangeToArray'); - }, - - mapOne: function(src, dst) { - error('should not call mapCidOne'); - }, - - lookup: function(code) { - return (isInt(code) && code <= 0xffff) ? code : undefined; - }, - - contains: function(code) { - return isInt(code) && code <= 0xffff; - }, - - forEach: function(callback) { - for (var i = 0; i <= 0xffff; i++) { - callback(i, i); - } - }, - - charCodeOf: function(value) { - return (isInt(value) && value <= 0xffff) ? value : -1; - }, - - getMap: function() { - // Sometimes identity maps must be instantiated, but it's rare. - var map = new Array(0x10000); - for (var i = 0; i <= 0xffff; i++) { - map[i] = i; - } - return map; - }, - - readCharCode: CMap.prototype.readCharCode, - - get length() { - return 0x10000; - }, - - get isIdentityCMap() { - error('should not access .isIdentityCMap'); - } - }; - - return IdentityCMap; -})(); - -var BinaryCMapReader = (function BinaryCMapReaderClosure() { - function fetchBinaryData(url) { - var nonBinaryRequest = PDFJS.disableWorker; - var request = new XMLHttpRequest(); - request.open('GET', url, false); - if (!nonBinaryRequest) { - try { - request.responseType = 'arraybuffer'; - nonBinaryRequest = request.responseType !== 'arraybuffer'; - } catch (e) { - nonBinaryRequest = true; - } - } - if (nonBinaryRequest && request.overrideMimeType) { - request.overrideMimeType('text/plain; charset=x-user-defined'); - } - request.send(null); - if (nonBinaryRequest ? !request.responseText : !request.response) { - error('Unable to get binary cMap at: ' + url); - } - if (nonBinaryRequest) { - var data = Array.prototype.map.call(request.responseText, function (ch) { - return ch.charCodeAt(0) & 255; - }); - return new Uint8Array(data); - } - return new Uint8Array(request.response); - } - - function hexToInt(a, size) { - var n = 0; - for (var i = 0; i <= size; i++) { - n = (n << 8) | a[i]; - } - return n >>> 0; - } - - function hexToStr(a, size) { - // This code is hot. Special-case some common values to avoid creating an - // object with subarray(). - if (size === 1) { - return String.fromCharCode(a[0], a[1]); - } - if (size === 3) { - return String.fromCharCode(a[0], a[1], a[2], a[3]); - } - return String.fromCharCode.apply(null, a.subarray(0, size + 1)); - } - - function addHex(a, b, size) { - var c = 0; - for (var i = size; i >= 0; i--) { - c += a[i] + b[i]; - a[i] = c & 255; - c >>= 8; - } - } - - function incHex(a, size) { - var c = 1; - for (var i = size; i >= 0 && c > 0; i--) { - c += a[i]; - a[i] = c & 255; - c >>= 8; - } - } - - var MAX_NUM_SIZE = 16; - var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8) - - function BinaryCMapStream(data) { - this.buffer = data; - this.pos = 0; - this.end = data.length; - this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); - } - - BinaryCMapStream.prototype = { - readByte: function () { - if (this.pos >= this.end) { - return -1; - } - return this.buffer[this.pos++]; - }, - readNumber: function () { - var n = 0; - var last; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - n = (n << 7) | (b & 0x7F); - } while (!last); - return n; - }, - readSigned: function () { - var n = this.readNumber(); - return (n & 1) ? ~(n >>> 1) : n >>> 1; - }, - readHex: function (num, size) { - num.set(this.buffer.subarray(this.pos, - this.pos + size + 1)); - this.pos += size + 1; - }, - readHexNumber: function (num, size) { - var last; - var stack = this.tmpBuf, sp = 0; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - stack[sp++] = b & 0x7F; - } while (!last); - var i = size, buffer = 0, bufferSize = 0; - while (i >= 0) { - while (bufferSize < 8 && stack.length > 0) { - buffer = (stack[--sp] << bufferSize) | buffer; - bufferSize += 7; - } - num[i] = buffer & 255; - i--; - buffer >>= 8; - bufferSize -= 8; - } - }, - readHexSigned: function (num, size) { - this.readHexNumber(num, size); - var sign = num[size] & 1 ? 255 : 0; - var c = 0; - for (var i = 0; i <= size; i++) { - c = ((c & 1) << 8) | num[i]; - num[i] = (c >> 1) ^ sign; - } - }, - readString: function () { - var len = this.readNumber(); - var s = ''; - for (var i = 0; i < len; i++) { - s += String.fromCharCode(this.readNumber()); - } - return s; - } - }; - - function processBinaryCMap(url, cMap, extend) { - var data = fetchBinaryData(url); - var stream = new BinaryCMapStream(data); - - var header = stream.readByte(); - cMap.vertical = !!(header & 1); - - var useCMap = null; - var start = new Uint8Array(MAX_NUM_SIZE); - var end = new Uint8Array(MAX_NUM_SIZE); - var char = new Uint8Array(MAX_NUM_SIZE); - var charCode = new Uint8Array(MAX_NUM_SIZE); - var tmp = new Uint8Array(MAX_NUM_SIZE); - var code; - - var b; - while ((b = stream.readByte()) >= 0) { - var type = b >> 5; - if (type === 7) { // metadata, e.g. comment or usecmap - switch (b & 0x1F) { - case 0: - stream.readString(); // skipping comment - break; - case 1: - useCMap = stream.readString(); - break; - } - continue; - } - var sequence = !!(b & 0x10); - var dataSize = b & 15; - - assert(dataSize + 1 <= MAX_NUM_SIZE); - - var ucs2DataSize = 1; - var subitemsCount = stream.readNumber(); - var i; - switch (type) { - case 0: // codespacerange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - } - break; - case 1: // notdefrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // undefined range, skipping - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // nop - } - break; - case 2: // cidchar - stream.readHex(char, dataSize); - code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); - for (i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); - if (!sequence) { - stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); - } - code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); - } - break; - case 3: // cidrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - if (!sequence) { - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - } - break; - case 4: // bfchar - stream.readHex(char, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); - } - incHex(charCode, dataSize); - stream.readHexSigned(tmp, dataSize); - addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - case 5: // bfrange - stream.readHex(start, ucs2DataSize); - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(start, ucs2DataSize); - addHex(start, end, ucs2DataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - default: - error('Unknown type: ' + type); - break; - } - } - - if (useCMap) { - extend(useCMap); - } - return cMap; - } - - function BinaryCMapReader() {} - - BinaryCMapReader.prototype = { - read: processBinaryCMap - }; - - return BinaryCMapReader; -})(); - -var CMapFactory = (function CMapFactoryClosure() { - function strToInt(str) { - var a = 0; - for (var i = 0; i < str.length; i++) { - a = (a << 8) | str.charCodeAt(i); - } - return a >>> 0; - } - - function expectString(obj) { - if (!isString(obj)) { - error('Malformed CMap: expected string.'); - } - } - - function expectInt(obj) { - if (!isInt(obj)) { - error('Malformed CMap: expected int.'); - } - } - - function parseBfChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - // TODO are /dstName used? - expectString(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseBfRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - if (isInt(obj) || isString(obj)) { - var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj; - cMap.mapBfRange(low, high, dstLow); - } else if (isCmd(obj, '[')) { - obj = lexer.getObj(); - var array = []; - while (!isCmd(obj, ']') && !isEOF(obj)) { - array.push(obj); - obj = lexer.getObj(); - } - cMap.mapBfRangeToArray(low, high, array); - } else { - break; - } - } - error('Invalid bf range.'); - } - - function parseCidChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseCidRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dstLow = obj; - cMap.mapCidRange(low, high, dstLow); - } - } - - function parseCodespaceRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcodespacerange')) { - return; - } - if (!isString(obj)) { - break; - } - var low = strToInt(obj); - obj = lexer.getObj(); - if (!isString(obj)) { - break; - } - var high = strToInt(obj); - cMap.addCodespaceRange(obj.length, low, high); - } - error('Invalid codespace range.'); - } - - function parseWMode(cMap, lexer) { - var obj = lexer.getObj(); - if (isInt(obj)) { - cMap.vertical = !!obj; - } - } - - function parseCMapName(cMap, lexer) { - var obj = lexer.getObj(); - if (isName(obj) && isString(obj.name)) { - cMap.name = obj.name; - } - } - - function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { - var previous; - var embededUseCMap; - objLoop: while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } else if (isName(obj)) { - if (obj.name === 'WMode') { - parseWMode(cMap, lexer); - } else if (obj.name === 'CMapName') { - parseCMapName(cMap, lexer); - } - previous = obj; - } else if (isCmd(obj)) { - switch (obj.cmd) { - case 'endcmap': - break objLoop; - case 'usecmap': - if (isName(previous)) { - embededUseCMap = previous.name; - } - break; - case 'begincodespacerange': - parseCodespaceRange(cMap, lexer); - break; - case 'beginbfchar': - parseBfChar(cMap, lexer); - break; - case 'begincidchar': - parseCidChar(cMap, lexer); - break; - case 'beginbfrange': - parseBfRange(cMap, lexer); - break; - case 'begincidrange': - parseCidRange(cMap, lexer); - break; - } - } - } - - if (!useCMap && embededUseCMap) { - // Load the usecmap definition from the file only if there wasn't one - // specified. - useCMap = embededUseCMap; - } - if (useCMap) { - extendCMap(cMap, builtInCMapParams, useCMap); - } - } - - function extendCMap(cMap, builtInCMapParams, useCMap) { - cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams); - // If there aren't any code space ranges defined clone all the parent ones - // into this cMap. - if (cMap.numCodespaceRanges === 0) { - var useCodespaceRanges = cMap.useCMap.codespaceRanges; - for (var i = 0; i < useCodespaceRanges.length; i++) { - cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); - } - cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; - } - // Merge the map into the current one, making sure not to override - // any previously defined entries. - cMap.useCMap.forEach(function(key, value) { - if (!cMap.contains(key)) { - cMap.mapOne(key, cMap.useCMap.lookup(key)); - } - }); - } - - function parseBinaryCMap(name, builtInCMapParams) { - var url = builtInCMapParams.url + name + '.bcmap'; - var cMap = new CMap(true); - new BinaryCMapReader().read(url, cMap, function (useCMap) { - extendCMap(cMap, builtInCMapParams, useCMap); - }); - return cMap; - } - - function createBuiltInCMap(name, builtInCMapParams) { - if (name === 'Identity-H') { - return new IdentityCMap(false, 2); - } else if (name === 'Identity-V') { - return new IdentityCMap(true, 2); - } - if (BUILT_IN_CMAPS.indexOf(name) === -1) { - error('Unknown cMap name: ' + name); - } - assert(builtInCMapParams, 'built-in cMap parameters are not provided'); - - if (builtInCMapParams.packed) { - return parseBinaryCMap(name, builtInCMapParams); - } - - var request = new XMLHttpRequest(); - var url = builtInCMapParams.url + name; - request.open('GET', url, false); - request.send(null); - if (!request.responseText) { - error('Unable to get cMap at: ' + url); - } - var cMap = new CMap(true); - var lexer = new Lexer(new StringStream(request.responseText)); - parseCMap(cMap, lexer, builtInCMapParams, null); - return cMap; - } - - return { - create: function (encoding, builtInCMapParams, useCMap) { - if (isName(encoding)) { - return createBuiltInCMap(encoding.name, builtInCMapParams); - } else if (isStream(encoding)) { - var cMap = new CMap(); - var lexer = new Lexer(encoding); - try { - parseCMap(cMap, lexer, builtInCMapParams, useCMap); - } catch (e) { - warn('Invalid CMap data. ' + e); - } - if (cMap.isIdentityCMap) { - return createBuiltInCMap(cMap.name, builtInCMapParams); - } - return cMap; - } - error('Encoding required.'); - } - }; -})(); - - -// Unicode Private Use Area -var PRIVATE_USE_OFFSET_START = 0xE000; -var PRIVATE_USE_OFFSET_END = 0xF8FF; -var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false; - -// PDF Glyph Space Units are one Thousandth of a TextSpace Unit -// except for Type 3 fonts -var PDF_GLYPH_SPACE_UNITS = 1000; - -// Hinting is currently disabled due to unknown problems on windows -// in tracemonkey and various other pdfs with type1 fonts. -var HINTING_ENABLED = false; - -// Accented charactars are not displayed properly on windows, using this flag -// to control analysis of seac charstrings. -var SEAC_ANALYSIS_ENABLED = false; - -var FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; - -var Encodings = { - ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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'], - MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', - 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', - 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', - 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', - 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', - 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', - 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', - 'Circumflexsmall', 'hypheninferior', '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', '', '', 'asuperior', 'centsuperior', '', '', '', '', - 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', - 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', - 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', - 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', - 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', - 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', - 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', - 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', - 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', - 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', - 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', - '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', - 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', - 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', - 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', - 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', - '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', - 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', - 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'], - MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', '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', 'grave', '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', '', - 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', - 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', - 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', - 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', - 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', - 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', - 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', - 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', - 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', - 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', - 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', - 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', - 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', - 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', - 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', - 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', - 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', - 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', - 'ogonek', 'caron'], - StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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'], - WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', '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', 'grave', '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', - 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', - 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', - 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', - 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', - 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', - 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', - 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', - 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', - 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', - 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', - 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', - 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', - 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', - 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', - 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', - 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', - 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', - 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', - 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', - 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', - 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', - 'ydieresis'], - SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', - 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', - 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', - 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', - 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', - 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', - 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', - 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', - 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', - 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', - 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', - 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', - 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', - 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', - 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', - 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', - 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', - 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', - 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', - 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', - 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', - 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', - 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', - 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', - 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', - 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', - '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', - 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', - 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', - 'bracerightbt'], - ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', - 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', - 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', - 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', - 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', - 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', - 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', - 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', - 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', - 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', - 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', - 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', - 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', - 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', - 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', - 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', - 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', - 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', - 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', - 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', - 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191'] -}; - -/** - * Hold a map of decoded fonts and of the standard fourteen Type1 - * fonts and their acronyms. - */ -var stdFontMap = { - 'ArialNarrow': 'Helvetica', - 'ArialNarrow-Bold': 'Helvetica-Bold', - 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique', - 'ArialNarrow-Italic': 'Helvetica-Oblique', - 'ArialBlack': 'Helvetica', - 'ArialBlack-Bold': 'Helvetica-Bold', - 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique', - 'ArialBlack-Italic': 'Helvetica-Oblique', - 'Arial': 'Helvetica', - 'Arial-Bold': 'Helvetica-Bold', - 'Arial-BoldItalic': 'Helvetica-BoldOblique', - 'Arial-Italic': 'Helvetica-Oblique', - 'Arial-BoldItalicMT': 'Helvetica-BoldOblique', - 'Arial-BoldMT': 'Helvetica-Bold', - 'Arial-ItalicMT': 'Helvetica-Oblique', - 'ArialMT': 'Helvetica', - 'Courier-Bold': 'Courier-Bold', - 'Courier-BoldItalic': 'Courier-BoldOblique', - 'Courier-Italic': 'Courier-Oblique', - 'CourierNew': 'Courier', - 'CourierNew-Bold': 'Courier-Bold', - 'CourierNew-BoldItalic': 'Courier-BoldOblique', - 'CourierNew-Italic': 'Courier-Oblique', - 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique', - 'CourierNewPS-BoldMT': 'Courier-Bold', - 'CourierNewPS-ItalicMT': 'Courier-Oblique', - 'CourierNewPSMT': 'Courier', - 'Helvetica': 'Helvetica', - 'Helvetica-Bold': 'Helvetica-Bold', - 'Helvetica-BoldItalic': 'Helvetica-BoldOblique', - 'Helvetica-BoldOblique': 'Helvetica-BoldOblique', - 'Helvetica-Italic': 'Helvetica-Oblique', - 'Helvetica-Oblique':'Helvetica-Oblique', - 'Symbol-Bold': 'Symbol', - 'Symbol-BoldItalic': 'Symbol', - 'Symbol-Italic': 'Symbol', - 'TimesNewRoman': 'Times-Roman', - 'TimesNewRoman-Bold': 'Times-Bold', - 'TimesNewRoman-BoldItalic': 'Times-BoldItalic', - 'TimesNewRoman-Italic': 'Times-Italic', - 'TimesNewRomanPS': 'Times-Roman', - 'TimesNewRomanPS-Bold': 'Times-Bold', - 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldMT': 'Times-Bold', - 'TimesNewRomanPS-Italic': 'Times-Italic', - 'TimesNewRomanPS-ItalicMT': 'Times-Italic', - 'TimesNewRomanPSMT': 'Times-Roman', - 'TimesNewRomanPSMT-Bold': 'Times-Bold', - 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPSMT-Italic': 'Times-Italic' -}; - -/** - * Holds the map of the non-standard fonts that might be included as a standard - * fonts without glyph data. - */ -var nonStdFontMap = { - 'CenturyGothic': 'Helvetica', - 'CenturyGothic-Bold': 'Helvetica-Bold', - 'CenturyGothic-BoldItalic': 'Helvetica-BoldOblique', - 'CenturyGothic-Italic': 'Helvetica-Oblique', - 'ComicSansMS': 'Comic Sans MS', - 'ComicSansMS-Bold': 'Comic Sans MS-Bold', - 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic', - 'ComicSansMS-Italic': 'Comic Sans MS-Italic', - 'LucidaConsole': 'Courier', - 'LucidaConsole-Bold': 'Courier-Bold', - 'LucidaConsole-BoldItalic': 'Courier-BoldOblique', - 'LucidaConsole-Italic': 'Courier-Oblique', - 'MS-Gothic': 'MS Gothic', - 'MS-Gothic-Bold': 'MS Gothic-Bold', - 'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic', - 'MS-Gothic-Italic': 'MS Gothic-Italic', - 'MS-Mincho': 'MS Mincho', - 'MS-Mincho-Bold': 'MS Mincho-Bold', - 'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic', - 'MS-Mincho-Italic': 'MS Mincho-Italic', - 'MS-PGothic': 'MS PGothic', - 'MS-PGothic-Bold': 'MS PGothic-Bold', - 'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic', - 'MS-PGothic-Italic': 'MS PGothic-Italic', - 'MS-PMincho': 'MS PMincho', - 'MS-PMincho-Bold': 'MS PMincho-Bold', - 'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic', - 'MS-PMincho-Italic': 'MS PMincho-Italic', - 'Wingdings': 'ZapfDingbats' -}; - -var serifFonts = { - 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true, - 'Aldus': true, 'Alexandria': true, 'Algerian': true, - 'American Typewriter': true, 'Antiqua': true, 'Apex': true, - 'Arno': true, 'Aster': true, 'Aurora': true, - 'Baskerville': true, 'Bell': true, 'Bembo': true, - 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true, - 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true, - 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true, - 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true, - 'Calvert': true, 'Capitals': true, 'Cambria': true, - 'Cartier': true, 'Caslon': true, 'Catull': true, - 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true, - 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true, - 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true, - 'Cochin': true, 'Colonna': true, 'Computer Modern': true, - 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true, - 'Corona': true, 'Ecotype': true, 'Egyptienne': true, - 'Elephant': true, 'Excelsior': true, 'Fairfield': true, - 'FF Scala': true, 'Folkard': true, 'Footlight': true, - 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true, - 'Gentium': true, 'Georgia': true, 'Gloucester': true, - 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true, - 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true, - 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true, - 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true, - 'Ionic No. 5': true, 'Janson': true, 'Joanna': true, - 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true, - 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true, - 'Lucida Bright': true, 'Melior': true, 'Memphis': true, - 'Miller': true, 'Minion': true, 'Modern': true, - 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true, - 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true, - 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true, - 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true, - 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true, - 'Requiem': true, 'Rockwell': true, 'Roman': true, - 'Rotis Serif': true, 'Sabon': true, 'Scala': true, - 'Seagull': true, 'Sistina': true, 'Souvenir': true, - 'STIX': true, 'Stone Informal': true, 'Stone Serif': true, - 'Sylfaen': true, 'Times': true, 'Trajan': true, - 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true, - 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true, - 'Versailles': true, 'Wanted': true, 'Weiss': true, - 'Wide Latin': true, 'Windsor': true, 'XITS': true -}; - -var symbolsFonts = { - 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true -}; - -// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts -// but does not embed the CID to GID mapping. The mapping is incomplete for all -// glyphs, but common for some set of the standard fonts. -var GlyphMapForStandardFonts = { - '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38, - '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 45, - '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52, - '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894, - '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66, - '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73, - '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80, - '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87, - '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94, - '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101, - '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108, - '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115, - '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122, - '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199, - '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224, - '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233, - '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238, - '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246, - '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224, - '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182, - '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168, - '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804, - '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719, - '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248, - '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776, - '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '223': 711, - '224': 321, '225': 322, '227': 353, '229': 382, '234': 253, '252': 263, - '253': 268, '254': 269, '258': 258, '260': 260, '261': 261, '265': 280, - '266': 281, '268': 283, '269': 313, '275': 323, '276': 324, '278': 328, - '284': 345, '285': 346, '286': 347, '292': 367, '295': 377, '296': 378, - '298': 380, '305': 963, - '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359, - '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524, - '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776, - '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782, - '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769, - '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342, - '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363, - '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824, - '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045, - '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753, - '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849, - '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460, - '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467, - '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474, - '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480, - '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487, - '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494, - '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502, - '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509, - '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516, - '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522, - '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529, - '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549, - '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556, - '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290, - '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296, - '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533, - '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595, - '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606, - '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615, - '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884, - '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887, - '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889, - '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892, - '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588, - '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275, - '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799, - '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377 -}; - -// The glyph map for ArialBlack differs slightly from the glyph map used for -// other well-known standard fonts. Hence we use this (incomplete) CID to GID -// mapping to adjust the glyph map for non-embedded ArialBlack fonts. -var SupplementalGlyphMapForArialBlack = { - '227': 322, '264': 261, '291': 346, -}; - -// Some characters, e.g. copyrightserif, are mapped to the private use area and -// might not be displayed using standard fonts. Mapping/hacking well-known chars -// to the similar equivalents in the normal characters range. -var SpecialPUASymbols = { - '63721': 0x00A9, // copyrightsans (0xF8E9) => copyright - '63193': 0x00A9, // copyrightserif (0xF6D9) => copyright - '63720': 0x00AE, // registersans (0xF8E8) => registered - '63194': 0x00AE, // registerserif (0xF6DA) => registered - '63722': 0x2122, // trademarksans (0xF8EA) => trademark - '63195': 0x2122, // trademarkserif (0xF6DB) => trademark - '63729': 0x23A7, // bracelefttp (0xF8F1) - '63730': 0x23A8, // braceleftmid (0xF8F2) - '63731': 0x23A9, // braceleftbt (0xF8F3) - '63740': 0x23AB, // bracerighttp (0xF8FC) - '63741': 0x23AC, // bracerightmid (0xF8FD) - '63742': 0x23AD, // bracerightbt (0xF8FE) - '63726': 0x23A1, // bracketlefttp (0xF8EE) - '63727': 0x23A2, // bracketleftex (0xF8EF) - '63728': 0x23A3, // bracketleftbt (0xF8F0) - '63737': 0x23A4, // bracketrighttp (0xF8F9) - '63738': 0x23A5, // bracketrightex (0xF8FA) - '63739': 0x23A6, // bracketrightbt (0xF8FB) - '63723': 0x239B, // parenlefttp (0xF8EB) - '63724': 0x239C, // parenleftex (0xF8EC) - '63725': 0x239D, // parenleftbt (0xF8ED) - '63734': 0x239E, // parenrighttp (0xF8F6) - '63735': 0x239F, // parenrightex (0xF8F7) - '63736': 0x23A0, // parenrightbt (0xF8F8) -}; -function mapSpecialUnicodeValues(code) { - if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block. - return 0; - } else if (code >= 0xF600 && code <= 0xF8FF) { - return (SpecialPUASymbols[code] || code); - } - return code; -} - -var UnicodeRanges = [ - { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin - { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement - { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A - { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B - { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions - { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters - { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks - { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic - { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic - { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic - { 'begin': 0x0530, 'end': 0x058F }, // Armenian - { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew - { 'begin': 0xA500, 'end': 0xA63F }, // Vai - { 'begin': 0x0600, 'end': 0x06FF }, // Arabic - { 'begin': 0x07C0, 'end': 0x07FF }, // NKo - { 'begin': 0x0900, 'end': 0x097F }, // Devanagari - { 'begin': 0x0980, 'end': 0x09FF }, // Bengali - { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi - { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati - { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya - { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil - { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu - { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada - { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam - { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai - { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao - { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian - { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese - { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo - { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional - { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended - { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation - { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts - { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol - { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols - { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols - { 'begin': 0x2150, 'end': 0x218F }, // Number Forms - { 'begin': 0x2190, 'end': 0x21FF }, // Arrows - { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators - { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical - { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures - { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition - { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics - { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing - { 'begin': 0x2580, 'end': 0x259F }, // Block Elements - { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes - { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols - { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats - { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation - { 'begin': 0x3040, 'end': 0x309F }, // Hiragana - { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana - { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo - { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo - { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa - { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months - { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility - { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables - { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 * - { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia - { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs - { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0) - { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes - { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms - { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A - { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks - { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms - { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants - { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B - { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms - { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials - { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan - { 'begin': 0x0700, 'end': 0x074F }, // Syriac - { 'begin': 0x0780, 'end': 0x07BF }, // Thaana - { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala - { 'begin': 0x1000, 'end': 0x109F }, // Myanmar - { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic - { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee - { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics - { 'begin': 0x1680, 'end': 0x169F }, // Ogham - { 'begin': 0x16A0, 'end': 0x16FF }, // Runic - { 'begin': 0x1780, 'end': 0x17FF }, // Khmer - { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian - { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns - { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables - { 'begin': 0x1700, 'end': 0x171F }, // Tagalog - { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic - { 'begin': 0x10330, 'end': 0x1034F }, // Gothic - { 'begin': 0x10400, 'end': 0x1044F }, // Deseret - { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols - { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols - { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15) - { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors - { 'begin': 0xE0000, 'end': 0xE007F }, // Tags - { 'begin': 0x1900, 'end': 0x194F }, // Limbu - { 'begin': 0x1950, 'end': 0x197F }, // Tai Le - { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue - { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese - { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic - { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh - { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols - { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri - { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary - { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers - { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic - { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian - { 'begin': 0x10450, 'end': 0x1047F }, // Shavian - { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya - { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary - { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi - { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols - { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform - { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals - { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese - { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha - { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki - { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra - { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li - { 'begin': 0xA930, 'end': 0xA95F }, // Rejang - { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham - { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols - { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc - { 'begin': 0x102A0, 'end': 0x102DF }, // Carian - { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles -]; - -var MacStandardGlyphOrdering = [ - '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', - 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', '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', 'grave', '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', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', - 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', - 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', - 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', - 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', - 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', - 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', - 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', - 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', - 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', - 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', - 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', - 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', - 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', - 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', - 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', - 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', - 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', - 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', - 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', - 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', - 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', - 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', - 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', - 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; - -function getUnicodeRangeFor(value) { - for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { - var range = UnicodeRanges[i]; - if (value >= range.begin && value < range.end) { - return i; - } - } - return -1; -} - -function isRTLRangeFor(value) { - var range = UnicodeRanges[13]; - if (value >= range.begin && value < range.end) { - return true; - } - range = UnicodeRanges[11]; - if (value >= range.begin && value < range.end) { - return true; - } - return false; -} - -// The normalization table is obtained by filtering the Unicode characters -// database with entries. -var NormalizedUnicodes = { - '\u00A8': '\u0020\u0308', - '\u00AF': '\u0020\u0304', - '\u00B4': '\u0020\u0301', - '\u00B5': '\u03BC', - '\u00B8': '\u0020\u0327', - '\u0132': '\u0049\u004A', - '\u0133': '\u0069\u006A', - '\u013F': '\u004C\u00B7', - '\u0140': '\u006C\u00B7', - '\u0149': '\u02BC\u006E', - '\u017F': '\u0073', - '\u01C4': '\u0044\u017D', - '\u01C5': '\u0044\u017E', - '\u01C6': '\u0064\u017E', - '\u01C7': '\u004C\u004A', - '\u01C8': '\u004C\u006A', - '\u01C9': '\u006C\u006A', - '\u01CA': '\u004E\u004A', - '\u01CB': '\u004E\u006A', - '\u01CC': '\u006E\u006A', - '\u01F1': '\u0044\u005A', - '\u01F2': '\u0044\u007A', - '\u01F3': '\u0064\u007A', - '\u02D8': '\u0020\u0306', - '\u02D9': '\u0020\u0307', - '\u02DA': '\u0020\u030A', - '\u02DB': '\u0020\u0328', - '\u02DC': '\u0020\u0303', - '\u02DD': '\u0020\u030B', - '\u037A': '\u0020\u0345', - '\u0384': '\u0020\u0301', - '\u03D0': '\u03B2', - '\u03D1': '\u03B8', - '\u03D2': '\u03A5', - '\u03D5': '\u03C6', - '\u03D6': '\u03C0', - '\u03F0': '\u03BA', - '\u03F1': '\u03C1', - '\u03F2': '\u03C2', - '\u03F4': '\u0398', - '\u03F5': '\u03B5', - '\u03F9': '\u03A3', - '\u0587': '\u0565\u0582', - '\u0675': '\u0627\u0674', - '\u0676': '\u0648\u0674', - '\u0677': '\u06C7\u0674', - '\u0678': '\u064A\u0674', - '\u0E33': '\u0E4D\u0E32', - '\u0EB3': '\u0ECD\u0EB2', - '\u0EDC': '\u0EAB\u0E99', - '\u0EDD': '\u0EAB\u0EA1', - '\u0F77': '\u0FB2\u0F81', - '\u0F79': '\u0FB3\u0F81', - '\u1E9A': '\u0061\u02BE', - '\u1FBD': '\u0020\u0313', - '\u1FBF': '\u0020\u0313', - '\u1FC0': '\u0020\u0342', - '\u1FFE': '\u0020\u0314', - '\u2002': '\u0020', - '\u2003': '\u0020', - '\u2004': '\u0020', - '\u2005': '\u0020', - '\u2006': '\u0020', - '\u2008': '\u0020', - '\u2009': '\u0020', - '\u200A': '\u0020', - '\u2017': '\u0020\u0333', - '\u2024': '\u002E', - '\u2025': '\u002E\u002E', - '\u2026': '\u002E\u002E\u002E', - '\u2033': '\u2032\u2032', - '\u2034': '\u2032\u2032\u2032', - '\u2036': '\u2035\u2035', - '\u2037': '\u2035\u2035\u2035', - '\u203C': '\u0021\u0021', - '\u203E': '\u0020\u0305', - '\u2047': '\u003F\u003F', - '\u2048': '\u003F\u0021', - '\u2049': '\u0021\u003F', - '\u2057': '\u2032\u2032\u2032\u2032', - '\u205F': '\u0020', - '\u20A8': '\u0052\u0073', - '\u2100': '\u0061\u002F\u0063', - '\u2101': '\u0061\u002F\u0073', - '\u2103': '\u00B0\u0043', - '\u2105': '\u0063\u002F\u006F', - '\u2106': '\u0063\u002F\u0075', - '\u2107': '\u0190', - '\u2109': '\u00B0\u0046', - '\u2116': '\u004E\u006F', - '\u2121': '\u0054\u0045\u004C', - '\u2135': '\u05D0', - '\u2136': '\u05D1', - '\u2137': '\u05D2', - '\u2138': '\u05D3', - '\u213B': '\u0046\u0041\u0058', - '\u2160': '\u0049', - '\u2161': '\u0049\u0049', - '\u2162': '\u0049\u0049\u0049', - '\u2163': '\u0049\u0056', - '\u2164': '\u0056', - '\u2165': '\u0056\u0049', - '\u2166': '\u0056\u0049\u0049', - '\u2167': '\u0056\u0049\u0049\u0049', - '\u2168': '\u0049\u0058', - '\u2169': '\u0058', - '\u216A': '\u0058\u0049', - '\u216B': '\u0058\u0049\u0049', - '\u216C': '\u004C', - '\u216D': '\u0043', - '\u216E': '\u0044', - '\u216F': '\u004D', - '\u2170': '\u0069', - '\u2171': '\u0069\u0069', - '\u2172': '\u0069\u0069\u0069', - '\u2173': '\u0069\u0076', - '\u2174': '\u0076', - '\u2175': '\u0076\u0069', - '\u2176': '\u0076\u0069\u0069', - '\u2177': '\u0076\u0069\u0069\u0069', - '\u2178': '\u0069\u0078', - '\u2179': '\u0078', - '\u217A': '\u0078\u0069', - '\u217B': '\u0078\u0069\u0069', - '\u217C': '\u006C', - '\u217D': '\u0063', - '\u217E': '\u0064', - '\u217F': '\u006D', - '\u222C': '\u222B\u222B', - '\u222D': '\u222B\u222B\u222B', - '\u222F': '\u222E\u222E', - '\u2230': '\u222E\u222E\u222E', - '\u2474': '\u0028\u0031\u0029', - '\u2475': '\u0028\u0032\u0029', - '\u2476': '\u0028\u0033\u0029', - '\u2477': '\u0028\u0034\u0029', - '\u2478': '\u0028\u0035\u0029', - '\u2479': '\u0028\u0036\u0029', - '\u247A': '\u0028\u0037\u0029', - '\u247B': '\u0028\u0038\u0029', - '\u247C': '\u0028\u0039\u0029', - '\u247D': '\u0028\u0031\u0030\u0029', - '\u247E': '\u0028\u0031\u0031\u0029', - '\u247F': '\u0028\u0031\u0032\u0029', - '\u2480': '\u0028\u0031\u0033\u0029', - '\u2481': '\u0028\u0031\u0034\u0029', - '\u2482': '\u0028\u0031\u0035\u0029', - '\u2483': '\u0028\u0031\u0036\u0029', - '\u2484': '\u0028\u0031\u0037\u0029', - '\u2485': '\u0028\u0031\u0038\u0029', - '\u2486': '\u0028\u0031\u0039\u0029', - '\u2487': '\u0028\u0032\u0030\u0029', - '\u2488': '\u0031\u002E', - '\u2489': '\u0032\u002E', - '\u248A': '\u0033\u002E', - '\u248B': '\u0034\u002E', - '\u248C': '\u0035\u002E', - '\u248D': '\u0036\u002E', - '\u248E': '\u0037\u002E', - '\u248F': '\u0038\u002E', - '\u2490': '\u0039\u002E', - '\u2491': '\u0031\u0030\u002E', - '\u2492': '\u0031\u0031\u002E', - '\u2493': '\u0031\u0032\u002E', - '\u2494': '\u0031\u0033\u002E', - '\u2495': '\u0031\u0034\u002E', - '\u2496': '\u0031\u0035\u002E', - '\u2497': '\u0031\u0036\u002E', - '\u2498': '\u0031\u0037\u002E', - '\u2499': '\u0031\u0038\u002E', - '\u249A': '\u0031\u0039\u002E', - '\u249B': '\u0032\u0030\u002E', - '\u249C': '\u0028\u0061\u0029', - '\u249D': '\u0028\u0062\u0029', - '\u249E': '\u0028\u0063\u0029', - '\u249F': '\u0028\u0064\u0029', - '\u24A0': '\u0028\u0065\u0029', - '\u24A1': '\u0028\u0066\u0029', - '\u24A2': '\u0028\u0067\u0029', - '\u24A3': '\u0028\u0068\u0029', - '\u24A4': '\u0028\u0069\u0029', - '\u24A5': '\u0028\u006A\u0029', - '\u24A6': '\u0028\u006B\u0029', - '\u24A7': '\u0028\u006C\u0029', - '\u24A8': '\u0028\u006D\u0029', - '\u24A9': '\u0028\u006E\u0029', - '\u24AA': '\u0028\u006F\u0029', - '\u24AB': '\u0028\u0070\u0029', - '\u24AC': '\u0028\u0071\u0029', - '\u24AD': '\u0028\u0072\u0029', - '\u24AE': '\u0028\u0073\u0029', - '\u24AF': '\u0028\u0074\u0029', - '\u24B0': '\u0028\u0075\u0029', - '\u24B1': '\u0028\u0076\u0029', - '\u24B2': '\u0028\u0077\u0029', - '\u24B3': '\u0028\u0078\u0029', - '\u24B4': '\u0028\u0079\u0029', - '\u24B5': '\u0028\u007A\u0029', - '\u2A0C': '\u222B\u222B\u222B\u222B', - '\u2A74': '\u003A\u003A\u003D', - '\u2A75': '\u003D\u003D', - '\u2A76': '\u003D\u003D\u003D', - '\u2E9F': '\u6BCD', - '\u2EF3': '\u9F9F', - '\u2F00': '\u4E00', - '\u2F01': '\u4E28', - '\u2F02': '\u4E36', - '\u2F03': '\u4E3F', - '\u2F04': '\u4E59', - '\u2F05': '\u4E85', - '\u2F06': '\u4E8C', - '\u2F07': '\u4EA0', - '\u2F08': '\u4EBA', - '\u2F09': '\u513F', - '\u2F0A': '\u5165', - '\u2F0B': '\u516B', - '\u2F0C': '\u5182', - '\u2F0D': '\u5196', - '\u2F0E': '\u51AB', - '\u2F0F': '\u51E0', - '\u2F10': '\u51F5', - '\u2F11': '\u5200', - '\u2F12': '\u529B', - '\u2F13': '\u52F9', - '\u2F14': '\u5315', - '\u2F15': '\u531A', - '\u2F16': '\u5338', - '\u2F17': '\u5341', - '\u2F18': '\u535C', - '\u2F19': '\u5369', - '\u2F1A': '\u5382', - '\u2F1B': '\u53B6', - '\u2F1C': '\u53C8', - '\u2F1D': '\u53E3', - '\u2F1E': '\u56D7', - '\u2F1F': '\u571F', - '\u2F20': '\u58EB', - '\u2F21': '\u5902', - '\u2F22': '\u590A', - '\u2F23': '\u5915', - '\u2F24': '\u5927', - '\u2F25': '\u5973', - '\u2F26': '\u5B50', - '\u2F27': '\u5B80', - '\u2F28': '\u5BF8', - '\u2F29': '\u5C0F', - '\u2F2A': '\u5C22', - '\u2F2B': '\u5C38', - '\u2F2C': '\u5C6E', - '\u2F2D': '\u5C71', - '\u2F2E': '\u5DDB', - '\u2F2F': '\u5DE5', - '\u2F30': '\u5DF1', - '\u2F31': '\u5DFE', - '\u2F32': '\u5E72', - '\u2F33': '\u5E7A', - '\u2F34': '\u5E7F', - '\u2F35': '\u5EF4', - '\u2F36': '\u5EFE', - '\u2F37': '\u5F0B', - '\u2F38': '\u5F13', - '\u2F39': '\u5F50', - '\u2F3A': '\u5F61', - '\u2F3B': '\u5F73', - '\u2F3C': '\u5FC3', - '\u2F3D': '\u6208', - '\u2F3E': '\u6236', - '\u2F3F': '\u624B', - '\u2F40': '\u652F', - '\u2F41': '\u6534', - '\u2F42': '\u6587', - '\u2F43': '\u6597', - '\u2F44': '\u65A4', - '\u2F45': '\u65B9', - '\u2F46': '\u65E0', - '\u2F47': '\u65E5', - '\u2F48': '\u66F0', - '\u2F49': '\u6708', - '\u2F4A': '\u6728', - '\u2F4B': '\u6B20', - '\u2F4C': '\u6B62', - '\u2F4D': '\u6B79', - '\u2F4E': '\u6BB3', - '\u2F4F': '\u6BCB', - '\u2F50': '\u6BD4', - '\u2F51': '\u6BDB', - '\u2F52': '\u6C0F', - '\u2F53': '\u6C14', - '\u2F54': '\u6C34', - '\u2F55': '\u706B', - '\u2F56': '\u722A', - '\u2F57': '\u7236', - '\u2F58': '\u723B', - '\u2F59': '\u723F', - '\u2F5A': '\u7247', - '\u2F5B': '\u7259', - '\u2F5C': '\u725B', - '\u2F5D': '\u72AC', - '\u2F5E': '\u7384', - '\u2F5F': '\u7389', - '\u2F60': '\u74DC', - '\u2F61': '\u74E6', - '\u2F62': '\u7518', - '\u2F63': '\u751F', - '\u2F64': '\u7528', - '\u2F65': '\u7530', - '\u2F66': '\u758B', - '\u2F67': '\u7592', - '\u2F68': '\u7676', - '\u2F69': '\u767D', - '\u2F6A': '\u76AE', - '\u2F6B': '\u76BF', - '\u2F6C': '\u76EE', - '\u2F6D': '\u77DB', - '\u2F6E': '\u77E2', - '\u2F6F': '\u77F3', - '\u2F70': '\u793A', - '\u2F71': '\u79B8', - '\u2F72': '\u79BE', - '\u2F73': '\u7A74', - '\u2F74': '\u7ACB', - '\u2F75': '\u7AF9', - '\u2F76': '\u7C73', - '\u2F77': '\u7CF8', - '\u2F78': '\u7F36', - '\u2F79': '\u7F51', - '\u2F7A': '\u7F8A', - '\u2F7B': '\u7FBD', - '\u2F7C': '\u8001', - '\u2F7D': '\u800C', - '\u2F7E': '\u8012', - '\u2F7F': '\u8033', - '\u2F80': '\u807F', - '\u2F81': '\u8089', - '\u2F82': '\u81E3', - '\u2F83': '\u81EA', - '\u2F84': '\u81F3', - '\u2F85': '\u81FC', - '\u2F86': '\u820C', - '\u2F87': '\u821B', - '\u2F88': '\u821F', - '\u2F89': '\u826E', - '\u2F8A': '\u8272', - '\u2F8B': '\u8278', - '\u2F8C': '\u864D', - '\u2F8D': '\u866B', - '\u2F8E': '\u8840', - '\u2F8F': '\u884C', - '\u2F90': '\u8863', - '\u2F91': '\u897E', - '\u2F92': '\u898B', - '\u2F93': '\u89D2', - '\u2F94': '\u8A00', - '\u2F95': '\u8C37', - '\u2F96': '\u8C46', - '\u2F97': '\u8C55', - '\u2F98': '\u8C78', - '\u2F99': '\u8C9D', - '\u2F9A': '\u8D64', - '\u2F9B': '\u8D70', - '\u2F9C': '\u8DB3', - '\u2F9D': '\u8EAB', - '\u2F9E': '\u8ECA', - '\u2F9F': '\u8F9B', - '\u2FA0': '\u8FB0', - '\u2FA1': '\u8FB5', - '\u2FA2': '\u9091', - '\u2FA3': '\u9149', - '\u2FA4': '\u91C6', - '\u2FA5': '\u91CC', - '\u2FA6': '\u91D1', - '\u2FA7': '\u9577', - '\u2FA8': '\u9580', - '\u2FA9': '\u961C', - '\u2FAA': '\u96B6', - '\u2FAB': '\u96B9', - '\u2FAC': '\u96E8', - '\u2FAD': '\u9751', - '\u2FAE': '\u975E', - '\u2FAF': '\u9762', - '\u2FB0': '\u9769', - '\u2FB1': '\u97CB', - '\u2FB2': '\u97ED', - '\u2FB3': '\u97F3', - '\u2FB4': '\u9801', - '\u2FB5': '\u98A8', - '\u2FB6': '\u98DB', - '\u2FB7': '\u98DF', - '\u2FB8': '\u9996', - '\u2FB9': '\u9999', - '\u2FBA': '\u99AC', - '\u2FBB': '\u9AA8', - '\u2FBC': '\u9AD8', - '\u2FBD': '\u9ADF', - '\u2FBE': '\u9B25', - '\u2FBF': '\u9B2F', - '\u2FC0': '\u9B32', - '\u2FC1': '\u9B3C', - '\u2FC2': '\u9B5A', - '\u2FC3': '\u9CE5', - '\u2FC4': '\u9E75', - '\u2FC5': '\u9E7F', - '\u2FC6': '\u9EA5', - '\u2FC7': '\u9EBB', - '\u2FC8': '\u9EC3', - '\u2FC9': '\u9ECD', - '\u2FCA': '\u9ED1', - '\u2FCB': '\u9EF9', - '\u2FCC': '\u9EFD', - '\u2FCD': '\u9F0E', - '\u2FCE': '\u9F13', - '\u2FCF': '\u9F20', - '\u2FD0': '\u9F3B', - '\u2FD1': '\u9F4A', - '\u2FD2': '\u9F52', - '\u2FD3': '\u9F8D', - '\u2FD4': '\u9F9C', - '\u2FD5': '\u9FA0', - '\u3036': '\u3012', - '\u3038': '\u5341', - '\u3039': '\u5344', - '\u303A': '\u5345', - '\u309B': '\u0020\u3099', - '\u309C': '\u0020\u309A', - '\u3131': '\u1100', - '\u3132': '\u1101', - '\u3133': '\u11AA', - '\u3134': '\u1102', - '\u3135': '\u11AC', - '\u3136': '\u11AD', - '\u3137': '\u1103', - '\u3138': '\u1104', - '\u3139': '\u1105', - '\u313A': '\u11B0', - '\u313B': '\u11B1', - '\u313C': '\u11B2', - '\u313D': '\u11B3', - '\u313E': '\u11B4', - '\u313F': '\u11B5', - '\u3140': '\u111A', - '\u3141': '\u1106', - '\u3142': '\u1107', - '\u3143': '\u1108', - '\u3144': '\u1121', - '\u3145': '\u1109', - '\u3146': '\u110A', - '\u3147': '\u110B', - '\u3148': '\u110C', - '\u3149': '\u110D', - '\u314A': '\u110E', - '\u314B': '\u110F', - '\u314C': '\u1110', - '\u314D': '\u1111', - '\u314E': '\u1112', - '\u314F': '\u1161', - '\u3150': '\u1162', - '\u3151': '\u1163', - '\u3152': '\u1164', - '\u3153': '\u1165', - '\u3154': '\u1166', - '\u3155': '\u1167', - '\u3156': '\u1168', - '\u3157': '\u1169', - '\u3158': '\u116A', - '\u3159': '\u116B', - '\u315A': '\u116C', - '\u315B': '\u116D', - '\u315C': '\u116E', - '\u315D': '\u116F', - '\u315E': '\u1170', - '\u315F': '\u1171', - '\u3160': '\u1172', - '\u3161': '\u1173', - '\u3162': '\u1174', - '\u3163': '\u1175', - '\u3164': '\u1160', - '\u3165': '\u1114', - '\u3166': '\u1115', - '\u3167': '\u11C7', - '\u3168': '\u11C8', - '\u3169': '\u11CC', - '\u316A': '\u11CE', - '\u316B': '\u11D3', - '\u316C': '\u11D7', - '\u316D': '\u11D9', - '\u316E': '\u111C', - '\u316F': '\u11DD', - '\u3170': '\u11DF', - '\u3171': '\u111D', - '\u3172': '\u111E', - '\u3173': '\u1120', - '\u3174': '\u1122', - '\u3175': '\u1123', - '\u3176': '\u1127', - '\u3177': '\u1129', - '\u3178': '\u112B', - '\u3179': '\u112C', - '\u317A': '\u112D', - '\u317B': '\u112E', - '\u317C': '\u112F', - '\u317D': '\u1132', - '\u317E': '\u1136', - '\u317F': '\u1140', - '\u3180': '\u1147', - '\u3181': '\u114C', - '\u3182': '\u11F1', - '\u3183': '\u11F2', - '\u3184': '\u1157', - '\u3185': '\u1158', - '\u3186': '\u1159', - '\u3187': '\u1184', - '\u3188': '\u1185', - '\u3189': '\u1188', - '\u318A': '\u1191', - '\u318B': '\u1192', - '\u318C': '\u1194', - '\u318D': '\u119E', - '\u318E': '\u11A1', - '\u3200': '\u0028\u1100\u0029', - '\u3201': '\u0028\u1102\u0029', - '\u3202': '\u0028\u1103\u0029', - '\u3203': '\u0028\u1105\u0029', - '\u3204': '\u0028\u1106\u0029', - '\u3205': '\u0028\u1107\u0029', - '\u3206': '\u0028\u1109\u0029', - '\u3207': '\u0028\u110B\u0029', - '\u3208': '\u0028\u110C\u0029', - '\u3209': '\u0028\u110E\u0029', - '\u320A': '\u0028\u110F\u0029', - '\u320B': '\u0028\u1110\u0029', - '\u320C': '\u0028\u1111\u0029', - '\u320D': '\u0028\u1112\u0029', - '\u320E': '\u0028\u1100\u1161\u0029', - '\u320F': '\u0028\u1102\u1161\u0029', - '\u3210': '\u0028\u1103\u1161\u0029', - '\u3211': '\u0028\u1105\u1161\u0029', - '\u3212': '\u0028\u1106\u1161\u0029', - '\u3213': '\u0028\u1107\u1161\u0029', - '\u3214': '\u0028\u1109\u1161\u0029', - '\u3215': '\u0028\u110B\u1161\u0029', - '\u3216': '\u0028\u110C\u1161\u0029', - '\u3217': '\u0028\u110E\u1161\u0029', - '\u3218': '\u0028\u110F\u1161\u0029', - '\u3219': '\u0028\u1110\u1161\u0029', - '\u321A': '\u0028\u1111\u1161\u0029', - '\u321B': '\u0028\u1112\u1161\u0029', - '\u321C': '\u0028\u110C\u116E\u0029', - '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029', - '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029', - '\u3220': '\u0028\u4E00\u0029', - '\u3221': '\u0028\u4E8C\u0029', - '\u3222': '\u0028\u4E09\u0029', - '\u3223': '\u0028\u56DB\u0029', - '\u3224': '\u0028\u4E94\u0029', - '\u3225': '\u0028\u516D\u0029', - '\u3226': '\u0028\u4E03\u0029', - '\u3227': '\u0028\u516B\u0029', - '\u3228': '\u0028\u4E5D\u0029', - '\u3229': '\u0028\u5341\u0029', - '\u322A': '\u0028\u6708\u0029', - '\u322B': '\u0028\u706B\u0029', - '\u322C': '\u0028\u6C34\u0029', - '\u322D': '\u0028\u6728\u0029', - '\u322E': '\u0028\u91D1\u0029', - '\u322F': '\u0028\u571F\u0029', - '\u3230': '\u0028\u65E5\u0029', - '\u3231': '\u0028\u682A\u0029', - '\u3232': '\u0028\u6709\u0029', - '\u3233': '\u0028\u793E\u0029', - '\u3234': '\u0028\u540D\u0029', - '\u3235': '\u0028\u7279\u0029', - '\u3236': '\u0028\u8CA1\u0029', - '\u3237': '\u0028\u795D\u0029', - '\u3238': '\u0028\u52B4\u0029', - '\u3239': '\u0028\u4EE3\u0029', - '\u323A': '\u0028\u547C\u0029', - '\u323B': '\u0028\u5B66\u0029', - '\u323C': '\u0028\u76E3\u0029', - '\u323D': '\u0028\u4F01\u0029', - '\u323E': '\u0028\u8CC7\u0029', - '\u323F': '\u0028\u5354\u0029', - '\u3240': '\u0028\u796D\u0029', - '\u3241': '\u0028\u4F11\u0029', - '\u3242': '\u0028\u81EA\u0029', - '\u3243': '\u0028\u81F3\u0029', - '\u32C0': '\u0031\u6708', - '\u32C1': '\u0032\u6708', - '\u32C2': '\u0033\u6708', - '\u32C3': '\u0034\u6708', - '\u32C4': '\u0035\u6708', - '\u32C5': '\u0036\u6708', - '\u32C6': '\u0037\u6708', - '\u32C7': '\u0038\u6708', - '\u32C8': '\u0039\u6708', - '\u32C9': '\u0031\u0030\u6708', - '\u32CA': '\u0031\u0031\u6708', - '\u32CB': '\u0031\u0032\u6708', - '\u3358': '\u0030\u70B9', - '\u3359': '\u0031\u70B9', - '\u335A': '\u0032\u70B9', - '\u335B': '\u0033\u70B9', - '\u335C': '\u0034\u70B9', - '\u335D': '\u0035\u70B9', - '\u335E': '\u0036\u70B9', - '\u335F': '\u0037\u70B9', - '\u3360': '\u0038\u70B9', - '\u3361': '\u0039\u70B9', - '\u3362': '\u0031\u0030\u70B9', - '\u3363': '\u0031\u0031\u70B9', - '\u3364': '\u0031\u0032\u70B9', - '\u3365': '\u0031\u0033\u70B9', - '\u3366': '\u0031\u0034\u70B9', - '\u3367': '\u0031\u0035\u70B9', - '\u3368': '\u0031\u0036\u70B9', - '\u3369': '\u0031\u0037\u70B9', - '\u336A': '\u0031\u0038\u70B9', - '\u336B': '\u0031\u0039\u70B9', - '\u336C': '\u0032\u0030\u70B9', - '\u336D': '\u0032\u0031\u70B9', - '\u336E': '\u0032\u0032\u70B9', - '\u336F': '\u0032\u0033\u70B9', - '\u3370': '\u0032\u0034\u70B9', - '\u33E0': '\u0031\u65E5', - '\u33E1': '\u0032\u65E5', - '\u33E2': '\u0033\u65E5', - '\u33E3': '\u0034\u65E5', - '\u33E4': '\u0035\u65E5', - '\u33E5': '\u0036\u65E5', - '\u33E6': '\u0037\u65E5', - '\u33E7': '\u0038\u65E5', - '\u33E8': '\u0039\u65E5', - '\u33E9': '\u0031\u0030\u65E5', - '\u33EA': '\u0031\u0031\u65E5', - '\u33EB': '\u0031\u0032\u65E5', - '\u33EC': '\u0031\u0033\u65E5', - '\u33ED': '\u0031\u0034\u65E5', - '\u33EE': '\u0031\u0035\u65E5', - '\u33EF': '\u0031\u0036\u65E5', - '\u33F0': '\u0031\u0037\u65E5', - '\u33F1': '\u0031\u0038\u65E5', - '\u33F2': '\u0031\u0039\u65E5', - '\u33F3': '\u0032\u0030\u65E5', - '\u33F4': '\u0032\u0031\u65E5', - '\u33F5': '\u0032\u0032\u65E5', - '\u33F6': '\u0032\u0033\u65E5', - '\u33F7': '\u0032\u0034\u65E5', - '\u33F8': '\u0032\u0035\u65E5', - '\u33F9': '\u0032\u0036\u65E5', - '\u33FA': '\u0032\u0037\u65E5', - '\u33FB': '\u0032\u0038\u65E5', - '\u33FC': '\u0032\u0039\u65E5', - '\u33FD': '\u0033\u0030\u65E5', - '\u33FE': '\u0033\u0031\u65E5', - '\uFB00': '\u0066\u0066', - '\uFB01': '\u0066\u0069', - '\uFB02': '\u0066\u006C', - '\uFB03': '\u0066\u0066\u0069', - '\uFB04': '\u0066\u0066\u006C', - '\uFB05': '\u017F\u0074', - '\uFB06': '\u0073\u0074', - '\uFB13': '\u0574\u0576', - '\uFB14': '\u0574\u0565', - '\uFB15': '\u0574\u056B', - '\uFB16': '\u057E\u0576', - '\uFB17': '\u0574\u056D', - '\uFB4F': '\u05D0\u05DC', - '\uFB50': '\u0671', - '\uFB51': '\u0671', - '\uFB52': '\u067B', - '\uFB53': '\u067B', - '\uFB54': '\u067B', - '\uFB55': '\u067B', - '\uFB56': '\u067E', - '\uFB57': '\u067E', - '\uFB58': '\u067E', - '\uFB59': '\u067E', - '\uFB5A': '\u0680', - '\uFB5B': '\u0680', - '\uFB5C': '\u0680', - '\uFB5D': '\u0680', - '\uFB5E': '\u067A', - '\uFB5F': '\u067A', - '\uFB60': '\u067A', - '\uFB61': '\u067A', - '\uFB62': '\u067F', - '\uFB63': '\u067F', - '\uFB64': '\u067F', - '\uFB65': '\u067F', - '\uFB66': '\u0679', - '\uFB67': '\u0679', - '\uFB68': '\u0679', - '\uFB69': '\u0679', - '\uFB6A': '\u06A4', - '\uFB6B': '\u06A4', - '\uFB6C': '\u06A4', - '\uFB6D': '\u06A4', - '\uFB6E': '\u06A6', - '\uFB6F': '\u06A6', - '\uFB70': '\u06A6', - '\uFB71': '\u06A6', - '\uFB72': '\u0684', - '\uFB73': '\u0684', - '\uFB74': '\u0684', - '\uFB75': '\u0684', - '\uFB76': '\u0683', - '\uFB77': '\u0683', - '\uFB78': '\u0683', - '\uFB79': '\u0683', - '\uFB7A': '\u0686', - '\uFB7B': '\u0686', - '\uFB7C': '\u0686', - '\uFB7D': '\u0686', - '\uFB7E': '\u0687', - '\uFB7F': '\u0687', - '\uFB80': '\u0687', - '\uFB81': '\u0687', - '\uFB82': '\u068D', - '\uFB83': '\u068D', - '\uFB84': '\u068C', - '\uFB85': '\u068C', - '\uFB86': '\u068E', - '\uFB87': '\u068E', - '\uFB88': '\u0688', - '\uFB89': '\u0688', - '\uFB8A': '\u0698', - '\uFB8B': '\u0698', - '\uFB8C': '\u0691', - '\uFB8D': '\u0691', - '\uFB8E': '\u06A9', - '\uFB8F': '\u06A9', - '\uFB90': '\u06A9', - '\uFB91': '\u06A9', - '\uFB92': '\u06AF', - '\uFB93': '\u06AF', - '\uFB94': '\u06AF', - '\uFB95': '\u06AF', - '\uFB96': '\u06B3', - '\uFB97': '\u06B3', - '\uFB98': '\u06B3', - '\uFB99': '\u06B3', - '\uFB9A': '\u06B1', - '\uFB9B': '\u06B1', - '\uFB9C': '\u06B1', - '\uFB9D': '\u06B1', - '\uFB9E': '\u06BA', - '\uFB9F': '\u06BA', - '\uFBA0': '\u06BB', - '\uFBA1': '\u06BB', - '\uFBA2': '\u06BB', - '\uFBA3': '\u06BB', - '\uFBA4': '\u06C0', - '\uFBA5': '\u06C0', - '\uFBA6': '\u06C1', - '\uFBA7': '\u06C1', - '\uFBA8': '\u06C1', - '\uFBA9': '\u06C1', - '\uFBAA': '\u06BE', - '\uFBAB': '\u06BE', - '\uFBAC': '\u06BE', - '\uFBAD': '\u06BE', - '\uFBAE': '\u06D2', - '\uFBAF': '\u06D2', - '\uFBB0': '\u06D3', - '\uFBB1': '\u06D3', - '\uFBD3': '\u06AD', - '\uFBD4': '\u06AD', - '\uFBD5': '\u06AD', - '\uFBD6': '\u06AD', - '\uFBD7': '\u06C7', - '\uFBD8': '\u06C7', - '\uFBD9': '\u06C6', - '\uFBDA': '\u06C6', - '\uFBDB': '\u06C8', - '\uFBDC': '\u06C8', - '\uFBDD': '\u0677', - '\uFBDE': '\u06CB', - '\uFBDF': '\u06CB', - '\uFBE0': '\u06C5', - '\uFBE1': '\u06C5', - '\uFBE2': '\u06C9', - '\uFBE3': '\u06C9', - '\uFBE4': '\u06D0', - '\uFBE5': '\u06D0', - '\uFBE6': '\u06D0', - '\uFBE7': '\u06D0', - '\uFBE8': '\u0649', - '\uFBE9': '\u0649', - '\uFBEA': '\u0626\u0627', - '\uFBEB': '\u0626\u0627', - '\uFBEC': '\u0626\u06D5', - '\uFBED': '\u0626\u06D5', - '\uFBEE': '\u0626\u0648', - '\uFBEF': '\u0626\u0648', - '\uFBF0': '\u0626\u06C7', - '\uFBF1': '\u0626\u06C7', - '\uFBF2': '\u0626\u06C6', - '\uFBF3': '\u0626\u06C6', - '\uFBF4': '\u0626\u06C8', - '\uFBF5': '\u0626\u06C8', - '\uFBF6': '\u0626\u06D0', - '\uFBF7': '\u0626\u06D0', - '\uFBF8': '\u0626\u06D0', - '\uFBF9': '\u0626\u0649', - '\uFBFA': '\u0626\u0649', - '\uFBFB': '\u0626\u0649', - '\uFBFC': '\u06CC', - '\uFBFD': '\u06CC', - '\uFBFE': '\u06CC', - '\uFBFF': '\u06CC', - '\uFC00': '\u0626\u062C', - '\uFC01': '\u0626\u062D', - '\uFC02': '\u0626\u0645', - '\uFC03': '\u0626\u0649', - '\uFC04': '\u0626\u064A', - '\uFC05': '\u0628\u062C', - '\uFC06': '\u0628\u062D', - '\uFC07': '\u0628\u062E', - '\uFC08': '\u0628\u0645', - '\uFC09': '\u0628\u0649', - '\uFC0A': '\u0628\u064A', - '\uFC0B': '\u062A\u062C', - '\uFC0C': '\u062A\u062D', - '\uFC0D': '\u062A\u062E', - '\uFC0E': '\u062A\u0645', - '\uFC0F': '\u062A\u0649', - '\uFC10': '\u062A\u064A', - '\uFC11': '\u062B\u062C', - '\uFC12': '\u062B\u0645', - '\uFC13': '\u062B\u0649', - '\uFC14': '\u062B\u064A', - '\uFC15': '\u062C\u062D', - '\uFC16': '\u062C\u0645', - '\uFC17': '\u062D\u062C', - '\uFC18': '\u062D\u0645', - '\uFC19': '\u062E\u062C', - '\uFC1A': '\u062E\u062D', - '\uFC1B': '\u062E\u0645', - '\uFC1C': '\u0633\u062C', - '\uFC1D': '\u0633\u062D', - '\uFC1E': '\u0633\u062E', - '\uFC1F': '\u0633\u0645', - '\uFC20': '\u0635\u062D', - '\uFC21': '\u0635\u0645', - '\uFC22': '\u0636\u062C', - '\uFC23': '\u0636\u062D', - '\uFC24': '\u0636\u062E', - '\uFC25': '\u0636\u0645', - '\uFC26': '\u0637\u062D', - '\uFC27': '\u0637\u0645', - '\uFC28': '\u0638\u0645', - '\uFC29': '\u0639\u062C', - '\uFC2A': '\u0639\u0645', - '\uFC2B': '\u063A\u062C', - '\uFC2C': '\u063A\u0645', - '\uFC2D': '\u0641\u062C', - '\uFC2E': '\u0641\u062D', - '\uFC2F': '\u0641\u062E', - '\uFC30': '\u0641\u0645', - '\uFC31': '\u0641\u0649', - '\uFC32': '\u0641\u064A', - '\uFC33': '\u0642\u062D', - '\uFC34': '\u0642\u0645', - '\uFC35': '\u0642\u0649', - '\uFC36': '\u0642\u064A', - '\uFC37': '\u0643\u0627', - '\uFC38': '\u0643\u062C', - '\uFC39': '\u0643\u062D', - '\uFC3A': '\u0643\u062E', - '\uFC3B': '\u0643\u0644', - '\uFC3C': '\u0643\u0645', - '\uFC3D': '\u0643\u0649', - '\uFC3E': '\u0643\u064A', - '\uFC3F': '\u0644\u062C', - '\uFC40': '\u0644\u062D', - '\uFC41': '\u0644\u062E', - '\uFC42': '\u0644\u0645', - '\uFC43': '\u0644\u0649', - '\uFC44': '\u0644\u064A', - '\uFC45': '\u0645\u062C', - '\uFC46': '\u0645\u062D', - '\uFC47': '\u0645\u062E', - '\uFC48': '\u0645\u0645', - '\uFC49': '\u0645\u0649', - '\uFC4A': '\u0645\u064A', - '\uFC4B': '\u0646\u062C', - '\uFC4C': '\u0646\u062D', - '\uFC4D': '\u0646\u062E', - '\uFC4E': '\u0646\u0645', - '\uFC4F': '\u0646\u0649', - '\uFC50': '\u0646\u064A', - '\uFC51': '\u0647\u062C', - '\uFC52': '\u0647\u0645', - '\uFC53': '\u0647\u0649', - '\uFC54': '\u0647\u064A', - '\uFC55': '\u064A\u062C', - '\uFC56': '\u064A\u062D', - '\uFC57': '\u064A\u062E', - '\uFC58': '\u064A\u0645', - '\uFC59': '\u064A\u0649', - '\uFC5A': '\u064A\u064A', - '\uFC5B': '\u0630\u0670', - '\uFC5C': '\u0631\u0670', - '\uFC5D': '\u0649\u0670', - '\uFC5E': '\u0020\u064C\u0651', - '\uFC5F': '\u0020\u064D\u0651', - '\uFC60': '\u0020\u064E\u0651', - '\uFC61': '\u0020\u064F\u0651', - '\uFC62': '\u0020\u0650\u0651', - '\uFC63': '\u0020\u0651\u0670', - '\uFC64': '\u0626\u0631', - '\uFC65': '\u0626\u0632', - '\uFC66': '\u0626\u0645', - '\uFC67': '\u0626\u0646', - '\uFC68': '\u0626\u0649', - '\uFC69': '\u0626\u064A', - '\uFC6A': '\u0628\u0631', - '\uFC6B': '\u0628\u0632', - '\uFC6C': '\u0628\u0645', - '\uFC6D': '\u0628\u0646', - '\uFC6E': '\u0628\u0649', - '\uFC6F': '\u0628\u064A', - '\uFC70': '\u062A\u0631', - '\uFC71': '\u062A\u0632', - '\uFC72': '\u062A\u0645', - '\uFC73': '\u062A\u0646', - '\uFC74': '\u062A\u0649', - '\uFC75': '\u062A\u064A', - '\uFC76': '\u062B\u0631', - '\uFC77': '\u062B\u0632', - '\uFC78': '\u062B\u0645', - '\uFC79': '\u062B\u0646', - '\uFC7A': '\u062B\u0649', - '\uFC7B': '\u062B\u064A', - '\uFC7C': '\u0641\u0649', - '\uFC7D': '\u0641\u064A', - '\uFC7E': '\u0642\u0649', - '\uFC7F': '\u0642\u064A', - '\uFC80': '\u0643\u0627', - '\uFC81': '\u0643\u0644', - '\uFC82': '\u0643\u0645', - '\uFC83': '\u0643\u0649', - '\uFC84': '\u0643\u064A', - '\uFC85': '\u0644\u0645', - '\uFC86': '\u0644\u0649', - '\uFC87': '\u0644\u064A', - '\uFC88': '\u0645\u0627', - '\uFC89': '\u0645\u0645', - '\uFC8A': '\u0646\u0631', - '\uFC8B': '\u0646\u0632', - '\uFC8C': '\u0646\u0645', - '\uFC8D': '\u0646\u0646', - '\uFC8E': '\u0646\u0649', - '\uFC8F': '\u0646\u064A', - '\uFC90': '\u0649\u0670', - '\uFC91': '\u064A\u0631', - '\uFC92': '\u064A\u0632', - '\uFC93': '\u064A\u0645', - '\uFC94': '\u064A\u0646', - '\uFC95': '\u064A\u0649', - '\uFC96': '\u064A\u064A', - '\uFC97': '\u0626\u062C', - '\uFC98': '\u0626\u062D', - '\uFC99': '\u0626\u062E', - '\uFC9A': '\u0626\u0645', - '\uFC9B': '\u0626\u0647', - '\uFC9C': '\u0628\u062C', - '\uFC9D': '\u0628\u062D', - '\uFC9E': '\u0628\u062E', - '\uFC9F': '\u0628\u0645', - '\uFCA0': '\u0628\u0647', - '\uFCA1': '\u062A\u062C', - '\uFCA2': '\u062A\u062D', - '\uFCA3': '\u062A\u062E', - '\uFCA4': '\u062A\u0645', - '\uFCA5': '\u062A\u0647', - '\uFCA6': '\u062B\u0645', - '\uFCA7': '\u062C\u062D', - '\uFCA8': '\u062C\u0645', - '\uFCA9': '\u062D\u062C', - '\uFCAA': '\u062D\u0645', - '\uFCAB': '\u062E\u062C', - '\uFCAC': '\u062E\u0645', - '\uFCAD': '\u0633\u062C', - '\uFCAE': '\u0633\u062D', - '\uFCAF': '\u0633\u062E', - '\uFCB0': '\u0633\u0645', - '\uFCB1': '\u0635\u062D', - '\uFCB2': '\u0635\u062E', - '\uFCB3': '\u0635\u0645', - '\uFCB4': '\u0636\u062C', - '\uFCB5': '\u0636\u062D', - '\uFCB6': '\u0636\u062E', - '\uFCB7': '\u0636\u0645', - '\uFCB8': '\u0637\u062D', - '\uFCB9': '\u0638\u0645', - '\uFCBA': '\u0639\u062C', - '\uFCBB': '\u0639\u0645', - '\uFCBC': '\u063A\u062C', - '\uFCBD': '\u063A\u0645', - '\uFCBE': '\u0641\u062C', - '\uFCBF': '\u0641\u062D', - '\uFCC0': '\u0641\u062E', - '\uFCC1': '\u0641\u0645', - '\uFCC2': '\u0642\u062D', - '\uFCC3': '\u0642\u0645', - '\uFCC4': '\u0643\u062C', - '\uFCC5': '\u0643\u062D', - '\uFCC6': '\u0643\u062E', - '\uFCC7': '\u0643\u0644', - '\uFCC8': '\u0643\u0645', - '\uFCC9': '\u0644\u062C', - '\uFCCA': '\u0644\u062D', - '\uFCCB': '\u0644\u062E', - '\uFCCC': '\u0644\u0645', - '\uFCCD': '\u0644\u0647', - '\uFCCE': '\u0645\u062C', - '\uFCCF': '\u0645\u062D', - '\uFCD0': '\u0645\u062E', - '\uFCD1': '\u0645\u0645', - '\uFCD2': '\u0646\u062C', - '\uFCD3': '\u0646\u062D', - '\uFCD4': '\u0646\u062E', - '\uFCD5': '\u0646\u0645', - '\uFCD6': '\u0646\u0647', - '\uFCD7': '\u0647\u062C', - '\uFCD8': '\u0647\u0645', - '\uFCD9': '\u0647\u0670', - '\uFCDA': '\u064A\u062C', - '\uFCDB': '\u064A\u062D', - '\uFCDC': '\u064A\u062E', - '\uFCDD': '\u064A\u0645', - '\uFCDE': '\u064A\u0647', - '\uFCDF': '\u0626\u0645', - '\uFCE0': '\u0626\u0647', - '\uFCE1': '\u0628\u0645', - '\uFCE2': '\u0628\u0647', - '\uFCE3': '\u062A\u0645', - '\uFCE4': '\u062A\u0647', - '\uFCE5': '\u062B\u0645', - '\uFCE6': '\u062B\u0647', - '\uFCE7': '\u0633\u0645', - '\uFCE8': '\u0633\u0647', - '\uFCE9': '\u0634\u0645', - '\uFCEA': '\u0634\u0647', - '\uFCEB': '\u0643\u0644', - '\uFCEC': '\u0643\u0645', - '\uFCED': '\u0644\u0645', - '\uFCEE': '\u0646\u0645', - '\uFCEF': '\u0646\u0647', - '\uFCF0': '\u064A\u0645', - '\uFCF1': '\u064A\u0647', - '\uFCF2': '\u0640\u064E\u0651', - '\uFCF3': '\u0640\u064F\u0651', - '\uFCF4': '\u0640\u0650\u0651', - '\uFCF5': '\u0637\u0649', - '\uFCF6': '\u0637\u064A', - '\uFCF7': '\u0639\u0649', - '\uFCF8': '\u0639\u064A', - '\uFCF9': '\u063A\u0649', - '\uFCFA': '\u063A\u064A', - '\uFCFB': '\u0633\u0649', - '\uFCFC': '\u0633\u064A', - '\uFCFD': '\u0634\u0649', - '\uFCFE': '\u0634\u064A', - '\uFCFF': '\u062D\u0649', - '\uFD00': '\u062D\u064A', - '\uFD01': '\u062C\u0649', - '\uFD02': '\u062C\u064A', - '\uFD03': '\u062E\u0649', - '\uFD04': '\u062E\u064A', - '\uFD05': '\u0635\u0649', - '\uFD06': '\u0635\u064A', - '\uFD07': '\u0636\u0649', - '\uFD08': '\u0636\u064A', - '\uFD09': '\u0634\u062C', - '\uFD0A': '\u0634\u062D', - '\uFD0B': '\u0634\u062E', - '\uFD0C': '\u0634\u0645', - '\uFD0D': '\u0634\u0631', - '\uFD0E': '\u0633\u0631', - '\uFD0F': '\u0635\u0631', - '\uFD10': '\u0636\u0631', - '\uFD11': '\u0637\u0649', - '\uFD12': '\u0637\u064A', - '\uFD13': '\u0639\u0649', - '\uFD14': '\u0639\u064A', - '\uFD15': '\u063A\u0649', - '\uFD16': '\u063A\u064A', - '\uFD17': '\u0633\u0649', - '\uFD18': '\u0633\u064A', - '\uFD19': '\u0634\u0649', - '\uFD1A': '\u0634\u064A', - '\uFD1B': '\u062D\u0649', - '\uFD1C': '\u062D\u064A', - '\uFD1D': '\u062C\u0649', - '\uFD1E': '\u062C\u064A', - '\uFD1F': '\u062E\u0649', - '\uFD20': '\u062E\u064A', - '\uFD21': '\u0635\u0649', - '\uFD22': '\u0635\u064A', - '\uFD23': '\u0636\u0649', - '\uFD24': '\u0636\u064A', - '\uFD25': '\u0634\u062C', - '\uFD26': '\u0634\u062D', - '\uFD27': '\u0634\u062E', - '\uFD28': '\u0634\u0645', - '\uFD29': '\u0634\u0631', - '\uFD2A': '\u0633\u0631', - '\uFD2B': '\u0635\u0631', - '\uFD2C': '\u0636\u0631', - '\uFD2D': '\u0634\u062C', - '\uFD2E': '\u0634\u062D', - '\uFD2F': '\u0634\u062E', - '\uFD30': '\u0634\u0645', - '\uFD31': '\u0633\u0647', - '\uFD32': '\u0634\u0647', - '\uFD33': '\u0637\u0645', - '\uFD34': '\u0633\u062C', - '\uFD35': '\u0633\u062D', - '\uFD36': '\u0633\u062E', - '\uFD37': '\u0634\u062C', - '\uFD38': '\u0634\u062D', - '\uFD39': '\u0634\u062E', - '\uFD3A': '\u0637\u0645', - '\uFD3B': '\u0638\u0645', - '\uFD3C': '\u0627\u064B', - '\uFD3D': '\u0627\u064B', - '\uFD50': '\u062A\u062C\u0645', - '\uFD51': '\u062A\u062D\u062C', - '\uFD52': '\u062A\u062D\u062C', - '\uFD53': '\u062A\u062D\u0645', - '\uFD54': '\u062A\u062E\u0645', - '\uFD55': '\u062A\u0645\u062C', - '\uFD56': '\u062A\u0645\u062D', - '\uFD57': '\u062A\u0645\u062E', - '\uFD58': '\u062C\u0645\u062D', - '\uFD59': '\u062C\u0645\u062D', - '\uFD5A': '\u062D\u0645\u064A', - '\uFD5B': '\u062D\u0645\u0649', - '\uFD5C': '\u0633\u062D\u062C', - '\uFD5D': '\u0633\u062C\u062D', - '\uFD5E': '\u0633\u062C\u0649', - '\uFD5F': '\u0633\u0645\u062D', - '\uFD60': '\u0633\u0645\u062D', - '\uFD61': '\u0633\u0645\u062C', - '\uFD62': '\u0633\u0645\u0645', - '\uFD63': '\u0633\u0645\u0645', - '\uFD64': '\u0635\u062D\u062D', - '\uFD65': '\u0635\u062D\u062D', - '\uFD66': '\u0635\u0645\u0645', - '\uFD67': '\u0634\u062D\u0645', - '\uFD68': '\u0634\u062D\u0645', - '\uFD69': '\u0634\u062C\u064A', - '\uFD6A': '\u0634\u0645\u062E', - '\uFD6B': '\u0634\u0645\u062E', - '\uFD6C': '\u0634\u0645\u0645', - '\uFD6D': '\u0634\u0645\u0645', - '\uFD6E': '\u0636\u062D\u0649', - '\uFD6F': '\u0636\u062E\u0645', - '\uFD70': '\u0636\u062E\u0645', - '\uFD71': '\u0637\u0645\u062D', - '\uFD72': '\u0637\u0645\u062D', - '\uFD73': '\u0637\u0645\u0645', - '\uFD74': '\u0637\u0645\u064A', - '\uFD75': '\u0639\u062C\u0645', - '\uFD76': '\u0639\u0645\u0645', - '\uFD77': '\u0639\u0645\u0645', - '\uFD78': '\u0639\u0645\u0649', - '\uFD79': '\u063A\u0645\u0645', - '\uFD7A': '\u063A\u0645\u064A', - '\uFD7B': '\u063A\u0645\u0649', - '\uFD7C': '\u0641\u062E\u0645', - '\uFD7D': '\u0641\u062E\u0645', - '\uFD7E': '\u0642\u0645\u062D', - '\uFD7F': '\u0642\u0645\u0645', - '\uFD80': '\u0644\u062D\u0645', - '\uFD81': '\u0644\u062D\u064A', - '\uFD82': '\u0644\u062D\u0649', - '\uFD83': '\u0644\u062C\u062C', - '\uFD84': '\u0644\u062C\u062C', - '\uFD85': '\u0644\u062E\u0645', - '\uFD86': '\u0644\u062E\u0645', - '\uFD87': '\u0644\u0645\u062D', - '\uFD88': '\u0644\u0645\u062D', - '\uFD89': '\u0645\u062D\u062C', - '\uFD8A': '\u0645\u062D\u0645', - '\uFD8B': '\u0645\u062D\u064A', - '\uFD8C': '\u0645\u062C\u062D', - '\uFD8D': '\u0645\u062C\u0645', - '\uFD8E': '\u0645\u062E\u062C', - '\uFD8F': '\u0645\u062E\u0645', - '\uFD92': '\u0645\u062C\u062E', - '\uFD93': '\u0647\u0645\u062C', - '\uFD94': '\u0647\u0645\u0645', - '\uFD95': '\u0646\u062D\u0645', - '\uFD96': '\u0646\u062D\u0649', - '\uFD97': '\u0646\u062C\u0645', - '\uFD98': '\u0646\u062C\u0645', - '\uFD99': '\u0646\u062C\u0649', - '\uFD9A': '\u0646\u0645\u064A', - '\uFD9B': '\u0646\u0645\u0649', - '\uFD9C': '\u064A\u0645\u0645', - '\uFD9D': '\u064A\u0645\u0645', - '\uFD9E': '\u0628\u062E\u064A', - '\uFD9F': '\u062A\u062C\u064A', - '\uFDA0': '\u062A\u062C\u0649', - '\uFDA1': '\u062A\u062E\u064A', - '\uFDA2': '\u062A\u062E\u0649', - '\uFDA3': '\u062A\u0645\u064A', - '\uFDA4': '\u062A\u0645\u0649', - '\uFDA5': '\u062C\u0645\u064A', - '\uFDA6': '\u062C\u062D\u0649', - '\uFDA7': '\u062C\u0645\u0649', - '\uFDA8': '\u0633\u062E\u0649', - '\uFDA9': '\u0635\u062D\u064A', - '\uFDAA': '\u0634\u062D\u064A', - '\uFDAB': '\u0636\u062D\u064A', - '\uFDAC': '\u0644\u062C\u064A', - '\uFDAD': '\u0644\u0645\u064A', - '\uFDAE': '\u064A\u062D\u064A', - '\uFDAF': '\u064A\u062C\u064A', - '\uFDB0': '\u064A\u0645\u064A', - '\uFDB1': '\u0645\u0645\u064A', - '\uFDB2': '\u0642\u0645\u064A', - '\uFDB3': '\u0646\u062D\u064A', - '\uFDB4': '\u0642\u0645\u062D', - '\uFDB5': '\u0644\u062D\u0645', - '\uFDB6': '\u0639\u0645\u064A', - '\uFDB7': '\u0643\u0645\u064A', - '\uFDB8': '\u0646\u062C\u062D', - '\uFDB9': '\u0645\u062E\u064A', - '\uFDBA': '\u0644\u062C\u0645', - '\uFDBB': '\u0643\u0645\u0645', - '\uFDBC': '\u0644\u062C\u0645', - '\uFDBD': '\u0646\u062C\u062D', - '\uFDBE': '\u062C\u062D\u064A', - '\uFDBF': '\u062D\u062C\u064A', - '\uFDC0': '\u0645\u062C\u064A', - '\uFDC1': '\u0641\u0645\u064A', - '\uFDC2': '\u0628\u062D\u064A', - '\uFDC3': '\u0643\u0645\u0645', - '\uFDC4': '\u0639\u062C\u0645', - '\uFDC5': '\u0635\u0645\u0645', - '\uFDC6': '\u0633\u062E\u064A', - '\uFDC7': '\u0646\u062C\u064A', - '\uFE49': '\u203E', - '\uFE4A': '\u203E', - '\uFE4B': '\u203E', - '\uFE4C': '\u203E', - '\uFE4D': '\u005F', - '\uFE4E': '\u005F', - '\uFE4F': '\u005F', - '\uFE80': '\u0621', - '\uFE81': '\u0622', - '\uFE82': '\u0622', - '\uFE83': '\u0623', - '\uFE84': '\u0623', - '\uFE85': '\u0624', - '\uFE86': '\u0624', - '\uFE87': '\u0625', - '\uFE88': '\u0625', - '\uFE89': '\u0626', - '\uFE8A': '\u0626', - '\uFE8B': '\u0626', - '\uFE8C': '\u0626', - '\uFE8D': '\u0627', - '\uFE8E': '\u0627', - '\uFE8F': '\u0628', - '\uFE90': '\u0628', - '\uFE91': '\u0628', - '\uFE92': '\u0628', - '\uFE93': '\u0629', - '\uFE94': '\u0629', - '\uFE95': '\u062A', - '\uFE96': '\u062A', - '\uFE97': '\u062A', - '\uFE98': '\u062A', - '\uFE99': '\u062B', - '\uFE9A': '\u062B', - '\uFE9B': '\u062B', - '\uFE9C': '\u062B', - '\uFE9D': '\u062C', - '\uFE9E': '\u062C', - '\uFE9F': '\u062C', - '\uFEA0': '\u062C', - '\uFEA1': '\u062D', - '\uFEA2': '\u062D', - '\uFEA3': '\u062D', - '\uFEA4': '\u062D', - '\uFEA5': '\u062E', - '\uFEA6': '\u062E', - '\uFEA7': '\u062E', - '\uFEA8': '\u062E', - '\uFEA9': '\u062F', - '\uFEAA': '\u062F', - '\uFEAB': '\u0630', - '\uFEAC': '\u0630', - '\uFEAD': '\u0631', - '\uFEAE': '\u0631', - '\uFEAF': '\u0632', - '\uFEB0': '\u0632', - '\uFEB1': '\u0633', - '\uFEB2': '\u0633', - '\uFEB3': '\u0633', - '\uFEB4': '\u0633', - '\uFEB5': '\u0634', - '\uFEB6': '\u0634', - '\uFEB7': '\u0634', - '\uFEB8': '\u0634', - '\uFEB9': '\u0635', - '\uFEBA': '\u0635', - '\uFEBB': '\u0635', - '\uFEBC': '\u0635', - '\uFEBD': '\u0636', - '\uFEBE': '\u0636', - '\uFEBF': '\u0636', - '\uFEC0': '\u0636', - '\uFEC1': '\u0637', - '\uFEC2': '\u0637', - '\uFEC3': '\u0637', - '\uFEC4': '\u0637', - '\uFEC5': '\u0638', - '\uFEC6': '\u0638', - '\uFEC7': '\u0638', - '\uFEC8': '\u0638', - '\uFEC9': '\u0639', - '\uFECA': '\u0639', - '\uFECB': '\u0639', - '\uFECC': '\u0639', - '\uFECD': '\u063A', - '\uFECE': '\u063A', - '\uFECF': '\u063A', - '\uFED0': '\u063A', - '\uFED1': '\u0641', - '\uFED2': '\u0641', - '\uFED3': '\u0641', - '\uFED4': '\u0641', - '\uFED5': '\u0642', - '\uFED6': '\u0642', - '\uFED7': '\u0642', - '\uFED8': '\u0642', - '\uFED9': '\u0643', - '\uFEDA': '\u0643', - '\uFEDB': '\u0643', - '\uFEDC': '\u0643', - '\uFEDD': '\u0644', - '\uFEDE': '\u0644', - '\uFEDF': '\u0644', - '\uFEE0': '\u0644', - '\uFEE1': '\u0645', - '\uFEE2': '\u0645', - '\uFEE3': '\u0645', - '\uFEE4': '\u0645', - '\uFEE5': '\u0646', - '\uFEE6': '\u0646', - '\uFEE7': '\u0646', - '\uFEE8': '\u0646', - '\uFEE9': '\u0647', - '\uFEEA': '\u0647', - '\uFEEB': '\u0647', - '\uFEEC': '\u0647', - '\uFEED': '\u0648', - '\uFEEE': '\u0648', - '\uFEEF': '\u0649', - '\uFEF0': '\u0649', - '\uFEF1': '\u064A', - '\uFEF2': '\u064A', - '\uFEF3': '\u064A', - '\uFEF4': '\u064A', - '\uFEF5': '\u0644\u0622', - '\uFEF6': '\u0644\u0622', - '\uFEF7': '\u0644\u0623', - '\uFEF8': '\u0644\u0623', - '\uFEF9': '\u0644\u0625', - '\uFEFA': '\u0644\u0625', - '\uFEFB': '\u0644\u0627', - '\uFEFC': '\u0644\u0627' -}; - -function reverseIfRtl(chars) { - var charsLength = chars.length; - //reverse an arabic ligature - if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { - return chars; - } - var s = ''; - for (var ii = charsLength - 1; ii >= 0; ii--) { - s += chars[ii]; - } - return s; -} - -function adjustWidths(properties) { - if (!properties.fontMatrix) { - return; - } - if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { - return; - } - // adjusting width to fontMatrix scale - var scale = 0.001 / properties.fontMatrix[0]; - var glyphsWidths = properties.widths; - for (var glyph in glyphsWidths) { - glyphsWidths[glyph] *= scale; - } - properties.defaultWidth *= scale; -} - -function getFontType(type, subtype) { - switch (type) { - case 'Type1': - return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1; - case 'CIDFontType0': - return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C : - FontType.CIDFONTTYPE0; - case 'OpenType': - return FontType.OPENTYPE; - case 'TrueType': - return FontType.TRUETYPE; - case 'CIDFontType2': - return FontType.CIDFONTTYPE2; - case 'MMType1': - return FontType.MMTYPE1; - case 'Type0': - return FontType.TYPE0; - default: - return FontType.UNKNOWN; - } -} - -var Glyph = (function GlyphClosure() { - function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, - isSpace) { - this.fontChar = fontChar; - this.unicode = unicode; - this.accent = accent; - this.width = width; - this.vmetric = vmetric; - this.operatorListId = operatorListId; - this.isSpace = isSpace; - } - - Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, - vmetric, operatorListId, isSpace) { - return this.fontChar === fontChar && - this.unicode === unicode && - this.accent === accent && - this.width === width && - this.vmetric === vmetric && - this.operatorListId === operatorListId && - this.isSpace === isSpace; - }; - - return Glyph; -})(); - -var ToUnicodeMap = (function ToUnicodeMapClosure() { - function ToUnicodeMap(cmap) { - // The elements of this._map can be integers or strings, depending on how - // |cmap| was created. - this._map = cmap; - } - - ToUnicodeMap.prototype = { - get length() { - return this._map.length; - }, - - forEach: function(callback) { - for (var charCode in this._map) { - callback(charCode, this._map[charCode].charCodeAt(0)); - } - }, - - has: function(i) { - return this._map[i] !== undefined; - }, - - get: function(i) { - return this._map[i]; - }, - - charCodeOf: function(v) { - return this._map.indexOf(v); - } - }; - - return ToUnicodeMap; -})(); - -var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { - function IdentityToUnicodeMap(firstChar, lastChar) { - this.firstChar = firstChar; - this.lastChar = lastChar; - } - - IdentityToUnicodeMap.prototype = { - get length() { - return (this.lastChar + 1) - this.firstChar; - }, - - forEach: function (callback) { - for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { - callback(i, i); - } - }, - - has: function (i) { - return this.firstChar <= i && i <= this.lastChar; - }, - - get: function (i) { - if (this.firstChar <= i && i <= this.lastChar) { - return String.fromCharCode(i); - } - return undefined; - }, - - charCodeOf: function (v) { - return (isInt(v) && v >= this.firstChar && v <= this.lastChar) ? v : -1; - } - }; - - return IdentityToUnicodeMap; -})(); - -var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { - function writeInt16(dest, offset, num) { - dest[offset] = (num >> 8) & 0xFF; - dest[offset + 1] = num & 0xFF; - } - - function writeInt32(dest, offset, num) { - dest[offset] = (num >> 24) & 0xFF; - dest[offset + 1] = (num >> 16) & 0xFF; - dest[offset + 2] = (num >> 8) & 0xFF; - dest[offset + 3] = num & 0xFF; - } - - function writeData(dest, offset, data) { - var i, ii; - if (data instanceof Uint8Array) { - dest.set(data, offset); - } else if (typeof data === 'string') { - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data.charCodeAt(i) & 0xFF; - } - } else { - // treating everything else as array - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data[i] & 0xFF; - } - } - } - - function OpenTypeFileBuilder(sfnt) { - this.sfnt = sfnt; - this.tables = Object.create(null); - } - - OpenTypeFileBuilder.getSearchParams = - function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) { - var maxPower2 = 1, log2 = 0; - while ((maxPower2 ^ entriesCount) > maxPower2) { - maxPower2 <<= 1; - log2++; - } - var searchRange = maxPower2 * entrySize; - return { - range: searchRange, - entry: log2, - rangeShift: entrySize * entriesCount - searchRange - }; - }; - - var OTF_HEADER_SIZE = 12; - var OTF_TABLE_ENTRY_SIZE = 16; - - OpenTypeFileBuilder.prototype = { - toArray: function OpenTypeFileBuilder_toArray() { - var sfnt = this.sfnt; - - // Tables needs to be written by ascendant alphabetic order - var tables = this.tables; - var tablesNames = Object.keys(tables); - tablesNames.sort(); - var numTables = tablesNames.length; - - var i, j, jj, table, tableName; - // layout the tables data - var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; - var tableOffsets = [offset]; - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - var paddedLength = ((table.length + 3) & ~3) >>> 0; - offset += paddedLength; - tableOffsets.push(offset); - } - - var file = new Uint8Array(offset); - // write the table data first (mostly for checksum) - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - writeData(file, tableOffsets[i], table); - } - - // sfnt version (4 bytes) - if (sfnt === 'true') { - // Windows hates the Mac TrueType sfnt version number - sfnt = string32(0x00010000); - } - file[0] = sfnt.charCodeAt(0) & 0xFF; - file[1] = sfnt.charCodeAt(1) & 0xFF; - file[2] = sfnt.charCodeAt(2) & 0xFF; - file[3] = sfnt.charCodeAt(3) & 0xFF; - - // numTables (2 bytes) - writeInt16(file, 4, numTables); - - var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); - - // searchRange (2 bytes) - writeInt16(file, 6, searchParams.range); - // entrySelector (2 bytes) - writeInt16(file, 8, searchParams.entry); - // rangeShift (2 bytes) - writeInt16(file, 10, searchParams.rangeShift); - - offset = OTF_HEADER_SIZE; - // writing table entries - for (i = 0; i < numTables; i++) { - tableName = tablesNames[i]; - file[offset] = tableName.charCodeAt(0) & 0xFF; - file[offset + 1] = tableName.charCodeAt(1) & 0xFF; - file[offset + 2] = tableName.charCodeAt(2) & 0xFF; - file[offset + 3] = tableName.charCodeAt(3) & 0xFF; - - // checksum - var checksum = 0; - for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { - var quad = (file[j] << 24) + (file[j + 1] << 16) + - (file[j + 2] << 8) + file[j + 3]; - checksum = (checksum + quad) | 0; - } - writeInt32(file, offset + 4, checksum); - - // offset - writeInt32(file, offset + 8, tableOffsets[i]); - // length - writeInt32(file, offset + 12, tables[tableName].length); - - offset += OTF_TABLE_ENTRY_SIZE; - } - return file; - }, - - addTable: function OpenTypeFileBuilder_addTable(tag, data) { - if (tag in this.tables) { - throw new Error('Table ' + tag + ' already exists'); - } - this.tables[tag] = data; - } - }; - - return OpenTypeFileBuilder; -})(); - -// Problematic Unicode characters in the fonts that needs to be moved to avoid -// issues when they are painted on the canvas, e.g. complex-script shaping or -// control/whitespace characters. The ranges are listed in pairs: the first item -// is a code of the first problematic code, the second one is the next -// non-problematic code. The ranges must be in sorted order. -var ProblematicCharRanges = new Int32Array([ - // Control characters. - 0x0000, 0x0020, - 0x007F, 0x00A1, - 0x00AD, 0x00AE, - // Chars that is used in complex-script shaping. - 0x0600, 0x0780, - 0x08A0, 0x10A0, - 0x1780, 0x1800, - // General punctuation chars. - 0x2000, 0x2010, - 0x2011, 0x2012, - 0x2028, 0x2030, - 0x205F, 0x2070, - 0x25CC, 0x25CD, - // Chars that is used in complex-script shaping. - 0xAA60, 0xAA80, - // Specials Unicode block. - 0xFFF0, 0x10000 -]); - -/** - * 'Font' is the class the outside world should use, it encapsulate all the font - * decoding logics whatever type it is (assuming the font type is supported). - * - * For example to read a Type1 font and to attach it to the document: - * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); - * type1Font.bind(); - */ -var Font = (function FontClosure() { - function Font(name, file, properties) { - var charCode, glyphName, fontChar; - - this.name = name; - this.loadedName = properties.loadedName; - this.isType3Font = properties.isType3Font; - this.sizes = []; - - this.glyphCache = {}; - - var names = name.split('+'); - names = names.length > 1 ? names[1] : names[0]; - names = names.split(/[-,_]/g)[0]; - this.isSerifFont = !!(properties.flags & FontFlags.Serif); - this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); - - var type = properties.type; - var subtype = properties.subtype; - this.type = type; - - this.fallbackName = (this.isMonospace ? 'monospace' : - (this.isSerifFont ? 'serif' : 'sans-serif')); - - this.differences = properties.differences; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.composite = properties.composite; - this.wideChars = properties.wideChars; - this.cMap = properties.cMap; - this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; - this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; - this.fontMatrix = properties.fontMatrix; - this.bbox = properties.bbox; - - this.toUnicode = properties.toUnicode = this.buildToUnicode(properties); - - this.toFontChar = []; - - if (properties.type === 'Type3') { - for (charCode = 0; charCode < 256; charCode++) { - this.toFontChar[charCode] = (this.differences[charCode] || - properties.defaultEncoding[charCode]); - } - this.fontType = FontType.TYPE3; - return; - } - - this.cidEncoding = properties.cidEncoding; - this.vertical = properties.vertical; - if (this.vertical) { - this.vmetrics = properties.vmetrics; - this.defaultVMetrics = properties.defaultVMetrics; - } - - if (!file || file.isEmpty) { - if (file) { - // Some bad PDF generators will include empty font files, - // attempting to recover by assuming that no file exists. - warn('Font file is empty in "' + name + '" (' + this.loadedName + ')'); - } - - this.missingFile = true; - // The file data is not specified. Trying to fix the font name - // to be used with the canvas.font. - var fontName = name.replace(/[,_]/g, '-'); - var isStandardFont = !!stdFontMap[fontName] || - !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); - fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; - - this.bold = (fontName.search(/bold/gi) !== -1); - this.italic = ((fontName.search(/oblique/gi) !== -1) || - (fontName.search(/italic/gi) !== -1)); - - // Use 'name' instead of 'fontName' here because the original - // name ArialBlack for example will be replaced by Helvetica. - this.black = (name.search(/Black/g) !== -1); - - // if at least one width is present, remeasure all chars when exists - this.remeasure = Object.keys(this.widths).length > 0; - if (isStandardFont && type === 'CIDFontType2' && - properties.cidEncoding.indexOf('Identity-') === 0) { - // Standard fonts might be embedded as CID font without glyph mapping. - // Building one based on GlyphMapForStandardFonts. - var map = []; - for (charCode in GlyphMapForStandardFonts) { - map[+charCode] = GlyphMapForStandardFonts[charCode]; - } - if (/ArialBlack/i.test(name)) { - for (charCode in SupplementalGlyphMapForArialBlack) { - map[+charCode] = SupplementalGlyphMapForArialBlack[charCode]; - } - } - var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap; - if (!isIdentityUnicode) { - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - map[+charCode] = unicodeCharCode; - }); - } - this.toFontChar = map; - this.toUnicode = new ToUnicodeMap(map); - } else if (/Symbol/i.test(fontName)) { - var symbols = Encodings.SymbolSetEncoding; - for (charCode in symbols) { - fontChar = GlyphsUnicode[symbols[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - for (charCode in properties.differences) { - fontChar = GlyphsUnicode[properties.differences[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - } else if (/Dingbats/i.test(fontName)) { - if (/Wingdings/i.test(name)) { - warn('Wingdings font without embedded font file, ' + - 'falling back to the ZapfDingbats encoding.'); - } - var dingbats = Encodings.ZapfDingbatsEncoding; - for (charCode in dingbats) { - fontChar = DingbatsGlyphsUnicode[dingbats[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - for (charCode in properties.differences) { - fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - } else if (isStandardFont) { - this.toFontChar = []; - for (charCode in properties.defaultEncoding) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - this.toFontChar[charCode] = GlyphsUnicode[glyphName]; - } - } else { - var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1); - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - if (notCidFont) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode); - } - this.toFontChar[charCode] = unicodeCharCode; - }.bind(this)); - } - this.loadedName = fontName.split('-')[0]; - this.loading = false; - this.fontType = getFontType(type, subtype); - return; - } - - // Some fonts might use wrong font types for Type1C or CIDFontType0C - if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) { - // Some TrueType fonts by mistake claim Type1C - if (isTrueTypeFile(file)) { - subtype = 'TrueType'; - } else { - type = 'Type1'; - } - } - if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') { - type = 'CIDFontType0'; - } - if (subtype === 'OpenType') { - type = 'OpenType'; - } - // Some CIDFontType0C fonts by mistake claim CIDFontType0. - if (type === 'CIDFontType0') { - subtype = isType1File(file) ? 'CIDFontType0' : 'CIDFontType0C'; - } - - var data; - switch (type) { - case 'MMType1': - info('MMType1 font (' + name + '), falling back to Type1.'); - /* falls through */ - case 'Type1': - case 'CIDFontType0': - this.mimetype = 'font/opentype'; - - var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ? - new CFFFont(file, properties) : new Type1Font(name, file, properties); - - adjustWidths(properties); - - // Wrap the CFF data inside an OTF font file - data = this.convert(name, cff, properties); - break; - - case 'OpenType': - case 'TrueType': - case 'CIDFontType2': - this.mimetype = 'font/opentype'; - - // Repair the TrueType file. It is can be damaged in the point of - // view of the sanitizer - data = this.checkAndRepair(name, file, properties); - if (this.isOpenType) { - adjustWidths(properties); - - type = 'OpenType'; - } - break; - - default: - error('Font ' + type + ' is not supported'); - break; - } - - this.data = data; - this.fontType = getFontType(type, subtype); - - // Transfer some properties again that could change during font conversion - this.fontMatrix = properties.fontMatrix; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.encoding = properties.baseEncoding; - this.seacMap = properties.seacMap; - - this.loading = true; - } - - Font.getFontID = (function () { - var ID = 1; - return function Font_getFontID() { - return String(ID++); - }; - })(); - - function int16(b0, b1) { - return (b0 << 8) + b1; - } - - function int32(b0, b1, b2, b3) { - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - } - - function string16(value) { - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function safeString16(value) { - // clamp value to the 16-bit int range - value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value)); - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function isTrueTypeFile(file) { - var header = file.peekBytes(4); - return readUint32(header, 0) === 0x00010000; - } - - function isType1File(file) { - var header = file.peekBytes(2); - // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21). - if (header[0] === 0x25 && header[1] === 0x21) { - return true; - } - // ... obviously some fonts violate that part of the specification, - // please refer to the comment in |Type1Font| below. - if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header. - return true; - } - return false; - } - - /** - * Helper function for `adjustMapping`. - * @return {boolean} - */ - function isProblematicUnicodeLocation(code) { - // Using binary search to find a range start. - var i = 0, j = ProblematicCharRanges.length - 1; - while (i < j) { - var c = (i + j + 1) >> 1; - if (code < ProblematicCharRanges[c]) { - j = c - 1; - } else { - i = c; - } - } - // Even index means code in problematic range. - return !(i & 1); - } - - /** - * Rebuilds the char code to glyph ID map by trying to replace the char codes - * with their unicode value. It also moves char codes that are in known - * problematic locations. - * @return {Object} Two properties: - * 'toFontChar' - maps original char codes(the value that will be read - * from commands such as show text) to the char codes that will be used in the - * font that we build - * 'charCodeToGlyphId' - maps the new font char codes to glyph ids - */ - function adjustMapping(charCodeToGlyphId, properties) { - var toUnicode = properties.toUnicode; - var isSymbolic = !!(properties.flags & FontFlags.Symbolic); - var isIdentityUnicode = - properties.toUnicode instanceof IdentityToUnicodeMap; - var newMap = Object.create(null); - var toFontChar = []; - var usedFontCharCodes = []; - var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START; - for (var originalCharCode in charCodeToGlyphId) { - originalCharCode |= 0; - var glyphId = charCodeToGlyphId[originalCharCode]; - var fontCharCode = originalCharCode; - // First try to map the value to a unicode position if a non identity map - // was created. - var hasUnicodeValue = false; - if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { - var unicode = toUnicode.get(fontCharCode); - // TODO: Try to map ligatures to the correct spot. - if (unicode.length === 1) { - fontCharCode = unicode.charCodeAt(0); - } - // For Symbolic fonts, we trust the `unicode` value if and only if the - // font includes either `ToUnicode` or `Encoding` data, since otherwise - // `toUnicode` may not be correct. - hasUnicodeValue = properties.hasIncludedToUnicodeMap || - properties.hasEncoding; - } - // Try to move control characters, special characters and already mapped - // characters to the private use area since they will not be drawn by - // canvas if left in their current position. Also, move characters if the - // font was symbolic and there is only an identity unicode map since the - // characters probably aren't in the correct position (fixes an issue - // with firefox and thuluthfont). - if ((usedFontCharCodes[fontCharCode] !== undefined || - isProblematicUnicodeLocation(fontCharCode) || - (isSymbolic && !hasUnicodeValue)) && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left. - // Loop to try and find a free spot in the private use area. - do { - fontCharCode = nextAvailableFontCharCode++; - - if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) { - fontCharCode = 0xF020; - nextAvailableFontCharCode = fontCharCode + 1; - } - - } while (usedFontCharCodes[fontCharCode] !== undefined && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END); - } - - newMap[fontCharCode] = glyphId; - toFontChar[originalCharCode] = fontCharCode; - usedFontCharCodes[fontCharCode] = true; - } - return { - toFontChar: toFontChar, - charCodeToGlyphId: newMap, - nextAvailableFontCharCode: nextAvailableFontCharCode - }; - } - - function getRanges(glyphs, numGlyphs) { - // Array.sort() sorts by characters, not numerically, so convert to an - // array of characters. - var codes = []; - for (var charCode in glyphs) { - // Remove an invalid glyph ID mappings to make OTS happy. - if (glyphs[charCode] >= numGlyphs) { - continue; - } - codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] }); - } - codes.sort(function fontGetRangesSort(a, b) { - return a.fontCharCode - b.fontCharCode; - }); - - // Split the sorted codes into ranges. - var ranges = []; - var length = codes.length; - for (var n = 0; n < length; ) { - var start = codes[n].fontCharCode; - var codeIndices = [codes[n].glyphId]; - ++n; - var end = start; - while (n < length && end + 1 === codes[n].fontCharCode) { - codeIndices.push(codes[n].glyphId); - ++end; - ++n; - if (end === 0xFFFF) { - break; - } - } - ranges.push([start, end, codeIndices]); - } - - return ranges; - } - - function createCmapTable(glyphs, numGlyphs) { - var ranges = getRanges(glyphs, numGlyphs); - var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; - var cmap = '\x00\x00' + // version - string16(numTables) + // numTables - '\x00\x03' + // platformID - '\x00\x01' + // encodingID - string32(4 + numTables * 8); // start of the table record - - var i, ii, j, jj; - for (i = ranges.length - 1; i >= 0; --i) { - if (ranges[i][0] <= 0xFFFF) { break; } - } - var bmpLength = i + 1; - - if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) { - ranges[i][1] = 0xFFFE; - } - var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0; - var segCount = bmpLength + trailingRangesCount; - var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); - - // Fill up the 4 parallel arrays describing the segments. - var startCount = ''; - var endCount = ''; - var idDeltas = ''; - var idRangeOffsets = ''; - var glyphsIds = ''; - var bias = 0; - - var range, start, end, codes; - for (i = 0, ii = bmpLength; i < ii; i++) { - range = ranges[i]; - start = range[0]; - end = range[1]; - startCount += string16(start); - endCount += string16(end); - codes = range[2]; - var contiguous = true; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - contiguous = false; - break; - } - } - if (!contiguous) { - var offset = (segCount - i) * 2 + bias * 2; - bias += (end - start + 1); - - idDeltas += string16(0); - idRangeOffsets += string16(offset); - - for (j = 0, jj = codes.length; j < jj; ++j) { - glyphsIds += string16(codes[j]); - } - } else { - var startCode = codes[0]; - - idDeltas += string16((startCode - start) & 0xFFFF); - idRangeOffsets += string16(0); - } - } - - if (trailingRangesCount > 0) { - endCount += '\xFF\xFF'; - startCount += '\xFF\xFF'; - idDeltas += '\x00\x01'; - idRangeOffsets += '\x00\x00'; - } - - var format314 = '\x00\x00' + // language - string16(2 * segCount) + - string16(searchParams.range) + - string16(searchParams.entry) + - string16(searchParams.rangeShift) + - endCount + '\x00\x00' + startCount + - idDeltas + idRangeOffsets + glyphsIds; - - var format31012 = ''; - var header31012 = ''; - if (numTables > 1) { - cmap += '\x00\x03' + // platformID - '\x00\x0A' + // encodingID - string32(4 + numTables * 8 + - 4 + format314.length); // start of the table record - format31012 = ''; - for (i = 0, ii = ranges.length; i < ii; i++) { - range = ranges[i]; - start = range[0]; - codes = range[2]; - var code = codes[0]; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - end = range[0] + j - 1; - format31012 += string32(start) + // startCharCode - string32(end) + // endCharCode - string32(code); // startGlyphID - start = end + 1; - code = codes[j]; - } - } - format31012 += string32(start) + // startCharCode - string32(range[1]) + // endCharCode - string32(code); // startGlyphID - } - header31012 = '\x00\x0C' + // format - '\x00\x00' + // reserved - string32(format31012.length + 16) + // length - '\x00\x00\x00\x00' + // language - string32(format31012.length / 12); // nGroups - } - - return cmap + '\x00\x04' + // format - string16(format314.length + 4) + // length - format314 + header31012 + format31012; - } - - function validateOS2Table(os2) { - var stream = new Stream(os2.data); - var version = stream.getUint16(); - // TODO verify all OS/2 tables fields, but currently we validate only those - // that give us issues - stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges - var selection = stream.getUint16(); - if (version < 4 && (selection & 0x0300)) { - return false; - } - var firstChar = stream.getUint16(); - var lastChar = stream.getUint16(); - if (firstChar > lastChar) { - return false; - } - stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap - var usWinAscent = stream.getUint16(); - if (usWinAscent === 0) { // makes font unreadable by windows - return false; - } - - // OS/2 appears to be valid, resetting some fields - os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0 - return true; - } - - function createOS2Table(properties, charstrings, override) { - override = override || { - unitsPerEm: 0, - yMax: 0, - yMin: 0, - ascent: 0, - descent: 0 - }; - - var ulUnicodeRange1 = 0; - var ulUnicodeRange2 = 0; - var ulUnicodeRange3 = 0; - var ulUnicodeRange4 = 0; - - var firstCharIndex = null; - var lastCharIndex = 0; - - if (charstrings) { - for (var code in charstrings) { - code |= 0; - if (firstCharIndex > code || !firstCharIndex) { - firstCharIndex = code; - } - if (lastCharIndex < code) { - lastCharIndex = code; - } - - var position = getUnicodeRangeFor(code); - if (position < 32) { - ulUnicodeRange1 |= 1 << position; - } else if (position < 64) { - ulUnicodeRange2 |= 1 << position - 32; - } else if (position < 96) { - ulUnicodeRange3 |= 1 << position - 64; - } else if (position < 123) { - ulUnicodeRange4 |= 1 << position - 96; - } else { - error('Unicode ranges Bits > 123 are reserved for internal usage'); - } - } - } else { - // TODO - firstCharIndex = 0; - lastCharIndex = 255; - } - - var bbox = properties.bbox || [0, 0, 0, 0]; - var unitsPerEm = (override.unitsPerEm || - 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]); - - // if the font units differ to the PDF glyph space units - // then scale up the values - var scale = (properties.ascentScaled ? 1.0 : - unitsPerEm / PDF_GLYPH_SPACE_UNITS); - - var typoAscent = (override.ascent || - Math.round(scale * (properties.ascent || bbox[3]))); - var typoDescent = (override.descent || - Math.round(scale * (properties.descent || bbox[1]))); - if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { - typoDescent = -typoDescent; // fixing incorrect descent - } - var winAscent = override.yMax || typoAscent; - var winDescent = -override.yMin || -typoDescent; - - return '\x00\x03' + // version - '\x02\x24' + // xAvgCharWidth - '\x01\xF4' + // usWeightClass - '\x00\x05' + // usWidthClass - '\x00\x00' + // fstype (0 to let the font loads via font-face on IE) - '\x02\x8A' + // ySubscriptXSize - '\x02\xBB' + // ySubscriptYSize - '\x00\x00' + // ySubscriptXOffset - '\x00\x8C' + // ySubscriptYOffset - '\x02\x8A' + // ySuperScriptXSize - '\x02\xBB' + // ySuperScriptYSize - '\x00\x00' + // ySuperScriptXOffset - '\x01\xDF' + // ySuperScriptYOffset - '\x00\x31' + // yStrikeOutSize - '\x01\x02' + // yStrikeOutPosition - '\x00\x00' + // sFamilyClass - '\x00\x00\x06' + - String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + - '\x00\x00\x00\x00\x00\x00' + // Panose - string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31) - string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63) - string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95) - string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127) - '\x2A\x32\x31\x2A' + // achVendID - string16(properties.italicAngle ? 1 : 0) + // fsSelection - string16(firstCharIndex || - properties.firstChar) + // usFirstCharIndex - string16(lastCharIndex || properties.lastChar) + // usLastCharIndex - string16(typoAscent) + // sTypoAscender - string16(typoDescent) + // sTypoDescender - '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value) - string16(winAscent) + // usWinAscent - string16(winDescent) + // usWinDescent - '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31) - '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63) - string16(properties.xHeight) + // sxHeight - string16(properties.capHeight) + // sCapHeight - string16(0) + // usDefaultChar - string16(firstCharIndex || properties.firstChar) + // usBreakChar - '\x00\x03'; // usMaxContext - } - - function createPostTable(properties) { - var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16))); - return ('\x00\x03\x00\x00' + // Version number - string32(angle) + // italicAngle - '\x00\x00' + // underlinePosition - '\x00\x00' + // underlineThickness - string32(properties.fixedPitch) + // isFixedPitch - '\x00\x00\x00\x00' + // minMemType42 - '\x00\x00\x00\x00' + // maxMemType42 - '\x00\x00\x00\x00' + // minMemType1 - '\x00\x00\x00\x00'); // maxMemType1 - } - - function createNameTable(name, proto) { - if (!proto) { - proto = [[], []]; // no strings and unicode strings - } - - var strings = [ - proto[0][0] || 'Original licence', // 0.Copyright - proto[0][1] || name, // 1.Font family - proto[0][2] || 'Unknown', // 2.Font subfamily (font weight) - proto[0][3] || 'uniqueID', // 3.Unique ID - proto[0][4] || name, // 4.Full font name - proto[0][5] || 'Version 0.11', // 5.Version - proto[0][6] || '', // 6.Postscript name - proto[0][7] || 'Unknown', // 7.Trademark - proto[0][8] || 'Unknown', // 8.Manufacturer - proto[0][9] || 'Unknown' // 9.Designer - ]; - - // Mac want 1-byte per character strings while Windows want - // 2-bytes per character, so duplicate the names table - var stringsUnicode = []; - var i, ii, j, jj, str; - for (i = 0, ii = strings.length; i < ii; i++) { - str = proto[1][i] || strings[i]; - - var strBufUnicode = []; - for (j = 0, jj = str.length; j < jj; j++) { - strBufUnicode.push(string16(str.charCodeAt(j))); - } - stringsUnicode.push(strBufUnicode.join('')); - } - - var names = [strings, stringsUnicode]; - var platforms = ['\x00\x01', '\x00\x03']; - var encodings = ['\x00\x00', '\x00\x01']; - var languages = ['\x00\x00', '\x04\x09']; - - var namesRecordCount = strings.length * platforms.length; - var nameTable = - '\x00\x00' + // format - string16(namesRecordCount) + // Number of names Record - string16(namesRecordCount * 12 + 6); // Storage - - // Build the name records field - var strOffset = 0; - for (i = 0, ii = platforms.length; i < ii; i++) { - var strs = names[i]; - for (j = 0, jj = strs.length; j < jj; j++) { - str = strs[j]; - var nameRecord = - platforms[i] + // platform ID - encodings[i] + // encoding ID - languages[i] + // language ID - string16(j) + // name ID - string16(str.length) + - string16(strOffset); - nameTable += nameRecord; - strOffset += str.length; - } - } - - nameTable += strings.join('') + stringsUnicode.join(''); - return nameTable; - } - - Font.prototype = { - name: null, - font: null, - mimetype: null, - encoding: null, - get renderer() { - var renderer = FontRendererFactory.create(this); - return shadow(this, 'renderer', renderer); - }, - - exportData: function Font_exportData() { - var data = {}; - for (var i in this) { - if (this.hasOwnProperty(i)) { - data[i] = this[i]; - } - } - return data; - }, - - checkAndRepair: function Font_checkAndRepair(name, font, properties) { - function readTableEntry(file) { - var tag = bytesToString(file.getBytes(4)); - - var checksum = file.getInt32(); - var offset = file.getInt32() >>> 0; - var length = file.getInt32() >>> 0; - - // Read the table associated data - var previousPosition = file.pos; - file.pos = file.start ? file.start : 0; - file.skip(offset); - var data = file.getBytes(length); - file.pos = previousPosition; - - if (tag === 'head') { - // clearing checksum adjustment - data[8] = data[9] = data[10] = data[11] = 0; - data[17] |= 0x20; //Set font optimized for cleartype flag - } - - return { - tag: tag, - checksum: checksum, - length: length, - offset: offset, - data: data - }; - } - - function readOpenTypeHeader(ttf) { - return { - version: bytesToString(ttf.getBytes(4)), - numTables: ttf.getUint16(), - searchRange: ttf.getUint16(), - entrySelector: ttf.getUint16(), - rangeShift: ttf.getUint16() - }; - } - - /** - * Read the appropriate subtable from the cmap according to 9.6.6.4 from - * PDF spec - */ - function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) { - if (!cmap) { - warn('No cmap table available.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - var segment; - var start = (font.start ? font.start : 0) + cmap.offset; - font.pos = start; - - var version = font.getUint16(); - var numTables = font.getUint16(); - - var potentialTable; - var canBreak = false; - // There's an order of preference in terms of which cmap subtable to - // use: - // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table - // - symbolic fonts the preference is a 3,0 table then a 1,0 table - // The following takes advantage of the fact that the tables are sorted - // to work. - for (var i = 0; i < numTables; i++) { - var platformId = font.getUint16(); - var encodingId = font.getUint16(); - var offset = font.getInt32() >>> 0; - var useTable = false; - - if (platformId === 0 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 1 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 3 && encodingId === 1 && - ((!isSymbolicFont && hasEncoding) || !potentialTable)) { - useTable = true; - if (!isSymbolicFont) { - canBreak = true; - } - } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { - useTable = true; - canBreak = true; - } - - if (useTable) { - potentialTable = { - platformId: platformId, - encodingId: encodingId, - offset: offset - }; - } - if (canBreak) { - break; - } - } - - if (potentialTable) { - font.pos = start + potentialTable.offset; - } - if (!potentialTable || font.peekByte() === -1) { - warn('Could not find a preferred cmap table.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - var format = font.getUint16(); - var length = font.getUint16(); - var language = font.getUint16(); - - var hasShortCmap = false; - var mappings = []; - var j, glyphId; - - // TODO(mack): refactor this cmap subtable reading logic out - if (format === 0) { - for (j = 0; j < 256; j++) { - var index = font.getByte(); - if (!index) { - continue; - } - mappings.push({ - charCode: j, - glyphId: index - }); - } - hasShortCmap = true; - } else if (format === 4) { - // re-creating the table in format 4 since the encoding - // might be changed - var segCount = (font.getUint16() >> 1); - font.getBytes(6); // skipping range fields - var segIndex, segments = []; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments.push({ end: font.getUint16() }); - } - font.getUint16(); - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].start = font.getUint16(); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].delta = font.getUint16(); - } - - var offsetsCount = 0; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - var rangeOffset = font.getUint16(); - if (!rangeOffset) { - segment.offsetIndex = -1; - continue; - } - - var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); - segment.offsetIndex = offsetIndex; - offsetsCount = Math.max(offsetsCount, offsetIndex + - segment.end - segment.start + 1); - } - - var offsets = []; - for (j = 0; j < offsetsCount; j++) { - offsets.push(font.getUint16()); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - start = segment.start; - var end = segment.end; - var delta = segment.delta; - offsetIndex = segment.offsetIndex; - - for (j = start; j <= end; j++) { - if (j === 0xFFFF) { - continue; - } - - glyphId = (offsetIndex < 0 ? - j : offsets[offsetIndex + j - start]); - glyphId = (glyphId + delta) & 0xFFFF; - if (glyphId === 0) { - continue; - } - mappings.push({ - charCode: j, - glyphId: glyphId - }); - } - } - } else if (format === 6) { - // Format 6 is a 2-bytes dense mapping, which means the font data - // lives glue together even if they are pretty far in the unicode - // table. (This looks weird, so I can have missed something), this - // works on Linux but seems to fails on Mac so let's rewrite the - // cmap table to a 3-1-4 style - var firstCode = font.getUint16(); - var entryCount = font.getUint16(); - - for (j = 0; j < entryCount; j++) { - glyphId = font.getUint16(); - var charCode = firstCode + j; - - mappings.push({ - charCode: charCode, - glyphId: glyphId - }); - } - } else { - warn('cmap table has unsupported format: ' + format); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - // removing duplicate entries - mappings.sort(function (a, b) { - return a.charCode - b.charCode; - }); - for (i = 1; i < mappings.length; i++) { - if (mappings[i - 1].charCode === mappings[i].charCode) { - mappings.splice(i, 1); - i--; - } - } - - return { - platformId: potentialTable.platformId, - encodingId: potentialTable.encodingId, - mappings: mappings, - hasShortCmap: hasShortCmap - }; - } - - function sanitizeMetrics(font, header, metrics, numGlyphs) { - if (!header) { - if (metrics) { - metrics.data = null; - } - return; - } - - font.pos = (font.start ? font.start : 0) + header.offset; - font.pos += header.length - 2; - var numOfMetrics = font.getUint16(); - - if (numOfMetrics > numGlyphs) { - info('The numOfMetrics (' + numOfMetrics + ') should not be ' + - 'greater than the numGlyphs (' + numGlyphs + ')'); - // Reduce numOfMetrics if it is greater than numGlyphs - numOfMetrics = numGlyphs; - header.data[34] = (numOfMetrics & 0xff00) >> 8; - header.data[35] = numOfMetrics & 0x00ff; - } - - var numOfSidebearings = numGlyphs - numOfMetrics; - var numMissing = numOfSidebearings - - ((metrics.length - numOfMetrics * 4) >> 1); - - if (numMissing > 0) { - // For each missing glyph, we set both the width and lsb to 0 (zero). - // Since we need to add two properties for each glyph, this explains - // the use of |numMissing * 2| when initializing the typed array. - var entries = new Uint8Array(metrics.length + numMissing * 2); - entries.set(metrics.data); - metrics.data = entries; - } - } - - function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, - hintsValid) { - if (sourceEnd - sourceStart <= 12) { - // glyph with data less than 12 is invalid one - return 0; - } - var glyf = source.subarray(sourceStart, sourceEnd); - var contoursCount = (glyf[0] << 8) | glyf[1]; - if (contoursCount & 0x8000) { - // complex glyph, writing as is - dest.set(glyf, destStart); - return glyf.length; - } - - var i, j = 10, flagsCount = 0; - for (i = 0; i < contoursCount; i++) { - var endPoint = (glyf[j] << 8) | glyf[j + 1]; - flagsCount = endPoint + 1; - j += 2; - } - // skipping instructions - var instructionsStart = j; - var instructionsLength = (glyf[j] << 8) | glyf[j + 1]; - j += 2 + instructionsLength; - var instructionsEnd = j; - // validating flags - var coordinatesLength = 0; - for (i = 0; i < flagsCount; i++) { - var flag = glyf[j++]; - if (flag & 0xC0) { - // reserved flags must be zero, cleaning up - glyf[j - 1] = flag & 0x3F; - } - var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) + - ((flag & 4) ? 1 : (flag & 32) ? 0 : 2); - coordinatesLength += xyLength; - if (flag & 8) { - var repeat = glyf[j++]; - i += repeat; - coordinatesLength += repeat * xyLength; - } - } - // glyph without coordinates will be rejected - if (coordinatesLength === 0) { - return 0; - } - var glyphDataLength = j + coordinatesLength; - if (glyphDataLength > glyf.length) { - // not enough data for coordinates - return 0; - } - if (!hintsValid && instructionsLength > 0) { - dest.set(glyf.subarray(0, instructionsStart), destStart); - dest.set([0, 0], destStart + instructionsStart); - dest.set(glyf.subarray(instructionsEnd, glyphDataLength), - destStart + instructionsStart + 2); - glyphDataLength -= instructionsLength; - if (glyf.length - glyphDataLength > 3) { - glyphDataLength = (glyphDataLength + 3) & ~3; - } - return glyphDataLength; - } - if (glyf.length - glyphDataLength > 3) { - // truncating and aligning to 4 bytes the long glyph data - glyphDataLength = (glyphDataLength + 3) & ~3; - dest.set(glyf.subarray(0, glyphDataLength), destStart); - return glyphDataLength; - } - // glyph data is fine - dest.set(glyf, destStart); - return glyf.length; - } - - function sanitizeHead(head, numGlyphs, locaLength) { - var data = head.data; - - // Validate version: - // Should always be 0x00010000 - var version = int32(data[0], data[1], data[2], data[3]); - if (version >> 16 !== 1) { - info('Attempting to fix invalid version in head table: ' + version); - data[0] = 0; - data[1] = 1; - data[2] = 0; - data[3] = 0; - } - - var indexToLocFormat = int16(data[50], data[51]); - if (indexToLocFormat < 0 || indexToLocFormat > 1) { - info('Attempting to fix invalid indexToLocFormat in head table: ' + - indexToLocFormat); - - // The value of indexToLocFormat should be 0 if the loca table - // consists of short offsets, and should be 1 if the loca table - // consists of long offsets. - // - // The number of entries in the loca table should be numGlyphs + 1. - // - // Using this information, we can work backwards to deduce if the - // size of each offset in the loca table, and thus figure out the - // appropriate value for indexToLocFormat. - - var numGlyphsPlusOne = numGlyphs + 1; - if (locaLength === numGlyphsPlusOne << 1) { - // 0x0000 indicates the loca table consists of short offsets - data[50] = 0; - data[51] = 0; - } else if (locaLength === numGlyphsPlusOne << 2) { - // 0x0001 indicates the loca table consists of long offsets - data[50] = 0; - data[51] = 1; - } else { - warn('Could not fix indexToLocFormat: ' + indexToLocFormat); - } - } - } - - function sanitizeGlyphLocations(loca, glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, - dupFirstEntry) { - var itemSize, itemDecode, itemEncode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - itemEncode = function fontItemEncodeLong(data, offset, value) { - data[offset] = (value >>> 24) & 0xFF; - data[offset + 1] = (value >> 16) & 0xFF; - data[offset + 2] = (value >> 8) & 0xFF; - data[offset + 3] = value & 0xFF; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - itemEncode = function fontItemEncode(data, offset, value) { - data[offset] = (value >> 9) & 0xFF; - data[offset + 1] = (value >> 1) & 0xFF; - }; - } - var locaData = loca.data; - var locaDataSize = itemSize * (1 + numGlyphs); - // is loca.data too short or long? - if (locaData.length !== locaDataSize) { - locaData = new Uint8Array(locaDataSize); - locaData.set(loca.data.subarray(0, locaDataSize)); - loca.data = locaData; - } - // removing the invalid glyphs - var oldGlyfData = glyf.data; - var oldGlyfDataLength = oldGlyfData.length; - var newGlyfData = new Uint8Array(oldGlyfDataLength); - var startOffset = itemDecode(locaData, 0); - var writeOffset = 0; - var missingGlyphData = {}; - itemEncode(locaData, 0, writeOffset); - var i, j; - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - var endOffset = itemDecode(locaData, j); - if (endOffset > oldGlyfDataLength && - ((oldGlyfDataLength + 3) & ~3) === endOffset) { - // Aspose breaks fonts by aligning the glyphs to the qword, but not - // the glyf table size, which makes last glyph out of range. - endOffset = oldGlyfDataLength; - } - if (endOffset > oldGlyfDataLength) { - // glyph end offset points outside glyf data, rejecting the glyph - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - continue; - } - - if (startOffset === endOffset) { - missingGlyphData[i] = true; - } - - var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, - newGlyfData, writeOffset, hintsValid); - writeOffset += newLength; - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - } - - if (writeOffset === 0) { - // glyf table cannot be empty -- redoing the glyf and loca tables - // to have single glyph with one point - var simpleGlyph = new Uint8Array( - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - itemEncode(locaData, j, simpleGlyph.length); - } - glyf.data = simpleGlyph; - return missingGlyphData; - } - - if (dupFirstEntry) { - var firstEntryLength = itemDecode(locaData, itemSize); - if (newGlyfData.length > firstEntryLength + writeOffset) { - glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); - } else { - glyf.data = new Uint8Array(firstEntryLength + writeOffset); - glyf.data.set(newGlyfData.subarray(0, writeOffset)); - } - glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); - itemEncode(loca.data, locaData.length - itemSize, - writeOffset + firstEntryLength); - } else { - glyf.data = newGlyfData.subarray(0, writeOffset); - } - return missingGlyphData; - } - - function readPostScriptTable(post, properties, maxpNumGlyphs) { - var start = (font.start ? font.start : 0) + post.offset; - font.pos = start; - - var length = post.length, end = start + length; - var version = font.getInt32(); - // skip rest to the tables - font.getBytes(28); - - var glyphNames; - var valid = true; - var i; - - switch (version) { - case 0x00010000: - glyphNames = MacStandardGlyphOrdering; - break; - case 0x00020000: - var numGlyphs = font.getUint16(); - if (numGlyphs !== maxpNumGlyphs) { - valid = false; - break; - } - var glyphNameIndexes = []; - for (i = 0; i < numGlyphs; ++i) { - var index = font.getUint16(); - if (index >= 32768) { - valid = false; - break; - } - glyphNameIndexes.push(index); - } - if (!valid) { - break; - } - var customNames = []; - var strBuf = []; - while (font.pos < end) { - var stringLength = font.getByte(); - strBuf.length = stringLength; - for (i = 0; i < stringLength; ++i) { - strBuf[i] = String.fromCharCode(font.getByte()); - } - customNames.push(strBuf.join('')); - } - glyphNames = []; - for (i = 0; i < numGlyphs; ++i) { - var j = glyphNameIndexes[i]; - if (j < 258) { - glyphNames.push(MacStandardGlyphOrdering[j]); - continue; - } - glyphNames.push(customNames[j - 258]); - } - break; - case 0x00030000: - break; - default: - warn('Unknown/unsupported post table version ' + version); - valid = false; - if (properties.defaultEncoding) { - glyphNames = properties.defaultEncoding; - } - break; - } - properties.glyphNames = glyphNames; - return valid; - } - - function readNameTable(nameTable) { - var start = (font.start ? font.start : 0) + nameTable.offset; - font.pos = start; - - var names = [[], []]; - var length = nameTable.length, end = start + length; - var format = font.getUint16(); - var FORMAT_0_HEADER_LENGTH = 6; - if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { - // unsupported name table format or table "too" small - return names; - } - var numRecords = font.getUint16(); - var stringsStart = font.getUint16(); - var records = []; - var NAME_RECORD_LENGTH = 12; - var i, ii; - - for (i = 0; i < numRecords && - font.pos + NAME_RECORD_LENGTH <= end; i++) { - var r = { - platform: font.getUint16(), - encoding: font.getUint16(), - language: font.getUint16(), - name: font.getUint16(), - length: font.getUint16(), - offset: font.getUint16() - }; - // using only Macintosh and Windows platform/encoding names - if ((r.platform === 1 && r.encoding === 0 && r.language === 0) || - (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) { - records.push(r); - } - } - for (i = 0, ii = records.length; i < ii; i++) { - var record = records[i]; - var pos = start + stringsStart + record.offset; - if (pos + record.length > end) { - continue; // outside of name table, ignoring - } - font.pos = pos; - var nameIndex = record.name; - if (record.encoding) { - // unicode - var str = ''; - for (var j = 0, jj = record.length; j < jj; j += 2) { - str += String.fromCharCode(font.getUint16()); - } - names[1][nameIndex] = str; - } else { - names[0][nameIndex] = bytesToString(font.getBytes(record.length)); - } - } - return names; - } - - var TTOpsStackDeltas = [ - 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, - -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, - 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, - 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, - 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, - -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, - -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, - -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; - // 0xC0-DF == -1 and 0xE0-FF == -2 - - function sanitizeTTProgram(table, ttContext) { - var data = table.data; - var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0; - var stack = []; - var callstack = []; - var functionsCalled = []; - var tooComplexToFollowFunctions = - ttContext.tooComplexToFollowFunctions; - var inFDEF = false, ifLevel = 0, inELSE = 0; - for (var ii = data.length; i < ii;) { - var op = data[i++]; - // The TrueType instruction set docs can be found at - // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html - if (op === 0x40) { // NPUSHB - pushes n bytes - n = data[i++]; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if (op === 0x41) { // NPUSHW - pushes n words - n = data[i++]; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes - n = op - 0xB0 + 1; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words - n = op - 0xB8 + 1; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL - if (!inFDEF && !inELSE) { - // collecting inforamtion about which functions are used - funcId = stack[stack.length - 1]; - ttContext.functionsUsed[funcId] = true; - if (funcId in ttContext.functionsStackDeltas) { - stack.length += ttContext.functionsStackDeltas[funcId]; - } else if (funcId in ttContext.functionsDefined && - functionsCalled.indexOf(funcId) < 0) { - callstack.push({data: data, i: i, stackTop: stack.length - 1}); - functionsCalled.push(funcId); - pc = ttContext.functionsDefined[funcId]; - if (!pc) { - warn('TT: CALL non-existent function'); - ttContext.hintsValid = false; - return; - } - data = pc.data; - i = pc.i; - } - } - } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF - if (inFDEF || inELSE) { - warn('TT: nested FDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // collecting inforamtion about which functions are defined - lastDeff = i; - funcId = stack.pop(); - ttContext.functionsDefined[funcId] = {data: data, i: i}; - } else if (op === 0x2D) { // ENDF - end of function - if (inFDEF) { - inFDEF = false; - lastEndf = i; - } else { - pc = callstack.pop(); - if (!pc) { - warn('TT: ENDF bad stack'); - ttContext.hintsValid = false; - return; - } - funcId = functionsCalled.pop(); - data = pc.data; - i = pc.i; - ttContext.functionsStackDeltas[funcId] = - stack.length - pc.stackTop; - } - } else if (op === 0x89) { // IDEF - instruction definition - if (inFDEF || inELSE) { - warn('TT: nested IDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // recording it as a function to track ENDF - lastDeff = i; - } else if (op === 0x58) { // IF - ++ifLevel; - } else if (op === 0x1B) { // ELSE - inELSE = ifLevel; - } else if (op === 0x59) { // EIF - if (inELSE === ifLevel) { - inELSE = 0; - } - --ifLevel; - } else if (op === 0x1C) { // JMPR - if (!inFDEF && !inELSE) { - var offset = stack[stack.length - 1]; - // only jumping forward to prevent infinite loop - if (offset > 0) { - i += offset - 1; - } - } - } - // Adjusting stack not extactly, but just enough to get function id - if (!inFDEF && !inELSE) { - var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : - op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0; - if (op >= 0x71 && op <= 0x75) { - n = stack.pop(); - if (n === n) { - stackDelta = -n * 2; - } - } - while (stackDelta < 0 && stack.length > 0) { - stack.pop(); - stackDelta++; - } - while (stackDelta > 0) { - stack.push(NaN); // pushing any number into stack - stackDelta--; - } - } - } - ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; - var content = [data]; - if (i > data.length) { - content.push(new Uint8Array(i - data.length)); - } - if (lastDeff > lastEndf) { - warn('TT: complementing a missing function tail'); - // new function definition started, but not finished - // complete function by [CLEAR, ENDF] - content.push(new Uint8Array([0x22, 0x2D])); - } - foldTTTable(table, content); - } - - function checkInvalidFunctions(ttContext, maxFunctionDefs) { - if (ttContext.tooComplexToFollowFunctions) { - return; - } - if (ttContext.functionsDefined.length > maxFunctionDefs) { - warn('TT: more functions defined than expected'); - ttContext.hintsValid = false; - return; - } - for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { - if (j > maxFunctionDefs) { - warn('TT: invalid function id: ' + j); - ttContext.hintsValid = false; - return; - } - if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { - warn('TT: undefined function: ' + j); - ttContext.hintsValid = false; - return; - } - } - } - - function foldTTTable(table, content) { - if (content.length > 1) { - // concatenating the content items - var newLength = 0; - var j, jj; - for (j = 0, jj = content.length; j < jj; j++) { - newLength += content[j].length; - } - newLength = (newLength + 3) & ~3; - var result = new Uint8Array(newLength); - var pos = 0; - for (j = 0, jj = content.length; j < jj; j++) { - result.set(content[j], pos); - pos += content[j].length; - } - table.data = result; - table.length = newLength; - } - } - - function sanitizeTTPrograms(fpgm, prep, cvt) { - var ttContext = { - functionsDefined: [], - functionsUsed: [], - functionsStackDeltas: [], - tooComplexToFollowFunctions: false, - hintsValid: true - }; - if (fpgm) { - sanitizeTTProgram(fpgm, ttContext); - } - if (prep) { - sanitizeTTProgram(prep, ttContext); - } - if (fpgm) { - checkInvalidFunctions(ttContext, maxFunctionDefs); - } - if (cvt && (cvt.length & 1)) { - var cvtData = new Uint8Array(cvt.length + 1); - cvtData.set(cvt.data); - cvt.data = cvtData; - } - return ttContext.hintsValid; - } - - // The following steps modify the original font data, making copy - font = new Stream(new Uint8Array(font.getBytes())); - - var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', - 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF ']; - - var header = readOpenTypeHeader(font); - var numTables = header.numTables; - var cff, cffFile; - - var tables = { 'OS/2': null, cmap: null, head: null, hhea: null, - hmtx: null, maxp: null, name: null, post: null }; - var table; - for (var i = 0; i < numTables; i++) { - table = readTableEntry(font); - if (VALID_TABLES.indexOf(table.tag) < 0) { - continue; // skipping table if it's not a required or optional table - } - if (table.length === 0) { - continue; // skipping empty tables - } - tables[table.tag] = table; - } - - var isTrueType = !tables['CFF ']; - if (!isTrueType) { - // OpenType font - if ((header.version === 'OTTO' && properties.type !== 'CIDFontType2') || - !tables.head || !tables.hhea || !tables.maxp || !tables.post) { - // no major tables: throwing everything at CFFFont - cffFile = new Stream(tables['CFF '].data); - cff = new CFFFont(cffFile, properties); - - adjustWidths(properties); - - return this.convert(name, cff, properties); - } - - delete tables.glyf; - delete tables.loca; - delete tables.fpgm; - delete tables.prep; - delete tables['cvt ']; - this.isOpenType = true; - } else { - if (!tables.glyf || !tables.loca) { - error('Required "glyf" or "loca" tables are not found'); - } - this.isOpenType = false; - } - - if (!tables.maxp) { - error('Required "maxp" table is not found'); - } - - font.pos = (font.start || 0) + tables.maxp.offset; - var version = font.getInt32(); - var numGlyphs = font.getUint16(); - var maxFunctionDefs = 0; - if (version >= 0x00010000 && tables.maxp.length >= 22) { - // maxZones can be invalid - font.pos += 8; - var maxZones = font.getUint16(); - if (maxZones > 2) { // reset to 2 if font has invalid maxZones - tables.maxp.data[14] = 0; - tables.maxp.data[15] = 2; - } - font.pos += 4; - maxFunctionDefs = font.getUint16(); - } - - var dupFirstEntry = false; - if (properties.type === 'CIDFontType2' && properties.toUnicode && - properties.toUnicode.get(0) > '\u0000') { - // oracle's defect (see 3427), duplicating first entry - dupFirstEntry = true; - numGlyphs++; - tables.maxp.data[4] = numGlyphs >> 8; - tables.maxp.data[5] = numGlyphs & 255; - } - - var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, - tables['cvt '], maxFunctionDefs); - if (!hintsValid) { - delete tables.fpgm; - delete tables.prep; - delete tables['cvt ']; - } - - // Ensure the hmtx table contains the advance width and - // sidebearings information for numGlyphs in the maxp table - sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs); - - if (!tables.head) { - error('Required "head" table is not found'); - } - - sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); - - var missingGlyphs = {}; - if (isTrueType) { - var isGlyphLocationsLong = int16(tables.head.data[50], - tables.head.data[51]); - missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, - numGlyphs, isGlyphLocationsLong, - hintsValid, dupFirstEntry); - } - - if (!tables.hhea) { - error('Required "hhea" table is not found'); - } - - // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth - // Sometimes it's 0. That needs to be fixed - if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { - tables.hhea.data[10] = 0xFF; - tables.hhea.data[11] = 0xFF; - } - - // Extract some more font properties from the OpenType head and - // hhea tables; yMin and descent value are always negative. - var metricsOverride = { - unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), - yMax: int16(tables.head.data[42], tables.head.data[43]), - yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000, - ascent: int16(tables.hhea.data[4], tables.hhea.data[5]), - descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000 - }; - - // PDF FontDescriptor metrics lie -- using data from actual font. - this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; - this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; - - // The 'post' table has glyphs names. - if (tables.post) { - var valid = readPostScriptTable(tables.post, properties, numGlyphs); - if (!valid) { - tables.post = null; - } - } - - var charCodeToGlyphId = [], charCode; - var toUnicode = properties.toUnicode, widths = properties.widths; - var skipToUnicode = (toUnicode instanceof IdentityToUnicodeMap || - toUnicode.length === 0x10000); - - // Helper function to try to skip mapping of empty glyphs. - // Note: In some cases, just relying on the glyph data doesn't work, - // hence we also use a few heuristics to fix various PDF files. - function hasGlyph(glyphId, charCode, widthCode) { - if (!missingGlyphs[glyphId]) { - return true; - } - if (!skipToUnicode && charCode >= 0 && toUnicode.has(charCode)) { - return true; - } - if (widths && widthCode >= 0 && isNum(widths[widthCode])) { - return true; - } - return false; - } - - if (properties.type === 'CIDFontType2') { - var cidToGidMap = properties.cidToGidMap || []; - var isCidToGidMapEmpty = cidToGidMap.length === 0; - - properties.cMap.forEach(function(charCode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - var glyphId = -1; - if (isCidToGidMapEmpty) { - glyphId = charCode; - } else if (cidToGidMap[cid] !== undefined) { - glyphId = cidToGidMap[cid]; - } - - if (glyphId >= 0 && glyphId < numGlyphs && - hasGlyph(glyphId, charCode, cid)) { - charCodeToGlyphId[charCode] = glyphId; - } - }); - if (dupFirstEntry) { - charCodeToGlyphId[0] = numGlyphs - 1; - } - } else { - // Most of the following logic in this code branch is based on the - // 9.6.6.4 of the PDF spec. - var hasEncoding = - properties.differences.length > 0 || !!properties.baseEncodingName; - var cmapTable = - readCmapTable(tables.cmap, font, this.isSymbolicFont, hasEncoding); - var cmapPlatformId = cmapTable.platformId; - var cmapEncodingId = cmapTable.encodingId; - var cmapMappings = cmapTable.mappings; - var cmapMappingsLength = cmapMappings.length; - - // The spec seems to imply that if the font is symbolic the encoding - // should be ignored, this doesn't appear to work for 'preistabelle.pdf' - // where the the font is symbolic and it has an encoding. - if (hasEncoding && - (cmapPlatformId === 3 && cmapEncodingId === 1 || - cmapPlatformId === 1 && cmapEncodingId === 0) || - (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack - !!Encodings[properties.baseEncodingName])) { // Temporary hack - // When no preferred cmap table was found and |baseEncodingName| is - // one of the predefined encodings, we seem to obtain a better - // |charCodeToGlyphId| map from the code below (fixes bug 1057544). - // TODO: Note that this is a hack which should be removed as soon as - // we have proper support for more exotic cmap tables. - - var baseEncoding = []; - if (properties.baseEncodingName === 'MacRomanEncoding' || - properties.baseEncodingName === 'WinAnsiEncoding') { - baseEncoding = Encodings[properties.baseEncodingName]; - } - for (charCode = 0; charCode < 256; charCode++) { - var glyphName; - if (this.differences && charCode in this.differences) { - glyphName = this.differences[charCode]; - } else if (charCode in baseEncoding && - baseEncoding[charCode] !== '') { - glyphName = baseEncoding[charCode]; - } else { - glyphName = Encodings.StandardEncoding[charCode]; - } - if (!glyphName) { - continue; - } - var unicodeOrCharCode, isUnicode = false; - if (cmapPlatformId === 3 && cmapEncodingId === 1) { - unicodeOrCharCode = GlyphsUnicode[glyphName]; - isUnicode = true; - } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { - // TODO: the encoding needs to be updated with mac os table. - unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName); - } - - var found = false; - for (i = 0; i < cmapMappingsLength; ++i) { - if (cmapMappings[i].charCode !== unicodeOrCharCode) { - continue; - } - var code = isUnicode ? charCode : unicodeOrCharCode; - if (hasGlyph(cmapMappings[i].glyphId, code, -1)) { - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - found = true; - break; - } - } - if (!found && properties.glyphNames) { - // Try to map using the post table. - var glyphId = properties.glyphNames.indexOf(glyphName); - if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - } else if (cmapPlatformId === 0 && cmapEncodingId === 0) { - // Default Unicode semantics, use the charcodes as is. - for (i = 0; i < cmapMappingsLength; ++i) { - charCodeToGlyphId[cmapMappings[i].charCode] = - cmapMappings[i].glyphId; - } - } else { - // For (3, 0) cmap tables: - // The charcode key being stored in charCodeToGlyphId is the lower - // byte of the two-byte charcodes of the cmap table since according to - // the spec: 'each byte from the string shall be prepended with the - // high byte of the range [of charcodes in the cmap table], to form - // a two-byte character, which shall be used to select the - // associated glyph description from the subtable'. - // - // For (1, 0) cmap tables: - // 'single bytes from the string shall be used to look up the - // associated glyph descriptions from the subtable'. This means - // charcodes in the cmap will be single bytes, so no-op since - // glyph.charCode & 0xFF === glyph.charCode - for (i = 0; i < cmapMappingsLength; ++i) { - charCode = cmapMappings[i].charCode & 0xFF; - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - } - } - } - - if (charCodeToGlyphId.length === 0) { - // defines at least one glyph - charCodeToGlyphId[0] = 0; - } - - // Converting glyphs and ids into font's cmap table - var newMapping = adjustMapping(charCodeToGlyphId, properties); - this.toFontChar = newMapping.toFontChar; - tables.cmap = { - tag: 'cmap', - data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs) - }; - - if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { - tables['OS/2'] = { - tag: 'OS/2', - data: createOS2Table(properties, newMapping.charCodeToGlyphId, - metricsOverride) - }; - } - - // Rewrite the 'post' table if needed - if (!tables.post) { - tables.post = { - tag: 'post', - data: createPostTable(properties) - }; - } - - if (!isTrueType) { - try { - // Trying to repair CFF file - cffFile = new Stream(tables['CFF '].data); - var parser = new CFFParser(cffFile, properties); - cff = parser.parse(); - var compiler = new CFFCompiler(cff); - tables['CFF '].data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - } - } - - // Re-creating 'name' table - if (!tables.name) { - tables.name = { - tag: 'name', - data: createNameTable(this.name) - }; - } else { - // ... using existing 'name' table as prototype - var namePrototype = readNameTable(tables.name); - tables.name.data = createNameTable(name, namePrototype); - } - - var builder = new OpenTypeFileBuilder(header.version); - for (var tableTag in tables) { - builder.addTable(tableTag, tables[tableTag].data); - } - return builder.toArray(); - }, - - convert: function Font_convert(fontName, font, properties) { - // TODO: Check the charstring widths to determine this. - properties.fixedPitch = false; - - var mapping = font.getGlyphMapping(properties); - var newMapping = adjustMapping(mapping, properties); - this.toFontChar = newMapping.toFontChar; - var numGlyphs = font.numGlyphs; - - function getCharCodes(charCodeToGlyphId, glyphId) { - var charCodes = null; - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - if (!charCodes) { - charCodes = []; - } - charCodes.push(charCode | 0); - } - } - return charCodes; - } - - function createCharCode(charCodeToGlyphId, glyphId) { - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - return charCode | 0; - } - } - newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = - glyphId; - return newMapping.nextAvailableFontCharCode++; - } - - var seacs = font.seacs; - if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { - var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; - var charset = font.getCharset(); - var seacMap = Object.create(null); - for (var glyphId in seacs) { - glyphId |= 0; - var seac = seacs[glyphId]; - var baseGlyphName = Encodings.StandardEncoding[seac[2]]; - var accentGlyphName = Encodings.StandardEncoding[seac[3]]; - var baseGlyphId = charset.indexOf(baseGlyphName); - var accentGlyphId = charset.indexOf(accentGlyphName); - if (baseGlyphId < 0 || accentGlyphId < 0) { - continue; - } - var accentOffset = { - x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], - y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] - }; - - var charCodes = getCharCodes(mapping, glyphId); - if (!charCodes) { - // There's no point in mapping it if the char code was never mapped - // to begin with. - continue; - } - for (var i = 0, ii = charCodes.length; i < ii; i++) { - var charCode = charCodes[i]; - // Find a fontCharCode that maps to the base and accent glyphs. - // If one doesn't exists, create it. - var charCodeToGlyphId = newMapping.charCodeToGlyphId; - var baseFontCharCode = createCharCode(charCodeToGlyphId, - baseGlyphId); - var accentFontCharCode = createCharCode(charCodeToGlyphId, - accentGlyphId); - seacMap[charCode] = { - baseFontCharCode: baseFontCharCode, - accentFontCharCode: accentFontCharCode, - accentOffset: accentOffset - }; - } - } - properties.seacMap = seacMap; - } - - var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; - - var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F'); - // PostScript Font Program - builder.addTable('CFF ', font.data); - // OS/2 and Windows Specific metrics - builder.addTable('OS/2', createOS2Table(properties, - newMapping.charCodeToGlyphId)); - // Character to glyphs mapping - builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, - numGlyphs)); - // Font header - builder.addTable('head', - '\x00\x01\x00\x00' + // Version number - '\x00\x00\x10\x00' + // fontRevision - '\x00\x00\x00\x00' + // checksumAdjustement - '\x5F\x0F\x3C\xF5' + // magicNumber - '\x00\x00' + // Flags - safeString16(unitsPerEm) + // unitsPerEM - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date - '\x00\x00' + // xMin - safeString16(properties.descent) + // yMin - '\x0F\xFF' + // xMax - safeString16(properties.ascent) + // yMax - string16(properties.italicAngle ? 2 : 0) + // macStyle - '\x00\x11' + // lowestRecPPEM - '\x00\x00' + // fontDirectionHint - '\x00\x00' + // indexToLocFormat - '\x00\x00'); // glyphDataFormat - - // Horizontal header - builder.addTable('hhea', - '\x00\x01\x00\x00' + // Version number - safeString16(properties.ascent) + // Typographic Ascent - safeString16(properties.descent) + // Typographic Descent - '\x00\x00' + // Line Gap - '\xFF\xFF' + // advanceWidthMax - '\x00\x00' + // minLeftSidebearing - '\x00\x00' + // minRightSidebearing - '\x00\x00' + // xMaxExtent - safeString16(properties.capHeight) + // caretSlopeRise - safeString16(Math.tan(properties.italicAngle) * - properties.xHeight) + // caretSlopeRun - '\x00\x00' + // caretOffset - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // metricDataFormat - string16(numGlyphs)); // Number of HMetrics - - // Horizontal metrics - builder.addTable('hmtx', (function fontFieldsHmtx() { - var charstrings = font.charstrings; - var cffWidths = font.cff ? font.cff.widths : null; - var hmtx = '\x00\x00\x00\x00'; // Fake .notdef - for (var i = 1, ii = numGlyphs; i < ii; i++) { - var width = 0; - if (charstrings) { - var charstring = charstrings[i - 1]; - width = 'width' in charstring ? charstring.width : 0; - } else if (cffWidths) { - width = Math.ceil(cffWidths[i] || 0); - } - hmtx += string16(width) + string16(0); - } - return hmtx; - })()); - - // Maximum profile - builder.addTable('maxp', - '\x00\x00\x50\x00' + // Version number - string16(numGlyphs)); // Num of glyphs - - // Naming tables - builder.addTable('name', createNameTable(fontName)); - - // PostScript informations - builder.addTable('post', createPostTable(properties)); - - return builder.toArray(); - }, - - /** - * Builds a char code to unicode map based on section 9.10 of the spec. - * @param {Object} properties Font properties object. - * @return {Object} A ToUnicodeMap object. - */ - buildToUnicode: function Font_buildToUnicode(properties) { - // Section 9.10.2 Mapping Character Codes to Unicode Values - if (properties.toUnicode && properties.toUnicode.length !== 0) { - return properties.toUnicode; - } - // According to the spec if the font is a simple font we should only map - // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or - // the differences array only contains adobe standard or symbol set names, - // in pratice it seems better to always try to create a toUnicode - // map based of the default encoding. - var toUnicode, charcode; - if (!properties.composite /* is simple font */) { - toUnicode = []; - var encoding = properties.defaultEncoding.slice(); - var baseEncodingName = properties.baseEncodingName; - // Merge in the differences array. - var differences = properties.differences; - for (charcode in differences) { - encoding[charcode] = differences[charcode]; - } - for (charcode in encoding) { - // a) Map the character code to a character name. - var glyphName = encoding[charcode]; - // b) Look up the character name in the Adobe Glyph List (see the - // Bibliography) to obtain the corresponding Unicode value. - if (glyphName === '') { - continue; - } else if (GlyphsUnicode[glyphName] === undefined) { - // (undocumented) c) Few heuristics to recognize unknown glyphs - // NOTE: Adobe Reader does not do this step, but OSX Preview does - var code = 0; - switch (glyphName[0]) { - case 'G': // Gxx glyph - if (glyphName.length === 3) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'g': // g00xx glyph - if (glyphName.length === 5) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'C': // Cddd glyph - case 'c': // cddd glyph - if (glyphName.length >= 3) { - code = +glyphName.substr(1); - } - break; - } - if (code) { - // If |baseEncodingName| is one the predefined encodings, - // and |code| equals |charcode|, using the glyph defined in the - // baseEncoding seems to yield a better |toUnicode| mapping - // (fixes issue 5070). - if (baseEncodingName && code === +charcode) { - var baseEncoding = Encodings[baseEncodingName]; - if (baseEncoding && (glyphName = baseEncoding[charcode])) { - toUnicode[charcode] = - String.fromCharCode(GlyphsUnicode[glyphName]); - continue; - } - } - toUnicode[charcode] = String.fromCharCode(code); - } - continue; - } - toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]); - } - return new ToUnicodeMap(toUnicode); - } - // If the font is a composite font that uses one of the predefined CMaps - // listed in Table 118 (except Identity–H and Identity–V) or whose - // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or - // Adobe-Korea1 character collection: - if (properties.composite && ( - (properties.cMap.builtInCMap && - !(properties.cMap instanceof IdentityCMap)) || - (properties.cidSystemInfo.registry === 'Adobe' && - (properties.cidSystemInfo.ordering === 'GB1' || - properties.cidSystemInfo.ordering === 'CNS1' || - properties.cidSystemInfo.ordering === 'Japan1' || - properties.cidSystemInfo.ordering === 'Korea1')))) { - // Then: - // a) Map the character code to a character identifier (CID) according - // to the font’s CMap. - // b) Obtain the registry and ordering of the character collection used - // by the font’s CMap (for example, Adobe and Japan1) from its - // CIDSystemInfo dictionary. - var registry = properties.cidSystemInfo.registry; - var ordering = properties.cidSystemInfo.ordering; - // c) Construct a second CMap name by concatenating the registry and - // ordering obtained in step (b) in the format registry–ordering–UCS2 - // (for example, Adobe–Japan1–UCS2). - var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2'); - // d) Obtain the CMap with the name constructed in step (c) (available - // from the ASN Web site; see the Bibliography). - var ucs2CMap = CMapFactory.create(ucs2CMapName, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - var cMap = properties.cMap; - toUnicode = []; - cMap.forEach(function(charcode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - // e) Map the CID obtained in step (a) according to the CMap obtained - // in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.lookup(cid); - if (ucs2) { - toUnicode[charcode] = - String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } - }); - return new ToUnicodeMap(toUnicode); - } - - // The viewer's choice, just use an identity map. - return new IdentityToUnicodeMap(properties.firstChar, - properties.lastChar); - }, - - get spaceWidth() { - if ('_shadowWidth' in this) { - return this._shadowWidth; - } - - // trying to estimate space character width - var possibleSpaceReplacements = ['space', 'minus', 'one', 'i']; - var width; - for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { - var glyphName = possibleSpaceReplacements[i]; - // if possible, getting width by glyph name - if (glyphName in this.widths) { - width = this.widths[glyphName]; - break; - } - var glyphUnicode = GlyphsUnicode[glyphName]; - // finding the charcode via unicodeToCID map - var charcode = 0; - if (this.composite) { - if (this.cMap.contains(glyphUnicode)) { - charcode = this.cMap.lookup(glyphUnicode); - } - } - // ... via toUnicode map - if (!charcode && this.toUnicode) { - charcode = this.toUnicode.charCodeOf(glyphUnicode); - } - // setting it to unicode if negative or undefined - if (charcode <= 0) { - charcode = glyphUnicode; - } - // trying to get width via charcode - width = this.widths[charcode]; - if (width) { - break; // the non-zero width found - } - } - width = width || this.defaultWidth; - // Do not shadow the property here. See discussion: - // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280 - this._shadowWidth = width; - return width; - }, - - charToGlyph: function Font_charToGlyph(charcode, isSpace) { - var fontCharCode, width, operatorListId; - - var widthCode = charcode; - if (this.cMap && this.cMap.contains(charcode)) { - widthCode = this.cMap.lookup(charcode); - } - width = this.widths[widthCode]; - width = isNum(width) ? width : this.defaultWidth; - var vmetric = this.vmetrics && this.vmetrics[widthCode]; - - var unicode = this.toUnicode.get(charcode) || charcode; - if (typeof unicode === 'number') { - unicode = String.fromCharCode(unicode); - } - - // First try the toFontChar map, if it's not there then try falling - // back to the char code. - fontCharCode = this.toFontChar[charcode] || charcode; - if (this.missingFile) { - fontCharCode = mapSpecialUnicodeValues(fontCharCode); - } - - if (this.isType3Font) { - // Font char code in this case is actually a glyph name. - operatorListId = fontCharCode; - } - - var accent = null; - if (this.seacMap && this.seacMap[charcode]) { - var seac = this.seacMap[charcode]; - fontCharCode = seac.baseFontCharCode; - accent = { - fontChar: String.fromCharCode(seac.accentFontCharCode), - offset: seac.accentOffset - }; - } - - var fontChar = String.fromCharCode(fontCharCode); - - var glyph = this.glyphCache[charcode]; - if (!glyph || - !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace)) { - glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace); - this.glyphCache[charcode] = glyph; - } - return glyph; - }, - - charsToGlyphs: function Font_charsToGlyphs(chars) { - var charsCache = this.charsCache; - var glyphs, glyph, charcode; - - // if we translated this string before, just grab it from the cache - if (charsCache) { - glyphs = charsCache[chars]; - if (glyphs) { - return glyphs; - } - } - - // lazily create the translation cache - if (!charsCache) { - charsCache = this.charsCache = Object.create(null); - } - - glyphs = []; - var charsCacheKey = chars; - var i = 0, ii; - - if (this.cMap) { - // composite fonts have multi-byte strings convert the string from - // single-byte to multi-byte - var c = {}; - while (i < chars.length) { - this.cMap.readCharCode(chars, i, c); - charcode = c.charcode; - var length = c.length; - i += length; - // Space is char with code 0x20 and length 1 in multiple-byte codes. - var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; - glyph = this.charToGlyph(charcode, isSpace); - glyphs.push(glyph); - } - } else { - for (i = 0, ii = chars.length; i < ii; ++i) { - charcode = chars.charCodeAt(i); - glyph = this.charToGlyph(charcode, charcode === 0x20); - glyphs.push(glyph); - } - } - - // Enter the translated string into the cache - return (charsCache[charsCacheKey] = glyphs); - } - }; - - return Font; -})(); - -var ErrorFont = (function ErrorFontClosure() { - function ErrorFont(error) { - this.error = error; - this.loadedName = 'g_font_error'; - this.loading = false; - } - - ErrorFont.prototype = { - charsToGlyphs: function ErrorFont_charsToGlyphs() { - return []; - }, - exportData: function ErrorFont_exportData() { - return {error: this.error}; - } - }; - - return ErrorFont; -})(); - -/** - * Shared logic for building a char code to glyph id mapping for Type1 and - * simple CFF fonts. See section 9.6.6.2 of the spec. - * @param {Object} properties Font properties object. - * @param {Object} builtInEncoding The encoding contained within the actual font - * data. - * @param {Array} Array of glyph names where the index is the glyph ID. - * @returns {Object} A char code to glyph ID map. - */ -function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { - var charCodeToGlyphId = Object.create(null); - var glyphId, charCode, baseEncoding; - - if (properties.baseEncodingName) { - // If a valid base encoding name was used, the mapping is initialized with - // that. - baseEncoding = Encodings[properties.baseEncodingName]; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } else if (!!(properties.flags & FontFlags.Symbolic)) { - // For a symbolic font the encoding should be the fonts built-in - // encoding. - for (charCode in builtInEncoding) { - charCodeToGlyphId[charCode] = builtInEncoding[charCode]; - } - } else { - // For non-symbolic fonts that don't have a base encoding the standard - // encoding should be used. - baseEncoding = Encodings.StandardEncoding; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - - // Lastly, merge in the differences. - var differences = properties.differences; - if (differences) { - for (charCode in differences) { - var glyphName = differences[charCode]; - glyphId = glyphNames.indexOf(glyphName); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - return charCodeToGlyphId; -} - -/* - * CharStrings are encoded following the the CharString Encoding sequence - * describe in Chapter 6 of the "Adobe Type1 Font Format" specification. - * The value in a byte indicates a command, a number, or subsequent bytes - * that are to be interpreted in a special way. - * - * CharString Number Encoding: - * A CharString byte containing the values from 32 through 255 inclusive - * indicate an integer. These values are decoded in four ranges. - * - * 1. A CharString byte containing a value, v, between 32 and 246 inclusive, - * indicate the integer v - 139. Thus, the integer values from -107 through - * 107 inclusive may be encoded in single byte. - * - * 2. A CharString byte containing a value, v, between 247 and 250 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * [(v - 247) x 256] + w + 108 - * - * 3. A CharString byte containing a value, v, between 251 and 254 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * -[(v - 251) * 256] - w - 108 - * - * 4. A CharString containing the value 255 indicates that the next 4 bytes - * are a two complement signed integer. The first of these bytes contains the - * highest order bits, the second byte contains the next higher order bits - * and the fourth byte contain the lowest order bits. - * - * - * CharString Command Encoding: - * CharStrings commands are encoded in 1 or 2 bytes. - * - * Single byte commands are encoded in 1 byte that contains a value between - * 0 and 31 inclusive. - * If a command byte contains the value 12, then the value in the next byte - * indicates a command. This "escape" mechanism allows many extra commands - * to be encoded and this encoding technique helps to minimize the length of - * the charStrings. - */ -var Type1CharString = (function Type1CharStringClosure() { - var COMMAND_MAP = { - 'hstem': [1], - 'vstem': [3], - 'vmoveto': [4], - 'rlineto': [5], - 'hlineto': [6], - 'vlineto': [7], - 'rrcurveto': [8], - 'callsubr': [10], - 'flex': [12, 35], - 'drop' : [12, 18], - 'endchar': [14], - 'rmoveto': [21], - 'hmoveto': [22], - 'vhcurveto': [30], - 'hvcurveto': [31] - }; - - function Type1CharString() { - this.width = 0; - this.lsb = 0; - this.flexing = false; - this.output = []; - this.stack = []; - } - - Type1CharString.prototype = { - convert: function Type1CharString_convert(encoded, subrs) { - var count = encoded.length; - var error = false; - var wx, sbx, subrNumber; - for (var i = 0; i < count; i++) { - var value = encoded[i]; - if (value < 32) { - if (value === 12) { - value = (value << 8) + encoded[++i]; - } - switch (value) { - case 1: // hstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case 3: // vstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case 4: // vmoveto - if (this.flexing) { - if (this.stack.length < 1) { - error = true; - break; - } - // Add the dx for flex and but also swap the values so they are - // the right order. - var dy = this.stack.pop(); - this.stack.push(0, dy); - break; - } - error = this.executeCommand(1, COMMAND_MAP.vmoveto); - break; - case 5: // rlineto - error = this.executeCommand(2, COMMAND_MAP.rlineto); - break; - case 6: // hlineto - error = this.executeCommand(1, COMMAND_MAP.hlineto); - break; - case 7: // vlineto - error = this.executeCommand(1, COMMAND_MAP.vlineto); - break; - case 8: // rrcurveto - error = this.executeCommand(6, COMMAND_MAP.rrcurveto); - break; - case 9: // closepath - // closepath is a Type1 command that does not take argument and is - // useless in Type2 and it can simply be ignored. - this.stack = []; - break; - case 10: // callsubr - if (this.stack.length < 1) { - error = true; - break; - } - subrNumber = this.stack.pop(); - error = this.convert(subrs[subrNumber], subrs); - break; - case 11: // return - return error; - case 13: // hsbw - if (this.stack.length < 2) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use hmoveto with lsb. - wx = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx); - error = this.executeCommand(2, COMMAND_MAP.hmoveto); - break; - case 14: // endchar - this.output.push(COMMAND_MAP.endchar[0]); - break; - case 21: // rmoveto - if (this.flexing) { - break; - } - error = this.executeCommand(2, COMMAND_MAP.rmoveto); - break; - case 22: // hmoveto - if (this.flexing) { - // Add the dy for flex. - this.stack.push(0); - break; - } - error = this.executeCommand(1, COMMAND_MAP.hmoveto); - break; - case 30: // vhcurveto - error = this.executeCommand(4, COMMAND_MAP.vhcurveto); - break; - case 31: // hvcurveto - error = this.executeCommand(4, COMMAND_MAP.hvcurveto); - break; - case (12 << 8) + 0: // dotsection - // dotsection is a Type1 command to specify some hinting feature - // for dots that do not take a parameter and it can safely be - // ignored for Type2. - this.stack = []; - break; - case (12 << 8) + 1: // vstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // [vh]stem3 are Type1 only and Type2 supports [vh]stem with - // multiple parameters, so instead of returning [vh]stem3 take a - // shortcut and return [vhstem] instead. - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case (12 << 8) + 2: // hstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // See vstem3. - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case (12 << 8) + 6: // seac - // seac is like type 2's special endchar but it doesn't use the - // first argument asb, so remove it. - if (SEAC_ANALYSIS_ENABLED) { - this.seac = this.stack.splice(-4, 4); - error = this.executeCommand(0, COMMAND_MAP.endchar); - } else { - error = this.executeCommand(4, COMMAND_MAP.endchar); - } - break; - case (12 << 8) + 7: // sbw - if (this.stack.length < 4) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use rmoveto with - // (dx, dy). The height argument will not be used for vmtx and - // vhea tables reconstruction -- ignoring it. - var wy = this.stack.pop(); - wx = this.stack.pop(); - var sby = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx, sby); - error = this.executeCommand(3, COMMAND_MAP.rmoveto); - break; - case (12 << 8) + 12: // div - if (this.stack.length < 2) { - error = true; - break; - } - var num2 = this.stack.pop(); - var num1 = this.stack.pop(); - this.stack.push(num1 / num2); - break; - case (12 << 8) + 16: // callothersubr - if (this.stack.length < 2) { - error = true; - break; - } - subrNumber = this.stack.pop(); - var numArgs = this.stack.pop(); - if (subrNumber === 0 && numArgs === 3) { - var flexArgs = this.stack.splice(this.stack.length - 17, 17); - this.stack.push( - flexArgs[2] + flexArgs[0], // bcp1x + rpx - flexArgs[3] + flexArgs[1], // bcp1y + rpy - flexArgs[4], // bcp2x - flexArgs[5], // bcp2y - flexArgs[6], // p2x - flexArgs[7], // p2y - flexArgs[8], // bcp3x - flexArgs[9], // bcp3y - flexArgs[10], // bcp4x - flexArgs[11], // bcp4y - flexArgs[12], // p3x - flexArgs[13], // p3y - flexArgs[14] // flexDepth - // 15 = finalx unused by flex - // 16 = finaly unused by flex - ); - error = this.executeCommand(13, COMMAND_MAP.flex, true); - this.flexing = false; - this.stack.push(flexArgs[15], flexArgs[16]); - } else if (subrNumber === 1 && numArgs === 0) { - this.flexing = true; - } - break; - case (12 << 8) + 17: // pop - // Ignore this since it is only used with othersubr. - break; - case (12 << 8) + 33: // setcurrentpoint - // Ignore for now. - this.stack = []; - break; - default: - warn('Unknown type 1 charstring command of "' + value + '"'); - break; - } - if (error) { - break; - } - continue; - } else if (value <= 246) { - value = value - 139; - } else if (value <= 250) { - value = ((value - 247) * 256) + encoded[++i] + 108; - } else if (value <= 254) { - value = -((value - 251) * 256) - encoded[++i] - 108; - } else { - value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | - (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; - } - this.stack.push(value); - } - return error; - }, - - executeCommand: function(howManyArgs, command, keepStack) { - var stackLength = this.stack.length; - if (howManyArgs > stackLength) { - return true; - } - var start = stackLength - howManyArgs; - for (var i = start; i < stackLength; i++) { - var value = this.stack[i]; - if (value === (value | 0)) { // int - this.output.push(28, (value >> 8) & 0xff, value & 0xff); - } else { // fixed point - value = (65536 * value) | 0; - this.output.push(255, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF); - } - } - this.output.push.apply(this.output, command); - if (keepStack) { - this.stack.splice(start, howManyArgs); - } else { - this.stack.length = 0; - } - return false; - } - }; - - return Type1CharString; -})(); - -/* - * Type1Parser encapsulate the needed code for parsing a Type1 font - * program. Some of its logic depends on the Type2 charstrings - * structure. - * Note: this doesn't really parse the font since that would require evaluation - * of PostScript, but it is possible in most cases to extract what we need - * without a full parse. - */ -var Type1Parser = (function Type1ParserClosure() { - /* - * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence - * of Plaintext Bytes. The function took a key as a parameter which can be - * for decrypting the eexec block of for decoding charStrings. - */ - var EEXEC_ENCRYPT_KEY = 55665; - var CHAR_STRS_ENCRYPT_KEY = 4330; - - function isHexDigit(code) { - return code >= 48 && code <= 57 || // '0'-'9' - code >= 65 && code <= 70 || // 'A'-'F' - code >= 97 && code <= 102; // 'a'-'f' - } - - function decrypt(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length; - var decrypted = new Uint8Array(count); - for (var i = 0; i < count; i++) { - var value = data[i]; - decrypted[i] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - return Array.prototype.slice.call(decrypted, discardNumber); - } - - function decryptAscii(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length, maybeLength = count >>> 1; - var decrypted = new Uint8Array(maybeLength); - var i, j; - for (i = 0, j = 0; i < count; i++) { - var digit1 = data[i]; - if (!isHexDigit(digit1)) { - continue; - } - i++; - var digit2; - while (i < count && !isHexDigit(digit2 = data[i])) { - i++; - } - if (i < count) { - var value = parseInt(String.fromCharCode(digit1, digit2), 16); - decrypted[j++] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - } - return Array.prototype.slice.call(decrypted, discardNumber, j); - } - - function isSpecial(c) { - return c === 0x2F || // '/' - c === 0x5B || c === 0x5D || // '[', ']' - c === 0x7B || c === 0x7D || // '{', '}' - c === 0x28 || c === 0x29; // '(', ')' - } - - function Type1Parser(stream, encrypted) { - if (encrypted) { - var data = stream.getBytes(); - var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && - isHexDigit(data[2]) && isHexDigit(data[3])); - stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : - decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); - } - this.stream = stream; - this.nextChar(); - } - - Type1Parser.prototype = { - readNumberArray: function Type1Parser_readNumberArray() { - this.getToken(); // read '[' or '{' (arrays can start with either) - var array = []; - while (true) { - var token = this.getToken(); - if (token === null || token === ']' || token === '}') { - break; - } - array.push(parseFloat(token || 0)); - } - return array; - }, - - readNumber: function Type1Parser_readNumber() { - var token = this.getToken(); - return parseFloat(token || 0); - }, - - readInt: function Type1Parser_readInt() { - // Use '| 0' to prevent setting a double into length such as the double - // does not flow into the loop variable. - var token = this.getToken(); - return parseInt(token || 0, 10) | 0; - }, - - readBoolean: function Type1Parser_readBoolean() { - var token = this.getToken(); - - // Use 1 and 0 since that's what type2 charstrings use. - return token === 'true' ? 1 : 0; - }, - - nextChar : function Type1_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - - getToken: function Type1Parser_getToken() { - // Eat whitespace and comments. - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch === -1) { - return null; - } - - if (comment) { - if (ch === 0x0A || ch === 0x0D) { - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (!Lexer.isSpace(ch)) { - break; - } - ch = this.nextChar(); - } - if (isSpecial(ch)) { - this.nextChar(); - return String.fromCharCode(ch); - } - var token = ''; - do { - token += String.fromCharCode(ch); - ch = this.nextChar(); - } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch)); - return token; - }, - - /* - * Returns an object containing a Subrs array and a CharStrings - * array extracted from and eexec encrypted block of data - */ - extractFontProgram: function Type1Parser_extractFontProgram() { - var stream = this.stream; - - var subrs = [], charstrings = []; - var program = { - subrs: [], - charstrings: [], - properties: { - 'privateData': { - 'lenIV': 4 - } - } - }; - var token, length, data, lenIV, encoded; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'CharStrings': - // The number immediately following CharStrings must be greater or - // equal to the number of CharStrings. - this.getToken(); - this.getToken(); // read in 'dict' - this.getToken(); // read in 'dup' - this.getToken(); // read in 'begin' - while(true) { - token = this.getToken(); - if (token === null || token === 'end') { - break; - } - - if (token !== '/') { - continue; - } - var glyph = this.getToken(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'ND' or '|-' - if (token === 'noaccess') { - this.getToken(); // read in 'def' - } - charstrings.push({ - glyph: glyph, - encoded: encoded - }); - } - break; - case 'Subrs': - var num = this.readInt(); - this.getToken(); // read in 'array' - while ((token = this.getToken()) === 'dup') { - var index = this.readInt(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'NP' or '|' - if (token === 'noaccess') { - this.getToken(); // read in 'put' - } - subrs[index] = encoded; - } - break; - case 'BlueValues': - case 'OtherBlues': - case 'FamilyBlues': - case 'FamilyOtherBlues': - var blueArray = this.readNumberArray(); - // *Blue* values may contain invalid data: disables reading of - // those values when hinting is disabled. - if (blueArray.length > 0 && (blueArray.length % 2) === 0 && - HINTING_ENABLED) { - program.properties.privateData[token] = blueArray; - } - break; - case 'StemSnapH': - case 'StemSnapV': - program.properties.privateData[token] = this.readNumberArray(); - break; - case 'StdHW': - case 'StdVW': - program.properties.privateData[token] = - this.readNumberArray()[0]; - break; - case 'BlueShift': - case 'lenIV': - case 'BlueFuzz': - case 'BlueScale': - case 'LanguageGroup': - case 'ExpansionFactor': - program.properties.privateData[token] = this.readNumber(); - break; - case 'ForceBold': - program.properties.privateData[token] = this.readBoolean(); - break; - } - } - - for (var i = 0; i < charstrings.length; i++) { - glyph = charstrings[i].glyph; - encoded = charstrings[i].encoded; - var charString = new Type1CharString(); - var error = charString.convert(encoded, subrs); - var output = charString.output; - if (error) { - // It seems when FreeType encounters an error while evaluating a glyph - // that it completely ignores the glyph so we'll mimic that behaviour - // here and put an endchar to make the validator happy. - output = [14]; - } - program.charstrings.push({ - glyphName: glyph, - charstring: output, - width: charString.width, - lsb: charString.lsb, - seac: charString.seac - }); - } - - return program; - }, - - extractFontHeader: function Type1Parser_extractFontHeader(properties) { - var token; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'FontMatrix': - var matrix = this.readNumberArray(); - properties.fontMatrix = matrix; - break; - case 'Encoding': - var encodingArg = this.getToken(); - var encoding; - if (!/^\d+$/.test(encodingArg)) { - // encoding name is specified - encoding = Encodings[encodingArg]; - } else { - encoding = []; - var size = parseInt(encodingArg, 10) | 0; - this.getToken(); // read in 'array' - - for (var j = 0; j < size; j++) { - token = this.getToken(); - // skipping till first dup or def (e.g. ignoring for statement) - while (token !== 'dup' && token !== 'def') { - token = this.getToken(); - if (token === null) { - return; // invalid header - } - } - if (token === 'def') { - break; // read all array data - } - var index = this.readInt(); - this.getToken(); // read in '/' - var glyph = this.getToken(); - encoding[index] = glyph; - this.getToken(); // read the in 'put' - } - } - properties.builtInEncoding = encoding; - break; - case 'FontBBox': - var fontBBox = this.readNumberArray(); - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - break; - } - } - } - }; - - return Type1Parser; -})(); - -/** - * The CFF class takes a Type1 file and wrap it into a - * 'Compact Font Format' which itself embed Type2 charstrings. - */ -var CFFStandardStrings = [ - '.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', 'exclamsmall', - 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', - 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', - 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', - 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', - 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', - 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', - 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', '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', 'questiondownsmall', 'oneeighth', - 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', - 'zerosuperior', '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', '001.000', '001.001', '001.002', '001.003', - 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold' -]; - -// Type1Font is also a CIDFontType0. -var Type1Font = function Type1Font(name, file, properties) { - // Some bad generators embed pfb file as is, we have to strip 6-byte headers. - // Also, length1 and length2 might be off by 6 bytes as well. - // http://www.math.ubc.ca/~cass/piscript/type1.pdf - var PFB_HEADER_SIZE = 6; - var headerBlockLength = properties.length1; - var eexecBlockLength = properties.length2; - var pfbHeader = file.peekBytes(PFB_HEADER_SIZE); - var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; - if (pfbHeaderPresent) { - file.skip(PFB_HEADER_SIZE); - headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Get the data block containing glyphs and subrs informations - var headerBlock = new Stream(file.getBytes(headerBlockLength)); - var headerBlockParser = new Type1Parser(headerBlock); - headerBlockParser.extractFontHeader(properties); - - if (pfbHeaderPresent) { - pfbHeader = file.getBytes(PFB_HEADER_SIZE); - eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Decrypt the data blocks and retrieve it's content - var eexecBlock = new Stream(file.getBytes(eexecBlockLength)); - var eexecBlockParser = new Type1Parser(eexecBlock, true); - var data = eexecBlockParser.extractFontProgram(); - for (var info in data.properties) { - properties[info] = data.properties[info]; - } - - var charstrings = data.charstrings; - var type2Charstrings = this.getType2Charstrings(charstrings); - var subrs = this.getType2Subrs(data.subrs); - - this.charstrings = charstrings; - this.data = this.wrap(name, type2Charstrings, this.charstrings, - subrs, properties); - this.seacs = this.getSeacs(data.charstrings); -}; - -Type1Font.prototype = { - get numGlyphs() { - return this.charstrings.length + 1; - }, - - getCharset: function Type1Font_getCharset() { - var charset = ['.notdef']; - var charstrings = this.charstrings; - for (var glyphId = 0; glyphId < charstrings.length; glyphId++) { - charset.push(charstrings[glyphId].glyphName); - } - return charset; - }, - - getGlyphMapping: function Type1Font_getGlyphMapping(properties) { - var charstrings = this.charstrings; - var glyphNames = ['.notdef'], glyphId; - for (glyphId = 0; glyphId < charstrings.length; glyphId++) { - glyphNames.push(charstrings[glyphId].glyphName); - } - var encoding = properties.builtInEncoding; - if (encoding) { - var builtInEncoding = {}; - for (var charCode in encoding) { - glyphId = glyphNames.indexOf(encoding[charCode]); - if (glyphId >= 0) { - builtInEncoding[charCode] = glyphId; - } - } - } - - return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); - }, - - getSeacs: function Type1Font_getSeacs(charstrings) { - var i, ii; - var seacMap = []; - for (i = 0, ii = charstrings.length; i < ii; i++) { - var charstring = charstrings[i]; - if (charstring.seac) { - // Offset by 1 for .notdef - seacMap[i + 1] = charstring.seac; - } - } - return seacMap; - }, - - getType2Charstrings: function Type1Font_getType2Charstrings( - type1Charstrings) { - var type2Charstrings = []; - for (var i = 0, ii = type1Charstrings.length; i < ii; i++) { - type2Charstrings.push(type1Charstrings[i].charstring); - } - return type2Charstrings; - }, - - getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { - var bias = 0; - var count = type1Subrs.length; - if (count < 1133) { - bias = 107; - } else if (count < 33769) { - bias = 1131; - } else { - bias = 32768; - } - - // Add a bunch of empty subrs to deal with the Type2 bias - var type2Subrs = []; - var i; - for (i = 0; i < bias; i++) { - type2Subrs.push([0x0B]); - } - - for (i = 0; i < count; i++) { - type2Subrs.push(type1Subrs[i]); - } - - return type2Subrs; - }, - - wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) { - var cff = new CFF(); - cff.header = new CFFHeader(1, 0, 4, 4); - - cff.names = [name]; - - var topDict = new CFFTopDict(); - // CFF strings IDs 0...390 are predefined names, so refering - // to entries in our own String INDEX starts at SID 391. - topDict.setByName('version', 391); - topDict.setByName('Notice', 392); - topDict.setByName('FullName', 393); - topDict.setByName('FamilyName', 394); - topDict.setByName('Weight', 395); - topDict.setByName('Encoding', null); // placeholder - topDict.setByName('FontMatrix', properties.fontMatrix); - topDict.setByName('FontBBox', properties.bbox); - topDict.setByName('charset', null); // placeholder - topDict.setByName('CharStrings', null); // placeholder - topDict.setByName('Private', null); // placeholder - cff.topDict = topDict; - - var strings = new CFFStrings(); - strings.add('Version 0.11'); // Version - strings.add('See original notice'); // Notice - strings.add(name); // FullName - strings.add(name); // FamilyName - strings.add('Medium'); // Weight - cff.strings = strings; - - cff.globalSubrIndex = new CFFIndex(); - - var count = glyphs.length; - var charsetArray = [0]; - var i, ii; - for (i = 0; i < count; i++) { - var index = CFFStandardStrings.indexOf(charstrings[i].glyphName); - // TODO: Insert the string and correctly map it. Previously it was - // thought mapping names that aren't in the standard strings to .notdef - // was fine, however in issue818 when mapping them all to .notdef the - // adieresis glyph no longer worked. - if (index === -1) { - index = 0; - } - charsetArray.push((index >> 8) & 0xff, index & 0xff); - } - cff.charset = new CFFCharset(false, 0, [], charsetArray); - - var charStringsIndex = new CFFIndex(); - charStringsIndex.add([0x8B, 0x0E]); // .notdef - for (i = 0; i < count; i++) { - charStringsIndex.add(glyphs[i]); - } - cff.charStrings = charStringsIndex; - - var privateDict = new CFFPrivateDict(); - privateDict.setByName('Subrs', null); // placeholder - var fields = [ - 'BlueValues', - 'OtherBlues', - 'FamilyBlues', - 'FamilyOtherBlues', - 'StemSnapH', - 'StemSnapV', - 'BlueShift', - 'BlueFuzz', - 'BlueScale', - 'LanguageGroup', - 'ExpansionFactor', - 'ForceBold', - 'StdHW', - 'StdVW' - ]; - for (i = 0, ii = fields.length; i < ii; i++) { - var field = fields[i]; - if (!properties.privateData.hasOwnProperty(field)) { - continue; - } - var value = properties.privateData[field]; - if (isArray(value)) { - // All of the private dictionary array data in CFF must be stored as - // "delta-encoded" numbers. - for (var j = value.length - 1; j > 0; j--) { - value[j] -= value[j - 1]; // ... difference from previous value - } - } - privateDict.setByName(field, value); - } - cff.topDict.privateDict = privateDict; - - var subrIndex = new CFFIndex(); - for (i = 0, ii = subrs.length; i < ii; i++) { - subrIndex.add(subrs[i]); - } - privateDict.subrsIndex = subrIndex; - - var compiler = new CFFCompiler(cff); - return compiler.compile(); - } -}; - -var CFFFont = (function CFFFontClosure() { - function CFFFont(file, properties) { - this.properties = properties; - - var parser = new CFFParser(file, properties); - this.cff = parser.parse(); - var compiler = new CFFCompiler(this.cff); - this.seacs = this.cff.seacs; - try { - this.data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - // There may have just been an issue with the compiler, set the data - // anyway and hope the font loaded. - this.data = file; - } - } - - CFFFont.prototype = { - get numGlyphs() { - return this.cff.charStrings.count; - }, - getCharset: function CFFFont_getCharset() { - return this.cff.charset.charset; - }, - getGlyphMapping: function CFFFont_getGlyphMapping() { - var cff = this.cff; - var properties = this.properties; - var charsets = cff.charset.charset; - var charCodeToGlyphId; - var glyphId; - - if (properties.composite) { - charCodeToGlyphId = Object.create(null); - if (cff.isCIDFont) { - // If the font is actually a CID font then we should use the charset - // to map CIDs to GIDs. - for (glyphId = 0; glyphId < charsets.length; glyphId++) { - var cid = charsets[glyphId]; - var charCode = properties.cMap.charCodeOf(cid); - charCodeToGlyphId[charCode] = glyphId; - } - } else { - // If it is NOT actually a CID font then CIDs should be mapped - // directly to GIDs. - for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { - charCodeToGlyphId[glyphId] = glyphId; - } - } - return charCodeToGlyphId; - } - - var encoding = cff.encoding ? cff.encoding.encoding : null; - charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); - return charCodeToGlyphId; - } - }; - - return CFFFont; -})(); - -var CFFParser = (function CFFParserClosure() { - var CharstringValidationData = [ - null, - { id: 'hstem', min: 2, stackClearing: true, stem: true }, - null, - { id: 'vstem', min: 2, stackClearing: true, stem: true }, - { id: 'vmoveto', min: 1, stackClearing: true }, - { id: 'rlineto', min: 2, resetStack: true }, - { id: 'hlineto', min: 1, resetStack: true }, - { id: 'vlineto', min: 1, resetStack: true }, - { id: 'rrcurveto', min: 6, resetStack: true }, - null, - { id: 'callsubr', min: 1, undefStack: true }, - { id: 'return', min: 0, undefStack: true }, - null, // 12 - null, - { id: 'endchar', min: 0, stackClearing: true }, - null, - null, - null, - { id: 'hstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'hintmask', min: 0, stackClearing: true }, - { id: 'cntrmask', min: 0, stackClearing: true }, - { id: 'rmoveto', min: 2, stackClearing: true }, - { id: 'hmoveto', min: 1, stackClearing: true }, - { id: 'vstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'rcurveline', min: 8, resetStack: true }, - { id: 'rlinecurve', min: 8, resetStack: true }, - { id: 'vvcurveto', min: 4, resetStack: true }, - { id: 'hhcurveto', min: 4, resetStack: true }, - null, // shortint - { id: 'callgsubr', min: 1, undefStack: true }, - { id: 'vhcurveto', min: 4, resetStack: true }, - { id: 'hvcurveto', min: 4, resetStack: true } - ]; - var CharstringValidationData12 = [ - null, - null, - null, - { id: 'and', min: 2, stackDelta: -1 }, - { id: 'or', min: 2, stackDelta: -1 }, - { id: 'not', min: 1, stackDelta: 0 }, - null, - null, - null, - { id: 'abs', min: 1, stackDelta: 0 }, - { id: 'add', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] + stack[index - 1]; - } - }, - { id: 'sub', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] - stack[index - 1]; - } - }, - { id: 'div', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] / stack[index - 1]; - } - }, - null, - { id: 'neg', min: 1, stackDelta: 0, - stackFn: function stack_div(stack, index) { - stack[index - 1] = -stack[index - 1]; - } - }, - { id: 'eq', min: 2, stackDelta: -1 }, - null, - null, - { id: 'drop', min: 1, stackDelta: -1 }, - null, - { id: 'put', min: 2, stackDelta: -2 }, - { id: 'get', min: 1, stackDelta: 0 }, - { id: 'ifelse', min: 4, stackDelta: -3 }, - { id: 'random', min: 0, stackDelta: 1 }, - { id: 'mul', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] * stack[index - 1]; - } - }, - null, - { id: 'sqrt', min: 1, stackDelta: 0 }, - { id: 'dup', min: 1, stackDelta: 1 }, - { id: 'exch', min: 2, stackDelta: 0 }, - { id: 'index', min: 2, stackDelta: 0 }, - { id: 'roll', min: 3, stackDelta: -2 }, - null, - null, - null, - { id: 'hflex', min: 7, resetStack: true }, - { id: 'flex', min: 13, resetStack: true }, - { id: 'hflex1', min: 9, resetStack: true }, - { id: 'flex1', min: 11, resetStack: true } - ]; - - function CFFParser(file, properties) { - this.bytes = file.getBytes(); - this.properties = properties; - } - CFFParser.prototype = { - parse: function CFFParser_parse() { - var properties = this.properties; - var cff = new CFF(); - this.cff = cff; - - // The first five sections must be in order, all the others are reached - // via offsets contained in one of the below. - var header = this.parseHeader(); - var nameIndex = this.parseIndex(header.endPos); - var topDictIndex = this.parseIndex(nameIndex.endPos); - var stringIndex = this.parseIndex(topDictIndex.endPos); - var globalSubrIndex = this.parseIndex(stringIndex.endPos); - - var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); - var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); - - cff.header = header.obj; - cff.names = this.parseNameIndex(nameIndex.obj); - cff.strings = this.parseStringIndex(stringIndex.obj); - cff.topDict = topDict; - cff.globalSubrIndex = globalSubrIndex.obj; - - this.parsePrivateDict(cff.topDict); - - cff.isCIDFont = topDict.hasName('ROS'); - - var charStringOffset = topDict.getByName('CharStrings'); - var charStringsAndSeacs = this.parseCharStrings(charStringOffset); - cff.charStrings = charStringsAndSeacs.charStrings; - cff.seacs = charStringsAndSeacs.seacs; - cff.widths = charStringsAndSeacs.widths; - - var fontMatrix = topDict.getByName('FontMatrix'); - if (fontMatrix) { - properties.fontMatrix = fontMatrix; - } - - var fontBBox = topDict.getByName('FontBBox'); - if (fontBBox) { - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - } - - var charset, encoding; - if (cff.isCIDFont) { - var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; - for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { - var dictRaw = fdArrayIndex.get(i); - var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), - cff.strings); - this.parsePrivateDict(fontDict); - cff.fdArray.push(fontDict); - } - // cid fonts don't have an encoding - encoding = null; - charset = this.parseCharsets(topDict.getByName('charset'), - cff.charStrings.count, cff.strings, true); - cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), - cff.charStrings.count); - } else { - charset = this.parseCharsets(topDict.getByName('charset'), - cff.charStrings.count, cff.strings, false); - encoding = this.parseEncoding(topDict.getByName('Encoding'), - properties, - cff.strings, charset.charset); - } - cff.charset = charset; - cff.encoding = encoding; - - return cff; - }, - parseHeader: function CFFParser_parseHeader() { - var bytes = this.bytes; - var bytesLength = bytes.length; - var offset = 0; - - // Prevent an infinite loop, by checking that the offset is within the - // bounds of the bytes array. Necessary in empty, or invalid, font files. - while (offset < bytesLength && bytes[offset] !== 1) { - ++offset; - } - if (offset >= bytesLength) { - error('Invalid CFF header'); - } else if (offset !== 0) { - info('cff data is shifted'); - bytes = bytes.subarray(offset); - this.bytes = bytes; - } - var major = bytes[0]; - var minor = bytes[1]; - var hdrSize = bytes[2]; - var offSize = bytes[3]; - var header = new CFFHeader(major, minor, hdrSize, offSize); - return { obj: header, endPos: hdrSize }; - }, - parseDict: function CFFParser_parseDict(dict) { - var pos = 0; - - function parseOperand() { - var value = dict[pos++]; - if (value === 30) { - return parseFloatOperand(pos); - } else if (value === 28) { - value = dict[pos++]; - value = ((value << 24) | (dict[pos++] << 16)) >> 16; - return value; - } else if (value === 29) { - value = dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - return value; - } else if (value >= 32 && value <= 246) { - return value - 139; - } else if (value >= 247 && value <= 250) { - return ((value - 247) * 256) + dict[pos++] + 108; - } else if (value >= 251 && value <= 254) { - return -((value - 251) * 256) - dict[pos++] - 108; - } else { - error('255 is not a valid DICT command'); - } - return -1; - } - - function parseFloatOperand() { - var str = ''; - var eof = 15; - var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', - '9', '.', 'E', 'E-', null, '-']; - var length = dict.length; - while (pos < length) { - var b = dict[pos++]; - var b1 = b >> 4; - var b2 = b & 15; - - if (b1 === eof) { - break; - } - str += lookup[b1]; - - if (b2 === eof) { - break; - } - str += lookup[b2]; - } - return parseFloat(str); - } - - var operands = []; - var entries = []; - - pos = 0; - var end = dict.length; - while (pos < end) { - var b = dict[pos]; - if (b <= 21) { - if (b === 12) { - b = (b << 8) | dict[++pos]; - } - entries.push([b, operands]); - operands = []; - ++pos; - } else { - operands.push(parseOperand()); - } - } - return entries; - }, - parseIndex: function CFFParser_parseIndex(pos) { - var cffIndex = new CFFIndex(); - var bytes = this.bytes; - var count = (bytes[pos++] << 8) | bytes[pos++]; - var offsets = []; - var end = pos; - var i, ii; - - if (count !== 0) { - var offsetSize = bytes[pos++]; - // add 1 for offset to determine size of last object - var startPos = pos + ((count + 1) * offsetSize) - 1; - - for (i = 0, ii = count + 1; i < ii; ++i) { - var offset = 0; - for (var j = 0; j < offsetSize; ++j) { - offset <<= 8; - offset += bytes[pos++]; - } - offsets.push(startPos + offset); - } - end = offsets[count]; - } - for (i = 0, ii = offsets.length - 1; i < ii; ++i) { - var offsetStart = offsets[i]; - var offsetEnd = offsets[i + 1]; - cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); - } - return {obj: cffIndex, endPos: end}; - }, - parseNameIndex: function CFFParser_parseNameIndex(index) { - var names = []; - for (var i = 0, ii = index.count; i < ii; ++i) { - var name = index.get(i); - // OTS doesn't allow names to be over 127 characters. - var length = Math.min(name.length, 127); - var data = []; - // OTS also only permits certain characters in the name. - for (var j = 0; j < length; ++j) { - var c = name[j]; - if (j === 0 && c === 0) { - data[j] = c; - continue; - } - if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ || - c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ || - c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ || - c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) { - data[j] = 95; - continue; - } - data[j] = c; - } - names.push(bytesToString(data)); - } - return names; - }, - parseStringIndex: function CFFParser_parseStringIndex(index) { - var strings = new CFFStrings(); - for (var i = 0, ii = index.count; i < ii; ++i) { - var data = index.get(i); - strings.add(bytesToString(data)); - } - return strings; - }, - createDict: function CFFParser_createDict(Type, dict, strings) { - var cffDict = new Type(strings); - for (var i = 0, ii = dict.length; i < ii; ++i) { - var pair = dict[i]; - var key = pair[0]; - var value = pair[1]; - cffDict.setByKey(key, value); - } - return cffDict; - }, - parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) { - var charStrings = this.parseIndex(charStringOffset).obj; - var seacs = []; - var widths = []; - var count = charStrings.count; - for (var i = 0; i < count; i++) { - var charstring = charStrings.get(i); - - var stackSize = 0; - var stack = []; - var undefStack = true; - var hints = 0; - var valid = true; - var data = charstring; - var length = data.length; - var firstStackClearing = true; - for (var j = 0; j < length;) { - var value = data[j++]; - var validationCommand = null; - if (value === 12) { - var q = data[j++]; - if (q === 0) { - // The CFF specification state that the 'dotsection' command - // (12, 0) is deprecated and treated as a no-op, but all Type2 - // charstrings processors should support them. Unfortunately - // the font sanitizer don't. As a workaround the sequence (12, 0) - // is replaced by a useless (0, hmoveto). - data[j - 2] = 139; - data[j - 1] = 22; - stackSize = 0; - } else { - validationCommand = CharstringValidationData12[q]; - } - } else if (value === 28) { // number (16 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16; - j += 2; - stackSize++; - } else if (value === 14) { - if (stackSize >= 4) { - stackSize -= 4; - if (SEAC_ANALYSIS_ENABLED) { - seacs[i] = stack.slice(stackSize, stackSize + 4); - valid = false; - } - } - validationCommand = CharstringValidationData[value]; - } else if (value >= 32 && value <= 246) { // number - stack[stackSize] = value - 139; - stackSize++; - } else if (value >= 247 && value <= 254) { // number (+1 bytes) - stack[stackSize] = (value < 251 ? - ((value - 247) << 8) + data[j] + 108 : - -((value - 251) << 8) - data[j] - 108); - j++; - stackSize++; - } else if (value === 255) { // number (32 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) | - (data[j + 2] << 8) | data[j + 3]) / 65536; - j += 4; - stackSize++; - } else if (value === 19 || value === 20) { - hints += stackSize >> 1; - j += (hints + 7) >> 3; // skipping right amount of hints flag data - stackSize %= 2; - validationCommand = CharstringValidationData[value]; - } else { - validationCommand = CharstringValidationData[value]; - } - if (validationCommand) { - if (validationCommand.stem) { - hints += stackSize >> 1; - } - if ('min' in validationCommand) { - if (!undefStack && stackSize < validationCommand.min) { - warn('Not enough parameters for ' + validationCommand.id + - '; actual: ' + stackSize + - ', expected: ' + validationCommand.min); - valid = false; - break; - } - } - if (firstStackClearing && validationCommand.stackClearing) { - firstStackClearing = false; - // the optional character width can be found before the first - // stack-clearing command arguments - stackSize -= validationCommand.min; - if (stackSize >= 2 && validationCommand.stem) { - // there are even amount of arguments for stem commands - stackSize %= 2; - } else if (stackSize > 1) { - warn('Found too many parameters for stack-clearing command'); - } - if (stackSize > 0 && stack[stackSize - 1] >= 0) { - widths[i] = stack[stackSize - 1]; - } - } - if ('stackDelta' in validationCommand) { - if ('stackFn' in validationCommand) { - validationCommand.stackFn(stack, stackSize); - } - stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - undefStack = false; - } else if (validationCommand.undefStack) { - stackSize = 0; - undefStack = true; - firstStackClearing = false; - } - } - } - if (!valid) { - // resetting invalid charstring to single 'endchar' - charStrings.set(i, new Uint8Array([14])); - } - } - return { charStrings: charStrings, seacs: seacs, widths: widths }; - }, - emptyPrivateDictionary: - function CFFParser_emptyPrivateDictionary(parentDict) { - var privateDict = this.createDict(CFFPrivateDict, [], - parentDict.strings); - parentDict.setByKey(18, [0, 0]); - parentDict.privateDict = privateDict; - }, - parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { - // no private dict, do nothing - if (!parentDict.hasName('Private')) { - this.emptyPrivateDictionary(parentDict); - return; - } - var privateOffset = parentDict.getByName('Private'); - // make sure the params are formatted correctly - if (!isArray(privateOffset) || privateOffset.length !== 2) { - parentDict.removeByName('Private'); - return; - } - var size = privateOffset[0]; - var offset = privateOffset[1]; - // remove empty dicts or ones that refer to invalid location - if (size === 0 || offset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - - var privateDictEnd = offset + size; - var dictData = this.bytes.subarray(offset, privateDictEnd); - var dict = this.parseDict(dictData); - var privateDict = this.createDict(CFFPrivateDict, dict, - parentDict.strings); - parentDict.privateDict = privateDict; - - // Parse the Subrs index also since it's relative to the private dict. - if (!privateDict.getByName('Subrs')) { - return; - } - var subrsOffset = privateDict.getByName('Subrs'); - var relativeOffset = offset + subrsOffset; - // Validate the offset. - if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - var subrsIndex = this.parseIndex(relativeOffset); - privateDict.subrsIndex = subrsIndex.obj; - }, - parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { - if (pos === 0) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, - ISOAdobeCharset); - } else if (pos === 1) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, - ExpertCharset); - } else if (pos === 2) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, - ExpertSubsetCharset); - } - - var bytes = this.bytes; - var start = pos; - var format = bytes[pos++]; - var charset = ['.notdef']; - var id, count, i; - - // subtract 1 for the .notdef glyph - length -= 1; - - switch (format) { - case 0: - for (i = 0; i < length; i++) { - id = (bytes[pos++] << 8) | bytes[pos++]; - charset.push(cid ? id : strings.get(id)); - } - break; - case 1: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - case 2: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - default: - error('Unknown charset format'); - } - // Raw won't be needed if we actually compile the charset. - var end = pos; - var raw = bytes.subarray(start, end); - - return new CFFCharset(false, format, charset, raw); - }, - parseEncoding: function CFFParser_parseEncoding(pos, - properties, - strings, - charset) { - var encoding = {}; - var bytes = this.bytes; - var predefined = false; - var hasSupplement = false; - var format, i, ii; - var raw = null; - - function readSupplement() { - var supplementsCount = bytes[pos++]; - for (i = 0; i < supplementsCount; i++) { - var code = bytes[pos++]; - var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); - encoding[code] = charset.indexOf(strings.get(sid)); - } - } - - if (pos === 0 || pos === 1) { - predefined = true; - format = pos; - var baseEncoding = pos ? Encodings.ExpertEncoding : - Encodings.StandardEncoding; - for (i = 0, ii = charset.length; i < ii; i++) { - var index = baseEncoding.indexOf(charset[i]); - if (index !== -1) { - encoding[index] = i; - } - } - } else { - var dataStart = pos; - format = bytes[pos++]; - switch (format & 0x7f) { - case 0: - var glyphsCount = bytes[pos++]; - for (i = 1; i <= glyphsCount; i++) { - encoding[bytes[pos++]] = i; - } - break; - - case 1: - var rangesCount = bytes[pos++]; - var gid = 1; - for (i = 0; i < rangesCount; i++) { - var start = bytes[pos++]; - var left = bytes[pos++]; - for (var j = start; j <= start + left; j++) { - encoding[j] = gid++; - } - } - break; - - default: - error('Unknow encoding format: ' + format + ' in CFF'); - break; - } - var dataEnd = pos; - if (format & 0x80) { - // The font sanitizer does not support CFF encoding with a - // supplement, since the encoding is not really used to map - // between gid to glyph, let's overwrite what is declared in - // the top dictionary to let the sanitizer think the font use - // StandardEncoding, that's a lie but that's ok. - bytes[dataStart] &= 0x7f; - readSupplement(); - hasSupplement = true; - } - raw = bytes.subarray(dataStart, dataEnd); - } - format = format & 0x7f; - return new CFFEncoding(predefined, format, encoding, raw); - }, - parseFDSelect: function CFFParser_parseFDSelect(pos, length) { - var start = pos; - var bytes = this.bytes; - var format = bytes[pos++]; - var fdSelect = []; - var i; - - switch (format) { - case 0: - for (i = 0; i < length; ++i) { - var id = bytes[pos++]; - fdSelect.push(id); - } - break; - case 3: - var rangesCount = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i < rangesCount; ++i) { - var first = (bytes[pos++] << 8) | bytes[pos++]; - var fdIndex = bytes[pos++]; - var next = (bytes[pos] << 8) | bytes[pos + 1]; - for (var j = first; j < next; ++j) { - fdSelect.push(fdIndex); - } - } - // Advance past the sentinel(next). - pos += 2; - break; - default: - error('Unknown fdselect format ' + format); - break; - } - var end = pos; - return new CFFFDSelect(fdSelect, bytes.subarray(start, end)); - } - }; - return CFFParser; -})(); - -// Compact Font Format -var CFF = (function CFFClosure() { - function CFF() { - this.header = null; - this.names = []; - this.topDict = null; - this.strings = new CFFStrings(); - this.globalSubrIndex = null; - - // The following could really be per font, but since we only have one font - // store them here. - this.encoding = null; - this.charset = null; - this.charStrings = null; - this.fdArray = []; - this.fdSelect = null; - - this.isCIDFont = false; - } - return CFF; -})(); - -var CFFHeader = (function CFFHeaderClosure() { - function CFFHeader(major, minor, hdrSize, offSize) { - this.major = major; - this.minor = minor; - this.hdrSize = hdrSize; - this.offSize = offSize; - } - return CFFHeader; -})(); - -var CFFStrings = (function CFFStringsClosure() { - function CFFStrings() { - this.strings = []; - } - CFFStrings.prototype = { - get: function CFFStrings_get(index) { - if (index >= 0 && index <= 390) { - return CFFStandardStrings[index]; - } - if (index - 391 <= this.strings.length) { - return this.strings[index - 391]; - } - return CFFStandardStrings[0]; - }, - add: function CFFStrings_add(value) { - this.strings.push(value); - }, - get count() { - return this.strings.length; - } - }; - return CFFStrings; -})(); - -var CFFIndex = (function CFFIndexClosure() { - function CFFIndex() { - this.objects = []; - this.length = 0; - } - CFFIndex.prototype = { - add: function CFFIndex_add(data) { - this.length += data.length; - this.objects.push(data); - }, - set: function CFFIndex_set(index, data) { - this.length += data.length - this.objects[index].length; - this.objects[index] = data; - }, - get: function CFFIndex_get(index) { - return this.objects[index]; - }, - get count() { - return this.objects.length; - } - }; - return CFFIndex; -})(); - -var CFFDict = (function CFFDictClosure() { - function CFFDict(tables, strings) { - this.keyToNameMap = tables.keyToNameMap; - this.nameToKeyMap = tables.nameToKeyMap; - this.defaults = tables.defaults; - this.types = tables.types; - this.opcodes = tables.opcodes; - this.order = tables.order; - this.strings = strings; - this.values = {}; - } - CFFDict.prototype = { - // value should always be an array - setByKey: function CFFDict_setByKey(key, value) { - if (!(key in this.keyToNameMap)) { - return false; - } - // ignore empty values - if (value.length === 0) { - return true; - } - var type = this.types[key]; - // remove the array wrapping these types of values - if (type === 'num' || type === 'sid' || type === 'offset') { - value = value[0]; - } - this.values[key] = value; - return true; - }, - setByName: function CFFDict_setByName(name, value) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - this.values[this.nameToKeyMap[name]] = value; - }, - hasName: function CFFDict_hasName(name) { - return this.nameToKeyMap[name] in this.values; - }, - getByName: function CFFDict_getByName(name) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - var key = this.nameToKeyMap[name]; - if (!(key in this.values)) { - return this.defaults[key]; - } - return this.values[key]; - }, - removeByName: function CFFDict_removeByName(name) { - delete this.values[this.nameToKeyMap[name]]; - } - }; - CFFDict.createTables = function CFFDict_createTables(layout) { - var tables = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [] - }; - for (var i = 0, ii = layout.length; i < ii; ++i) { - var entry = layout[i]; - var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; - tables.keyToNameMap[key] = entry[1]; - tables.nameToKeyMap[entry[1]] = key; - tables.types[key] = entry[2]; - tables.defaults[key] = entry[3]; - tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; - tables.order.push(key); - } - return tables; - }; - return CFFDict; -})(); - -var CFFTopDict = (function CFFTopDictClosure() { - var layout = [ - [[12, 30], 'ROS', ['sid', 'sid', 'num'], null], - [[12, 20], 'SyntheticBase', 'num', null], - [0, 'version', 'sid', null], - [1, 'Notice', 'sid', null], - [[12, 0], 'Copyright', 'sid', null], - [2, 'FullName', 'sid', null], - [3, 'FamilyName', 'sid', null], - [4, 'Weight', 'sid', null], - [[12, 1], 'isFixedPitch', 'num', 0], - [[12, 2], 'ItalicAngle', 'num', 0], - [[12, 3], 'UnderlinePosition', 'num', -100], - [[12, 4], 'UnderlineThickness', 'num', 50], - [[12, 5], 'PaintType', 'num', 0], - [[12, 6], 'CharstringType', 'num', 2], - [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], - [0.001, 0, 0, 0.001, 0, 0]], - [13, 'UniqueID', 'num', null], - [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], - [[12, 8], 'StrokeWidth', 'num', 0], - [14, 'XUID', 'array', null], - [15, 'charset', 'offset', 0], - [16, 'Encoding', 'offset', 0], - [17, 'CharStrings', 'offset', 0], - [18, 'Private', ['offset', 'offset'], null], - [[12, 21], 'PostScript', 'sid', null], - [[12, 22], 'BaseFontName', 'sid', null], - [[12, 23], 'BaseFontBlend', 'delta', null], - [[12, 31], 'CIDFontVersion', 'num', 0], - [[12, 32], 'CIDFontRevision', 'num', 0], - [[12, 33], 'CIDFontType', 'num', 0], - [[12, 34], 'CIDCount', 'num', 8720], - [[12, 35], 'UIDBase', 'num', null], - // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes - // before FDArray. - [[12, 37], 'FDSelect', 'offset', null], - [[12, 36], 'FDArray', 'offset', null], - [[12, 38], 'FontName', 'sid', null] - ]; - var tables = null; - function CFFTopDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.privateDict = null; - } - CFFTopDict.prototype = Object.create(CFFDict.prototype); - return CFFTopDict; -})(); - -var CFFPrivateDict = (function CFFPrivateDictClosure() { - var layout = [ - [6, 'BlueValues', 'delta', null], - [7, 'OtherBlues', 'delta', null], - [8, 'FamilyBlues', 'delta', null], - [9, 'FamilyOtherBlues', 'delta', null], - [[12, 9], 'BlueScale', 'num', 0.039625], - [[12, 10], 'BlueShift', 'num', 7], - [[12, 11], 'BlueFuzz', 'num', 1], - [10, 'StdHW', 'num', null], - [11, 'StdVW', 'num', null], - [[12, 12], 'StemSnapH', 'delta', null], - [[12, 13], 'StemSnapV', 'delta', null], - [[12, 14], 'ForceBold', 'num', 0], - [[12, 17], 'LanguageGroup', 'num', 0], - [[12, 18], 'ExpansionFactor', 'num', 0.06], - [[12, 19], 'initialRandomSeed', 'num', 0], - [20, 'defaultWidthX', 'num', 0], - [21, 'nominalWidthX', 'num', 0], - [19, 'Subrs', 'offset', null] - ]; - var tables = null; - function CFFPrivateDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.subrsIndex = null; - } - CFFPrivateDict.prototype = Object.create(CFFDict.prototype); - return CFFPrivateDict; -})(); - -var CFFCharsetPredefinedTypes = { - ISO_ADOBE: 0, - EXPERT: 1, - EXPERT_SUBSET: 2 -}; -var CFFCharset = (function CFFCharsetClosure() { - function CFFCharset(predefined, format, charset, raw) { - this.predefined = predefined; - this.format = format; - this.charset = charset; - this.raw = raw; - } - return CFFCharset; -})(); - -var CFFEncoding = (function CFFEncodingClosure() { - function CFFEncoding(predefined, format, encoding, raw) { - this.predefined = predefined; - this.format = format; - this.encoding = encoding; - this.raw = raw; - } - return CFFEncoding; -})(); - -var CFFFDSelect = (function CFFFDSelectClosure() { - function CFFFDSelect(fdSelect, raw) { - this.fdSelect = fdSelect; - this.raw = raw; - } - return CFFFDSelect; -})(); - -// Helper class to keep track of where an offset is within the data and helps -// filling in that offset once it's known. -var CFFOffsetTracker = (function CFFOffsetTrackerClosure() { - function CFFOffsetTracker() { - this.offsets = {}; - } - CFFOffsetTracker.prototype = { - isTracking: function CFFOffsetTracker_isTracking(key) { - return key in this.offsets; - }, - track: function CFFOffsetTracker_track(key, location) { - if (key in this.offsets) { - error('Already tracking location of ' + key); - } - this.offsets[key] = location; - }, - offset: function CFFOffsetTracker_offset(value) { - for (var key in this.offsets) { - this.offsets[key] += value; - } - }, - setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, - values, - output) { - if (!(key in this.offsets)) { - error('Not tracking location of ' + key); - } - var data = output.data; - var dataOffset = this.offsets[key]; - var size = 5; - for (var i = 0, ii = values.length; i < ii; ++i) { - var offset0 = i * size + dataOffset; - var offset1 = offset0 + 1; - var offset2 = offset0 + 2; - var offset3 = offset0 + 3; - var offset4 = offset0 + 4; - // It's easy to screw up offsets so perform this sanity check. - if (data[offset0] !== 0x1d || data[offset1] !== 0 || - data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { - error('writing to an offset that is not empty'); - } - var value = values[i]; - data[offset0] = 0x1d; - data[offset1] = (value >> 24) & 0xFF; - data[offset2] = (value >> 16) & 0xFF; - data[offset3] = (value >> 8) & 0xFF; - data[offset4] = value & 0xFF; - } - } - }; - return CFFOffsetTracker; -})(); - -// Takes a CFF and converts it to the binary representation. -var CFFCompiler = (function CFFCompilerClosure() { - function CFFCompiler(cff) { - this.cff = cff; - } - CFFCompiler.prototype = { - compile: function CFFCompiler_compile() { - var cff = this.cff; - var output = { - data: [], - length: 0, - add: function CFFCompiler_add(data) { - this.data = this.data.concat(data); - this.length = this.data.length; - } - }; - - // Compile the five entries that must be in order. - var header = this.compileHeader(cff.header); - output.add(header); - - var nameIndex = this.compileNameIndex(cff.names); - output.add(nameIndex); - - if (cff.isCIDFont) { - // The spec is unclear on how font matrices should relate to each other - // when there is one in the main top dict and the sub top dicts. - // Windows handles this differently than linux and osx so we have to - // normalize to work on all. - // Rules based off of some mailing list discussions: - // - If main font has a matrix and subfont doesn't, use the main matrix. - // - If no main font matrix and there is a subfont matrix, use the - // subfont matrix. - // - If both have matrices, concat together. - // - If neither have matrices, use default. - // To make this work on all platforms we move the top matrix into each - // sub top dict and concat if necessary. - if (cff.topDict.hasName('FontMatrix')) { - var base = cff.topDict.getByName('FontMatrix'); - cff.topDict.removeByName('FontMatrix'); - for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { - var subDict = cff.fdArray[i]; - var matrix = base.slice(0); - if (subDict.hasName('FontMatrix')) { - matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); - } - subDict.setByName('FontMatrix', matrix); - } - } - } - - var compiled = this.compileTopDicts([cff.topDict], - output.length, - cff.isCIDFont); - output.add(compiled.output); - var topDictTracker = compiled.trackers[0]; - - var stringIndex = this.compileStringIndex(cff.strings.strings); - output.add(stringIndex); - - var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); - output.add(globalSubrIndex); - - // Now start on the other entries that have no specfic order. - if (cff.encoding && cff.topDict.hasName('Encoding')) { - if (cff.encoding.predefined) { - topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], - output); - } else { - var encoding = this.compileEncoding(cff.encoding); - topDictTracker.setEntryLocation('Encoding', [output.length], output); - output.add(encoding); - } - } - - if (cff.charset && cff.topDict.hasName('charset')) { - if (cff.charset.predefined) { - topDictTracker.setEntryLocation('charset', [cff.charset.format], - output); - } else { - var charset = this.compileCharset(cff.charset); - topDictTracker.setEntryLocation('charset', [output.length], output); - output.add(charset); - } - } - - var charStrings = this.compileCharStrings(cff.charStrings); - topDictTracker.setEntryLocation('CharStrings', [output.length], output); - output.add(charStrings); - - if (cff.isCIDFont) { - // For some reason FDSelect must be in front of FDArray on windows. OSX - // and linux don't seem to care. - topDictTracker.setEntryLocation('FDSelect', [output.length], output); - var fdSelect = this.compileFDSelect(cff.fdSelect.raw); - output.add(fdSelect); - // It is unclear if the sub font dictionary can have CID related - // dictionary keys, but the sanitizer doesn't like them so remove them. - compiled = this.compileTopDicts(cff.fdArray, output.length, true); - topDictTracker.setEntryLocation('FDArray', [output.length], output); - output.add(compiled.output); - var fontDictTrackers = compiled.trackers; - - this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); - } - - this.compilePrivateDicts([cff.topDict], [topDictTracker], output); - - // If the font data ends with INDEX whose object data is zero-length, - // the sanitizer will bail out. Add a dummy byte to avoid that. - output.add([0]); - - return output.data; - }, - encodeNumber: function CFFCompiler_encodeNumber(value) { - if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt - return this.encodeInteger(value); - } else { - return this.encodeFloat(value); - } - }, - encodeFloat: function CFFCompiler_encodeFloat(num) { - var value = num.toString(); - - // rounding inaccurate doubles - var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value); - if (m) { - var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length)); - value = (Math.round(num * epsilon) / epsilon).toString(); - } - - var nibbles = ''; - var i, ii; - for (i = 0, ii = value.length; i < ii; ++i) { - var a = value[i]; - if (a === 'e') { - nibbles += value[++i] === '-' ? 'c' : 'b'; - } else if (a === '.') { - nibbles += 'a'; - } else if (a === '-') { - nibbles += 'e'; - } else { - nibbles += a; - } - } - nibbles += (nibbles.length & 1) ? 'f' : 'ff'; - var out = [30]; - for (i = 0, ii = nibbles.length; i < ii; i += 2) { - out.push(parseInt(nibbles.substr(i, 2), 16)); - } - return out; - }, - encodeInteger: function CFFCompiler_encodeInteger(value) { - var code; - if (value >= -107 && value <= 107) { - code = [value + 139]; - } else if (value >= 108 && value <= 1131) { - value = [value - 108]; - code = [(value >> 8) + 247, value & 0xFF]; - } else if (value >= -1131 && value <= -108) { - value = -value - 108; - code = [(value >> 8) + 251, value & 0xFF]; - } else if (value >= -32768 && value <= 32767) { - code = [0x1c, (value >> 8) & 0xFF, value & 0xFF]; - } else { - code = [0x1d, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF]; - } - return code; - }, - compileHeader: function CFFCompiler_compileHeader(header) { - return [ - header.major, - header.minor, - header.hdrSize, - header.offSize - ]; - }, - compileNameIndex: function CFFCompiler_compileNameIndex(names) { - var nameIndex = new CFFIndex(); - for (var i = 0, ii = names.length; i < ii; ++i) { - nameIndex.add(stringToBytes(names[i])); - } - return this.compileIndex(nameIndex); - }, - compileTopDicts: function CFFCompiler_compileTopDicts(dicts, - length, - removeCidKeys) { - var fontDictTrackers = []; - var fdArrayIndex = new CFFIndex(); - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - if (removeCidKeys) { - fontDict.removeByName('CIDFontVersion'); - fontDict.removeByName('CIDFontRevision'); - fontDict.removeByName('CIDFontType'); - fontDict.removeByName('CIDCount'); - fontDict.removeByName('UIDBase'); - } - var fontDictTracker = new CFFOffsetTracker(); - var fontDictData = this.compileDict(fontDict, fontDictTracker); - fontDictTrackers.push(fontDictTracker); - fdArrayIndex.add(fontDictData); - fontDictTracker.offset(length); - } - fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); - return { - trackers: fontDictTrackers, - output: fdArrayIndex - }; - }, - compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, - trackers, - output) { - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - assert(fontDict.privateDict && fontDict.hasName('Private'), - 'There must be an private dictionary.'); - var privateDict = fontDict.privateDict; - var privateDictTracker = new CFFOffsetTracker(); - var privateDictData = this.compileDict(privateDict, privateDictTracker); - - var outputLength = output.length; - privateDictTracker.offset(outputLength); - if (!privateDictData.length) { - // The private dictionary was empty, set the output length to zero to - // ensure the offset length isn't out of bounds in the eyes of the - // sanitizer. - outputLength = 0; - } - - trackers[i].setEntryLocation('Private', - [privateDictData.length, outputLength], - output); - output.add(privateDictData); - - if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { - var subrs = this.compileIndex(privateDict.subrsIndex); - privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], - output); - output.add(subrs); - } - } - }, - compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { - var out = []; - // The dictionary keys must be in a certain order. - var order = dict.order; - for (var i = 0; i < order.length; ++i) { - var key = order[i]; - if (!(key in dict.values)) { - continue; - } - var values = dict.values[key]; - var types = dict.types[key]; - if (!isArray(types)) { - types = [types]; - } - if (!isArray(values)) { - values = [values]; - } - - // Remove any empty dict values. - if (values.length === 0) { - continue; - } - - for (var j = 0, jj = types.length; j < jj; ++j) { - var type = types[j]; - var value = values[j]; - switch (type) { - case 'num': - case 'sid': - out = out.concat(this.encodeNumber(value)); - break; - case 'offset': - // For offsets we just insert a 32bit integer so we don't have to - // deal with figuring out the length of the offset when it gets - // replaced later on by the compiler. - var name = dict.keyToNameMap[key]; - // Some offsets have the offset and the length, so just record the - // position of the first one. - if (!offsetTracker.isTracking(name)) { - offsetTracker.track(name, out.length); - } - out = out.concat([0x1d, 0, 0, 0, 0]); - break; - case 'array': - case 'delta': - out = out.concat(this.encodeNumber(value)); - for (var k = 1, kk = values.length; k < kk; ++k) { - out = out.concat(this.encodeNumber(values[k])); - } - break; - default: - error('Unknown data type of ' + type); - break; - } - } - out = out.concat(dict.opcodes[key]); - } - return out; - }, - compileStringIndex: function CFFCompiler_compileStringIndex(strings) { - var stringIndex = new CFFIndex(); - for (var i = 0, ii = strings.length; i < ii; ++i) { - stringIndex.add(stringToBytes(strings[i])); - } - return this.compileIndex(stringIndex); - }, - compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { - var globalSubrIndex = this.cff.globalSubrIndex; - this.out.writeByteArray(this.compileIndex(globalSubrIndex)); - }, - compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { - return this.compileIndex(charStrings); - }, - compileCharset: function CFFCompiler_compileCharset(charset) { - return this.compileTypedArray(charset.raw); - }, - compileEncoding: function CFFCompiler_compileEncoding(encoding) { - return this.compileTypedArray(encoding.raw); - }, - compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { - return this.compileTypedArray(fdSelect); - }, - compileTypedArray: function CFFCompiler_compileTypedArray(data) { - var out = []; - for (var i = 0, ii = data.length; i < ii; ++i) { - out[i] = data[i]; - } - return out; - }, - compileIndex: function CFFCompiler_compileIndex(index, trackers) { - trackers = trackers || []; - var objects = index.objects; - // First 2 bytes contains the number of objects contained into this index - var count = objects.length; - - // If there is no object, just create an index. This technically - // should just be [0, 0] but OTS has an issue with that. - if (count === 0) { - return [0, 0, 0]; - } - - var data = [(count >> 8) & 0xFF, count & 0xff]; - - var lastOffset = 1, i; - for (i = 0; i < count; ++i) { - lastOffset += objects[i].length; - } - - var offsetSize; - if (lastOffset < 0x100) { - offsetSize = 1; - } else if (lastOffset < 0x10000) { - offsetSize = 2; - } else if (lastOffset < 0x1000000) { - offsetSize = 3; - } else { - offsetSize = 4; - } - - // Next byte contains the offset size use to reference object in the file - data.push(offsetSize); - - // Add another offset after this one because we need a new offset - var relativeOffset = 1; - for (i = 0; i < count + 1; i++) { - if (offsetSize === 1) { - data.push(relativeOffset & 0xFF); - } else if (offsetSize === 2) { - data.push((relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else if (offsetSize === 3) { - data.push((relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else { - data.push((relativeOffset >>> 24) & 0xFF, - (relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } - - if (objects[i]) { - relativeOffset += objects[i].length; - } - } - - for (i = 0; i < count; i++) { - // Notify the tracker where the object will be offset in the data. - if (trackers[i]) { - trackers[i].offset(data.length); - } - for (var j = 0, jj = objects[i].length; j < jj; j++) { - data.push(objects[i][j]); - } - } - return data; - } - }; - return CFFCompiler; -})(); - -// Workaround for seac on Windows. -(function checkSeacSupport() { - if (/Windows/.test(navigator.userAgent)) { - SEAC_ANALYSIS_ENABLED = true; - } -})(); - -// Workaround for Private Use Area characters in Chrome on Windows -// http://code.google.com/p/chromium/issues/detail?id=122465 -// https://github.com/mozilla/pdf.js/issues/1689 -(function checkChromeWindows() { - if (/Windows.*Chrome/.test(navigator.userAgent)) { - SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true; - } -})(); - - -var FontRendererFactory = (function FontRendererFactoryClosure() { - function getLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - } - - function getUshort(data, offset) { - return (data[offset] << 8) | data[offset + 1]; - } - - function parseCmap(data, start, end) { - var offset = (getUshort(data, start + 2) === 1 ? - getLong(data, start + 8) : getLong(data, start + 16)); - var format = getUshort(data, start + offset); - var length, ranges, p, i; - if (format === 4) { - length = getUshort(data, start + offset + 2); - var segCount = getUshort(data, start + offset + 6) >> 1; - p = start + offset + 14; - ranges = []; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i] = {end: getUshort(data, p)}; - } - p += 2; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].start = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].idDelta = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - var idOffset = getUshort(data, p); - if (idOffset === 0) { - continue; - } - ranges[i].ids = []; - for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { - ranges[i].ids[j] = getUshort(data, p + idOffset); - idOffset += 2; - } - } - return ranges; - } else if (format === 12) { - length = getLong(data, start + offset + 4); - var groups = getLong(data, start + offset + 12); - p = start + offset + 16; - ranges = []; - for (i = 0; i < groups; i++) { - ranges.push({ - start: getLong(data, p), - end: getLong(data, p + 4), - idDelta: getLong(data, p + 8) - getLong(data, p) - }); - p += 12; - } - return ranges; - } - error('not supported cmap: ' + format); - } - - function parseCff(data, start, end) { - var properties = {}; - var parser = new CFFParser(new Stream(data, start, end - start), - properties); - var cff = parser.parse(); - return { - glyphs: cff.charStrings.objects, - subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && - cff.topDict.privateDict.subrsIndex.objects), - gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects - }; - } - - function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { - var itemSize, itemDecode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - } - var glyphs = []; - var startOffset = itemDecode(loca, 0); - for (var j = itemSize; j < loca.length; j += itemSize) { - var endOffset = itemDecode(loca, j); - glyphs.push(glyf.subarray(startOffset, endOffset)); - startOffset = endOffset; - } - return glyphs; - } - - function lookupCmap(ranges, unicode) { - var code = unicode.charCodeAt(0); - var l = 0, r = ranges.length - 1; - while (l < r) { - var c = (l + r + 1) >> 1; - if (code < ranges[c].start) { - r = c - 1; - } else { - l = c; - } - } - if (ranges[l].start <= code && code <= ranges[l].end) { - return (ranges[l].idDelta + (ranges[l].ids ? - ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF; - } - return 0; - } - - function compileGlyf(code, cmds, font) { - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function quadraticCurveTo(xa, ya, x, y) { - cmds.push({cmd: 'quadraticCurveTo', args: [xa, ya, x, y]}); - } - - var i = 0; - var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - var flags; - var x = 0, y = 0; - i += 10; - if (numberOfContours < 0) { - // composite glyph - do { - flags = (code[i] << 8) | code[i + 1]; - var glyphIndex = (code[i + 2] << 8) | code[i + 3]; - i += 4; - var arg1, arg2; - if ((flags & 0x01)) { - arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16; - i += 4; - } else { - arg1 = code[i++]; arg2 = code[i++]; - } - if ((flags & 0x02)) { - x = arg1; - y = arg2; - } else { - x = 0; y = 0; // TODO "they are points" ? - } - var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0; - if ((flags & 0x08)) { - scaleX = - scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - i += 2; - } else if ((flags & 0x40)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - i += 4; - } else if ((flags & 0x80)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824; - scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824; - i += 8; - } - var subglyph = font.glyphs[glyphIndex]; - if (subglyph) { - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', - args: [scaleX, scale01, scale10, scaleY, x, y]}); - compileGlyf(subglyph, cmds, font); - cmds.push({cmd: 'restore'}); - } - } while ((flags & 0x20)); - } else { - // simple glyph - var endPtsOfContours = []; - var j, jj; - for (j = 0; j < numberOfContours; j++) { - endPtsOfContours.push((code[i] << 8) | code[i + 1]); - i += 2; - } - var instructionLength = (code[i] << 8) | code[i + 1]; - i += 2 + instructionLength; // skipping the instructions - var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1; - var points = []; - while (points.length < numberOfPoints) { - flags = code[i++]; - var repeat = 1; - if ((flags & 0x08)) { - repeat += code[i++]; - } - while (repeat-- > 0) { - points.push({flags: flags}); - } - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x12) { - case 0x00: - x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x02: - x -= code[i++]; - break; - case 0x12: - x += code[i++]; - break; - } - points[j].x = x; - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x24) { - case 0x00: - y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x04: - y -= code[i++]; - break; - case 0x24: - y += code[i++]; - break; - } - points[j].y = y; - } - - var startPoint = 0; - for (i = 0; i < numberOfContours; i++) { - var endPoint = endPtsOfContours[i]; - // contours might have implicit points, which is located in the middle - // between two neighboring off-curve points - var contour = points.slice(startPoint, endPoint + 1); - if ((contour[0].flags & 1)) { - contour.push(contour[0]); // using start point at the contour end - } else if ((contour[contour.length - 1].flags & 1)) { - // first is off-curve point, trying to use one from the end - contour.unshift(contour[contour.length - 1]); - } else { - // start and end are off-curve points, creating implicit one - var p = { - flags: 1, - x: (contour[0].x + contour[contour.length - 1].x) / 2, - y: (contour[0].y + contour[contour.length - 1].y) / 2 - }; - contour.unshift(p); - contour.push(p); - } - moveTo(contour[0].x, contour[0].y); - for (j = 1, jj = contour.length; j < jj; j++) { - if ((contour[j].flags & 1)) { - lineTo(contour[j].x, contour[j].y); - } else if ((contour[j + 1].flags & 1)){ - quadraticCurveTo(contour[j].x, contour[j].y, - contour[j + 1].x, contour[j + 1].y); - j++; - } else { - quadraticCurveTo(contour[j].x, contour[j].y, - (contour[j].x + contour[j + 1].x) / 2, - (contour[j].y + contour[j + 1].y) / 2); - } - } - startPoint = endPoint + 1; - } - } - } - - function compileCharString(code, cmds, font) { - var stack = []; - var x = 0, y = 0; - var stems = 0; - - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.push({cmd: 'bezierCurveTo', args: [x1, y1, x2, y2, x, y]}); - } - - function parse(code) { - var i = 0; - while (i < code.length) { - var stackClean = false; - var v = code[i++]; - var xa, xb, ya, yb, y1, y2, y3, n, subrCode; - switch (v) { - case 1: // hstem - stems += stack.length >> 1; - stackClean = true; - break; - case 3: // vstem - stems += stack.length >> 1; - stackClean = true; - break; - case 4: // vmoveto - y += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 5: // rlineto - while (stack.length > 0) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - break; - case 6: // hlineto - while (stack.length > 0) { - x += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - y += stack.shift(); - lineTo(x, y); - } - break; - case 7: // vlineto - while (stack.length > 0) { - y += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - x += stack.shift(); - lineTo(x, y); - } - break; - case 8: // rrcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 10: // callsubr - n = stack.pop() + font.subrsBias; - subrCode = font.subrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 11: // return - return; - case 12: - v = code[i++]; - switch (v) { - case 34: // flex - xa = x + stack.shift(); - xb = xa + stack.shift(); y1 = y + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y, xb, y1, x, y1); - xa = x + stack.shift(); - xb = xa + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y, x, y); - break; - case 35: // flex - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - stack.pop(); // fd - break; - case 36: // hflex1 - xa = x + stack.shift(); y1 = y + stack.shift(); - xb = xa + stack.shift(); y2 = y1 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y2, x, y2); - xa = x + stack.shift(); - xb = xa + stack.shift(); y3 = y2 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y2, xb, y3, x, y); - break; - case 37: // flex1 - var x0 = x, y0 = y; - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb; - if (Math.abs(x - x0) > Math.abs(y - y0)) { - x += stack.shift(); - } else { - y += stack.shift(); - } - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - default: - error('unknown operator: 12 ' + v); - } - break; - case 14: // endchar - if (stack.length >= 4) { - var achar = stack.pop(); - var bchar = stack.pop(); - y = stack.pop(); - x = stack.pop(); - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'translate', args: [x, y]}); - var gid = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[Encodings.StandardEncoding[achar]])); - compileCharString(font.glyphs[gid], cmds, font); - cmds.push({cmd: 'restore'}); - - gid = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[Encodings.StandardEncoding[bchar]])); - compileCharString(font.glyphs[gid], cmds, font); - } - return; - case 18: // hstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 19: // hintmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 20: // cntrmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 21: // rmoveto - y += stack.pop(); - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 22: // hmoveto - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 23: // vstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 24: // rcurveline - while (stack.length > 2) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - break; - case 25: // rlinecurve - while (stack.length > 6) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - case 26: // vvcurveto - if (stack.length % 2) { - x += stack.shift(); - } - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 27: // hhcurveto - if (stack.length % 2) { - y += stack.shift(); - } - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb; - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 28: - stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16); - i += 2; - break; - case 29: // callgsubr - n = stack.pop() + font.gsubrsBias; - subrCode = font.gsubrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 30: // vhcurveto - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 31: // hvcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - default: - if (v < 32) { - error('unknown operator: ' + v); - } - if (v < 247) { - stack.push(v - 139); - } else if (v < 251) { - stack.push((v - 247) * 256 + code[i++] + 108); - } else if (v < 255) { - stack.push(-(v - 251) * 256 - code[i++] - 108); - } else { - stack.push(((code[i] << 24) | (code[i + 1] << 16) | - (code[i + 2] << 8) | code[i + 3]) / 65536); - i += 4; - } - break; - } - if (stackClean) { - stack.length = 0; - } - } - } - parse(code); - } - - var noop = ''; - - function CompiledFont(fontMatrix) { - this.compiledGlyphs = {}; - this.fontMatrix = fontMatrix; - } - CompiledFont.prototype = { - getPathJs: function (unicode) { - var gid = lookupCmap(this.cmap, unicode); - var fn = this.compiledGlyphs[gid]; - if (!fn) { - this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]); - } - return fn; - }, - - compileGlyph: function (code) { - if (!code || code.length === 0 || code[0] === 14) { - return noop; - } - - var cmds = []; - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', args: this.fontMatrix.slice()}); - cmds.push({cmd: 'scale', args: ['size', '-size']}); - - this.compileGlyphImpl(code, cmds); - - cmds.push({cmd: 'restore'}); - - return cmds; - }, - - compileGlyphImpl: function () { - error('Children classes should implement this.'); - }, - - hasBuiltPath: function (unicode) { - var gid = lookupCmap(this.cmap, unicode); - return gid in this.compiledGlyphs; - } - }; - - function TrueTypeCompiled(glyphs, cmap, fontMatrix) { - fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]; - CompiledFont.call(this, fontMatrix); - - this.glyphs = glyphs; - this.cmap = cmap; - - this.compiledGlyphs = []; - } - - Util.inherit(TrueTypeCompiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileGlyf(code, cmds, this); - } - }); - - function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) { - fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0]; - CompiledFont.call(this, fontMatrix); - this.glyphs = cffInfo.glyphs; - this.gsubrs = cffInfo.gsubrs || []; - this.subrs = cffInfo.subrs || []; - this.cmap = cmap; - this.glyphNameMap = glyphNameMap || GlyphsUnicode; - - this.compiledGlyphs = []; - this.gsubrsBias = (this.gsubrs.length < 1240 ? - 107 : (this.gsubrs.length < 33900 ? 1131 : 32768)); - this.subrsBias = (this.subrs.length < 1240 ? - 107 : (this.subrs.length < 33900 ? 1131 : 32768)); - } - - Util.inherit(Type2Compiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileCharString(code, cmds, this); - } - }); - - - return { - create: function FontRendererFactory_create(font) { - var data = new Uint8Array(font.data); - var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; - var numTables = getUshort(data, 4); - for (var i = 0, p = 12; i < numTables; i++, p += 16) { - var tag = bytesToString(data.subarray(p, p + 4)); - var offset = getLong(data, p + 8); - var length = getLong(data, p + 12); - switch (tag) { - case 'cmap': - cmap = parseCmap(data, offset, offset + length); - break; - case 'glyf': - glyf = data.subarray(offset, offset + length); - break; - case 'loca': - loca = data.subarray(offset, offset + length); - break; - case 'head': - unitsPerEm = getUshort(data, offset + 18); - indexToLocFormat = getUshort(data, offset + 50); - break; - case 'CFF ': - cff = parseCff(data, offset, offset + length); - break; - } - } - - if (glyf) { - var fontMatrix = (!unitsPerEm ? font.fontMatrix : - [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]); - return new TrueTypeCompiled( - parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); - } else { - return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); - } - } - }; -})(); - - -var GlyphsUnicode = { - A: 0x0041, - AE: 0x00C6, - AEacute: 0x01FC, - AEmacron: 0x01E2, - AEsmall: 0xF7E6, - Aacute: 0x00C1, - Aacutesmall: 0xF7E1, - Abreve: 0x0102, - Abreveacute: 0x1EAE, - Abrevecyrillic: 0x04D0, - Abrevedotbelow: 0x1EB6, - Abrevegrave: 0x1EB0, - Abrevehookabove: 0x1EB2, - Abrevetilde: 0x1EB4, - Acaron: 0x01CD, - Acircle: 0x24B6, - Acircumflex: 0x00C2, - Acircumflexacute: 0x1EA4, - Acircumflexdotbelow: 0x1EAC, - Acircumflexgrave: 0x1EA6, - Acircumflexhookabove: 0x1EA8, - Acircumflexsmall: 0xF7E2, - Acircumflextilde: 0x1EAA, - Acute: 0xF6C9, - Acutesmall: 0xF7B4, - Acyrillic: 0x0410, - Adblgrave: 0x0200, - Adieresis: 0x00C4, - Adieresiscyrillic: 0x04D2, - Adieresismacron: 0x01DE, - Adieresissmall: 0xF7E4, - Adotbelow: 0x1EA0, - Adotmacron: 0x01E0, - Agrave: 0x00C0, - Agravesmall: 0xF7E0, - Ahookabove: 0x1EA2, - Aiecyrillic: 0x04D4, - Ainvertedbreve: 0x0202, - Alpha: 0x0391, - Alphatonos: 0x0386, - Amacron: 0x0100, - Amonospace: 0xFF21, - Aogonek: 0x0104, - Aring: 0x00C5, - Aringacute: 0x01FA, - Aringbelow: 0x1E00, - Aringsmall: 0xF7E5, - Asmall: 0xF761, - Atilde: 0x00C3, - Atildesmall: 0xF7E3, - Aybarmenian: 0x0531, - B: 0x0042, - Bcircle: 0x24B7, - Bdotaccent: 0x1E02, - Bdotbelow: 0x1E04, - Becyrillic: 0x0411, - Benarmenian: 0x0532, - Beta: 0x0392, - Bhook: 0x0181, - Blinebelow: 0x1E06, - Bmonospace: 0xFF22, - Brevesmall: 0xF6F4, - Bsmall: 0xF762, - Btopbar: 0x0182, - C: 0x0043, - Caarmenian: 0x053E, - Cacute: 0x0106, - Caron: 0xF6CA, - Caronsmall: 0xF6F5, - Ccaron: 0x010C, - Ccedilla: 0x00C7, - Ccedillaacute: 0x1E08, - Ccedillasmall: 0xF7E7, - Ccircle: 0x24B8, - Ccircumflex: 0x0108, - Cdot: 0x010A, - Cdotaccent: 0x010A, - Cedillasmall: 0xF7B8, - Chaarmenian: 0x0549, - Cheabkhasiancyrillic: 0x04BC, - Checyrillic: 0x0427, - Chedescenderabkhasiancyrillic: 0x04BE, - Chedescendercyrillic: 0x04B6, - Chedieresiscyrillic: 0x04F4, - Cheharmenian: 0x0543, - Chekhakassiancyrillic: 0x04CB, - Cheverticalstrokecyrillic: 0x04B8, - Chi: 0x03A7, - Chook: 0x0187, - Circumflexsmall: 0xF6F6, - Cmonospace: 0xFF23, - Coarmenian: 0x0551, - Csmall: 0xF763, - D: 0x0044, - DZ: 0x01F1, - DZcaron: 0x01C4, - Daarmenian: 0x0534, - Dafrican: 0x0189, - Dcaron: 0x010E, - Dcedilla: 0x1E10, - Dcircle: 0x24B9, - Dcircumflexbelow: 0x1E12, - Dcroat: 0x0110, - Ddotaccent: 0x1E0A, - Ddotbelow: 0x1E0C, - Decyrillic: 0x0414, - Deicoptic: 0x03EE, - Delta: 0x2206, - Deltagreek: 0x0394, - Dhook: 0x018A, - Dieresis: 0xF6CB, - DieresisAcute: 0xF6CC, - DieresisGrave: 0xF6CD, - Dieresissmall: 0xF7A8, - Digammagreek: 0x03DC, - Djecyrillic: 0x0402, - Dlinebelow: 0x1E0E, - Dmonospace: 0xFF24, - Dotaccentsmall: 0xF6F7, - Dslash: 0x0110, - Dsmall: 0xF764, - Dtopbar: 0x018B, - Dz: 0x01F2, - Dzcaron: 0x01C5, - Dzeabkhasiancyrillic: 0x04E0, - Dzecyrillic: 0x0405, - Dzhecyrillic: 0x040F, - E: 0x0045, - Eacute: 0x00C9, - Eacutesmall: 0xF7E9, - Ebreve: 0x0114, - Ecaron: 0x011A, - Ecedillabreve: 0x1E1C, - Echarmenian: 0x0535, - Ecircle: 0x24BA, - Ecircumflex: 0x00CA, - Ecircumflexacute: 0x1EBE, - Ecircumflexbelow: 0x1E18, - Ecircumflexdotbelow: 0x1EC6, - Ecircumflexgrave: 0x1EC0, - Ecircumflexhookabove: 0x1EC2, - Ecircumflexsmall: 0xF7EA, - Ecircumflextilde: 0x1EC4, - Ecyrillic: 0x0404, - Edblgrave: 0x0204, - Edieresis: 0x00CB, - Edieresissmall: 0xF7EB, - Edot: 0x0116, - Edotaccent: 0x0116, - Edotbelow: 0x1EB8, - Efcyrillic: 0x0424, - Egrave: 0x00C8, - Egravesmall: 0xF7E8, - Eharmenian: 0x0537, - Ehookabove: 0x1EBA, - Eightroman: 0x2167, - Einvertedbreve: 0x0206, - Eiotifiedcyrillic: 0x0464, - Elcyrillic: 0x041B, - Elevenroman: 0x216A, - Emacron: 0x0112, - Emacronacute: 0x1E16, - Emacrongrave: 0x1E14, - Emcyrillic: 0x041C, - Emonospace: 0xFF25, - Encyrillic: 0x041D, - Endescendercyrillic: 0x04A2, - Eng: 0x014A, - Enghecyrillic: 0x04A4, - Enhookcyrillic: 0x04C7, - Eogonek: 0x0118, - Eopen: 0x0190, - Epsilon: 0x0395, - Epsilontonos: 0x0388, - Ercyrillic: 0x0420, - Ereversed: 0x018E, - Ereversedcyrillic: 0x042D, - Escyrillic: 0x0421, - Esdescendercyrillic: 0x04AA, - Esh: 0x01A9, - Esmall: 0xF765, - Eta: 0x0397, - Etarmenian: 0x0538, - Etatonos: 0x0389, - Eth: 0x00D0, - Ethsmall: 0xF7F0, - Etilde: 0x1EBC, - Etildebelow: 0x1E1A, - Euro: 0x20AC, - Ezh: 0x01B7, - Ezhcaron: 0x01EE, - Ezhreversed: 0x01B8, - F: 0x0046, - Fcircle: 0x24BB, - Fdotaccent: 0x1E1E, - Feharmenian: 0x0556, - Feicoptic: 0x03E4, - Fhook: 0x0191, - Fitacyrillic: 0x0472, - Fiveroman: 0x2164, - Fmonospace: 0xFF26, - Fourroman: 0x2163, - Fsmall: 0xF766, - G: 0x0047, - GBsquare: 0x3387, - Gacute: 0x01F4, - Gamma: 0x0393, - Gammaafrican: 0x0194, - Gangiacoptic: 0x03EA, - Gbreve: 0x011E, - Gcaron: 0x01E6, - Gcedilla: 0x0122, - Gcircle: 0x24BC, - Gcircumflex: 0x011C, - Gcommaaccent: 0x0122, - Gdot: 0x0120, - Gdotaccent: 0x0120, - Gecyrillic: 0x0413, - Ghadarmenian: 0x0542, - Ghemiddlehookcyrillic: 0x0494, - Ghestrokecyrillic: 0x0492, - Gheupturncyrillic: 0x0490, - Ghook: 0x0193, - Gimarmenian: 0x0533, - Gjecyrillic: 0x0403, - Gmacron: 0x1E20, - Gmonospace: 0xFF27, - Grave: 0xF6CE, - Gravesmall: 0xF760, - Gsmall: 0xF767, - Gsmallhook: 0x029B, - Gstroke: 0x01E4, - H: 0x0048, - H18533: 0x25CF, - H18543: 0x25AA, - H18551: 0x25AB, - H22073: 0x25A1, - HPsquare: 0x33CB, - Haabkhasiancyrillic: 0x04A8, - Hadescendercyrillic: 0x04B2, - Hardsigncyrillic: 0x042A, - Hbar: 0x0126, - Hbrevebelow: 0x1E2A, - Hcedilla: 0x1E28, - Hcircle: 0x24BD, - Hcircumflex: 0x0124, - Hdieresis: 0x1E26, - Hdotaccent: 0x1E22, - Hdotbelow: 0x1E24, - Hmonospace: 0xFF28, - Hoarmenian: 0x0540, - Horicoptic: 0x03E8, - Hsmall: 0xF768, - Hungarumlaut: 0xF6CF, - Hungarumlautsmall: 0xF6F8, - Hzsquare: 0x3390, - I: 0x0049, - IAcyrillic: 0x042F, - IJ: 0x0132, - IUcyrillic: 0x042E, - Iacute: 0x00CD, - Iacutesmall: 0xF7ED, - Ibreve: 0x012C, - Icaron: 0x01CF, - Icircle: 0x24BE, - Icircumflex: 0x00CE, - Icircumflexsmall: 0xF7EE, - Icyrillic: 0x0406, - Idblgrave: 0x0208, - Idieresis: 0x00CF, - Idieresisacute: 0x1E2E, - Idieresiscyrillic: 0x04E4, - Idieresissmall: 0xF7EF, - Idot: 0x0130, - Idotaccent: 0x0130, - Idotbelow: 0x1ECA, - Iebrevecyrillic: 0x04D6, - Iecyrillic: 0x0415, - Ifraktur: 0x2111, - Igrave: 0x00CC, - Igravesmall: 0xF7EC, - Ihookabove: 0x1EC8, - Iicyrillic: 0x0418, - Iinvertedbreve: 0x020A, - Iishortcyrillic: 0x0419, - Imacron: 0x012A, - Imacroncyrillic: 0x04E2, - Imonospace: 0xFF29, - Iniarmenian: 0x053B, - Iocyrillic: 0x0401, - Iogonek: 0x012E, - Iota: 0x0399, - Iotaafrican: 0x0196, - Iotadieresis: 0x03AA, - Iotatonos: 0x038A, - Ismall: 0xF769, - Istroke: 0x0197, - Itilde: 0x0128, - Itildebelow: 0x1E2C, - Izhitsacyrillic: 0x0474, - Izhitsadblgravecyrillic: 0x0476, - J: 0x004A, - Jaarmenian: 0x0541, - Jcircle: 0x24BF, - Jcircumflex: 0x0134, - Jecyrillic: 0x0408, - Jheharmenian: 0x054B, - Jmonospace: 0xFF2A, - Jsmall: 0xF76A, - K: 0x004B, - KBsquare: 0x3385, - KKsquare: 0x33CD, - Kabashkircyrillic: 0x04A0, - Kacute: 0x1E30, - Kacyrillic: 0x041A, - Kadescendercyrillic: 0x049A, - Kahookcyrillic: 0x04C3, - Kappa: 0x039A, - Kastrokecyrillic: 0x049E, - Kaverticalstrokecyrillic: 0x049C, - Kcaron: 0x01E8, - Kcedilla: 0x0136, - Kcircle: 0x24C0, - Kcommaaccent: 0x0136, - Kdotbelow: 0x1E32, - Keharmenian: 0x0554, - Kenarmenian: 0x053F, - Khacyrillic: 0x0425, - Kheicoptic: 0x03E6, - Khook: 0x0198, - Kjecyrillic: 0x040C, - Klinebelow: 0x1E34, - Kmonospace: 0xFF2B, - Koppacyrillic: 0x0480, - Koppagreek: 0x03DE, - Ksicyrillic: 0x046E, - Ksmall: 0xF76B, - L: 0x004C, - LJ: 0x01C7, - LL: 0xF6BF, - Lacute: 0x0139, - Lambda: 0x039B, - Lcaron: 0x013D, - Lcedilla: 0x013B, - Lcircle: 0x24C1, - Lcircumflexbelow: 0x1E3C, - Lcommaaccent: 0x013B, - Ldot: 0x013F, - Ldotaccent: 0x013F, - Ldotbelow: 0x1E36, - Ldotbelowmacron: 0x1E38, - Liwnarmenian: 0x053C, - Lj: 0x01C8, - Ljecyrillic: 0x0409, - Llinebelow: 0x1E3A, - Lmonospace: 0xFF2C, - Lslash: 0x0141, - Lslashsmall: 0xF6F9, - Lsmall: 0xF76C, - M: 0x004D, - MBsquare: 0x3386, - Macron: 0xF6D0, - Macronsmall: 0xF7AF, - Macute: 0x1E3E, - Mcircle: 0x24C2, - Mdotaccent: 0x1E40, - Mdotbelow: 0x1E42, - Menarmenian: 0x0544, - Mmonospace: 0xFF2D, - Msmall: 0xF76D, - Mturned: 0x019C, - Mu: 0x039C, - N: 0x004E, - NJ: 0x01CA, - Nacute: 0x0143, - Ncaron: 0x0147, - Ncedilla: 0x0145, - Ncircle: 0x24C3, - Ncircumflexbelow: 0x1E4A, - Ncommaaccent: 0x0145, - Ndotaccent: 0x1E44, - Ndotbelow: 0x1E46, - Nhookleft: 0x019D, - Nineroman: 0x2168, - Nj: 0x01CB, - Njecyrillic: 0x040A, - Nlinebelow: 0x1E48, - Nmonospace: 0xFF2E, - Nowarmenian: 0x0546, - Nsmall: 0xF76E, - Ntilde: 0x00D1, - Ntildesmall: 0xF7F1, - Nu: 0x039D, - O: 0x004F, - OE: 0x0152, - OEsmall: 0xF6FA, - Oacute: 0x00D3, - Oacutesmall: 0xF7F3, - Obarredcyrillic: 0x04E8, - Obarreddieresiscyrillic: 0x04EA, - Obreve: 0x014E, - Ocaron: 0x01D1, - Ocenteredtilde: 0x019F, - Ocircle: 0x24C4, - Ocircumflex: 0x00D4, - Ocircumflexacute: 0x1ED0, - Ocircumflexdotbelow: 0x1ED8, - Ocircumflexgrave: 0x1ED2, - Ocircumflexhookabove: 0x1ED4, - Ocircumflexsmall: 0xF7F4, - Ocircumflextilde: 0x1ED6, - Ocyrillic: 0x041E, - Odblacute: 0x0150, - Odblgrave: 0x020C, - Odieresis: 0x00D6, - Odieresiscyrillic: 0x04E6, - Odieresissmall: 0xF7F6, - Odotbelow: 0x1ECC, - Ogoneksmall: 0xF6FB, - Ograve: 0x00D2, - Ogravesmall: 0xF7F2, - Oharmenian: 0x0555, - Ohm: 0x2126, - Ohookabove: 0x1ECE, - Ohorn: 0x01A0, - Ohornacute: 0x1EDA, - Ohorndotbelow: 0x1EE2, - Ohorngrave: 0x1EDC, - Ohornhookabove: 0x1EDE, - Ohorntilde: 0x1EE0, - Ohungarumlaut: 0x0150, - Oi: 0x01A2, - Oinvertedbreve: 0x020E, - Omacron: 0x014C, - Omacronacute: 0x1E52, - Omacrongrave: 0x1E50, - Omega: 0x2126, - Omegacyrillic: 0x0460, - Omegagreek: 0x03A9, - Omegaroundcyrillic: 0x047A, - Omegatitlocyrillic: 0x047C, - Omegatonos: 0x038F, - Omicron: 0x039F, - Omicrontonos: 0x038C, - Omonospace: 0xFF2F, - Oneroman: 0x2160, - Oogonek: 0x01EA, - Oogonekmacron: 0x01EC, - Oopen: 0x0186, - Oslash: 0x00D8, - Oslashacute: 0x01FE, - Oslashsmall: 0xF7F8, - Osmall: 0xF76F, - Ostrokeacute: 0x01FE, - Otcyrillic: 0x047E, - Otilde: 0x00D5, - Otildeacute: 0x1E4C, - Otildedieresis: 0x1E4E, - Otildesmall: 0xF7F5, - P: 0x0050, - Pacute: 0x1E54, - Pcircle: 0x24C5, - Pdotaccent: 0x1E56, - Pecyrillic: 0x041F, - Peharmenian: 0x054A, - Pemiddlehookcyrillic: 0x04A6, - Phi: 0x03A6, - Phook: 0x01A4, - Pi: 0x03A0, - Piwrarmenian: 0x0553, - Pmonospace: 0xFF30, - Psi: 0x03A8, - Psicyrillic: 0x0470, - Psmall: 0xF770, - Q: 0x0051, - Qcircle: 0x24C6, - Qmonospace: 0xFF31, - Qsmall: 0xF771, - R: 0x0052, - Raarmenian: 0x054C, - Racute: 0x0154, - Rcaron: 0x0158, - Rcedilla: 0x0156, - Rcircle: 0x24C7, - Rcommaaccent: 0x0156, - Rdblgrave: 0x0210, - Rdotaccent: 0x1E58, - Rdotbelow: 0x1E5A, - Rdotbelowmacron: 0x1E5C, - Reharmenian: 0x0550, - Rfraktur: 0x211C, - Rho: 0x03A1, - Ringsmall: 0xF6FC, - Rinvertedbreve: 0x0212, - Rlinebelow: 0x1E5E, - Rmonospace: 0xFF32, - Rsmall: 0xF772, - Rsmallinverted: 0x0281, - Rsmallinvertedsuperior: 0x02B6, - S: 0x0053, - SF010000: 0x250C, - SF020000: 0x2514, - SF030000: 0x2510, - SF040000: 0x2518, - SF050000: 0x253C, - SF060000: 0x252C, - SF070000: 0x2534, - SF080000: 0x251C, - SF090000: 0x2524, - SF100000: 0x2500, - SF110000: 0x2502, - SF190000: 0x2561, - SF200000: 0x2562, - SF210000: 0x2556, - SF220000: 0x2555, - SF230000: 0x2563, - SF240000: 0x2551, - SF250000: 0x2557, - SF260000: 0x255D, - SF270000: 0x255C, - SF280000: 0x255B, - SF360000: 0x255E, - SF370000: 0x255F, - SF380000: 0x255A, - SF390000: 0x2554, - SF400000: 0x2569, - SF410000: 0x2566, - SF420000: 0x2560, - SF430000: 0x2550, - SF440000: 0x256C, - SF450000: 0x2567, - SF460000: 0x2568, - SF470000: 0x2564, - SF480000: 0x2565, - SF490000: 0x2559, - SF500000: 0x2558, - SF510000: 0x2552, - SF520000: 0x2553, - SF530000: 0x256B, - SF540000: 0x256A, - Sacute: 0x015A, - Sacutedotaccent: 0x1E64, - Sampigreek: 0x03E0, - Scaron: 0x0160, - Scarondotaccent: 0x1E66, - Scaronsmall: 0xF6FD, - Scedilla: 0x015E, - Schwa: 0x018F, - Schwacyrillic: 0x04D8, - Schwadieresiscyrillic: 0x04DA, - Scircle: 0x24C8, - Scircumflex: 0x015C, - Scommaaccent: 0x0218, - Sdotaccent: 0x1E60, - Sdotbelow: 0x1E62, - Sdotbelowdotaccent: 0x1E68, - Seharmenian: 0x054D, - Sevenroman: 0x2166, - Shaarmenian: 0x0547, - Shacyrillic: 0x0428, - Shchacyrillic: 0x0429, - Sheicoptic: 0x03E2, - Shhacyrillic: 0x04BA, - Shimacoptic: 0x03EC, - Sigma: 0x03A3, - Sixroman: 0x2165, - Smonospace: 0xFF33, - Softsigncyrillic: 0x042C, - Ssmall: 0xF773, - Stigmagreek: 0x03DA, - T: 0x0054, - Tau: 0x03A4, - Tbar: 0x0166, - Tcaron: 0x0164, - Tcedilla: 0x0162, - Tcircle: 0x24C9, - Tcircumflexbelow: 0x1E70, - Tcommaaccent: 0x0162, - Tdotaccent: 0x1E6A, - Tdotbelow: 0x1E6C, - Tecyrillic: 0x0422, - Tedescendercyrillic: 0x04AC, - Tenroman: 0x2169, - Tetsecyrillic: 0x04B4, - Theta: 0x0398, - Thook: 0x01AC, - Thorn: 0x00DE, - Thornsmall: 0xF7FE, - Threeroman: 0x2162, - Tildesmall: 0xF6FE, - Tiwnarmenian: 0x054F, - Tlinebelow: 0x1E6E, - Tmonospace: 0xFF34, - Toarmenian: 0x0539, - Tonefive: 0x01BC, - Tonesix: 0x0184, - Tonetwo: 0x01A7, - Tretroflexhook: 0x01AE, - Tsecyrillic: 0x0426, - Tshecyrillic: 0x040B, - Tsmall: 0xF774, - Twelveroman: 0x216B, - Tworoman: 0x2161, - U: 0x0055, - Uacute: 0x00DA, - Uacutesmall: 0xF7FA, - Ubreve: 0x016C, - Ucaron: 0x01D3, - Ucircle: 0x24CA, - Ucircumflex: 0x00DB, - Ucircumflexbelow: 0x1E76, - Ucircumflexsmall: 0xF7FB, - Ucyrillic: 0x0423, - Udblacute: 0x0170, - Udblgrave: 0x0214, - Udieresis: 0x00DC, - Udieresisacute: 0x01D7, - Udieresisbelow: 0x1E72, - Udieresiscaron: 0x01D9, - Udieresiscyrillic: 0x04F0, - Udieresisgrave: 0x01DB, - Udieresismacron: 0x01D5, - Udieresissmall: 0xF7FC, - Udotbelow: 0x1EE4, - Ugrave: 0x00D9, - Ugravesmall: 0xF7F9, - Uhookabove: 0x1EE6, - Uhorn: 0x01AF, - Uhornacute: 0x1EE8, - Uhorndotbelow: 0x1EF0, - Uhorngrave: 0x1EEA, - Uhornhookabove: 0x1EEC, - Uhorntilde: 0x1EEE, - Uhungarumlaut: 0x0170, - Uhungarumlautcyrillic: 0x04F2, - Uinvertedbreve: 0x0216, - Ukcyrillic: 0x0478, - Umacron: 0x016A, - Umacroncyrillic: 0x04EE, - Umacrondieresis: 0x1E7A, - Umonospace: 0xFF35, - Uogonek: 0x0172, - Upsilon: 0x03A5, - Upsilon1: 0x03D2, - Upsilonacutehooksymbolgreek: 0x03D3, - Upsilonafrican: 0x01B1, - Upsilondieresis: 0x03AB, - Upsilondieresishooksymbolgreek: 0x03D4, - Upsilonhooksymbol: 0x03D2, - Upsilontonos: 0x038E, - Uring: 0x016E, - Ushortcyrillic: 0x040E, - Usmall: 0xF775, - Ustraightcyrillic: 0x04AE, - Ustraightstrokecyrillic: 0x04B0, - Utilde: 0x0168, - Utildeacute: 0x1E78, - Utildebelow: 0x1E74, - V: 0x0056, - Vcircle: 0x24CB, - Vdotbelow: 0x1E7E, - Vecyrillic: 0x0412, - Vewarmenian: 0x054E, - Vhook: 0x01B2, - Vmonospace: 0xFF36, - Voarmenian: 0x0548, - Vsmall: 0xF776, - Vtilde: 0x1E7C, - W: 0x0057, - Wacute: 0x1E82, - Wcircle: 0x24CC, - Wcircumflex: 0x0174, - Wdieresis: 0x1E84, - Wdotaccent: 0x1E86, - Wdotbelow: 0x1E88, - Wgrave: 0x1E80, - Wmonospace: 0xFF37, - Wsmall: 0xF777, - X: 0x0058, - Xcircle: 0x24CD, - Xdieresis: 0x1E8C, - Xdotaccent: 0x1E8A, - Xeharmenian: 0x053D, - Xi: 0x039E, - Xmonospace: 0xFF38, - Xsmall: 0xF778, - Y: 0x0059, - Yacute: 0x00DD, - Yacutesmall: 0xF7FD, - Yatcyrillic: 0x0462, - Ycircle: 0x24CE, - Ycircumflex: 0x0176, - Ydieresis: 0x0178, - Ydieresissmall: 0xF7FF, - Ydotaccent: 0x1E8E, - Ydotbelow: 0x1EF4, - Yericyrillic: 0x042B, - Yerudieresiscyrillic: 0x04F8, - Ygrave: 0x1EF2, - Yhook: 0x01B3, - Yhookabove: 0x1EF6, - Yiarmenian: 0x0545, - Yicyrillic: 0x0407, - Yiwnarmenian: 0x0552, - Ymonospace: 0xFF39, - Ysmall: 0xF779, - Ytilde: 0x1EF8, - Yusbigcyrillic: 0x046A, - Yusbigiotifiedcyrillic: 0x046C, - Yuslittlecyrillic: 0x0466, - Yuslittleiotifiedcyrillic: 0x0468, - Z: 0x005A, - Zaarmenian: 0x0536, - Zacute: 0x0179, - Zcaron: 0x017D, - Zcaronsmall: 0xF6FF, - Zcircle: 0x24CF, - Zcircumflex: 0x1E90, - Zdot: 0x017B, - Zdotaccent: 0x017B, - Zdotbelow: 0x1E92, - Zecyrillic: 0x0417, - Zedescendercyrillic: 0x0498, - Zedieresiscyrillic: 0x04DE, - Zeta: 0x0396, - Zhearmenian: 0x053A, - Zhebrevecyrillic: 0x04C1, - Zhecyrillic: 0x0416, - Zhedescendercyrillic: 0x0496, - Zhedieresiscyrillic: 0x04DC, - Zlinebelow: 0x1E94, - Zmonospace: 0xFF3A, - Zsmall: 0xF77A, - Zstroke: 0x01B5, - a: 0x0061, - aabengali: 0x0986, - aacute: 0x00E1, - aadeva: 0x0906, - aagujarati: 0x0A86, - aagurmukhi: 0x0A06, - aamatragurmukhi: 0x0A3E, - aarusquare: 0x3303, - aavowelsignbengali: 0x09BE, - aavowelsigndeva: 0x093E, - aavowelsigngujarati: 0x0ABE, - abbreviationmarkarmenian: 0x055F, - abbreviationsigndeva: 0x0970, - abengali: 0x0985, - abopomofo: 0x311A, - abreve: 0x0103, - abreveacute: 0x1EAF, - abrevecyrillic: 0x04D1, - abrevedotbelow: 0x1EB7, - abrevegrave: 0x1EB1, - abrevehookabove: 0x1EB3, - abrevetilde: 0x1EB5, - acaron: 0x01CE, - acircle: 0x24D0, - acircumflex: 0x00E2, - acircumflexacute: 0x1EA5, - acircumflexdotbelow: 0x1EAD, - acircumflexgrave: 0x1EA7, - acircumflexhookabove: 0x1EA9, - acircumflextilde: 0x1EAB, - acute: 0x00B4, - acutebelowcmb: 0x0317, - acutecmb: 0x0301, - acutecomb: 0x0301, - acutedeva: 0x0954, - acutelowmod: 0x02CF, - acutetonecmb: 0x0341, - acyrillic: 0x0430, - adblgrave: 0x0201, - addakgurmukhi: 0x0A71, - adeva: 0x0905, - adieresis: 0x00E4, - adieresiscyrillic: 0x04D3, - adieresismacron: 0x01DF, - adotbelow: 0x1EA1, - adotmacron: 0x01E1, - ae: 0x00E6, - aeacute: 0x01FD, - aekorean: 0x3150, - aemacron: 0x01E3, - afii00208: 0x2015, - afii08941: 0x20A4, - afii10017: 0x0410, - afii10018: 0x0411, - afii10019: 0x0412, - afii10020: 0x0413, - afii10021: 0x0414, - afii10022: 0x0415, - afii10023: 0x0401, - afii10024: 0x0416, - afii10025: 0x0417, - afii10026: 0x0418, - afii10027: 0x0419, - afii10028: 0x041A, - afii10029: 0x041B, - afii10030: 0x041C, - afii10031: 0x041D, - afii10032: 0x041E, - afii10033: 0x041F, - afii10034: 0x0420, - afii10035: 0x0421, - afii10036: 0x0422, - afii10037: 0x0423, - afii10038: 0x0424, - afii10039: 0x0425, - afii10040: 0x0426, - afii10041: 0x0427, - afii10042: 0x0428, - afii10043: 0x0429, - afii10044: 0x042A, - afii10045: 0x042B, - afii10046: 0x042C, - afii10047: 0x042D, - afii10048: 0x042E, - afii10049: 0x042F, - afii10050: 0x0490, - afii10051: 0x0402, - afii10052: 0x0403, - afii10053: 0x0404, - afii10054: 0x0405, - afii10055: 0x0406, - afii10056: 0x0407, - afii10057: 0x0408, - afii10058: 0x0409, - afii10059: 0x040A, - afii10060: 0x040B, - afii10061: 0x040C, - afii10062: 0x040E, - afii10063: 0xF6C4, - afii10064: 0xF6C5, - afii10065: 0x0430, - afii10066: 0x0431, - afii10067: 0x0432, - afii10068: 0x0433, - afii10069: 0x0434, - afii10070: 0x0435, - afii10071: 0x0451, - afii10072: 0x0436, - afii10073: 0x0437, - afii10074: 0x0438, - afii10075: 0x0439, - afii10076: 0x043A, - afii10077: 0x043B, - afii10078: 0x043C, - afii10079: 0x043D, - afii10080: 0x043E, - afii10081: 0x043F, - afii10082: 0x0440, - afii10083: 0x0441, - afii10084: 0x0442, - afii10085: 0x0443, - afii10086: 0x0444, - afii10087: 0x0445, - afii10088: 0x0446, - afii10089: 0x0447, - afii10090: 0x0448, - afii10091: 0x0449, - afii10092: 0x044A, - afii10093: 0x044B, - afii10094: 0x044C, - afii10095: 0x044D, - afii10096: 0x044E, - afii10097: 0x044F, - afii10098: 0x0491, - afii10099: 0x0452, - afii10100: 0x0453, - afii10101: 0x0454, - afii10102: 0x0455, - afii10103: 0x0456, - afii10104: 0x0457, - afii10105: 0x0458, - afii10106: 0x0459, - afii10107: 0x045A, - afii10108: 0x045B, - afii10109: 0x045C, - afii10110: 0x045E, - afii10145: 0x040F, - afii10146: 0x0462, - afii10147: 0x0472, - afii10148: 0x0474, - afii10192: 0xF6C6, - afii10193: 0x045F, - afii10194: 0x0463, - afii10195: 0x0473, - afii10196: 0x0475, - afii10831: 0xF6C7, - afii10832: 0xF6C8, - afii10846: 0x04D9, - afii299: 0x200E, - afii300: 0x200F, - afii301: 0x200D, - afii57381: 0x066A, - afii57388: 0x060C, - afii57392: 0x0660, - afii57393: 0x0661, - afii57394: 0x0662, - afii57395: 0x0663, - afii57396: 0x0664, - afii57397: 0x0665, - afii57398: 0x0666, - afii57399: 0x0667, - afii57400: 0x0668, - afii57401: 0x0669, - afii57403: 0x061B, - afii57407: 0x061F, - afii57409: 0x0621, - afii57410: 0x0622, - afii57411: 0x0623, - afii57412: 0x0624, - afii57413: 0x0625, - afii57414: 0x0626, - afii57415: 0x0627, - afii57416: 0x0628, - afii57417: 0x0629, - afii57418: 0x062A, - afii57419: 0x062B, - afii57420: 0x062C, - afii57421: 0x062D, - afii57422: 0x062E, - afii57423: 0x062F, - afii57424: 0x0630, - afii57425: 0x0631, - afii57426: 0x0632, - afii57427: 0x0633, - afii57428: 0x0634, - afii57429: 0x0635, - afii57430: 0x0636, - afii57431: 0x0637, - afii57432: 0x0638, - afii57433: 0x0639, - afii57434: 0x063A, - afii57440: 0x0640, - afii57441: 0x0641, - afii57442: 0x0642, - afii57443: 0x0643, - afii57444: 0x0644, - afii57445: 0x0645, - afii57446: 0x0646, - afii57448: 0x0648, - afii57449: 0x0649, - afii57450: 0x064A, - afii57451: 0x064B, - afii57452: 0x064C, - afii57453: 0x064D, - afii57454: 0x064E, - afii57455: 0x064F, - afii57456: 0x0650, - afii57457: 0x0651, - afii57458: 0x0652, - afii57470: 0x0647, - afii57505: 0x06A4, - afii57506: 0x067E, - afii57507: 0x0686, - afii57508: 0x0698, - afii57509: 0x06AF, - afii57511: 0x0679, - afii57512: 0x0688, - afii57513: 0x0691, - afii57514: 0x06BA, - afii57519: 0x06D2, - afii57534: 0x06D5, - afii57636: 0x20AA, - afii57645: 0x05BE, - afii57658: 0x05C3, - afii57664: 0x05D0, - afii57665: 0x05D1, - afii57666: 0x05D2, - afii57667: 0x05D3, - afii57668: 0x05D4, - afii57669: 0x05D5, - afii57670: 0x05D6, - afii57671: 0x05D7, - afii57672: 0x05D8, - afii57673: 0x05D9, - afii57674: 0x05DA, - afii57675: 0x05DB, - afii57676: 0x05DC, - afii57677: 0x05DD, - afii57678: 0x05DE, - afii57679: 0x05DF, - afii57680: 0x05E0, - afii57681: 0x05E1, - afii57682: 0x05E2, - afii57683: 0x05E3, - afii57684: 0x05E4, - afii57685: 0x05E5, - afii57686: 0x05E6, - afii57687: 0x05E7, - afii57688: 0x05E8, - afii57689: 0x05E9, - afii57690: 0x05EA, - afii57694: 0xFB2A, - afii57695: 0xFB2B, - afii57700: 0xFB4B, - afii57705: 0xFB1F, - afii57716: 0x05F0, - afii57717: 0x05F1, - afii57718: 0x05F2, - afii57723: 0xFB35, - afii57793: 0x05B4, - afii57794: 0x05B5, - afii57795: 0x05B6, - afii57796: 0x05BB, - afii57797: 0x05B8, - afii57798: 0x05B7, - afii57799: 0x05B0, - afii57800: 0x05B2, - afii57801: 0x05B1, - afii57802: 0x05B3, - afii57803: 0x05C2, - afii57804: 0x05C1, - afii57806: 0x05B9, - afii57807: 0x05BC, - afii57839: 0x05BD, - afii57841: 0x05BF, - afii57842: 0x05C0, - afii57929: 0x02BC, - afii61248: 0x2105, - afii61289: 0x2113, - afii61352: 0x2116, - afii61573: 0x202C, - afii61574: 0x202D, - afii61575: 0x202E, - afii61664: 0x200C, - afii63167: 0x066D, - afii64937: 0x02BD, - agrave: 0x00E0, - agujarati: 0x0A85, - agurmukhi: 0x0A05, - ahiragana: 0x3042, - ahookabove: 0x1EA3, - aibengali: 0x0990, - aibopomofo: 0x311E, - aideva: 0x0910, - aiecyrillic: 0x04D5, - aigujarati: 0x0A90, - aigurmukhi: 0x0A10, - aimatragurmukhi: 0x0A48, - ainarabic: 0x0639, - ainfinalarabic: 0xFECA, - aininitialarabic: 0xFECB, - ainmedialarabic: 0xFECC, - ainvertedbreve: 0x0203, - aivowelsignbengali: 0x09C8, - aivowelsigndeva: 0x0948, - aivowelsigngujarati: 0x0AC8, - akatakana: 0x30A2, - akatakanahalfwidth: 0xFF71, - akorean: 0x314F, - alef: 0x05D0, - alefarabic: 0x0627, - alefdageshhebrew: 0xFB30, - aleffinalarabic: 0xFE8E, - alefhamzaabovearabic: 0x0623, - alefhamzaabovefinalarabic: 0xFE84, - alefhamzabelowarabic: 0x0625, - alefhamzabelowfinalarabic: 0xFE88, - alefhebrew: 0x05D0, - aleflamedhebrew: 0xFB4F, - alefmaddaabovearabic: 0x0622, - alefmaddaabovefinalarabic: 0xFE82, - alefmaksuraarabic: 0x0649, - alefmaksurafinalarabic: 0xFEF0, - alefmaksurainitialarabic: 0xFEF3, - alefmaksuramedialarabic: 0xFEF4, - alefpatahhebrew: 0xFB2E, - alefqamatshebrew: 0xFB2F, - aleph: 0x2135, - allequal: 0x224C, - alpha: 0x03B1, - alphatonos: 0x03AC, - amacron: 0x0101, - amonospace: 0xFF41, - ampersand: 0x0026, - ampersandmonospace: 0xFF06, - ampersandsmall: 0xF726, - amsquare: 0x33C2, - anbopomofo: 0x3122, - angbopomofo: 0x3124, - angbracketleft: 0x3008, // This glyph is missing from Adobe's original list. - angbracketright: 0x3009, // This glyph is missing from Adobe's original list. - angkhankhuthai: 0x0E5A, - angle: 0x2220, - anglebracketleft: 0x3008, - anglebracketleftvertical: 0xFE3F, - anglebracketright: 0x3009, - anglebracketrightvertical: 0xFE40, - angleleft: 0x2329, - angleright: 0x232A, - angstrom: 0x212B, - anoteleia: 0x0387, - anudattadeva: 0x0952, - anusvarabengali: 0x0982, - anusvaradeva: 0x0902, - anusvaragujarati: 0x0A82, - aogonek: 0x0105, - apaatosquare: 0x3300, - aparen: 0x249C, - apostrophearmenian: 0x055A, - apostrophemod: 0x02BC, - apple: 0xF8FF, - approaches: 0x2250, - approxequal: 0x2248, - approxequalorimage: 0x2252, - approximatelyequal: 0x2245, - araeaekorean: 0x318E, - araeakorean: 0x318D, - arc: 0x2312, - arighthalfring: 0x1E9A, - aring: 0x00E5, - aringacute: 0x01FB, - aringbelow: 0x1E01, - arrowboth: 0x2194, - arrowdashdown: 0x21E3, - arrowdashleft: 0x21E0, - arrowdashright: 0x21E2, - arrowdashup: 0x21E1, - arrowdblboth: 0x21D4, - arrowdbldown: 0x21D3, - arrowdblleft: 0x21D0, - arrowdblright: 0x21D2, - arrowdblup: 0x21D1, - arrowdown: 0x2193, - arrowdownleft: 0x2199, - arrowdownright: 0x2198, - arrowdownwhite: 0x21E9, - arrowheaddownmod: 0x02C5, - arrowheadleftmod: 0x02C2, - arrowheadrightmod: 0x02C3, - arrowheadupmod: 0x02C4, - arrowhorizex: 0xF8E7, - arrowleft: 0x2190, - arrowleftdbl: 0x21D0, - arrowleftdblstroke: 0x21CD, - arrowleftoverright: 0x21C6, - arrowleftwhite: 0x21E6, - arrowright: 0x2192, - arrowrightdblstroke: 0x21CF, - arrowrightheavy: 0x279E, - arrowrightoverleft: 0x21C4, - arrowrightwhite: 0x21E8, - arrowtableft: 0x21E4, - arrowtabright: 0x21E5, - arrowup: 0x2191, - arrowupdn: 0x2195, - arrowupdnbse: 0x21A8, - arrowupdownbase: 0x21A8, - arrowupleft: 0x2196, - arrowupleftofdown: 0x21C5, - arrowupright: 0x2197, - arrowupwhite: 0x21E7, - arrowvertex: 0xF8E6, - asciicircum: 0x005E, - asciicircummonospace: 0xFF3E, - asciitilde: 0x007E, - asciitildemonospace: 0xFF5E, - ascript: 0x0251, - ascriptturned: 0x0252, - asmallhiragana: 0x3041, - asmallkatakana: 0x30A1, - asmallkatakanahalfwidth: 0xFF67, - asterisk: 0x002A, - asteriskaltonearabic: 0x066D, - asteriskarabic: 0x066D, - asteriskmath: 0x2217, - asteriskmonospace: 0xFF0A, - asterisksmall: 0xFE61, - asterism: 0x2042, - asuperior: 0xF6E9, - asymptoticallyequal: 0x2243, - at: 0x0040, - atilde: 0x00E3, - atmonospace: 0xFF20, - atsmall: 0xFE6B, - aturned: 0x0250, - aubengali: 0x0994, - aubopomofo: 0x3120, - audeva: 0x0914, - augujarati: 0x0A94, - augurmukhi: 0x0A14, - aulengthmarkbengali: 0x09D7, - aumatragurmukhi: 0x0A4C, - auvowelsignbengali: 0x09CC, - auvowelsigndeva: 0x094C, - auvowelsigngujarati: 0x0ACC, - avagrahadeva: 0x093D, - aybarmenian: 0x0561, - ayin: 0x05E2, - ayinaltonehebrew: 0xFB20, - ayinhebrew: 0x05E2, - b: 0x0062, - babengali: 0x09AC, - backslash: 0x005C, - backslashmonospace: 0xFF3C, - badeva: 0x092C, - bagujarati: 0x0AAC, - bagurmukhi: 0x0A2C, - bahiragana: 0x3070, - bahtthai: 0x0E3F, - bakatakana: 0x30D0, - bar: 0x007C, - barmonospace: 0xFF5C, - bbopomofo: 0x3105, - bcircle: 0x24D1, - bdotaccent: 0x1E03, - bdotbelow: 0x1E05, - beamedsixteenthnotes: 0x266C, - because: 0x2235, - becyrillic: 0x0431, - beharabic: 0x0628, - behfinalarabic: 0xFE90, - behinitialarabic: 0xFE91, - behiragana: 0x3079, - behmedialarabic: 0xFE92, - behmeeminitialarabic: 0xFC9F, - behmeemisolatedarabic: 0xFC08, - behnoonfinalarabic: 0xFC6D, - bekatakana: 0x30D9, - benarmenian: 0x0562, - bet: 0x05D1, - beta: 0x03B2, - betasymbolgreek: 0x03D0, - betdagesh: 0xFB31, - betdageshhebrew: 0xFB31, - bethebrew: 0x05D1, - betrafehebrew: 0xFB4C, - bhabengali: 0x09AD, - bhadeva: 0x092D, - bhagujarati: 0x0AAD, - bhagurmukhi: 0x0A2D, - bhook: 0x0253, - bihiragana: 0x3073, - bikatakana: 0x30D3, - bilabialclick: 0x0298, - bindigurmukhi: 0x0A02, - birusquare: 0x3331, - blackcircle: 0x25CF, - blackdiamond: 0x25C6, - blackdownpointingtriangle: 0x25BC, - blackleftpointingpointer: 0x25C4, - blackleftpointingtriangle: 0x25C0, - blacklenticularbracketleft: 0x3010, - blacklenticularbracketleftvertical: 0xFE3B, - blacklenticularbracketright: 0x3011, - blacklenticularbracketrightvertical: 0xFE3C, - blacklowerlefttriangle: 0x25E3, - blacklowerrighttriangle: 0x25E2, - blackrectangle: 0x25AC, - blackrightpointingpointer: 0x25BA, - blackrightpointingtriangle: 0x25B6, - blacksmallsquare: 0x25AA, - blacksmilingface: 0x263B, - blacksquare: 0x25A0, - blackstar: 0x2605, - blackupperlefttriangle: 0x25E4, - blackupperrighttriangle: 0x25E5, - blackuppointingsmalltriangle: 0x25B4, - blackuppointingtriangle: 0x25B2, - blank: 0x2423, - blinebelow: 0x1E07, - block: 0x2588, - bmonospace: 0xFF42, - bobaimaithai: 0x0E1A, - bohiragana: 0x307C, - bokatakana: 0x30DC, - bparen: 0x249D, - bqsquare: 0x33C3, - braceex: 0xF8F4, - braceleft: 0x007B, - braceleftbt: 0xF8F3, - braceleftmid: 0xF8F2, - braceleftmonospace: 0xFF5B, - braceleftsmall: 0xFE5B, - bracelefttp: 0xF8F1, - braceleftvertical: 0xFE37, - braceright: 0x007D, - bracerightbt: 0xF8FE, - bracerightmid: 0xF8FD, - bracerightmonospace: 0xFF5D, - bracerightsmall: 0xFE5C, - bracerighttp: 0xF8FC, - bracerightvertical: 0xFE38, - bracketleft: 0x005B, - bracketleftbt: 0xF8F0, - bracketleftex: 0xF8EF, - bracketleftmonospace: 0xFF3B, - bracketlefttp: 0xF8EE, - bracketright: 0x005D, - bracketrightbt: 0xF8FB, - bracketrightex: 0xF8FA, - bracketrightmonospace: 0xFF3D, - bracketrighttp: 0xF8F9, - breve: 0x02D8, - brevebelowcmb: 0x032E, - brevecmb: 0x0306, - breveinvertedbelowcmb: 0x032F, - breveinvertedcmb: 0x0311, - breveinverteddoublecmb: 0x0361, - bridgebelowcmb: 0x032A, - bridgeinvertedbelowcmb: 0x033A, - brokenbar: 0x00A6, - bstroke: 0x0180, - bsuperior: 0xF6EA, - btopbar: 0x0183, - buhiragana: 0x3076, - bukatakana: 0x30D6, - bullet: 0x2022, - bulletinverse: 0x25D8, - bulletoperator: 0x2219, - bullseye: 0x25CE, - c: 0x0063, - caarmenian: 0x056E, - cabengali: 0x099A, - cacute: 0x0107, - cadeva: 0x091A, - cagujarati: 0x0A9A, - cagurmukhi: 0x0A1A, - calsquare: 0x3388, - candrabindubengali: 0x0981, - candrabinducmb: 0x0310, - candrabindudeva: 0x0901, - candrabindugujarati: 0x0A81, - capslock: 0x21EA, - careof: 0x2105, - caron: 0x02C7, - caronbelowcmb: 0x032C, - caroncmb: 0x030C, - carriagereturn: 0x21B5, - cbopomofo: 0x3118, - ccaron: 0x010D, - ccedilla: 0x00E7, - ccedillaacute: 0x1E09, - ccircle: 0x24D2, - ccircumflex: 0x0109, - ccurl: 0x0255, - cdot: 0x010B, - cdotaccent: 0x010B, - cdsquare: 0x33C5, - cedilla: 0x00B8, - cedillacmb: 0x0327, - cent: 0x00A2, - centigrade: 0x2103, - centinferior: 0xF6DF, - centmonospace: 0xFFE0, - centoldstyle: 0xF7A2, - centsuperior: 0xF6E0, - chaarmenian: 0x0579, - chabengali: 0x099B, - chadeva: 0x091B, - chagujarati: 0x0A9B, - chagurmukhi: 0x0A1B, - chbopomofo: 0x3114, - cheabkhasiancyrillic: 0x04BD, - checkmark: 0x2713, - checyrillic: 0x0447, - chedescenderabkhasiancyrillic: 0x04BF, - chedescendercyrillic: 0x04B7, - chedieresiscyrillic: 0x04F5, - cheharmenian: 0x0573, - chekhakassiancyrillic: 0x04CC, - cheverticalstrokecyrillic: 0x04B9, - chi: 0x03C7, - chieuchacirclekorean: 0x3277, - chieuchaparenkorean: 0x3217, - chieuchcirclekorean: 0x3269, - chieuchkorean: 0x314A, - chieuchparenkorean: 0x3209, - chochangthai: 0x0E0A, - chochanthai: 0x0E08, - chochingthai: 0x0E09, - chochoethai: 0x0E0C, - chook: 0x0188, - cieucacirclekorean: 0x3276, - cieucaparenkorean: 0x3216, - cieuccirclekorean: 0x3268, - cieuckorean: 0x3148, - cieucparenkorean: 0x3208, - cieucuparenkorean: 0x321C, - circle: 0x25CB, - circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list. - circlemultiply: 0x2297, - circleot: 0x2299, - circleplus: 0x2295, - circlepostalmark: 0x3036, - circlewithlefthalfblack: 0x25D0, - circlewithrighthalfblack: 0x25D1, - circumflex: 0x02C6, - circumflexbelowcmb: 0x032D, - circumflexcmb: 0x0302, - clear: 0x2327, - clickalveolar: 0x01C2, - clickdental: 0x01C0, - clicklateral: 0x01C1, - clickretroflex: 0x01C3, - club: 0x2663, - clubsuitblack: 0x2663, - clubsuitwhite: 0x2667, - cmcubedsquare: 0x33A4, - cmonospace: 0xFF43, - cmsquaredsquare: 0x33A0, - coarmenian: 0x0581, - colon: 0x003A, - colonmonetary: 0x20A1, - colonmonospace: 0xFF1A, - colonsign: 0x20A1, - colonsmall: 0xFE55, - colontriangularhalfmod: 0x02D1, - colontriangularmod: 0x02D0, - comma: 0x002C, - commaabovecmb: 0x0313, - commaaboverightcmb: 0x0315, - commaaccent: 0xF6C3, - commaarabic: 0x060C, - commaarmenian: 0x055D, - commainferior: 0xF6E1, - commamonospace: 0xFF0C, - commareversedabovecmb: 0x0314, - commareversedmod: 0x02BD, - commasmall: 0xFE50, - commasuperior: 0xF6E2, - commaturnedabovecmb: 0x0312, - commaturnedmod: 0x02BB, - compass: 0x263C, - congruent: 0x2245, - contourintegral: 0x222E, - control: 0x2303, - controlACK: 0x0006, - controlBEL: 0x0007, - controlBS: 0x0008, - controlCAN: 0x0018, - controlCR: 0x000D, - controlDC1: 0x0011, - controlDC2: 0x0012, - controlDC3: 0x0013, - controlDC4: 0x0014, - controlDEL: 0x007F, - controlDLE: 0x0010, - controlEM: 0x0019, - controlENQ: 0x0005, - controlEOT: 0x0004, - controlESC: 0x001B, - controlETB: 0x0017, - controlETX: 0x0003, - controlFF: 0x000C, - controlFS: 0x001C, - controlGS: 0x001D, - controlHT: 0x0009, - controlLF: 0x000A, - controlNAK: 0x0015, - controlRS: 0x001E, - controlSI: 0x000F, - controlSO: 0x000E, - controlSOT: 0x0002, - controlSTX: 0x0001, - controlSUB: 0x001A, - controlSYN: 0x0016, - controlUS: 0x001F, - controlVT: 0x000B, - copyright: 0x00A9, - copyrightsans: 0xF8E9, - copyrightserif: 0xF6D9, - cornerbracketleft: 0x300C, - cornerbracketlefthalfwidth: 0xFF62, - cornerbracketleftvertical: 0xFE41, - cornerbracketright: 0x300D, - cornerbracketrighthalfwidth: 0xFF63, - cornerbracketrightvertical: 0xFE42, - corporationsquare: 0x337F, - cosquare: 0x33C7, - coverkgsquare: 0x33C6, - cparen: 0x249E, - cruzeiro: 0x20A2, - cstretched: 0x0297, - curlyand: 0x22CF, - curlyor: 0x22CE, - currency: 0x00A4, - cyrBreve: 0xF6D1, - cyrFlex: 0xF6D2, - cyrbreve: 0xF6D4, - cyrflex: 0xF6D5, - d: 0x0064, - daarmenian: 0x0564, - dabengali: 0x09A6, - dadarabic: 0x0636, - dadeva: 0x0926, - dadfinalarabic: 0xFEBE, - dadinitialarabic: 0xFEBF, - dadmedialarabic: 0xFEC0, - dagesh: 0x05BC, - dageshhebrew: 0x05BC, - dagger: 0x2020, - daggerdbl: 0x2021, - dagujarati: 0x0AA6, - dagurmukhi: 0x0A26, - dahiragana: 0x3060, - dakatakana: 0x30C0, - dalarabic: 0x062F, - dalet: 0x05D3, - daletdagesh: 0xFB33, - daletdageshhebrew: 0xFB33, - dalethebrew: 0x05D3, - dalfinalarabic: 0xFEAA, - dammaarabic: 0x064F, - dammalowarabic: 0x064F, - dammatanaltonearabic: 0x064C, - dammatanarabic: 0x064C, - danda: 0x0964, - dargahebrew: 0x05A7, - dargalefthebrew: 0x05A7, - dasiapneumatacyrilliccmb: 0x0485, - dblGrave: 0xF6D3, - dblanglebracketleft: 0x300A, - dblanglebracketleftvertical: 0xFE3D, - dblanglebracketright: 0x300B, - dblanglebracketrightvertical: 0xFE3E, - dblarchinvertedbelowcmb: 0x032B, - dblarrowleft: 0x21D4, - dblarrowright: 0x21D2, - dbldanda: 0x0965, - dblgrave: 0xF6D6, - dblgravecmb: 0x030F, - dblintegral: 0x222C, - dbllowline: 0x2017, - dbllowlinecmb: 0x0333, - dbloverlinecmb: 0x033F, - dblprimemod: 0x02BA, - dblverticalbar: 0x2016, - dblverticallineabovecmb: 0x030E, - dbopomofo: 0x3109, - dbsquare: 0x33C8, - dcaron: 0x010F, - dcedilla: 0x1E11, - dcircle: 0x24D3, - dcircumflexbelow: 0x1E13, - dcroat: 0x0111, - ddabengali: 0x09A1, - ddadeva: 0x0921, - ddagujarati: 0x0AA1, - ddagurmukhi: 0x0A21, - ddalarabic: 0x0688, - ddalfinalarabic: 0xFB89, - dddhadeva: 0x095C, - ddhabengali: 0x09A2, - ddhadeva: 0x0922, - ddhagujarati: 0x0AA2, - ddhagurmukhi: 0x0A22, - ddotaccent: 0x1E0B, - ddotbelow: 0x1E0D, - decimalseparatorarabic: 0x066B, - decimalseparatorpersian: 0x066B, - decyrillic: 0x0434, - degree: 0x00B0, - dehihebrew: 0x05AD, - dehiragana: 0x3067, - deicoptic: 0x03EF, - dekatakana: 0x30C7, - deleteleft: 0x232B, - deleteright: 0x2326, - delta: 0x03B4, - deltaturned: 0x018D, - denominatorminusonenumeratorbengali: 0x09F8, - dezh: 0x02A4, - dhabengali: 0x09A7, - dhadeva: 0x0927, - dhagujarati: 0x0AA7, - dhagurmukhi: 0x0A27, - dhook: 0x0257, - dialytikatonos: 0x0385, - dialytikatonoscmb: 0x0344, - diamond: 0x2666, - diamondsuitwhite: 0x2662, - dieresis: 0x00A8, - dieresisacute: 0xF6D7, - dieresisbelowcmb: 0x0324, - dieresiscmb: 0x0308, - dieresisgrave: 0xF6D8, - dieresistonos: 0x0385, - dihiragana: 0x3062, - dikatakana: 0x30C2, - dittomark: 0x3003, - divide: 0x00F7, - divides: 0x2223, - divisionslash: 0x2215, - djecyrillic: 0x0452, - dkshade: 0x2593, - dlinebelow: 0x1E0F, - dlsquare: 0x3397, - dmacron: 0x0111, - dmonospace: 0xFF44, - dnblock: 0x2584, - dochadathai: 0x0E0E, - dodekthai: 0x0E14, - dohiragana: 0x3069, - dokatakana: 0x30C9, - dollar: 0x0024, - dollarinferior: 0xF6E3, - dollarmonospace: 0xFF04, - dollaroldstyle: 0xF724, - dollarsmall: 0xFE69, - dollarsuperior: 0xF6E4, - dong: 0x20AB, - dorusquare: 0x3326, - dotaccent: 0x02D9, - dotaccentcmb: 0x0307, - dotbelowcmb: 0x0323, - dotbelowcomb: 0x0323, - dotkatakana: 0x30FB, - dotlessi: 0x0131, - dotlessj: 0xF6BE, - dotlessjstrokehook: 0x0284, - dotmath: 0x22C5, - dottedcircle: 0x25CC, - doubleyodpatah: 0xFB1F, - doubleyodpatahhebrew: 0xFB1F, - downtackbelowcmb: 0x031E, - downtackmod: 0x02D5, - dparen: 0x249F, - dsuperior: 0xF6EB, - dtail: 0x0256, - dtopbar: 0x018C, - duhiragana: 0x3065, - dukatakana: 0x30C5, - dz: 0x01F3, - dzaltone: 0x02A3, - dzcaron: 0x01C6, - dzcurl: 0x02A5, - dzeabkhasiancyrillic: 0x04E1, - dzecyrillic: 0x0455, - dzhecyrillic: 0x045F, - e: 0x0065, - eacute: 0x00E9, - earth: 0x2641, - ebengali: 0x098F, - ebopomofo: 0x311C, - ebreve: 0x0115, - ecandradeva: 0x090D, - ecandragujarati: 0x0A8D, - ecandravowelsigndeva: 0x0945, - ecandravowelsigngujarati: 0x0AC5, - ecaron: 0x011B, - ecedillabreve: 0x1E1D, - echarmenian: 0x0565, - echyiwnarmenian: 0x0587, - ecircle: 0x24D4, - ecircumflex: 0x00EA, - ecircumflexacute: 0x1EBF, - ecircumflexbelow: 0x1E19, - ecircumflexdotbelow: 0x1EC7, - ecircumflexgrave: 0x1EC1, - ecircumflexhookabove: 0x1EC3, - ecircumflextilde: 0x1EC5, - ecyrillic: 0x0454, - edblgrave: 0x0205, - edeva: 0x090F, - edieresis: 0x00EB, - edot: 0x0117, - edotaccent: 0x0117, - edotbelow: 0x1EB9, - eegurmukhi: 0x0A0F, - eematragurmukhi: 0x0A47, - efcyrillic: 0x0444, - egrave: 0x00E8, - egujarati: 0x0A8F, - eharmenian: 0x0567, - ehbopomofo: 0x311D, - ehiragana: 0x3048, - ehookabove: 0x1EBB, - eibopomofo: 0x311F, - eight: 0x0038, - eightarabic: 0x0668, - eightbengali: 0x09EE, - eightcircle: 0x2467, - eightcircleinversesansserif: 0x2791, - eightdeva: 0x096E, - eighteencircle: 0x2471, - eighteenparen: 0x2485, - eighteenperiod: 0x2499, - eightgujarati: 0x0AEE, - eightgurmukhi: 0x0A6E, - eighthackarabic: 0x0668, - eighthangzhou: 0x3028, - eighthnotebeamed: 0x266B, - eightideographicparen: 0x3227, - eightinferior: 0x2088, - eightmonospace: 0xFF18, - eightoldstyle: 0xF738, - eightparen: 0x247B, - eightperiod: 0x248F, - eightpersian: 0x06F8, - eightroman: 0x2177, - eightsuperior: 0x2078, - eightthai: 0x0E58, - einvertedbreve: 0x0207, - eiotifiedcyrillic: 0x0465, - ekatakana: 0x30A8, - ekatakanahalfwidth: 0xFF74, - ekonkargurmukhi: 0x0A74, - ekorean: 0x3154, - elcyrillic: 0x043B, - element: 0x2208, - elevencircle: 0x246A, - elevenparen: 0x247E, - elevenperiod: 0x2492, - elevenroman: 0x217A, - ellipsis: 0x2026, - ellipsisvertical: 0x22EE, - emacron: 0x0113, - emacronacute: 0x1E17, - emacrongrave: 0x1E15, - emcyrillic: 0x043C, - emdash: 0x2014, - emdashvertical: 0xFE31, - emonospace: 0xFF45, - emphasismarkarmenian: 0x055B, - emptyset: 0x2205, - enbopomofo: 0x3123, - encyrillic: 0x043D, - endash: 0x2013, - endashvertical: 0xFE32, - endescendercyrillic: 0x04A3, - eng: 0x014B, - engbopomofo: 0x3125, - enghecyrillic: 0x04A5, - enhookcyrillic: 0x04C8, - enspace: 0x2002, - eogonek: 0x0119, - eokorean: 0x3153, - eopen: 0x025B, - eopenclosed: 0x029A, - eopenreversed: 0x025C, - eopenreversedclosed: 0x025E, - eopenreversedhook: 0x025D, - eparen: 0x24A0, - epsilon: 0x03B5, - epsilontonos: 0x03AD, - equal: 0x003D, - equalmonospace: 0xFF1D, - equalsmall: 0xFE66, - equalsuperior: 0x207C, - equivalence: 0x2261, - erbopomofo: 0x3126, - ercyrillic: 0x0440, - ereversed: 0x0258, - ereversedcyrillic: 0x044D, - escyrillic: 0x0441, - esdescendercyrillic: 0x04AB, - esh: 0x0283, - eshcurl: 0x0286, - eshortdeva: 0x090E, - eshortvowelsigndeva: 0x0946, - eshreversedloop: 0x01AA, - eshsquatreversed: 0x0285, - esmallhiragana: 0x3047, - esmallkatakana: 0x30A7, - esmallkatakanahalfwidth: 0xFF6A, - estimated: 0x212E, - esuperior: 0xF6EC, - eta: 0x03B7, - etarmenian: 0x0568, - etatonos: 0x03AE, - eth: 0x00F0, - etilde: 0x1EBD, - etildebelow: 0x1E1B, - etnahtafoukhhebrew: 0x0591, - etnahtafoukhlefthebrew: 0x0591, - etnahtahebrew: 0x0591, - etnahtalefthebrew: 0x0591, - eturned: 0x01DD, - eukorean: 0x3161, - euro: 0x20AC, - evowelsignbengali: 0x09C7, - evowelsigndeva: 0x0947, - evowelsigngujarati: 0x0AC7, - exclam: 0x0021, - exclamarmenian: 0x055C, - exclamdbl: 0x203C, - exclamdown: 0x00A1, - exclamdownsmall: 0xF7A1, - exclammonospace: 0xFF01, - exclamsmall: 0xF721, - existential: 0x2203, - ezh: 0x0292, - ezhcaron: 0x01EF, - ezhcurl: 0x0293, - ezhreversed: 0x01B9, - ezhtail: 0x01BA, - f: 0x0066, - fadeva: 0x095E, - fagurmukhi: 0x0A5E, - fahrenheit: 0x2109, - fathaarabic: 0x064E, - fathalowarabic: 0x064E, - fathatanarabic: 0x064B, - fbopomofo: 0x3108, - fcircle: 0x24D5, - fdotaccent: 0x1E1F, - feharabic: 0x0641, - feharmenian: 0x0586, - fehfinalarabic: 0xFED2, - fehinitialarabic: 0xFED3, - fehmedialarabic: 0xFED4, - feicoptic: 0x03E5, - female: 0x2640, - ff: 0xFB00, - ffi: 0xFB03, - ffl: 0xFB04, - fi: 0xFB01, - fifteencircle: 0x246E, - fifteenparen: 0x2482, - fifteenperiod: 0x2496, - figuredash: 0x2012, - filledbox: 0x25A0, - filledrect: 0x25AC, - finalkaf: 0x05DA, - finalkafdagesh: 0xFB3A, - finalkafdageshhebrew: 0xFB3A, - finalkafhebrew: 0x05DA, - finalmem: 0x05DD, - finalmemhebrew: 0x05DD, - finalnun: 0x05DF, - finalnunhebrew: 0x05DF, - finalpe: 0x05E3, - finalpehebrew: 0x05E3, - finaltsadi: 0x05E5, - finaltsadihebrew: 0x05E5, - firsttonechinese: 0x02C9, - fisheye: 0x25C9, - fitacyrillic: 0x0473, - five: 0x0035, - fivearabic: 0x0665, - fivebengali: 0x09EB, - fivecircle: 0x2464, - fivecircleinversesansserif: 0x278E, - fivedeva: 0x096B, - fiveeighths: 0x215D, - fivegujarati: 0x0AEB, - fivegurmukhi: 0x0A6B, - fivehackarabic: 0x0665, - fivehangzhou: 0x3025, - fiveideographicparen: 0x3224, - fiveinferior: 0x2085, - fivemonospace: 0xFF15, - fiveoldstyle: 0xF735, - fiveparen: 0x2478, - fiveperiod: 0x248C, - fivepersian: 0x06F5, - fiveroman: 0x2174, - fivesuperior: 0x2075, - fivethai: 0x0E55, - fl: 0xFB02, - florin: 0x0192, - fmonospace: 0xFF46, - fmsquare: 0x3399, - fofanthai: 0x0E1F, - fofathai: 0x0E1D, - fongmanthai: 0x0E4F, - forall: 0x2200, - four: 0x0034, - fourarabic: 0x0664, - fourbengali: 0x09EA, - fourcircle: 0x2463, - fourcircleinversesansserif: 0x278D, - fourdeva: 0x096A, - fourgujarati: 0x0AEA, - fourgurmukhi: 0x0A6A, - fourhackarabic: 0x0664, - fourhangzhou: 0x3024, - fourideographicparen: 0x3223, - fourinferior: 0x2084, - fourmonospace: 0xFF14, - fournumeratorbengali: 0x09F7, - fouroldstyle: 0xF734, - fourparen: 0x2477, - fourperiod: 0x248B, - fourpersian: 0x06F4, - fourroman: 0x2173, - foursuperior: 0x2074, - fourteencircle: 0x246D, - fourteenparen: 0x2481, - fourteenperiod: 0x2495, - fourthai: 0x0E54, - fourthtonechinese: 0x02CB, - fparen: 0x24A1, - fraction: 0x2044, - franc: 0x20A3, - g: 0x0067, - gabengali: 0x0997, - gacute: 0x01F5, - gadeva: 0x0917, - gafarabic: 0x06AF, - gaffinalarabic: 0xFB93, - gafinitialarabic: 0xFB94, - gafmedialarabic: 0xFB95, - gagujarati: 0x0A97, - gagurmukhi: 0x0A17, - gahiragana: 0x304C, - gakatakana: 0x30AC, - gamma: 0x03B3, - gammalatinsmall: 0x0263, - gammasuperior: 0x02E0, - gangiacoptic: 0x03EB, - gbopomofo: 0x310D, - gbreve: 0x011F, - gcaron: 0x01E7, - gcedilla: 0x0123, - gcircle: 0x24D6, - gcircumflex: 0x011D, - gcommaaccent: 0x0123, - gdot: 0x0121, - gdotaccent: 0x0121, - gecyrillic: 0x0433, - gehiragana: 0x3052, - gekatakana: 0x30B2, - geometricallyequal: 0x2251, - gereshaccenthebrew: 0x059C, - gereshhebrew: 0x05F3, - gereshmuqdamhebrew: 0x059D, - germandbls: 0x00DF, - gershayimaccenthebrew: 0x059E, - gershayimhebrew: 0x05F4, - getamark: 0x3013, - ghabengali: 0x0998, - ghadarmenian: 0x0572, - ghadeva: 0x0918, - ghagujarati: 0x0A98, - ghagurmukhi: 0x0A18, - ghainarabic: 0x063A, - ghainfinalarabic: 0xFECE, - ghaininitialarabic: 0xFECF, - ghainmedialarabic: 0xFED0, - ghemiddlehookcyrillic: 0x0495, - ghestrokecyrillic: 0x0493, - gheupturncyrillic: 0x0491, - ghhadeva: 0x095A, - ghhagurmukhi: 0x0A5A, - ghook: 0x0260, - ghzsquare: 0x3393, - gihiragana: 0x304E, - gikatakana: 0x30AE, - gimarmenian: 0x0563, - gimel: 0x05D2, - gimeldagesh: 0xFB32, - gimeldageshhebrew: 0xFB32, - gimelhebrew: 0x05D2, - gjecyrillic: 0x0453, - glottalinvertedstroke: 0x01BE, - glottalstop: 0x0294, - glottalstopinverted: 0x0296, - glottalstopmod: 0x02C0, - glottalstopreversed: 0x0295, - glottalstopreversedmod: 0x02C1, - glottalstopreversedsuperior: 0x02E4, - glottalstopstroke: 0x02A1, - glottalstopstrokereversed: 0x02A2, - gmacron: 0x1E21, - gmonospace: 0xFF47, - gohiragana: 0x3054, - gokatakana: 0x30B4, - gparen: 0x24A2, - gpasquare: 0x33AC, - gradient: 0x2207, - grave: 0x0060, - gravebelowcmb: 0x0316, - gravecmb: 0x0300, - gravecomb: 0x0300, - gravedeva: 0x0953, - gravelowmod: 0x02CE, - gravemonospace: 0xFF40, - gravetonecmb: 0x0340, - greater: 0x003E, - greaterequal: 0x2265, - greaterequalorless: 0x22DB, - greatermonospace: 0xFF1E, - greaterorequivalent: 0x2273, - greaterorless: 0x2277, - greateroverequal: 0x2267, - greatersmall: 0xFE65, - gscript: 0x0261, - gstroke: 0x01E5, - guhiragana: 0x3050, - guillemotleft: 0x00AB, - guillemotright: 0x00BB, - guilsinglleft: 0x2039, - guilsinglright: 0x203A, - gukatakana: 0x30B0, - guramusquare: 0x3318, - gysquare: 0x33C9, - h: 0x0068, - haabkhasiancyrillic: 0x04A9, - haaltonearabic: 0x06C1, - habengali: 0x09B9, - hadescendercyrillic: 0x04B3, - hadeva: 0x0939, - hagujarati: 0x0AB9, - hagurmukhi: 0x0A39, - haharabic: 0x062D, - hahfinalarabic: 0xFEA2, - hahinitialarabic: 0xFEA3, - hahiragana: 0x306F, - hahmedialarabic: 0xFEA4, - haitusquare: 0x332A, - hakatakana: 0x30CF, - hakatakanahalfwidth: 0xFF8A, - halantgurmukhi: 0x0A4D, - hamzaarabic: 0x0621, - hamzalowarabic: 0x0621, - hangulfiller: 0x3164, - hardsigncyrillic: 0x044A, - harpoonleftbarbup: 0x21BC, - harpoonrightbarbup: 0x21C0, - hasquare: 0x33CA, - hatafpatah: 0x05B2, - hatafpatah16: 0x05B2, - hatafpatah23: 0x05B2, - hatafpatah2f: 0x05B2, - hatafpatahhebrew: 0x05B2, - hatafpatahnarrowhebrew: 0x05B2, - hatafpatahquarterhebrew: 0x05B2, - hatafpatahwidehebrew: 0x05B2, - hatafqamats: 0x05B3, - hatafqamats1b: 0x05B3, - hatafqamats28: 0x05B3, - hatafqamats34: 0x05B3, - hatafqamatshebrew: 0x05B3, - hatafqamatsnarrowhebrew: 0x05B3, - hatafqamatsquarterhebrew: 0x05B3, - hatafqamatswidehebrew: 0x05B3, - hatafsegol: 0x05B1, - hatafsegol17: 0x05B1, - hatafsegol24: 0x05B1, - hatafsegol30: 0x05B1, - hatafsegolhebrew: 0x05B1, - hatafsegolnarrowhebrew: 0x05B1, - hatafsegolquarterhebrew: 0x05B1, - hatafsegolwidehebrew: 0x05B1, - hbar: 0x0127, - hbopomofo: 0x310F, - hbrevebelow: 0x1E2B, - hcedilla: 0x1E29, - hcircle: 0x24D7, - hcircumflex: 0x0125, - hdieresis: 0x1E27, - hdotaccent: 0x1E23, - hdotbelow: 0x1E25, - he: 0x05D4, - heart: 0x2665, - heartsuitblack: 0x2665, - heartsuitwhite: 0x2661, - hedagesh: 0xFB34, - hedageshhebrew: 0xFB34, - hehaltonearabic: 0x06C1, - heharabic: 0x0647, - hehebrew: 0x05D4, - hehfinalaltonearabic: 0xFBA7, - hehfinalalttwoarabic: 0xFEEA, - hehfinalarabic: 0xFEEA, - hehhamzaabovefinalarabic: 0xFBA5, - hehhamzaaboveisolatedarabic: 0xFBA4, - hehinitialaltonearabic: 0xFBA8, - hehinitialarabic: 0xFEEB, - hehiragana: 0x3078, - hehmedialaltonearabic: 0xFBA9, - hehmedialarabic: 0xFEEC, - heiseierasquare: 0x337B, - hekatakana: 0x30D8, - hekatakanahalfwidth: 0xFF8D, - hekutaarusquare: 0x3336, - henghook: 0x0267, - herutusquare: 0x3339, - het: 0x05D7, - hethebrew: 0x05D7, - hhook: 0x0266, - hhooksuperior: 0x02B1, - hieuhacirclekorean: 0x327B, - hieuhaparenkorean: 0x321B, - hieuhcirclekorean: 0x326D, - hieuhkorean: 0x314E, - hieuhparenkorean: 0x320D, - hihiragana: 0x3072, - hikatakana: 0x30D2, - hikatakanahalfwidth: 0xFF8B, - hiriq: 0x05B4, - hiriq14: 0x05B4, - hiriq21: 0x05B4, - hiriq2d: 0x05B4, - hiriqhebrew: 0x05B4, - hiriqnarrowhebrew: 0x05B4, - hiriqquarterhebrew: 0x05B4, - hiriqwidehebrew: 0x05B4, - hlinebelow: 0x1E96, - hmonospace: 0xFF48, - hoarmenian: 0x0570, - hohipthai: 0x0E2B, - hohiragana: 0x307B, - hokatakana: 0x30DB, - hokatakanahalfwidth: 0xFF8E, - holam: 0x05B9, - holam19: 0x05B9, - holam26: 0x05B9, - holam32: 0x05B9, - holamhebrew: 0x05B9, - holamnarrowhebrew: 0x05B9, - holamquarterhebrew: 0x05B9, - holamwidehebrew: 0x05B9, - honokhukthai: 0x0E2E, - hookabovecomb: 0x0309, - hookcmb: 0x0309, - hookpalatalizedbelowcmb: 0x0321, - hookretroflexbelowcmb: 0x0322, - hoonsquare: 0x3342, - horicoptic: 0x03E9, - horizontalbar: 0x2015, - horncmb: 0x031B, - hotsprings: 0x2668, - house: 0x2302, - hparen: 0x24A3, - hsuperior: 0x02B0, - hturned: 0x0265, - huhiragana: 0x3075, - huiitosquare: 0x3333, - hukatakana: 0x30D5, - hukatakanahalfwidth: 0xFF8C, - hungarumlaut: 0x02DD, - hungarumlautcmb: 0x030B, - hv: 0x0195, - hyphen: 0x002D, - hypheninferior: 0xF6E5, - hyphenmonospace: 0xFF0D, - hyphensmall: 0xFE63, - hyphensuperior: 0xF6E6, - hyphentwo: 0x2010, - i: 0x0069, - iacute: 0x00ED, - iacyrillic: 0x044F, - ibengali: 0x0987, - ibopomofo: 0x3127, - ibreve: 0x012D, - icaron: 0x01D0, - icircle: 0x24D8, - icircumflex: 0x00EE, - icyrillic: 0x0456, - idblgrave: 0x0209, - ideographearthcircle: 0x328F, - ideographfirecircle: 0x328B, - ideographicallianceparen: 0x323F, - ideographiccallparen: 0x323A, - ideographiccentrecircle: 0x32A5, - ideographicclose: 0x3006, - ideographiccomma: 0x3001, - ideographiccommaleft: 0xFF64, - ideographiccongratulationparen: 0x3237, - ideographiccorrectcircle: 0x32A3, - ideographicearthparen: 0x322F, - ideographicenterpriseparen: 0x323D, - ideographicexcellentcircle: 0x329D, - ideographicfestivalparen: 0x3240, - ideographicfinancialcircle: 0x3296, - ideographicfinancialparen: 0x3236, - ideographicfireparen: 0x322B, - ideographichaveparen: 0x3232, - ideographichighcircle: 0x32A4, - ideographiciterationmark: 0x3005, - ideographiclaborcircle: 0x3298, - ideographiclaborparen: 0x3238, - ideographicleftcircle: 0x32A7, - ideographiclowcircle: 0x32A6, - ideographicmedicinecircle: 0x32A9, - ideographicmetalparen: 0x322E, - ideographicmoonparen: 0x322A, - ideographicnameparen: 0x3234, - ideographicperiod: 0x3002, - ideographicprintcircle: 0x329E, - ideographicreachparen: 0x3243, - ideographicrepresentparen: 0x3239, - ideographicresourceparen: 0x323E, - ideographicrightcircle: 0x32A8, - ideographicsecretcircle: 0x3299, - ideographicselfparen: 0x3242, - ideographicsocietyparen: 0x3233, - ideographicspace: 0x3000, - ideographicspecialparen: 0x3235, - ideographicstockparen: 0x3231, - ideographicstudyparen: 0x323B, - ideographicsunparen: 0x3230, - ideographicsuperviseparen: 0x323C, - ideographicwaterparen: 0x322C, - ideographicwoodparen: 0x322D, - ideographiczero: 0x3007, - ideographmetalcircle: 0x328E, - ideographmooncircle: 0x328A, - ideographnamecircle: 0x3294, - ideographsuncircle: 0x3290, - ideographwatercircle: 0x328C, - ideographwoodcircle: 0x328D, - ideva: 0x0907, - idieresis: 0x00EF, - idieresisacute: 0x1E2F, - idieresiscyrillic: 0x04E5, - idotbelow: 0x1ECB, - iebrevecyrillic: 0x04D7, - iecyrillic: 0x0435, - ieungacirclekorean: 0x3275, - ieungaparenkorean: 0x3215, - ieungcirclekorean: 0x3267, - ieungkorean: 0x3147, - ieungparenkorean: 0x3207, - igrave: 0x00EC, - igujarati: 0x0A87, - igurmukhi: 0x0A07, - ihiragana: 0x3044, - ihookabove: 0x1EC9, - iibengali: 0x0988, - iicyrillic: 0x0438, - iideva: 0x0908, - iigujarati: 0x0A88, - iigurmukhi: 0x0A08, - iimatragurmukhi: 0x0A40, - iinvertedbreve: 0x020B, - iishortcyrillic: 0x0439, - iivowelsignbengali: 0x09C0, - iivowelsigndeva: 0x0940, - iivowelsigngujarati: 0x0AC0, - ij: 0x0133, - ikatakana: 0x30A4, - ikatakanahalfwidth: 0xFF72, - ikorean: 0x3163, - ilde: 0x02DC, - iluyhebrew: 0x05AC, - imacron: 0x012B, - imacroncyrillic: 0x04E3, - imageorapproximatelyequal: 0x2253, - imatragurmukhi: 0x0A3F, - imonospace: 0xFF49, - increment: 0x2206, - infinity: 0x221E, - iniarmenian: 0x056B, - integral: 0x222B, - integralbottom: 0x2321, - integralbt: 0x2321, - integralex: 0xF8F5, - integraltop: 0x2320, - integraltp: 0x2320, - intersection: 0x2229, - intisquare: 0x3305, - invbullet: 0x25D8, - invcircle: 0x25D9, - invsmileface: 0x263B, - iocyrillic: 0x0451, - iogonek: 0x012F, - iota: 0x03B9, - iotadieresis: 0x03CA, - iotadieresistonos: 0x0390, - iotalatin: 0x0269, - iotatonos: 0x03AF, - iparen: 0x24A4, - irigurmukhi: 0x0A72, - ismallhiragana: 0x3043, - ismallkatakana: 0x30A3, - ismallkatakanahalfwidth: 0xFF68, - issharbengali: 0x09FA, - istroke: 0x0268, - isuperior: 0xF6ED, - iterationhiragana: 0x309D, - iterationkatakana: 0x30FD, - itilde: 0x0129, - itildebelow: 0x1E2D, - iubopomofo: 0x3129, - iucyrillic: 0x044E, - ivowelsignbengali: 0x09BF, - ivowelsigndeva: 0x093F, - ivowelsigngujarati: 0x0ABF, - izhitsacyrillic: 0x0475, - izhitsadblgravecyrillic: 0x0477, - j: 0x006A, - jaarmenian: 0x0571, - jabengali: 0x099C, - jadeva: 0x091C, - jagujarati: 0x0A9C, - jagurmukhi: 0x0A1C, - jbopomofo: 0x3110, - jcaron: 0x01F0, - jcircle: 0x24D9, - jcircumflex: 0x0135, - jcrossedtail: 0x029D, - jdotlessstroke: 0x025F, - jecyrillic: 0x0458, - jeemarabic: 0x062C, - jeemfinalarabic: 0xFE9E, - jeeminitialarabic: 0xFE9F, - jeemmedialarabic: 0xFEA0, - jeharabic: 0x0698, - jehfinalarabic: 0xFB8B, - jhabengali: 0x099D, - jhadeva: 0x091D, - jhagujarati: 0x0A9D, - jhagurmukhi: 0x0A1D, - jheharmenian: 0x057B, - jis: 0x3004, - jmonospace: 0xFF4A, - jparen: 0x24A5, - jsuperior: 0x02B2, - k: 0x006B, - kabashkircyrillic: 0x04A1, - kabengali: 0x0995, - kacute: 0x1E31, - kacyrillic: 0x043A, - kadescendercyrillic: 0x049B, - kadeva: 0x0915, - kaf: 0x05DB, - kafarabic: 0x0643, - kafdagesh: 0xFB3B, - kafdageshhebrew: 0xFB3B, - kaffinalarabic: 0xFEDA, - kafhebrew: 0x05DB, - kafinitialarabic: 0xFEDB, - kafmedialarabic: 0xFEDC, - kafrafehebrew: 0xFB4D, - kagujarati: 0x0A95, - kagurmukhi: 0x0A15, - kahiragana: 0x304B, - kahookcyrillic: 0x04C4, - kakatakana: 0x30AB, - kakatakanahalfwidth: 0xFF76, - kappa: 0x03BA, - kappasymbolgreek: 0x03F0, - kapyeounmieumkorean: 0x3171, - kapyeounphieuphkorean: 0x3184, - kapyeounpieupkorean: 0x3178, - kapyeounssangpieupkorean: 0x3179, - karoriisquare: 0x330D, - kashidaautoarabic: 0x0640, - kashidaautonosidebearingarabic: 0x0640, - kasmallkatakana: 0x30F5, - kasquare: 0x3384, - kasraarabic: 0x0650, - kasratanarabic: 0x064D, - kastrokecyrillic: 0x049F, - katahiraprolongmarkhalfwidth: 0xFF70, - kaverticalstrokecyrillic: 0x049D, - kbopomofo: 0x310E, - kcalsquare: 0x3389, - kcaron: 0x01E9, - kcedilla: 0x0137, - kcircle: 0x24DA, - kcommaaccent: 0x0137, - kdotbelow: 0x1E33, - keharmenian: 0x0584, - kehiragana: 0x3051, - kekatakana: 0x30B1, - kekatakanahalfwidth: 0xFF79, - kenarmenian: 0x056F, - kesmallkatakana: 0x30F6, - kgreenlandic: 0x0138, - khabengali: 0x0996, - khacyrillic: 0x0445, - khadeva: 0x0916, - khagujarati: 0x0A96, - khagurmukhi: 0x0A16, - khaharabic: 0x062E, - khahfinalarabic: 0xFEA6, - khahinitialarabic: 0xFEA7, - khahmedialarabic: 0xFEA8, - kheicoptic: 0x03E7, - khhadeva: 0x0959, - khhagurmukhi: 0x0A59, - khieukhacirclekorean: 0x3278, - khieukhaparenkorean: 0x3218, - khieukhcirclekorean: 0x326A, - khieukhkorean: 0x314B, - khieukhparenkorean: 0x320A, - khokhaithai: 0x0E02, - khokhonthai: 0x0E05, - khokhuatthai: 0x0E03, - khokhwaithai: 0x0E04, - khomutthai: 0x0E5B, - khook: 0x0199, - khorakhangthai: 0x0E06, - khzsquare: 0x3391, - kihiragana: 0x304D, - kikatakana: 0x30AD, - kikatakanahalfwidth: 0xFF77, - kiroguramusquare: 0x3315, - kiromeetorusquare: 0x3316, - kirosquare: 0x3314, - kiyeokacirclekorean: 0x326E, - kiyeokaparenkorean: 0x320E, - kiyeokcirclekorean: 0x3260, - kiyeokkorean: 0x3131, - kiyeokparenkorean: 0x3200, - kiyeoksioskorean: 0x3133, - kjecyrillic: 0x045C, - klinebelow: 0x1E35, - klsquare: 0x3398, - kmcubedsquare: 0x33A6, - kmonospace: 0xFF4B, - kmsquaredsquare: 0x33A2, - kohiragana: 0x3053, - kohmsquare: 0x33C0, - kokaithai: 0x0E01, - kokatakana: 0x30B3, - kokatakanahalfwidth: 0xFF7A, - kooposquare: 0x331E, - koppacyrillic: 0x0481, - koreanstandardsymbol: 0x327F, - koroniscmb: 0x0343, - kparen: 0x24A6, - kpasquare: 0x33AA, - ksicyrillic: 0x046F, - ktsquare: 0x33CF, - kturned: 0x029E, - kuhiragana: 0x304F, - kukatakana: 0x30AF, - kukatakanahalfwidth: 0xFF78, - kvsquare: 0x33B8, - kwsquare: 0x33BE, - l: 0x006C, - labengali: 0x09B2, - lacute: 0x013A, - ladeva: 0x0932, - lagujarati: 0x0AB2, - lagurmukhi: 0x0A32, - lakkhangyaothai: 0x0E45, - lamaleffinalarabic: 0xFEFC, - lamalefhamzaabovefinalarabic: 0xFEF8, - lamalefhamzaaboveisolatedarabic: 0xFEF7, - lamalefhamzabelowfinalarabic: 0xFEFA, - lamalefhamzabelowisolatedarabic: 0xFEF9, - lamalefisolatedarabic: 0xFEFB, - lamalefmaddaabovefinalarabic: 0xFEF6, - lamalefmaddaaboveisolatedarabic: 0xFEF5, - lamarabic: 0x0644, - lambda: 0x03BB, - lambdastroke: 0x019B, - lamed: 0x05DC, - lameddagesh: 0xFB3C, - lameddageshhebrew: 0xFB3C, - lamedhebrew: 0x05DC, - lamfinalarabic: 0xFEDE, - lamhahinitialarabic: 0xFCCA, - laminitialarabic: 0xFEDF, - lamjeeminitialarabic: 0xFCC9, - lamkhahinitialarabic: 0xFCCB, - lamlamhehisolatedarabic: 0xFDF2, - lammedialarabic: 0xFEE0, - lammeemhahinitialarabic: 0xFD88, - lammeeminitialarabic: 0xFCCC, - largecircle: 0x25EF, - lbar: 0x019A, - lbelt: 0x026C, - lbopomofo: 0x310C, - lcaron: 0x013E, - lcedilla: 0x013C, - lcircle: 0x24DB, - lcircumflexbelow: 0x1E3D, - lcommaaccent: 0x013C, - ldot: 0x0140, - ldotaccent: 0x0140, - ldotbelow: 0x1E37, - ldotbelowmacron: 0x1E39, - leftangleabovecmb: 0x031A, - lefttackbelowcmb: 0x0318, - less: 0x003C, - lessequal: 0x2264, - lessequalorgreater: 0x22DA, - lessmonospace: 0xFF1C, - lessorequivalent: 0x2272, - lessorgreater: 0x2276, - lessoverequal: 0x2266, - lesssmall: 0xFE64, - lezh: 0x026E, - lfblock: 0x258C, - lhookretroflex: 0x026D, - lira: 0x20A4, - liwnarmenian: 0x056C, - lj: 0x01C9, - ljecyrillic: 0x0459, - ll: 0xF6C0, - lladeva: 0x0933, - llagujarati: 0x0AB3, - llinebelow: 0x1E3B, - llladeva: 0x0934, - llvocalicbengali: 0x09E1, - llvocalicdeva: 0x0961, - llvocalicvowelsignbengali: 0x09E3, - llvocalicvowelsigndeva: 0x0963, - lmiddletilde: 0x026B, - lmonospace: 0xFF4C, - lmsquare: 0x33D0, - lochulathai: 0x0E2C, - logicaland: 0x2227, - logicalnot: 0x00AC, - logicalnotreversed: 0x2310, - logicalor: 0x2228, - lolingthai: 0x0E25, - longs: 0x017F, - lowlinecenterline: 0xFE4E, - lowlinecmb: 0x0332, - lowlinedashed: 0xFE4D, - lozenge: 0x25CA, - lparen: 0x24A7, - lslash: 0x0142, - lsquare: 0x2113, - lsuperior: 0xF6EE, - ltshade: 0x2591, - luthai: 0x0E26, - lvocalicbengali: 0x098C, - lvocalicdeva: 0x090C, - lvocalicvowelsignbengali: 0x09E2, - lvocalicvowelsigndeva: 0x0962, - lxsquare: 0x33D3, - m: 0x006D, - mabengali: 0x09AE, - macron: 0x00AF, - macronbelowcmb: 0x0331, - macroncmb: 0x0304, - macronlowmod: 0x02CD, - macronmonospace: 0xFFE3, - macute: 0x1E3F, - madeva: 0x092E, - magujarati: 0x0AAE, - magurmukhi: 0x0A2E, - mahapakhhebrew: 0x05A4, - mahapakhlefthebrew: 0x05A4, - mahiragana: 0x307E, - maichattawalowleftthai: 0xF895, - maichattawalowrightthai: 0xF894, - maichattawathai: 0x0E4B, - maichattawaupperleftthai: 0xF893, - maieklowleftthai: 0xF88C, - maieklowrightthai: 0xF88B, - maiekthai: 0x0E48, - maiekupperleftthai: 0xF88A, - maihanakatleftthai: 0xF884, - maihanakatthai: 0x0E31, - maitaikhuleftthai: 0xF889, - maitaikhuthai: 0x0E47, - maitholowleftthai: 0xF88F, - maitholowrightthai: 0xF88E, - maithothai: 0x0E49, - maithoupperleftthai: 0xF88D, - maitrilowleftthai: 0xF892, - maitrilowrightthai: 0xF891, - maitrithai: 0x0E4A, - maitriupperleftthai: 0xF890, - maiyamokthai: 0x0E46, - makatakana: 0x30DE, - makatakanahalfwidth: 0xFF8F, - male: 0x2642, - mansyonsquare: 0x3347, - maqafhebrew: 0x05BE, - mars: 0x2642, - masoracirclehebrew: 0x05AF, - masquare: 0x3383, - mbopomofo: 0x3107, - mbsquare: 0x33D4, - mcircle: 0x24DC, - mcubedsquare: 0x33A5, - mdotaccent: 0x1E41, - mdotbelow: 0x1E43, - meemarabic: 0x0645, - meemfinalarabic: 0xFEE2, - meeminitialarabic: 0xFEE3, - meemmedialarabic: 0xFEE4, - meemmeeminitialarabic: 0xFCD1, - meemmeemisolatedarabic: 0xFC48, - meetorusquare: 0x334D, - mehiragana: 0x3081, - meizierasquare: 0x337E, - mekatakana: 0x30E1, - mekatakanahalfwidth: 0xFF92, - mem: 0x05DE, - memdagesh: 0xFB3E, - memdageshhebrew: 0xFB3E, - memhebrew: 0x05DE, - menarmenian: 0x0574, - merkhahebrew: 0x05A5, - merkhakefulahebrew: 0x05A6, - merkhakefulalefthebrew: 0x05A6, - merkhalefthebrew: 0x05A5, - mhook: 0x0271, - mhzsquare: 0x3392, - middledotkatakanahalfwidth: 0xFF65, - middot: 0x00B7, - mieumacirclekorean: 0x3272, - mieumaparenkorean: 0x3212, - mieumcirclekorean: 0x3264, - mieumkorean: 0x3141, - mieumpansioskorean: 0x3170, - mieumparenkorean: 0x3204, - mieumpieupkorean: 0x316E, - mieumsioskorean: 0x316F, - mihiragana: 0x307F, - mikatakana: 0x30DF, - mikatakanahalfwidth: 0xFF90, - minus: 0x2212, - minusbelowcmb: 0x0320, - minuscircle: 0x2296, - minusmod: 0x02D7, - minusplus: 0x2213, - minute: 0x2032, - miribaarusquare: 0x334A, - mirisquare: 0x3349, - mlonglegturned: 0x0270, - mlsquare: 0x3396, - mmcubedsquare: 0x33A3, - mmonospace: 0xFF4D, - mmsquaredsquare: 0x339F, - mohiragana: 0x3082, - mohmsquare: 0x33C1, - mokatakana: 0x30E2, - mokatakanahalfwidth: 0xFF93, - molsquare: 0x33D6, - momathai: 0x0E21, - moverssquare: 0x33A7, - moverssquaredsquare: 0x33A8, - mparen: 0x24A8, - mpasquare: 0x33AB, - mssquare: 0x33B3, - msuperior: 0xF6EF, - mturned: 0x026F, - mu: 0x00B5, - mu1: 0x00B5, - muasquare: 0x3382, - muchgreater: 0x226B, - muchless: 0x226A, - mufsquare: 0x338C, - mugreek: 0x03BC, - mugsquare: 0x338D, - muhiragana: 0x3080, - mukatakana: 0x30E0, - mukatakanahalfwidth: 0xFF91, - mulsquare: 0x3395, - multiply: 0x00D7, - mumsquare: 0x339B, - munahhebrew: 0x05A3, - munahlefthebrew: 0x05A3, - musicalnote: 0x266A, - musicalnotedbl: 0x266B, - musicflatsign: 0x266D, - musicsharpsign: 0x266F, - mussquare: 0x33B2, - muvsquare: 0x33B6, - muwsquare: 0x33BC, - mvmegasquare: 0x33B9, - mvsquare: 0x33B7, - mwmegasquare: 0x33BF, - mwsquare: 0x33BD, - n: 0x006E, - nabengali: 0x09A8, - nabla: 0x2207, - nacute: 0x0144, - nadeva: 0x0928, - nagujarati: 0x0AA8, - nagurmukhi: 0x0A28, - nahiragana: 0x306A, - nakatakana: 0x30CA, - nakatakanahalfwidth: 0xFF85, - napostrophe: 0x0149, - nasquare: 0x3381, - nbopomofo: 0x310B, - nbspace: 0x00A0, - ncaron: 0x0148, - ncedilla: 0x0146, - ncircle: 0x24DD, - ncircumflexbelow: 0x1E4B, - ncommaaccent: 0x0146, - ndotaccent: 0x1E45, - ndotbelow: 0x1E47, - nehiragana: 0x306D, - nekatakana: 0x30CD, - nekatakanahalfwidth: 0xFF88, - newsheqelsign: 0x20AA, - nfsquare: 0x338B, - ngabengali: 0x0999, - ngadeva: 0x0919, - ngagujarati: 0x0A99, - ngagurmukhi: 0x0A19, - ngonguthai: 0x0E07, - nhiragana: 0x3093, - nhookleft: 0x0272, - nhookretroflex: 0x0273, - nieunacirclekorean: 0x326F, - nieunaparenkorean: 0x320F, - nieuncieuckorean: 0x3135, - nieuncirclekorean: 0x3261, - nieunhieuhkorean: 0x3136, - nieunkorean: 0x3134, - nieunpansioskorean: 0x3168, - nieunparenkorean: 0x3201, - nieunsioskorean: 0x3167, - nieuntikeutkorean: 0x3166, - nihiragana: 0x306B, - nikatakana: 0x30CB, - nikatakanahalfwidth: 0xFF86, - nikhahitleftthai: 0xF899, - nikhahitthai: 0x0E4D, - nine: 0x0039, - ninearabic: 0x0669, - ninebengali: 0x09EF, - ninecircle: 0x2468, - ninecircleinversesansserif: 0x2792, - ninedeva: 0x096F, - ninegujarati: 0x0AEF, - ninegurmukhi: 0x0A6F, - ninehackarabic: 0x0669, - ninehangzhou: 0x3029, - nineideographicparen: 0x3228, - nineinferior: 0x2089, - ninemonospace: 0xFF19, - nineoldstyle: 0xF739, - nineparen: 0x247C, - nineperiod: 0x2490, - ninepersian: 0x06F9, - nineroman: 0x2178, - ninesuperior: 0x2079, - nineteencircle: 0x2472, - nineteenparen: 0x2486, - nineteenperiod: 0x249A, - ninethai: 0x0E59, - nj: 0x01CC, - njecyrillic: 0x045A, - nkatakana: 0x30F3, - nkatakanahalfwidth: 0xFF9D, - nlegrightlong: 0x019E, - nlinebelow: 0x1E49, - nmonospace: 0xFF4E, - nmsquare: 0x339A, - nnabengali: 0x09A3, - nnadeva: 0x0923, - nnagujarati: 0x0AA3, - nnagurmukhi: 0x0A23, - nnnadeva: 0x0929, - nohiragana: 0x306E, - nokatakana: 0x30CE, - nokatakanahalfwidth: 0xFF89, - nonbreakingspace: 0x00A0, - nonenthai: 0x0E13, - nonuthai: 0x0E19, - noonarabic: 0x0646, - noonfinalarabic: 0xFEE6, - noonghunnaarabic: 0x06BA, - noonghunnafinalarabic: 0xFB9F, - nooninitialarabic: 0xFEE7, - noonjeeminitialarabic: 0xFCD2, - noonjeemisolatedarabic: 0xFC4B, - noonmedialarabic: 0xFEE8, - noonmeeminitialarabic: 0xFCD5, - noonmeemisolatedarabic: 0xFC4E, - noonnoonfinalarabic: 0xFC8D, - notcontains: 0x220C, - notelement: 0x2209, - notelementof: 0x2209, - notequal: 0x2260, - notgreater: 0x226F, - notgreaternorequal: 0x2271, - notgreaternorless: 0x2279, - notidentical: 0x2262, - notless: 0x226E, - notlessnorequal: 0x2270, - notparallel: 0x2226, - notprecedes: 0x2280, - notsubset: 0x2284, - notsucceeds: 0x2281, - notsuperset: 0x2285, - nowarmenian: 0x0576, - nparen: 0x24A9, - nssquare: 0x33B1, - nsuperior: 0x207F, - ntilde: 0x00F1, - nu: 0x03BD, - nuhiragana: 0x306C, - nukatakana: 0x30CC, - nukatakanahalfwidth: 0xFF87, - nuktabengali: 0x09BC, - nuktadeva: 0x093C, - nuktagujarati: 0x0ABC, - nuktagurmukhi: 0x0A3C, - numbersign: 0x0023, - numbersignmonospace: 0xFF03, - numbersignsmall: 0xFE5F, - numeralsigngreek: 0x0374, - numeralsignlowergreek: 0x0375, - numero: 0x2116, - nun: 0x05E0, - nundagesh: 0xFB40, - nundageshhebrew: 0xFB40, - nunhebrew: 0x05E0, - nvsquare: 0x33B5, - nwsquare: 0x33BB, - nyabengali: 0x099E, - nyadeva: 0x091E, - nyagujarati: 0x0A9E, - nyagurmukhi: 0x0A1E, - o: 0x006F, - oacute: 0x00F3, - oangthai: 0x0E2D, - obarred: 0x0275, - obarredcyrillic: 0x04E9, - obarreddieresiscyrillic: 0x04EB, - obengali: 0x0993, - obopomofo: 0x311B, - obreve: 0x014F, - ocandradeva: 0x0911, - ocandragujarati: 0x0A91, - ocandravowelsigndeva: 0x0949, - ocandravowelsigngujarati: 0x0AC9, - ocaron: 0x01D2, - ocircle: 0x24DE, - ocircumflex: 0x00F4, - ocircumflexacute: 0x1ED1, - ocircumflexdotbelow: 0x1ED9, - ocircumflexgrave: 0x1ED3, - ocircumflexhookabove: 0x1ED5, - ocircumflextilde: 0x1ED7, - ocyrillic: 0x043E, - odblacute: 0x0151, - odblgrave: 0x020D, - odeva: 0x0913, - odieresis: 0x00F6, - odieresiscyrillic: 0x04E7, - odotbelow: 0x1ECD, - oe: 0x0153, - oekorean: 0x315A, - ogonek: 0x02DB, - ogonekcmb: 0x0328, - ograve: 0x00F2, - ogujarati: 0x0A93, - oharmenian: 0x0585, - ohiragana: 0x304A, - ohookabove: 0x1ECF, - ohorn: 0x01A1, - ohornacute: 0x1EDB, - ohorndotbelow: 0x1EE3, - ohorngrave: 0x1EDD, - ohornhookabove: 0x1EDF, - ohorntilde: 0x1EE1, - ohungarumlaut: 0x0151, - oi: 0x01A3, - oinvertedbreve: 0x020F, - okatakana: 0x30AA, - okatakanahalfwidth: 0xFF75, - okorean: 0x3157, - olehebrew: 0x05AB, - omacron: 0x014D, - omacronacute: 0x1E53, - omacrongrave: 0x1E51, - omdeva: 0x0950, - omega: 0x03C9, - omega1: 0x03D6, - omegacyrillic: 0x0461, - omegalatinclosed: 0x0277, - omegaroundcyrillic: 0x047B, - omegatitlocyrillic: 0x047D, - omegatonos: 0x03CE, - omgujarati: 0x0AD0, - omicron: 0x03BF, - omicrontonos: 0x03CC, - omonospace: 0xFF4F, - one: 0x0031, - onearabic: 0x0661, - onebengali: 0x09E7, - onecircle: 0x2460, - onecircleinversesansserif: 0x278A, - onedeva: 0x0967, - onedotenleader: 0x2024, - oneeighth: 0x215B, - onefitted: 0xF6DC, - onegujarati: 0x0AE7, - onegurmukhi: 0x0A67, - onehackarabic: 0x0661, - onehalf: 0x00BD, - onehangzhou: 0x3021, - oneideographicparen: 0x3220, - oneinferior: 0x2081, - onemonospace: 0xFF11, - onenumeratorbengali: 0x09F4, - oneoldstyle: 0xF731, - oneparen: 0x2474, - oneperiod: 0x2488, - onepersian: 0x06F1, - onequarter: 0x00BC, - oneroman: 0x2170, - onesuperior: 0x00B9, - onethai: 0x0E51, - onethird: 0x2153, - oogonek: 0x01EB, - oogonekmacron: 0x01ED, - oogurmukhi: 0x0A13, - oomatragurmukhi: 0x0A4B, - oopen: 0x0254, - oparen: 0x24AA, - openbullet: 0x25E6, - option: 0x2325, - ordfeminine: 0x00AA, - ordmasculine: 0x00BA, - orthogonal: 0x221F, - oshortdeva: 0x0912, - oshortvowelsigndeva: 0x094A, - oslash: 0x00F8, - oslashacute: 0x01FF, - osmallhiragana: 0x3049, - osmallkatakana: 0x30A9, - osmallkatakanahalfwidth: 0xFF6B, - ostrokeacute: 0x01FF, - osuperior: 0xF6F0, - otcyrillic: 0x047F, - otilde: 0x00F5, - otildeacute: 0x1E4D, - otildedieresis: 0x1E4F, - oubopomofo: 0x3121, - overline: 0x203E, - overlinecenterline: 0xFE4A, - overlinecmb: 0x0305, - overlinedashed: 0xFE49, - overlinedblwavy: 0xFE4C, - overlinewavy: 0xFE4B, - overscore: 0x00AF, - ovowelsignbengali: 0x09CB, - ovowelsigndeva: 0x094B, - ovowelsigngujarati: 0x0ACB, - p: 0x0070, - paampssquare: 0x3380, - paasentosquare: 0x332B, - pabengali: 0x09AA, - pacute: 0x1E55, - padeva: 0x092A, - pagedown: 0x21DF, - pageup: 0x21DE, - pagujarati: 0x0AAA, - pagurmukhi: 0x0A2A, - pahiragana: 0x3071, - paiyannoithai: 0x0E2F, - pakatakana: 0x30D1, - palatalizationcyrilliccmb: 0x0484, - palochkacyrillic: 0x04C0, - pansioskorean: 0x317F, - paragraph: 0x00B6, - parallel: 0x2225, - parenleft: 0x0028, - parenleftaltonearabic: 0xFD3E, - parenleftbt: 0xF8ED, - parenleftex: 0xF8EC, - parenleftinferior: 0x208D, - parenleftmonospace: 0xFF08, - parenleftsmall: 0xFE59, - parenleftsuperior: 0x207D, - parenlefttp: 0xF8EB, - parenleftvertical: 0xFE35, - parenright: 0x0029, - parenrightaltonearabic: 0xFD3F, - parenrightbt: 0xF8F8, - parenrightex: 0xF8F7, - parenrightinferior: 0x208E, - parenrightmonospace: 0xFF09, - parenrightsmall: 0xFE5A, - parenrightsuperior: 0x207E, - parenrighttp: 0xF8F6, - parenrightvertical: 0xFE36, - partialdiff: 0x2202, - paseqhebrew: 0x05C0, - pashtahebrew: 0x0599, - pasquare: 0x33A9, - patah: 0x05B7, - patah11: 0x05B7, - patah1d: 0x05B7, - patah2a: 0x05B7, - patahhebrew: 0x05B7, - patahnarrowhebrew: 0x05B7, - patahquarterhebrew: 0x05B7, - patahwidehebrew: 0x05B7, - pazerhebrew: 0x05A1, - pbopomofo: 0x3106, - pcircle: 0x24DF, - pdotaccent: 0x1E57, - pe: 0x05E4, - pecyrillic: 0x043F, - pedagesh: 0xFB44, - pedageshhebrew: 0xFB44, - peezisquare: 0x333B, - pefinaldageshhebrew: 0xFB43, - peharabic: 0x067E, - peharmenian: 0x057A, - pehebrew: 0x05E4, - pehfinalarabic: 0xFB57, - pehinitialarabic: 0xFB58, - pehiragana: 0x307A, - pehmedialarabic: 0xFB59, - pekatakana: 0x30DA, - pemiddlehookcyrillic: 0x04A7, - perafehebrew: 0xFB4E, - percent: 0x0025, - percentarabic: 0x066A, - percentmonospace: 0xFF05, - percentsmall: 0xFE6A, - period: 0x002E, - periodarmenian: 0x0589, - periodcentered: 0x00B7, - periodhalfwidth: 0xFF61, - periodinferior: 0xF6E7, - periodmonospace: 0xFF0E, - periodsmall: 0xFE52, - periodsuperior: 0xF6E8, - perispomenigreekcmb: 0x0342, - perpendicular: 0x22A5, - perthousand: 0x2030, - peseta: 0x20A7, - pfsquare: 0x338A, - phabengali: 0x09AB, - phadeva: 0x092B, - phagujarati: 0x0AAB, - phagurmukhi: 0x0A2B, - phi: 0x03C6, - phi1: 0x03D5, - phieuphacirclekorean: 0x327A, - phieuphaparenkorean: 0x321A, - phieuphcirclekorean: 0x326C, - phieuphkorean: 0x314D, - phieuphparenkorean: 0x320C, - philatin: 0x0278, - phinthuthai: 0x0E3A, - phisymbolgreek: 0x03D5, - phook: 0x01A5, - phophanthai: 0x0E1E, - phophungthai: 0x0E1C, - phosamphaothai: 0x0E20, - pi: 0x03C0, - pieupacirclekorean: 0x3273, - pieupaparenkorean: 0x3213, - pieupcieuckorean: 0x3176, - pieupcirclekorean: 0x3265, - pieupkiyeokkorean: 0x3172, - pieupkorean: 0x3142, - pieupparenkorean: 0x3205, - pieupsioskiyeokkorean: 0x3174, - pieupsioskorean: 0x3144, - pieupsiostikeutkorean: 0x3175, - pieupthieuthkorean: 0x3177, - pieuptikeutkorean: 0x3173, - pihiragana: 0x3074, - pikatakana: 0x30D4, - pisymbolgreek: 0x03D6, - piwrarmenian: 0x0583, - plus: 0x002B, - plusbelowcmb: 0x031F, - pluscircle: 0x2295, - plusminus: 0x00B1, - plusmod: 0x02D6, - plusmonospace: 0xFF0B, - plussmall: 0xFE62, - plussuperior: 0x207A, - pmonospace: 0xFF50, - pmsquare: 0x33D8, - pohiragana: 0x307D, - pointingindexdownwhite: 0x261F, - pointingindexleftwhite: 0x261C, - pointingindexrightwhite: 0x261E, - pointingindexupwhite: 0x261D, - pokatakana: 0x30DD, - poplathai: 0x0E1B, - postalmark: 0x3012, - postalmarkface: 0x3020, - pparen: 0x24AB, - precedes: 0x227A, - prescription: 0x211E, - primemod: 0x02B9, - primereversed: 0x2035, - product: 0x220F, - projective: 0x2305, - prolongedkana: 0x30FC, - propellor: 0x2318, - propersubset: 0x2282, - propersuperset: 0x2283, - proportion: 0x2237, - proportional: 0x221D, - psi: 0x03C8, - psicyrillic: 0x0471, - psilipneumatacyrilliccmb: 0x0486, - pssquare: 0x33B0, - puhiragana: 0x3077, - pukatakana: 0x30D7, - pvsquare: 0x33B4, - pwsquare: 0x33BA, - q: 0x0071, - qadeva: 0x0958, - qadmahebrew: 0x05A8, - qafarabic: 0x0642, - qaffinalarabic: 0xFED6, - qafinitialarabic: 0xFED7, - qafmedialarabic: 0xFED8, - qamats: 0x05B8, - qamats10: 0x05B8, - qamats1a: 0x05B8, - qamats1c: 0x05B8, - qamats27: 0x05B8, - qamats29: 0x05B8, - qamats33: 0x05B8, - qamatsde: 0x05B8, - qamatshebrew: 0x05B8, - qamatsnarrowhebrew: 0x05B8, - qamatsqatanhebrew: 0x05B8, - qamatsqatannarrowhebrew: 0x05B8, - qamatsqatanquarterhebrew: 0x05B8, - qamatsqatanwidehebrew: 0x05B8, - qamatsquarterhebrew: 0x05B8, - qamatswidehebrew: 0x05B8, - qarneyparahebrew: 0x059F, - qbopomofo: 0x3111, - qcircle: 0x24E0, - qhook: 0x02A0, - qmonospace: 0xFF51, - qof: 0x05E7, - qofdagesh: 0xFB47, - qofdageshhebrew: 0xFB47, - qofhebrew: 0x05E7, - qparen: 0x24AC, - quarternote: 0x2669, - qubuts: 0x05BB, - qubuts18: 0x05BB, - qubuts25: 0x05BB, - qubuts31: 0x05BB, - qubutshebrew: 0x05BB, - qubutsnarrowhebrew: 0x05BB, - qubutsquarterhebrew: 0x05BB, - qubutswidehebrew: 0x05BB, - question: 0x003F, - questionarabic: 0x061F, - questionarmenian: 0x055E, - questiondown: 0x00BF, - questiondownsmall: 0xF7BF, - questiongreek: 0x037E, - questionmonospace: 0xFF1F, - questionsmall: 0xF73F, - quotedbl: 0x0022, - quotedblbase: 0x201E, - quotedblleft: 0x201C, - quotedblmonospace: 0xFF02, - quotedblprime: 0x301E, - quotedblprimereversed: 0x301D, - quotedblright: 0x201D, - quoteleft: 0x2018, - quoteleftreversed: 0x201B, - quotereversed: 0x201B, - quoteright: 0x2019, - quoterightn: 0x0149, - quotesinglbase: 0x201A, - quotesingle: 0x0027, - quotesinglemonospace: 0xFF07, - r: 0x0072, - raarmenian: 0x057C, - rabengali: 0x09B0, - racute: 0x0155, - radeva: 0x0930, - radical: 0x221A, - radicalex: 0xF8E5, - radoverssquare: 0x33AE, - radoverssquaredsquare: 0x33AF, - radsquare: 0x33AD, - rafe: 0x05BF, - rafehebrew: 0x05BF, - ragujarati: 0x0AB0, - ragurmukhi: 0x0A30, - rahiragana: 0x3089, - rakatakana: 0x30E9, - rakatakanahalfwidth: 0xFF97, - ralowerdiagonalbengali: 0x09F1, - ramiddlediagonalbengali: 0x09F0, - ramshorn: 0x0264, - ratio: 0x2236, - rbopomofo: 0x3116, - rcaron: 0x0159, - rcedilla: 0x0157, - rcircle: 0x24E1, - rcommaaccent: 0x0157, - rdblgrave: 0x0211, - rdotaccent: 0x1E59, - rdotbelow: 0x1E5B, - rdotbelowmacron: 0x1E5D, - referencemark: 0x203B, - reflexsubset: 0x2286, - reflexsuperset: 0x2287, - registered: 0x00AE, - registersans: 0xF8E8, - registerserif: 0xF6DA, - reharabic: 0x0631, - reharmenian: 0x0580, - rehfinalarabic: 0xFEAE, - rehiragana: 0x308C, - rekatakana: 0x30EC, - rekatakanahalfwidth: 0xFF9A, - resh: 0x05E8, - reshdageshhebrew: 0xFB48, - reshhebrew: 0x05E8, - reversedtilde: 0x223D, - reviahebrew: 0x0597, - reviamugrashhebrew: 0x0597, - revlogicalnot: 0x2310, - rfishhook: 0x027E, - rfishhookreversed: 0x027F, - rhabengali: 0x09DD, - rhadeva: 0x095D, - rho: 0x03C1, - rhook: 0x027D, - rhookturned: 0x027B, - rhookturnedsuperior: 0x02B5, - rhosymbolgreek: 0x03F1, - rhotichookmod: 0x02DE, - rieulacirclekorean: 0x3271, - rieulaparenkorean: 0x3211, - rieulcirclekorean: 0x3263, - rieulhieuhkorean: 0x3140, - rieulkiyeokkorean: 0x313A, - rieulkiyeoksioskorean: 0x3169, - rieulkorean: 0x3139, - rieulmieumkorean: 0x313B, - rieulpansioskorean: 0x316C, - rieulparenkorean: 0x3203, - rieulphieuphkorean: 0x313F, - rieulpieupkorean: 0x313C, - rieulpieupsioskorean: 0x316B, - rieulsioskorean: 0x313D, - rieulthieuthkorean: 0x313E, - rieultikeutkorean: 0x316A, - rieulyeorinhieuhkorean: 0x316D, - rightangle: 0x221F, - righttackbelowcmb: 0x0319, - righttriangle: 0x22BF, - rihiragana: 0x308A, - rikatakana: 0x30EA, - rikatakanahalfwidth: 0xFF98, - ring: 0x02DA, - ringbelowcmb: 0x0325, - ringcmb: 0x030A, - ringhalfleft: 0x02BF, - ringhalfleftarmenian: 0x0559, - ringhalfleftbelowcmb: 0x031C, - ringhalfleftcentered: 0x02D3, - ringhalfright: 0x02BE, - ringhalfrightbelowcmb: 0x0339, - ringhalfrightcentered: 0x02D2, - rinvertedbreve: 0x0213, - rittorusquare: 0x3351, - rlinebelow: 0x1E5F, - rlongleg: 0x027C, - rlonglegturned: 0x027A, - rmonospace: 0xFF52, - rohiragana: 0x308D, - rokatakana: 0x30ED, - rokatakanahalfwidth: 0xFF9B, - roruathai: 0x0E23, - rparen: 0x24AD, - rrabengali: 0x09DC, - rradeva: 0x0931, - rragurmukhi: 0x0A5C, - rreharabic: 0x0691, - rrehfinalarabic: 0xFB8D, - rrvocalicbengali: 0x09E0, - rrvocalicdeva: 0x0960, - rrvocalicgujarati: 0x0AE0, - rrvocalicvowelsignbengali: 0x09C4, - rrvocalicvowelsigndeva: 0x0944, - rrvocalicvowelsigngujarati: 0x0AC4, - rsuperior: 0xF6F1, - rtblock: 0x2590, - rturned: 0x0279, - rturnedsuperior: 0x02B4, - ruhiragana: 0x308B, - rukatakana: 0x30EB, - rukatakanahalfwidth: 0xFF99, - rupeemarkbengali: 0x09F2, - rupeesignbengali: 0x09F3, - rupiah: 0xF6DD, - ruthai: 0x0E24, - rvocalicbengali: 0x098B, - rvocalicdeva: 0x090B, - rvocalicgujarati: 0x0A8B, - rvocalicvowelsignbengali: 0x09C3, - rvocalicvowelsigndeva: 0x0943, - rvocalicvowelsigngujarati: 0x0AC3, - s: 0x0073, - sabengali: 0x09B8, - sacute: 0x015B, - sacutedotaccent: 0x1E65, - sadarabic: 0x0635, - sadeva: 0x0938, - sadfinalarabic: 0xFEBA, - sadinitialarabic: 0xFEBB, - sadmedialarabic: 0xFEBC, - sagujarati: 0x0AB8, - sagurmukhi: 0x0A38, - sahiragana: 0x3055, - sakatakana: 0x30B5, - sakatakanahalfwidth: 0xFF7B, - sallallahoualayhewasallamarabic: 0xFDFA, - samekh: 0x05E1, - samekhdagesh: 0xFB41, - samekhdageshhebrew: 0xFB41, - samekhhebrew: 0x05E1, - saraaathai: 0x0E32, - saraaethai: 0x0E41, - saraaimaimalaithai: 0x0E44, - saraaimaimuanthai: 0x0E43, - saraamthai: 0x0E33, - saraathai: 0x0E30, - saraethai: 0x0E40, - saraiileftthai: 0xF886, - saraiithai: 0x0E35, - saraileftthai: 0xF885, - saraithai: 0x0E34, - saraothai: 0x0E42, - saraueeleftthai: 0xF888, - saraueethai: 0x0E37, - saraueleftthai: 0xF887, - sarauethai: 0x0E36, - sarauthai: 0x0E38, - sarauuthai: 0x0E39, - sbopomofo: 0x3119, - scaron: 0x0161, - scarondotaccent: 0x1E67, - scedilla: 0x015F, - schwa: 0x0259, - schwacyrillic: 0x04D9, - schwadieresiscyrillic: 0x04DB, - schwahook: 0x025A, - scircle: 0x24E2, - scircumflex: 0x015D, - scommaaccent: 0x0219, - sdotaccent: 0x1E61, - sdotbelow: 0x1E63, - sdotbelowdotaccent: 0x1E69, - seagullbelowcmb: 0x033C, - second: 0x2033, - secondtonechinese: 0x02CA, - section: 0x00A7, - seenarabic: 0x0633, - seenfinalarabic: 0xFEB2, - seeninitialarabic: 0xFEB3, - seenmedialarabic: 0xFEB4, - segol: 0x05B6, - segol13: 0x05B6, - segol1f: 0x05B6, - segol2c: 0x05B6, - segolhebrew: 0x05B6, - segolnarrowhebrew: 0x05B6, - segolquarterhebrew: 0x05B6, - segoltahebrew: 0x0592, - segolwidehebrew: 0x05B6, - seharmenian: 0x057D, - sehiragana: 0x305B, - sekatakana: 0x30BB, - sekatakanahalfwidth: 0xFF7E, - semicolon: 0x003B, - semicolonarabic: 0x061B, - semicolonmonospace: 0xFF1B, - semicolonsmall: 0xFE54, - semivoicedmarkkana: 0x309C, - semivoicedmarkkanahalfwidth: 0xFF9F, - sentisquare: 0x3322, - sentosquare: 0x3323, - seven: 0x0037, - sevenarabic: 0x0667, - sevenbengali: 0x09ED, - sevencircle: 0x2466, - sevencircleinversesansserif: 0x2790, - sevendeva: 0x096D, - seveneighths: 0x215E, - sevengujarati: 0x0AED, - sevengurmukhi: 0x0A6D, - sevenhackarabic: 0x0667, - sevenhangzhou: 0x3027, - sevenideographicparen: 0x3226, - seveninferior: 0x2087, - sevenmonospace: 0xFF17, - sevenoldstyle: 0xF737, - sevenparen: 0x247A, - sevenperiod: 0x248E, - sevenpersian: 0x06F7, - sevenroman: 0x2176, - sevensuperior: 0x2077, - seventeencircle: 0x2470, - seventeenparen: 0x2484, - seventeenperiod: 0x2498, - seventhai: 0x0E57, - sfthyphen: 0x00AD, - shaarmenian: 0x0577, - shabengali: 0x09B6, - shacyrillic: 0x0448, - shaddaarabic: 0x0651, - shaddadammaarabic: 0xFC61, - shaddadammatanarabic: 0xFC5E, - shaddafathaarabic: 0xFC60, - shaddakasraarabic: 0xFC62, - shaddakasratanarabic: 0xFC5F, - shade: 0x2592, - shadedark: 0x2593, - shadelight: 0x2591, - shademedium: 0x2592, - shadeva: 0x0936, - shagujarati: 0x0AB6, - shagurmukhi: 0x0A36, - shalshelethebrew: 0x0593, - shbopomofo: 0x3115, - shchacyrillic: 0x0449, - sheenarabic: 0x0634, - sheenfinalarabic: 0xFEB6, - sheeninitialarabic: 0xFEB7, - sheenmedialarabic: 0xFEB8, - sheicoptic: 0x03E3, - sheqel: 0x20AA, - sheqelhebrew: 0x20AA, - sheva: 0x05B0, - sheva115: 0x05B0, - sheva15: 0x05B0, - sheva22: 0x05B0, - sheva2e: 0x05B0, - shevahebrew: 0x05B0, - shevanarrowhebrew: 0x05B0, - shevaquarterhebrew: 0x05B0, - shevawidehebrew: 0x05B0, - shhacyrillic: 0x04BB, - shimacoptic: 0x03ED, - shin: 0x05E9, - shindagesh: 0xFB49, - shindageshhebrew: 0xFB49, - shindageshshindot: 0xFB2C, - shindageshshindothebrew: 0xFB2C, - shindageshsindot: 0xFB2D, - shindageshsindothebrew: 0xFB2D, - shindothebrew: 0x05C1, - shinhebrew: 0x05E9, - shinshindot: 0xFB2A, - shinshindothebrew: 0xFB2A, - shinsindot: 0xFB2B, - shinsindothebrew: 0xFB2B, - shook: 0x0282, - sigma: 0x03C3, - sigma1: 0x03C2, - sigmafinal: 0x03C2, - sigmalunatesymbolgreek: 0x03F2, - sihiragana: 0x3057, - sikatakana: 0x30B7, - sikatakanahalfwidth: 0xFF7C, - siluqhebrew: 0x05BD, - siluqlefthebrew: 0x05BD, - similar: 0x223C, - sindothebrew: 0x05C2, - siosacirclekorean: 0x3274, - siosaparenkorean: 0x3214, - sioscieuckorean: 0x317E, - sioscirclekorean: 0x3266, - sioskiyeokkorean: 0x317A, - sioskorean: 0x3145, - siosnieunkorean: 0x317B, - siosparenkorean: 0x3206, - siospieupkorean: 0x317D, - siostikeutkorean: 0x317C, - six: 0x0036, - sixarabic: 0x0666, - sixbengali: 0x09EC, - sixcircle: 0x2465, - sixcircleinversesansserif: 0x278F, - sixdeva: 0x096C, - sixgujarati: 0x0AEC, - sixgurmukhi: 0x0A6C, - sixhackarabic: 0x0666, - sixhangzhou: 0x3026, - sixideographicparen: 0x3225, - sixinferior: 0x2086, - sixmonospace: 0xFF16, - sixoldstyle: 0xF736, - sixparen: 0x2479, - sixperiod: 0x248D, - sixpersian: 0x06F6, - sixroman: 0x2175, - sixsuperior: 0x2076, - sixteencircle: 0x246F, - sixteencurrencydenominatorbengali: 0x09F9, - sixteenparen: 0x2483, - sixteenperiod: 0x2497, - sixthai: 0x0E56, - slash: 0x002F, - slashmonospace: 0xFF0F, - slong: 0x017F, - slongdotaccent: 0x1E9B, - smileface: 0x263A, - smonospace: 0xFF53, - sofpasuqhebrew: 0x05C3, - softhyphen: 0x00AD, - softsigncyrillic: 0x044C, - sohiragana: 0x305D, - sokatakana: 0x30BD, - sokatakanahalfwidth: 0xFF7F, - soliduslongoverlaycmb: 0x0338, - solidusshortoverlaycmb: 0x0337, - sorusithai: 0x0E29, - sosalathai: 0x0E28, - sosothai: 0x0E0B, - sosuathai: 0x0E2A, - space: 0x0020, - spacehackarabic: 0x0020, - spade: 0x2660, - spadesuitblack: 0x2660, - spadesuitwhite: 0x2664, - sparen: 0x24AE, - squarebelowcmb: 0x033B, - squarecc: 0x33C4, - squarecm: 0x339D, - squarediagonalcrosshatchfill: 0x25A9, - squarehorizontalfill: 0x25A4, - squarekg: 0x338F, - squarekm: 0x339E, - squarekmcapital: 0x33CE, - squareln: 0x33D1, - squarelog: 0x33D2, - squaremg: 0x338E, - squaremil: 0x33D5, - squaremm: 0x339C, - squaremsquared: 0x33A1, - squareorthogonalcrosshatchfill: 0x25A6, - squareupperlefttolowerrightfill: 0x25A7, - squareupperrighttolowerleftfill: 0x25A8, - squareverticalfill: 0x25A5, - squarewhitewithsmallblack: 0x25A3, - srsquare: 0x33DB, - ssabengali: 0x09B7, - ssadeva: 0x0937, - ssagujarati: 0x0AB7, - ssangcieuckorean: 0x3149, - ssanghieuhkorean: 0x3185, - ssangieungkorean: 0x3180, - ssangkiyeokkorean: 0x3132, - ssangnieunkorean: 0x3165, - ssangpieupkorean: 0x3143, - ssangsioskorean: 0x3146, - ssangtikeutkorean: 0x3138, - ssuperior: 0xF6F2, - sterling: 0x00A3, - sterlingmonospace: 0xFFE1, - strokelongoverlaycmb: 0x0336, - strokeshortoverlaycmb: 0x0335, - subset: 0x2282, - subsetnotequal: 0x228A, - subsetorequal: 0x2286, - succeeds: 0x227B, - suchthat: 0x220B, - suhiragana: 0x3059, - sukatakana: 0x30B9, - sukatakanahalfwidth: 0xFF7D, - sukunarabic: 0x0652, - summation: 0x2211, - sun: 0x263C, - superset: 0x2283, - supersetnotequal: 0x228B, - supersetorequal: 0x2287, - svsquare: 0x33DC, - syouwaerasquare: 0x337C, - t: 0x0074, - tabengali: 0x09A4, - tackdown: 0x22A4, - tackleft: 0x22A3, - tadeva: 0x0924, - tagujarati: 0x0AA4, - tagurmukhi: 0x0A24, - taharabic: 0x0637, - tahfinalarabic: 0xFEC2, - tahinitialarabic: 0xFEC3, - tahiragana: 0x305F, - tahmedialarabic: 0xFEC4, - taisyouerasquare: 0x337D, - takatakana: 0x30BF, - takatakanahalfwidth: 0xFF80, - tatweelarabic: 0x0640, - tau: 0x03C4, - tav: 0x05EA, - tavdages: 0xFB4A, - tavdagesh: 0xFB4A, - tavdageshhebrew: 0xFB4A, - tavhebrew: 0x05EA, - tbar: 0x0167, - tbopomofo: 0x310A, - tcaron: 0x0165, - tccurl: 0x02A8, - tcedilla: 0x0163, - tcheharabic: 0x0686, - tchehfinalarabic: 0xFB7B, - tchehinitialarabic: 0xFB7C, - tchehmedialarabic: 0xFB7D, - tcircle: 0x24E3, - tcircumflexbelow: 0x1E71, - tcommaaccent: 0x0163, - tdieresis: 0x1E97, - tdotaccent: 0x1E6B, - tdotbelow: 0x1E6D, - tecyrillic: 0x0442, - tedescendercyrillic: 0x04AD, - teharabic: 0x062A, - tehfinalarabic: 0xFE96, - tehhahinitialarabic: 0xFCA2, - tehhahisolatedarabic: 0xFC0C, - tehinitialarabic: 0xFE97, - tehiragana: 0x3066, - tehjeeminitialarabic: 0xFCA1, - tehjeemisolatedarabic: 0xFC0B, - tehmarbutaarabic: 0x0629, - tehmarbutafinalarabic: 0xFE94, - tehmedialarabic: 0xFE98, - tehmeeminitialarabic: 0xFCA4, - tehmeemisolatedarabic: 0xFC0E, - tehnoonfinalarabic: 0xFC73, - tekatakana: 0x30C6, - tekatakanahalfwidth: 0xFF83, - telephone: 0x2121, - telephoneblack: 0x260E, - telishagedolahebrew: 0x05A0, - telishaqetanahebrew: 0x05A9, - tencircle: 0x2469, - tenideographicparen: 0x3229, - tenparen: 0x247D, - tenperiod: 0x2491, - tenroman: 0x2179, - tesh: 0x02A7, - tet: 0x05D8, - tetdagesh: 0xFB38, - tetdageshhebrew: 0xFB38, - tethebrew: 0x05D8, - tetsecyrillic: 0x04B5, - tevirhebrew: 0x059B, - tevirlefthebrew: 0x059B, - thabengali: 0x09A5, - thadeva: 0x0925, - thagujarati: 0x0AA5, - thagurmukhi: 0x0A25, - thalarabic: 0x0630, - thalfinalarabic: 0xFEAC, - thanthakhatlowleftthai: 0xF898, - thanthakhatlowrightthai: 0xF897, - thanthakhatthai: 0x0E4C, - thanthakhatupperleftthai: 0xF896, - theharabic: 0x062B, - thehfinalarabic: 0xFE9A, - thehinitialarabic: 0xFE9B, - thehmedialarabic: 0xFE9C, - thereexists: 0x2203, - therefore: 0x2234, - theta: 0x03B8, - theta1: 0x03D1, - thetasymbolgreek: 0x03D1, - thieuthacirclekorean: 0x3279, - thieuthaparenkorean: 0x3219, - thieuthcirclekorean: 0x326B, - thieuthkorean: 0x314C, - thieuthparenkorean: 0x320B, - thirteencircle: 0x246C, - thirteenparen: 0x2480, - thirteenperiod: 0x2494, - thonangmonthothai: 0x0E11, - thook: 0x01AD, - thophuthaothai: 0x0E12, - thorn: 0x00FE, - thothahanthai: 0x0E17, - thothanthai: 0x0E10, - thothongthai: 0x0E18, - thothungthai: 0x0E16, - thousandcyrillic: 0x0482, - thousandsseparatorarabic: 0x066C, - thousandsseparatorpersian: 0x066C, - three: 0x0033, - threearabic: 0x0663, - threebengali: 0x09E9, - threecircle: 0x2462, - threecircleinversesansserif: 0x278C, - threedeva: 0x0969, - threeeighths: 0x215C, - threegujarati: 0x0AE9, - threegurmukhi: 0x0A69, - threehackarabic: 0x0663, - threehangzhou: 0x3023, - threeideographicparen: 0x3222, - threeinferior: 0x2083, - threemonospace: 0xFF13, - threenumeratorbengali: 0x09F6, - threeoldstyle: 0xF733, - threeparen: 0x2476, - threeperiod: 0x248A, - threepersian: 0x06F3, - threequarters: 0x00BE, - threequartersemdash: 0xF6DE, - threeroman: 0x2172, - threesuperior: 0x00B3, - threethai: 0x0E53, - thzsquare: 0x3394, - tihiragana: 0x3061, - tikatakana: 0x30C1, - tikatakanahalfwidth: 0xFF81, - tikeutacirclekorean: 0x3270, - tikeutaparenkorean: 0x3210, - tikeutcirclekorean: 0x3262, - tikeutkorean: 0x3137, - tikeutparenkorean: 0x3202, - tilde: 0x02DC, - tildebelowcmb: 0x0330, - tildecmb: 0x0303, - tildecomb: 0x0303, - tildedoublecmb: 0x0360, - tildeoperator: 0x223C, - tildeoverlaycmb: 0x0334, - tildeverticalcmb: 0x033E, - timescircle: 0x2297, - tipehahebrew: 0x0596, - tipehalefthebrew: 0x0596, - tippigurmukhi: 0x0A70, - titlocyrilliccmb: 0x0483, - tiwnarmenian: 0x057F, - tlinebelow: 0x1E6F, - tmonospace: 0xFF54, - toarmenian: 0x0569, - tohiragana: 0x3068, - tokatakana: 0x30C8, - tokatakanahalfwidth: 0xFF84, - tonebarextrahighmod: 0x02E5, - tonebarextralowmod: 0x02E9, - tonebarhighmod: 0x02E6, - tonebarlowmod: 0x02E8, - tonebarmidmod: 0x02E7, - tonefive: 0x01BD, - tonesix: 0x0185, - tonetwo: 0x01A8, - tonos: 0x0384, - tonsquare: 0x3327, - topatakthai: 0x0E0F, - tortoiseshellbracketleft: 0x3014, - tortoiseshellbracketleftsmall: 0xFE5D, - tortoiseshellbracketleftvertical: 0xFE39, - tortoiseshellbracketright: 0x3015, - tortoiseshellbracketrightsmall: 0xFE5E, - tortoiseshellbracketrightvertical: 0xFE3A, - totaothai: 0x0E15, - tpalatalhook: 0x01AB, - tparen: 0x24AF, - trademark: 0x2122, - trademarksans: 0xF8EA, - trademarkserif: 0xF6DB, - tretroflexhook: 0x0288, - triagdn: 0x25BC, - triaglf: 0x25C4, - triagrt: 0x25BA, - triagup: 0x25B2, - ts: 0x02A6, - tsadi: 0x05E6, - tsadidagesh: 0xFB46, - tsadidageshhebrew: 0xFB46, - tsadihebrew: 0x05E6, - tsecyrillic: 0x0446, - tsere: 0x05B5, - tsere12: 0x05B5, - tsere1e: 0x05B5, - tsere2b: 0x05B5, - tserehebrew: 0x05B5, - tserenarrowhebrew: 0x05B5, - tserequarterhebrew: 0x05B5, - tserewidehebrew: 0x05B5, - tshecyrillic: 0x045B, - tsuperior: 0xF6F3, - ttabengali: 0x099F, - ttadeva: 0x091F, - ttagujarati: 0x0A9F, - ttagurmukhi: 0x0A1F, - tteharabic: 0x0679, - ttehfinalarabic: 0xFB67, - ttehinitialarabic: 0xFB68, - ttehmedialarabic: 0xFB69, - tthabengali: 0x09A0, - tthadeva: 0x0920, - tthagujarati: 0x0AA0, - tthagurmukhi: 0x0A20, - tturned: 0x0287, - tuhiragana: 0x3064, - tukatakana: 0x30C4, - tukatakanahalfwidth: 0xFF82, - tusmallhiragana: 0x3063, - tusmallkatakana: 0x30C3, - tusmallkatakanahalfwidth: 0xFF6F, - twelvecircle: 0x246B, - twelveparen: 0x247F, - twelveperiod: 0x2493, - twelveroman: 0x217B, - twentycircle: 0x2473, - twentyhangzhou: 0x5344, - twentyparen: 0x2487, - twentyperiod: 0x249B, - two: 0x0032, - twoarabic: 0x0662, - twobengali: 0x09E8, - twocircle: 0x2461, - twocircleinversesansserif: 0x278B, - twodeva: 0x0968, - twodotenleader: 0x2025, - twodotleader: 0x2025, - twodotleadervertical: 0xFE30, - twogujarati: 0x0AE8, - twogurmukhi: 0x0A68, - twohackarabic: 0x0662, - twohangzhou: 0x3022, - twoideographicparen: 0x3221, - twoinferior: 0x2082, - twomonospace: 0xFF12, - twonumeratorbengali: 0x09F5, - twooldstyle: 0xF732, - twoparen: 0x2475, - twoperiod: 0x2489, - twopersian: 0x06F2, - tworoman: 0x2171, - twostroke: 0x01BB, - twosuperior: 0x00B2, - twothai: 0x0E52, - twothirds: 0x2154, - u: 0x0075, - uacute: 0x00FA, - ubar: 0x0289, - ubengali: 0x0989, - ubopomofo: 0x3128, - ubreve: 0x016D, - ucaron: 0x01D4, - ucircle: 0x24E4, - ucircumflex: 0x00FB, - ucircumflexbelow: 0x1E77, - ucyrillic: 0x0443, - udattadeva: 0x0951, - udblacute: 0x0171, - udblgrave: 0x0215, - udeva: 0x0909, - udieresis: 0x00FC, - udieresisacute: 0x01D8, - udieresisbelow: 0x1E73, - udieresiscaron: 0x01DA, - udieresiscyrillic: 0x04F1, - udieresisgrave: 0x01DC, - udieresismacron: 0x01D6, - udotbelow: 0x1EE5, - ugrave: 0x00F9, - ugujarati: 0x0A89, - ugurmukhi: 0x0A09, - uhiragana: 0x3046, - uhookabove: 0x1EE7, - uhorn: 0x01B0, - uhornacute: 0x1EE9, - uhorndotbelow: 0x1EF1, - uhorngrave: 0x1EEB, - uhornhookabove: 0x1EED, - uhorntilde: 0x1EEF, - uhungarumlaut: 0x0171, - uhungarumlautcyrillic: 0x04F3, - uinvertedbreve: 0x0217, - ukatakana: 0x30A6, - ukatakanahalfwidth: 0xFF73, - ukcyrillic: 0x0479, - ukorean: 0x315C, - umacron: 0x016B, - umacroncyrillic: 0x04EF, - umacrondieresis: 0x1E7B, - umatragurmukhi: 0x0A41, - umonospace: 0xFF55, - underscore: 0x005F, - underscoredbl: 0x2017, - underscoremonospace: 0xFF3F, - underscorevertical: 0xFE33, - underscorewavy: 0xFE4F, - union: 0x222A, - universal: 0x2200, - uogonek: 0x0173, - uparen: 0x24B0, - upblock: 0x2580, - upperdothebrew: 0x05C4, - upsilon: 0x03C5, - upsilondieresis: 0x03CB, - upsilondieresistonos: 0x03B0, - upsilonlatin: 0x028A, - upsilontonos: 0x03CD, - uptackbelowcmb: 0x031D, - uptackmod: 0x02D4, - uragurmukhi: 0x0A73, - uring: 0x016F, - ushortcyrillic: 0x045E, - usmallhiragana: 0x3045, - usmallkatakana: 0x30A5, - usmallkatakanahalfwidth: 0xFF69, - ustraightcyrillic: 0x04AF, - ustraightstrokecyrillic: 0x04B1, - utilde: 0x0169, - utildeacute: 0x1E79, - utildebelow: 0x1E75, - uubengali: 0x098A, - uudeva: 0x090A, - uugujarati: 0x0A8A, - uugurmukhi: 0x0A0A, - uumatragurmukhi: 0x0A42, - uuvowelsignbengali: 0x09C2, - uuvowelsigndeva: 0x0942, - uuvowelsigngujarati: 0x0AC2, - uvowelsignbengali: 0x09C1, - uvowelsigndeva: 0x0941, - uvowelsigngujarati: 0x0AC1, - v: 0x0076, - vadeva: 0x0935, - vagujarati: 0x0AB5, - vagurmukhi: 0x0A35, - vakatakana: 0x30F7, - vav: 0x05D5, - vavdagesh: 0xFB35, - vavdagesh65: 0xFB35, - vavdageshhebrew: 0xFB35, - vavhebrew: 0x05D5, - vavholam: 0xFB4B, - vavholamhebrew: 0xFB4B, - vavvavhebrew: 0x05F0, - vavyodhebrew: 0x05F1, - vcircle: 0x24E5, - vdotbelow: 0x1E7F, - vecyrillic: 0x0432, - veharabic: 0x06A4, - vehfinalarabic: 0xFB6B, - vehinitialarabic: 0xFB6C, - vehmedialarabic: 0xFB6D, - vekatakana: 0x30F9, - venus: 0x2640, - verticalbar: 0x007C, - verticallineabovecmb: 0x030D, - verticallinebelowcmb: 0x0329, - verticallinelowmod: 0x02CC, - verticallinemod: 0x02C8, - vewarmenian: 0x057E, - vhook: 0x028B, - vikatakana: 0x30F8, - viramabengali: 0x09CD, - viramadeva: 0x094D, - viramagujarati: 0x0ACD, - visargabengali: 0x0983, - visargadeva: 0x0903, - visargagujarati: 0x0A83, - vmonospace: 0xFF56, - voarmenian: 0x0578, - voicediterationhiragana: 0x309E, - voicediterationkatakana: 0x30FE, - voicedmarkkana: 0x309B, - voicedmarkkanahalfwidth: 0xFF9E, - vokatakana: 0x30FA, - vparen: 0x24B1, - vtilde: 0x1E7D, - vturned: 0x028C, - vuhiragana: 0x3094, - vukatakana: 0x30F4, - w: 0x0077, - wacute: 0x1E83, - waekorean: 0x3159, - wahiragana: 0x308F, - wakatakana: 0x30EF, - wakatakanahalfwidth: 0xFF9C, - wakorean: 0x3158, - wasmallhiragana: 0x308E, - wasmallkatakana: 0x30EE, - wattosquare: 0x3357, - wavedash: 0x301C, - wavyunderscorevertical: 0xFE34, - wawarabic: 0x0648, - wawfinalarabic: 0xFEEE, - wawhamzaabovearabic: 0x0624, - wawhamzaabovefinalarabic: 0xFE86, - wbsquare: 0x33DD, - wcircle: 0x24E6, - wcircumflex: 0x0175, - wdieresis: 0x1E85, - wdotaccent: 0x1E87, - wdotbelow: 0x1E89, - wehiragana: 0x3091, - weierstrass: 0x2118, - wekatakana: 0x30F1, - wekorean: 0x315E, - weokorean: 0x315D, - wgrave: 0x1E81, - whitebullet: 0x25E6, - whitecircle: 0x25CB, - whitecircleinverse: 0x25D9, - whitecornerbracketleft: 0x300E, - whitecornerbracketleftvertical: 0xFE43, - whitecornerbracketright: 0x300F, - whitecornerbracketrightvertical: 0xFE44, - whitediamond: 0x25C7, - whitediamondcontainingblacksmalldiamond: 0x25C8, - whitedownpointingsmalltriangle: 0x25BF, - whitedownpointingtriangle: 0x25BD, - whiteleftpointingsmalltriangle: 0x25C3, - whiteleftpointingtriangle: 0x25C1, - whitelenticularbracketleft: 0x3016, - whitelenticularbracketright: 0x3017, - whiterightpointingsmalltriangle: 0x25B9, - whiterightpointingtriangle: 0x25B7, - whitesmallsquare: 0x25AB, - whitesmilingface: 0x263A, - whitesquare: 0x25A1, - whitestar: 0x2606, - whitetelephone: 0x260F, - whitetortoiseshellbracketleft: 0x3018, - whitetortoiseshellbracketright: 0x3019, - whiteuppointingsmalltriangle: 0x25B5, - whiteuppointingtriangle: 0x25B3, - wihiragana: 0x3090, - wikatakana: 0x30F0, - wikorean: 0x315F, - wmonospace: 0xFF57, - wohiragana: 0x3092, - wokatakana: 0x30F2, - wokatakanahalfwidth: 0xFF66, - won: 0x20A9, - wonmonospace: 0xFFE6, - wowaenthai: 0x0E27, - wparen: 0x24B2, - wring: 0x1E98, - wsuperior: 0x02B7, - wturned: 0x028D, - wynn: 0x01BF, - x: 0x0078, - xabovecmb: 0x033D, - xbopomofo: 0x3112, - xcircle: 0x24E7, - xdieresis: 0x1E8D, - xdotaccent: 0x1E8B, - xeharmenian: 0x056D, - xi: 0x03BE, - xmonospace: 0xFF58, - xparen: 0x24B3, - xsuperior: 0x02E3, - y: 0x0079, - yaadosquare: 0x334E, - yabengali: 0x09AF, - yacute: 0x00FD, - yadeva: 0x092F, - yaekorean: 0x3152, - yagujarati: 0x0AAF, - yagurmukhi: 0x0A2F, - yahiragana: 0x3084, - yakatakana: 0x30E4, - yakatakanahalfwidth: 0xFF94, - yakorean: 0x3151, - yamakkanthai: 0x0E4E, - yasmallhiragana: 0x3083, - yasmallkatakana: 0x30E3, - yasmallkatakanahalfwidth: 0xFF6C, - yatcyrillic: 0x0463, - ycircle: 0x24E8, - ycircumflex: 0x0177, - ydieresis: 0x00FF, - ydotaccent: 0x1E8F, - ydotbelow: 0x1EF5, - yeharabic: 0x064A, - yehbarreearabic: 0x06D2, - yehbarreefinalarabic: 0xFBAF, - yehfinalarabic: 0xFEF2, - yehhamzaabovearabic: 0x0626, - yehhamzaabovefinalarabic: 0xFE8A, - yehhamzaaboveinitialarabic: 0xFE8B, - yehhamzaabovemedialarabic: 0xFE8C, - yehinitialarabic: 0xFEF3, - yehmedialarabic: 0xFEF4, - yehmeeminitialarabic: 0xFCDD, - yehmeemisolatedarabic: 0xFC58, - yehnoonfinalarabic: 0xFC94, - yehthreedotsbelowarabic: 0x06D1, - yekorean: 0x3156, - yen: 0x00A5, - yenmonospace: 0xFFE5, - yeokorean: 0x3155, - yeorinhieuhkorean: 0x3186, - yerahbenyomohebrew: 0x05AA, - yerahbenyomolefthebrew: 0x05AA, - yericyrillic: 0x044B, - yerudieresiscyrillic: 0x04F9, - yesieungkorean: 0x3181, - yesieungpansioskorean: 0x3183, - yesieungsioskorean: 0x3182, - yetivhebrew: 0x059A, - ygrave: 0x1EF3, - yhook: 0x01B4, - yhookabove: 0x1EF7, - yiarmenian: 0x0575, - yicyrillic: 0x0457, - yikorean: 0x3162, - yinyang: 0x262F, - yiwnarmenian: 0x0582, - ymonospace: 0xFF59, - yod: 0x05D9, - yoddagesh: 0xFB39, - yoddageshhebrew: 0xFB39, - yodhebrew: 0x05D9, - yodyodhebrew: 0x05F2, - yodyodpatahhebrew: 0xFB1F, - yohiragana: 0x3088, - yoikorean: 0x3189, - yokatakana: 0x30E8, - yokatakanahalfwidth: 0xFF96, - yokorean: 0x315B, - yosmallhiragana: 0x3087, - yosmallkatakana: 0x30E7, - yosmallkatakanahalfwidth: 0xFF6E, - yotgreek: 0x03F3, - yoyaekorean: 0x3188, - yoyakorean: 0x3187, - yoyakthai: 0x0E22, - yoyingthai: 0x0E0D, - yparen: 0x24B4, - ypogegrammeni: 0x037A, - ypogegrammenigreekcmb: 0x0345, - yr: 0x01A6, - yring: 0x1E99, - ysuperior: 0x02B8, - ytilde: 0x1EF9, - yturned: 0x028E, - yuhiragana: 0x3086, - yuikorean: 0x318C, - yukatakana: 0x30E6, - yukatakanahalfwidth: 0xFF95, - yukorean: 0x3160, - yusbigcyrillic: 0x046B, - yusbigiotifiedcyrillic: 0x046D, - yuslittlecyrillic: 0x0467, - yuslittleiotifiedcyrillic: 0x0469, - yusmallhiragana: 0x3085, - yusmallkatakana: 0x30E5, - yusmallkatakanahalfwidth: 0xFF6D, - yuyekorean: 0x318B, - yuyeokorean: 0x318A, - yyabengali: 0x09DF, - yyadeva: 0x095F, - z: 0x007A, - zaarmenian: 0x0566, - zacute: 0x017A, - zadeva: 0x095B, - zagurmukhi: 0x0A5B, - zaharabic: 0x0638, - zahfinalarabic: 0xFEC6, - zahinitialarabic: 0xFEC7, - zahiragana: 0x3056, - zahmedialarabic: 0xFEC8, - zainarabic: 0x0632, - zainfinalarabic: 0xFEB0, - zakatakana: 0x30B6, - zaqefgadolhebrew: 0x0595, - zaqefqatanhebrew: 0x0594, - zarqahebrew: 0x0598, - zayin: 0x05D6, - zayindagesh: 0xFB36, - zayindageshhebrew: 0xFB36, - zayinhebrew: 0x05D6, - zbopomofo: 0x3117, - zcaron: 0x017E, - zcircle: 0x24E9, - zcircumflex: 0x1E91, - zcurl: 0x0291, - zdot: 0x017C, - zdotaccent: 0x017C, - zdotbelow: 0x1E93, - zecyrillic: 0x0437, - zedescendercyrillic: 0x0499, - zedieresiscyrillic: 0x04DF, - zehiragana: 0x305C, - zekatakana: 0x30BC, - zero: 0x0030, - zeroarabic: 0x0660, - zerobengali: 0x09E6, - zerodeva: 0x0966, - zerogujarati: 0x0AE6, - zerogurmukhi: 0x0A66, - zerohackarabic: 0x0660, - zeroinferior: 0x2080, - zeromonospace: 0xFF10, - zerooldstyle: 0xF730, - zeropersian: 0x06F0, - zerosuperior: 0x2070, - zerothai: 0x0E50, - zerowidthjoiner: 0xFEFF, - zerowidthnonjoiner: 0x200C, - zerowidthspace: 0x200B, - zeta: 0x03B6, - zhbopomofo: 0x3113, - zhearmenian: 0x056A, - zhebrevecyrillic: 0x04C2, - zhecyrillic: 0x0436, - zhedescendercyrillic: 0x0497, - zhedieresiscyrillic: 0x04DD, - zihiragana: 0x3058, - zikatakana: 0x30B8, - zinorhebrew: 0x05AE, - zlinebelow: 0x1E95, - zmonospace: 0xFF5A, - zohiragana: 0x305E, - zokatakana: 0x30BE, - zparen: 0x24B5, - zretroflexhook: 0x0290, - zstroke: 0x01B6, - zuhiragana: 0x305A, - zukatakana: 0x30BA, - '.notdef': 0x0000 -}; - -var DingbatsGlyphsUnicode = { - space: 0x0020, - a1: 0x2701, - a2: 0x2702, - a202: 0x2703, - a3: 0x2704, - a4: 0x260E, - a5: 0x2706, - a119: 0x2707, - a118: 0x2708, - a117: 0x2709, - a11: 0x261B, - a12: 0x261E, - a13: 0x270C, - a14: 0x270D, - a15: 0x270E, - a16: 0x270F, - a105: 0x2710, - a17: 0x2711, - a18: 0x2712, - a19: 0x2713, - a20: 0x2714, - a21: 0x2715, - a22: 0x2716, - a23: 0x2717, - a24: 0x2718, - a25: 0x2719, - a26: 0x271A, - a27: 0x271B, - a28: 0x271C, - a6: 0x271D, - a7: 0x271E, - a8: 0x271F, - a9: 0x2720, - a10: 0x2721, - a29: 0x2722, - a30: 0x2723, - a31: 0x2724, - a32: 0x2725, - a33: 0x2726, - a34: 0x2727, - a35: 0x2605, - a36: 0x2729, - a37: 0x272A, - a38: 0x272B, - a39: 0x272C, - a40: 0x272D, - a41: 0x272E, - a42: 0x272F, - a43: 0x2730, - a44: 0x2731, - a45: 0x2732, - a46: 0x2733, - a47: 0x2734, - a48: 0x2735, - a49: 0x2736, - a50: 0x2737, - a51: 0x2738, - a52: 0x2739, - a53: 0x273A, - a54: 0x273B, - a55: 0x273C, - a56: 0x273D, - a57: 0x273E, - a58: 0x273F, - a59: 0x2740, - a60: 0x2741, - a61: 0x2742, - a62: 0x2743, - a63: 0x2744, - a64: 0x2745, - a65: 0x2746, - a66: 0x2747, - a67: 0x2748, - a68: 0x2749, - a69: 0x274A, - a70: 0x274B, - a71: 0x25CF, - a72: 0x274D, - a73: 0x25A0, - a74: 0x274F, - a203: 0x2750, - a75: 0x2751, - a204: 0x2752, - a76: 0x25B2, - a77: 0x25BC, - a78: 0x25C6, - a79: 0x2756, - a81: 0x25D7, - a82: 0x2758, - a83: 0x2759, - a84: 0x275A, - a97: 0x275B, - a98: 0x275C, - a99: 0x275D, - a100: 0x275E, - a101: 0x2761, - a102: 0x2762, - a103: 0x2763, - a104: 0x2764, - a106: 0x2765, - a107: 0x2766, - a108: 0x2767, - a112: 0x2663, - a111: 0x2666, - a110: 0x2665, - a109: 0x2660, - a120: 0x2460, - a121: 0x2461, - a122: 0x2462, - a123: 0x2463, - a124: 0x2464, - a125: 0x2465, - a126: 0x2466, - a127: 0x2467, - a128: 0x2468, - a129: 0x2469, - a130: 0x2776, - a131: 0x2777, - a132: 0x2778, - a133: 0x2779, - a134: 0x277A, - a135: 0x277B, - a136: 0x277C, - a137: 0x277D, - a138: 0x277E, - a139: 0x277F, - a140: 0x2780, - a141: 0x2781, - a142: 0x2782, - a143: 0x2783, - a144: 0x2784, - a145: 0x2785, - a146: 0x2786, - a147: 0x2787, - a148: 0x2788, - a149: 0x2789, - a150: 0x278A, - a151: 0x278B, - a152: 0x278C, - a153: 0x278D, - a154: 0x278E, - a155: 0x278F, - a156: 0x2790, - a157: 0x2791, - a158: 0x2792, - a159: 0x2793, - a160: 0x2794, - a161: 0x2192, - a163: 0x2194, - a164: 0x2195, - a196: 0x2798, - a165: 0x2799, - a192: 0x279A, - a166: 0x279B, - a167: 0x279C, - a168: 0x279D, - a169: 0x279E, - a170: 0x279F, - a171: 0x27A0, - a172: 0x27A1, - a173: 0x27A2, - a162: 0x27A3, - a174: 0x27A4, - a175: 0x27A5, - a176: 0x27A6, - a177: 0x27A7, - a178: 0x27A8, - a179: 0x27A9, - a193: 0x27AA, - a180: 0x27AB, - a199: 0x27AC, - a181: 0x27AD, - a200: 0x27AE, - a182: 0x27AF, - a201: 0x27B1, - a183: 0x27B2, - a184: 0x27B3, - a197: 0x27B4, - a185: 0x27B5, - a194: 0x27B6, - a198: 0x27B7, - a186: 0x27B8, - a195: 0x27B9, - a187: 0x27BA, - a188: 0x27BB, - a189: 0x27BC, - a190: 0x27BD, - a191: 0x27BE, - a89: 0x2768, // 0xF8D7 - a90: 0x2769, // 0xF8D8 - a93: 0x276A, // 0xF8D9 - a94: 0x276B, // 0xF8DA - a91: 0x276C, // 0xF8DB - a92: 0x276D, // 0xF8DC - a205: 0x276E, // 0xF8DD - a85: 0x276F, // 0xF8DE - a206: 0x2770, // 0xF8DF - a86: 0x2771, // 0xF8E0 - a87: 0x2772, // 0xF8E1 - a88: 0x2773, // 0xF8E2 - a95: 0x2774, // 0xF8E3 - a96: 0x2775, // 0xF8E4 - '.notdef': 0x0000 -}; - - -var PDFImage = (function PDFImageClosure() { - /** - * Decode the image in the main thread if it supported. Resovles the promise - * when the image data is ready. - */ - function handleImageData(handler, xref, res, image) { - if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) { - // For natively supported jpegs send them to the main thread for decoding. - var dict = image.dict; - var colorSpace = dict.get('ColorSpace', 'CS'); - colorSpace = ColorSpace.parse(colorSpace, xref, res); - var numComps = colorSpace.numComps; - var decodePromise = handler.sendWithPromise('JpegDecode', - [image.getIR(), numComps]); - return decodePromise.then(function (message) { - var data = message.data; - return new Stream(data, 0, data.length, image.dict); - }); - } else { - return Promise.resolve(image); - } - } - - /** - * Decode and clamp a value. The formula is different from the spec because we - * don't decode to float range [0,1], we decode it in the [0,max] range. - */ - function decodeAndClamp(value, addend, coefficient, max) { - value = addend + value * coefficient; - // Clamp the value to the range - return (value < 0 ? 0 : (value > max ? max : value)); - } - - function PDFImage(xref, res, image, inline, smask, mask, isMask) { - this.image = image; - var dict = image.dict; - if (dict.has('Filter')) { - var filter = dict.get('Filter').name; - if (filter === 'JPXDecode') { - var jpxImage = new JpxImage(); - jpxImage.parseImageProperties(image.stream); - image.stream.reset(); - image.bitsPerComponent = jpxImage.bitsPerComponent; - image.numComps = jpxImage.componentsCount; - } else if (filter === 'JBIG2Decode') { - image.bitsPerComponent = 1; - image.numComps = 1; - } - } - // TODO cache rendered images? - - this.width = dict.get('Width', 'W'); - this.height = dict.get('Height', 'H'); - - if (this.width < 1 || this.height < 1) { - error('Invalid image width: ' + this.width + ' or height: ' + - this.height); - } - - this.interpolate = dict.get('Interpolate', 'I') || false; - this.imageMask = dict.get('ImageMask', 'IM') || false; - this.matte = dict.get('Matte') || false; - - var bitsPerComponent = image.bitsPerComponent; - if (!bitsPerComponent) { - bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); - if (!bitsPerComponent) { - if (this.imageMask) { - bitsPerComponent = 1; - } else { - error('Bits per component missing in image: ' + this.imageMask); - } - } - } - this.bpc = bitsPerComponent; - - if (!this.imageMask) { - var colorSpace = dict.get('ColorSpace', 'CS'); - if (!colorSpace) { - info('JPX images (which do not require color spaces)'); - switch (image.numComps) { - case 1: - colorSpace = Name.get('DeviceGray'); - break; - case 3: - colorSpace = Name.get('DeviceRGB'); - break; - case 4: - colorSpace = Name.get('DeviceCMYK'); - break; - default: - error('JPX images with ' + this.numComps + - ' color components not supported.'); - } - } - this.colorSpace = ColorSpace.parse(colorSpace, xref, res); - this.numComps = this.colorSpace.numComps; - } - - this.decode = dict.get('Decode', 'D'); - this.needsDecode = false; - if (this.decode && - ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) || - (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) { - this.needsDecode = true; - // Do some preprocessing to avoid more math. - var max = (1 << bitsPerComponent) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { - var dmin = this.decode[i]; - var dmax = this.decode[i + 1]; - this.decodeCoefficients[j] = dmax - dmin; - this.decodeAddends[j] = max * dmin; - } - } - - if (smask) { - this.smask = new PDFImage(xref, res, smask, false); - } else if (mask) { - if (isStream(mask)) { - var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); - if (!imageMask) { - warn('Ignoring /Mask in image without /ImageMask.'); - } else { - this.mask = new PDFImage(xref, res, mask, false, null, null, true); - } - } else { - // Color key mask (just an array). - this.mask = mask; - } - } - } - /** - * Handles processing of image data and returns the Promise that is resolved - * with a PDFImage when the image is ready to be used. - */ - PDFImage.buildImage = function PDFImage_buildImage(handler, xref, - res, image, inline) { - var imagePromise = handleImageData(handler, xref, res, image); - var smaskPromise; - var maskPromise; - - var smask = image.dict.get('SMask'); - var mask = image.dict.get('Mask'); - - if (smask) { - smaskPromise = handleImageData(handler, xref, res, smask); - maskPromise = Promise.resolve(null); - } else { - smaskPromise = Promise.resolve(null); - if (mask) { - if (isStream(mask)) { - maskPromise = handleImageData(handler, xref, res, mask); - } else if (isArray(mask)) { - maskPromise = Promise.resolve(mask); - } else { - warn('Unsupported mask format.'); - maskPromise = Promise.resolve(null); - } - } else { - maskPromise = Promise.resolve(null); - } - } - return Promise.all([imagePromise, smaskPromise, maskPromise]).then( - function(results) { - var imageData = results[0]; - var smaskData = results[1]; - var maskData = results[2]; - return new PDFImage(xref, res, imageData, inline, smaskData, maskData); - }); - }; - - /** - * Resize an image using the nearest neighbor algorithm. Currently only - * supports one and three component images. - * @param {TypedArray} pixels The original image with one component. - * @param {Number} bpc Number of bits per component. - * @param {Number} components Number of color components, 1 or 3 is supported. - * @param {Number} w1 Original width. - * @param {Number} h1 Original height. - * @param {Number} w2 New width. - * @param {Number} h2 New height. - * @param {TypedArray} dest (Optional) The destination buffer. - * @param {Number} alpha01 (Optional) Size reserved for the alpha channel. - * @return {TypedArray} Resized image data. - */ - PDFImage.resize = function PDFImage_resize(pixels, bpc, components, - w1, h1, w2, h2, dest, alpha01) { - - if (components !== 1 && components !== 3) { - error('Unsupported component count for resizing.'); - } - - var length = w2 * h2 * components; - var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var xRatio = w1 / w2; - var yRatio = h1 / h2; - var i, j, py, newIndex = 0, oldIndex; - var xScaled = new Uint16Array(w2); - var w1Scanline = w1 * components; - if (alpha01 !== 1) { - alpha01 = 0; - } - - for (j = 0; j < w2; j++) { - xScaled[j] = Math.floor(j * xRatio) * components; - } - - if (components === 1) { - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - temp[newIndex++] = pixels[oldIndex]; - } - } - } else if (components === 3) { - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - temp[newIndex++] = pixels[oldIndex++]; - temp[newIndex++] = pixels[oldIndex++]; - temp[newIndex++] = pixels[oldIndex++]; - newIndex += alpha01; - } - } - } - return temp; - }; - - PDFImage.createMask = - function PDFImage_createMask(imgArray, width, height, - imageIsFromDecodeStream, inverseDecode) { - - // |imgArray| might not contain full data for every pixel of the mask, so - // we need to distinguish between |computedLength| and |actualLength|. - // In particular, if inverseDecode is true, then the array we return must - // have a length of |computedLength|. - - var computedLength = ((width + 7) >> 3) * height; - var actualLength = imgArray.byteLength; - var haveFullData = computedLength === actualLength; - var data, i; - - if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { - // imgArray came from a DecodeStream and its data is in an appropriate - // form, so we can just transfer it. - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(actualLength); - data.set(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - for (i = actualLength; i < computedLength; i++) { - data[i] = 0xff; - } - } - - // If necessary, invert the original mask data (but not any extra we might - // have added above). It's safe to modify the array -- whether it's the - // original or a copy, we're about to transfer it anyway, so nothing else - // in this thread can be relying on its contents. - if (inverseDecode) { - for (i = 0; i < actualLength; i++) { - data[i] = ~data[i]; - } - } - - return {data: data, width: width, height: height}; - }; - - PDFImage.prototype = { - get drawWidth() { - return Math.max(this.width, - this.smask && this.smask.width || 0, - this.mask && this.mask.width || 0); - }, - - get drawHeight() { - return Math.max(this.height, - this.smask && this.smask.height || 0, - this.mask && this.mask.height || 0); - }, - - decodeBuffer: function PDFImage_decodeBuffer(buffer) { - var bpc = this.bpc; - var numComps = this.numComps; - - var decodeAddends = this.decodeAddends; - var decodeCoefficients = this.decodeCoefficients; - var max = (1 << bpc) - 1; - var i, ii; - - if (bpc === 1) { - // If the buffer needed decode that means it just needs to be inverted. - for (i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = +!(buffer[i]); - } - return; - } - var index = 0; - for (i = 0, ii = this.width * this.height; i < ii; i++) { - for (var j = 0; j < numComps; j++) { - buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], - decodeCoefficients[j], max); - index++; - } - } - }, - - getComponents: function PDFImage_getComponents(buffer) { - var bpc = this.bpc; - - // This image doesn't require any extra work. - if (bpc === 8) { - return buffer; - } - - var width = this.width; - var height = this.height; - var numComps = this.numComps; - - var length = width * height * numComps; - var bufferPos = 0; - var output = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var rowComps = width * numComps; - - var max = (1 << bpc) - 1; - var i = 0, ii, buf; - - if (bpc === 1) { - // Optimization for reading 1 bpc images. - var mask, loop1End, loop2End; - for (var j = 0; j < height; j++) { - loop1End = i + (rowComps & ~7); - loop2End = i + rowComps; - - // unroll loop for all full bytes - while (i < loop1End) { - buf = buffer[bufferPos++]; - output[i] = (buf >> 7) & 1; - output[i + 1] = (buf >> 6) & 1; - output[i + 2] = (buf >> 5) & 1; - output[i + 3] = (buf >> 4) & 1; - output[i + 4] = (buf >> 3) & 1; - output[i + 5] = (buf >> 2) & 1; - output[i + 6] = (buf >> 1) & 1; - output[i + 7] = buf & 1; - i += 8; - } - - // handle remaing bits - if (i < loop2End) { - buf = buffer[bufferPos++]; - mask = 128; - while (i < loop2End) { - output[i++] = +!!(buf & mask); - mask >>= 1; - } - } - } - } else { - // The general case that handles all other bpc values. - var bits = 0; - buf = 0; - for (i = 0, ii = length; i < ii; ++i) { - if (i % rowComps === 0) { - buf = 0; - bits = 0; - } - - while (bits < bpc) { - buf = (buf << 8) | buffer[bufferPos++]; - bits += 8; - } - - var remainingBits = bits - bpc; - var value = buf >> remainingBits; - output[i] = (value < 0 ? 0 : (value > max ? max : value)); - buf = buf & ((1 << remainingBits) - 1); - bits = remainingBits; - } - } - return output; - }, - - fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, - actualHeight, image) { - var smask = this.smask; - var mask = this.mask; - var alphaBuf, sw, sh, i, ii, j; - - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8Array(sw * sh); - smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width, - height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8Array(sw * sh); - mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); - - // Need to invert values in rgbaBuf - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - - if (sw !== width || sh !== height) { - alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width, - height); - } - } else if (isArray(mask)) { - // Color key mask: if any of the compontents are outside the range - // then they should be painted. - alphaBuf = new Uint8Array(width * height); - var numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - var opacity = 0; - var imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - var color = image[imageOffset + j]; - var maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; - } - } - alphaBuf[i] = opacity; - } - } else { - error('Unknown mask format.'); - } - } - - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } - } else { - // No mask. - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } - } - }, - - undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { - var matte = this.smask && this.smask.matte; - if (!matte) { - return; - } - var matteRgb = this.colorSpace.getRgb(matte, 0); - var matteR = matteRgb[0]; - var matteG = matteRgb[1]; - var matteB = matteRgb[2]; - var length = width * height * 4; - var r, g, b; - for (var i = 0; i < length; i += 4) { - var alpha = buffer[i + 3]; - if (alpha === 0) { - // according formula we have to get Infinity in all components - // making it white (typical paper color) should be okay - buffer[i] = 255; - buffer[i + 1] = 255; - buffer[i + 2] = 255; - continue; - } - var k = 255 / alpha; - r = (buffer[i] - matteR) * k + matteR; - g = (buffer[i + 1] - matteG) * k + matteG; - b = (buffer[i + 2] - matteB) * k + matteB; - buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; - buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; - buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; - } - }, - - createImageData: function PDFImage_createImageData(forceRGBA) { - var drawWidth = this.drawWidth; - var drawHeight = this.drawHeight; - var imgData = { // other fields are filled in below - width: drawWidth, - height: drawHeight - }; - - var numComps = this.numComps; - var originalWidth = this.width; - var originalHeight = this.height; - var bpc = this.bpc; - - // Rows start at byte boundary. - var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; - var imgArray; - - if (!forceRGBA) { - // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image - // without any complications, we pass a same-sized copy to the main - // thread rather than expanding by 32x to RGBA form. This saves *lots* - // of memory for many scanned documents. It's also much faster. - // - // Similarly, if it is a 24-bit-per pixel RGB image without any - // complications, we avoid expanding by 1.333x to RGBA form. - var kind; - if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { - kind = ImageKind.GRAYSCALE_1BPP; - } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && - !this.needsDecode) { - kind = ImageKind.RGB_24BPP; - } - if (kind && !this.smask && !this.mask && - drawWidth === originalWidth && drawHeight === originalHeight) { - imgData.kind = kind; - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // If imgArray came from a DecodeStream, we're safe to transfer it - // (and thus neuter it) because it will constitute the entire - // DecodeStream's data. But if it came from a Stream, we need to - // copy it because it'll only be a portion of the Stream's data, and - // the rest will be read later on. - if (this.image instanceof DecodeStream) { - imgData.data = imgArray; - } else { - var newArray = new Uint8Array(imgArray.length); - newArray.set(imgArray); - imgData.data = newArray; - } - if (this.needsDecode) { - // Invert the buffer (which must be grayscale if we reached here). - assert(kind === ImageKind.GRAYSCALE_1BPP); - var buffer = imgData.data; - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] ^= 0xff; - } - } - return imgData; - } - if (this.image instanceof JpegStream && !this.smask && !this.mask && - (this.colorSpace.name === 'DeviceGray' || - this.colorSpace.name === 'DeviceRGB' || - this.colorSpace.name === 'DeviceCMYK')) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(originalHeight * rowBytes, - drawWidth, drawHeight, true); - return imgData; - } - } - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // imgArray can be incomplete (e.g. after CCITT fax encoding). - var actualHeight = 0 | (imgArray.length / rowBytes * - drawHeight / originalHeight); - - var comps = this.getComponents(imgArray); - - // If opacity data is present, use RGBA_32BPP form. Otherwise, use the - // more compact RGB_24BPP form if allowable. - var alpha01, maybeUndoPreblend; - if (!forceRGBA && !this.smask && !this.mask) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 3); - alpha01 = 0; - maybeUndoPreblend = false; - } else { - imgData.kind = ImageKind.RGBA_32BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 4); - alpha01 = 1; - maybeUndoPreblend = true; - - // Color key masking (opacity) must be performed before decoding. - this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, - comps); - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, - drawWidth, drawHeight, actualHeight, bpc, comps, - alpha01); - if (maybeUndoPreblend) { - this.undoPreblend(imgData.data, drawWidth, actualHeight); - } - - return imgData; - }, - - fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { - var numComps = this.numComps; - if (numComps !== 1) { - error('Reading gray scale from a color image: ' + numComps); - } - - var width = this.width; - var height = this.height; - var bpc = this.bpc; - - // rows start at byte boundary - var rowBytes = (width * numComps * bpc + 7) >> 3; - var imgArray = this.getImageBytes(height * rowBytes); - - var comps = this.getComponents(imgArray); - var i, length; - - if (bpc === 1) { - // inline decoding (= inversion) for 1 bpc images - length = width * height; - if (this.needsDecode) { - // invert and scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (comps[i] - 1) & 255; - } - } else { - // scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (-comps[i]) & 255; - } - } - return; - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - length = width * height; - // we aren't using a colorspace so we need to scale the value - var scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = (scale * comps[i]) | 0; - } - }, - - getImageBytes: function PDFImage_getImageBytes(length, - drawWidth, drawHeight, - forceRGB) { - this.image.reset(); - this.image.drawWidth = drawWidth || this.width; - this.image.drawHeight = drawHeight || this.height; - this.image.forceRGB = !!forceRGB; - return this.image.getBytes(length); - } - }; - return PDFImage; -})(); - - -// The Metrics object contains glyph widths (in glyph space units). -// As per PDF spec, for most fonts (Type 3 being an exception) a glyph -// space unit corresponds to 1/1000th of text space unit. -var Metrics = { - 'Courier': 600, - 'Courier-Bold': 600, - 'Courier-BoldOblique': 600, - 'Courier-Oblique': 600, - 'Helvetica' : { - 'space': 278, - 'exclam': 278, - 'quotedbl': 355, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 667, - 'quoteright': 222, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 278, - 'semicolon': 278, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 556, - 'at': 1015, - 'A': 667, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 278, - 'backslash': 278, - 'bracketright': 278, - 'asciicircum': 469, - 'underscore': 556, - 'quoteleft': 222, - 'a': 556, - 'b': 556, - 'c': 500, - 'd': 556, - 'e': 556, - 'f': 278, - 'g': 556, - 'h': 556, - 'i': 222, - 'j': 222, - 'k': 500, - 'l': 222, - 'm': 833, - 'n': 556, - 'o': 556, - 'p': 556, - 'q': 556, - 'r': 333, - 's': 500, - 't': 278, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 500, - 'braceleft': 334, - 'bar': 260, - 'braceright': 334, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 191, - 'quotedblleft': 333, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 537, - 'bullet': 350, - 'quotesinglbase': 222, - 'quotedblbase': 333, - 'quotedblright': 333, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 556, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 222, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 556, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 667, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 500, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 500, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 222, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 500, - 'scedilla': 500, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 556, - 'Amacron': 667, - 'rcaron': 333, - 'ccedilla': 500, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 643, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 584, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 500, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 260, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 333, - 'omacron': 556, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 222, - 'tcaron': 317, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 222, - 'Oacute': 778, - 'oacute': 556, - 'amacron': 556, - 'sacute': 500, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 556, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 299, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 556, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 556, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 556, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 556, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 556, - 'Rcommaaccent': 722, - 'Lcommaaccent': 556, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 500, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 584, - 'odieresis': 556, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 556, - 'eth': 556, - 'zcaron': 500, - 'ncommaaccent': 556, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-Bold': { - 'space': 278, - 'exclam': 333, - 'quotedbl': 474, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 722, - 'quoteright': 278, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 333, - 'semicolon': 333, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 611, - 'at': 975, - 'A': 722, - 'B': 722, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 584, - 'underscore': 556, - 'quoteleft': 278, - 'a': 556, - 'b': 611, - 'c': 556, - 'd': 611, - 'e': 556, - 'f': 333, - 'g': 611, - 'h': 611, - 'i': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'm': 889, - 'n': 611, - 'o': 611, - 'p': 611, - 'q': 611, - 'r': 389, - 's': 556, - 't': 333, - 'u': 611, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'z': 500, - 'braceleft': 389, - 'bar': 280, - 'braceright': 389, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 238, - 'quotedblleft': 500, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 611, - 'fl': 611, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 556, - 'bullet': 350, - 'quotesinglbase': 278, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 611, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 611, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 722, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 556, - 'scommaaccent': 556, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 611, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 556, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 556, - 'scedilla': 556, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 611, - 'acircumflex': 556, - 'Amacron': 722, - 'rcaron': 389, - 'ccedilla': 556, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 743, - 'Umacron': 722, - 'uring': 611, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 584, - 'uacute': 611, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 556, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 556, - 'nacute': 611, - 'umacron': 611, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 280, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 611, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 389, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 611, - 'amacron': 556, - 'sacute': 556, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 611, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 611, - 'igrave': 278, - 'ohungarumlaut': 611, - 'Eogonek': 667, - 'dcroat': 611, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 400, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 611, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 611, - 'ntilde': 611, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 611, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 611, - 'Ccaron': 722, - 'ugrave': 611, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 611, - 'Rcommaaccent': 722, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 556, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 611, - 'tcommaaccent': 333, - 'logicalnot': 584, - 'odieresis': 611, - 'udieresis': 611, - 'notequal': 549, - 'gcommaaccent': 611, - 'eth': 611, - 'zcaron': 500, - 'ncommaaccent': 611, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-BoldOblique': { - 'space': 278, - 'exclam': 333, - 'quotedbl': 474, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 722, - 'quoteright': 278, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 333, - 'semicolon': 333, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 611, - 'at': 975, - 'A': 722, - 'B': 722, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 584, - 'underscore': 556, - 'quoteleft': 278, - 'a': 556, - 'b': 611, - 'c': 556, - 'd': 611, - 'e': 556, - 'f': 333, - 'g': 611, - 'h': 611, - 'i': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'm': 889, - 'n': 611, - 'o': 611, - 'p': 611, - 'q': 611, - 'r': 389, - 's': 556, - 't': 333, - 'u': 611, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'z': 500, - 'braceleft': 389, - 'bar': 280, - 'braceright': 389, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 238, - 'quotedblleft': 500, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 611, - 'fl': 611, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 556, - 'bullet': 350, - 'quotesinglbase': 278, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 611, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 611, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 722, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 556, - 'scommaaccent': 556, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 611, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 556, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 556, - 'scedilla': 556, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 611, - 'acircumflex': 556, - 'Amacron': 722, - 'rcaron': 389, - 'ccedilla': 556, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 743, - 'Umacron': 722, - 'uring': 611, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 584, - 'uacute': 611, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 556, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 556, - 'nacute': 611, - 'umacron': 611, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 280, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 611, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 389, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 611, - 'amacron': 556, - 'sacute': 556, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 611, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 611, - 'igrave': 278, - 'ohungarumlaut': 611, - 'Eogonek': 667, - 'dcroat': 611, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 400, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 611, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 611, - 'ntilde': 611, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 611, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 611, - 'Ccaron': 722, - 'ugrave': 611, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 611, - 'Rcommaaccent': 722, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 556, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 611, - 'tcommaaccent': 333, - 'logicalnot': 584, - 'odieresis': 611, - 'udieresis': 611, - 'notequal': 549, - 'gcommaaccent': 611, - 'eth': 611, - 'zcaron': 500, - 'ncommaaccent': 611, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-Oblique' : { - 'space': 278, - 'exclam': 278, - 'quotedbl': 355, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 667, - 'quoteright': 222, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 278, - 'semicolon': 278, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 556, - 'at': 1015, - 'A': 667, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 278, - 'backslash': 278, - 'bracketright': 278, - 'asciicircum': 469, - 'underscore': 556, - 'quoteleft': 222, - 'a': 556, - 'b': 556, - 'c': 500, - 'd': 556, - 'e': 556, - 'f': 278, - 'g': 556, - 'h': 556, - 'i': 222, - 'j': 222, - 'k': 500, - 'l': 222, - 'm': 833, - 'n': 556, - 'o': 556, - 'p': 556, - 'q': 556, - 'r': 333, - 's': 500, - 't': 278, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 500, - 'braceleft': 334, - 'bar': 260, - 'braceright': 334, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 191, - 'quotedblleft': 333, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 537, - 'bullet': 350, - 'quotesinglbase': 222, - 'quotedblbase': 333, - 'quotedblright': 333, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 556, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 222, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 556, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 667, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 500, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 500, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 222, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 500, - 'scedilla': 500, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 556, - 'Amacron': 667, - 'rcaron': 333, - 'ccedilla': 500, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 643, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 584, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 500, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 260, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 333, - 'omacron': 556, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 222, - 'tcaron': 317, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 222, - 'Oacute': 778, - 'oacute': 556, - 'amacron': 556, - 'sacute': 500, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 556, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 299, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 556, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 556, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 556, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 556, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 556, - 'Rcommaaccent': 722, - 'Lcommaaccent': 556, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 500, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 584, - 'odieresis': 556, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 556, - 'eth': 556, - 'zcaron': 500, - 'ncommaaccent': 556, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Symbol': { - 'space': 250, - 'exclam': 333, - 'universal': 713, - 'numbersign': 500, - 'existential': 549, - 'percent': 833, - 'ampersand': 778, - 'suchthat': 439, - 'parenleft': 333, - 'parenright': 333, - 'asteriskmath': 500, - 'plus': 549, - 'comma': 250, - 'minus': 549, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 278, - 'semicolon': 278, - 'less': 549, - 'equal': 549, - 'greater': 549, - 'question': 444, - 'congruent': 549, - 'Alpha': 722, - 'Beta': 667, - 'Chi': 722, - 'Delta': 612, - 'Epsilon': 611, - 'Phi': 763, - 'Gamma': 603, - 'Eta': 722, - 'Iota': 333, - 'theta1': 631, - 'Kappa': 722, - 'Lambda': 686, - 'Mu': 889, - 'Nu': 722, - 'Omicron': 722, - 'Pi': 768, - 'Theta': 741, - 'Rho': 556, - 'Sigma': 592, - 'Tau': 611, - 'Upsilon': 690, - 'sigma1': 439, - 'Omega': 768, - 'Xi': 645, - 'Psi': 795, - 'Zeta': 611, - 'bracketleft': 333, - 'therefore': 863, - 'bracketright': 333, - 'perpendicular': 658, - 'underscore': 500, - 'radicalex': 500, - 'alpha': 631, - 'beta': 549, - 'chi': 549, - 'delta': 494, - 'epsilon': 439, - 'phi': 521, - 'gamma': 411, - 'eta': 603, - 'iota': 329, - 'phi1': 603, - 'kappa': 549, - 'lambda': 549, - 'mu': 576, - 'nu': 521, - 'omicron': 549, - 'pi': 549, - 'theta': 521, - 'rho': 549, - 'sigma': 603, - 'tau': 439, - 'upsilon': 576, - 'omega1': 713, - 'omega': 686, - 'xi': 493, - 'psi': 686, - 'zeta': 494, - 'braceleft': 480, - 'bar': 200, - 'braceright': 480, - 'similar': 549, - 'Euro': 750, - 'Upsilon1': 620, - 'minute': 247, - 'lessequal': 549, - 'fraction': 167, - 'infinity': 713, - 'florin': 500, - 'club': 753, - 'diamond': 753, - 'heart': 753, - 'spade': 753, - 'arrowboth': 1042, - 'arrowleft': 987, - 'arrowup': 603, - 'arrowright': 987, - 'arrowdown': 603, - 'degree': 400, - 'plusminus': 549, - 'second': 411, - 'greaterequal': 549, - 'multiply': 549, - 'proportional': 713, - 'partialdiff': 494, - 'bullet': 460, - 'divide': 549, - 'notequal': 549, - 'equivalence': 549, - 'approxequal': 549, - 'ellipsis': 1000, - 'arrowvertex': 603, - 'arrowhorizex': 1000, - 'carriagereturn': 658, - 'aleph': 823, - 'Ifraktur': 686, - 'Rfraktur': 795, - 'weierstrass': 987, - 'circlemultiply': 768, - 'circleplus': 768, - 'emptyset': 823, - 'intersection': 768, - 'union': 768, - 'propersuperset': 713, - 'reflexsuperset': 713, - 'notsubset': 713, - 'propersubset': 713, - 'reflexsubset': 713, - 'element': 713, - 'notelement': 713, - 'angle': 768, - 'gradient': 713, - 'registerserif': 790, - 'copyrightserif': 790, - 'trademarkserif': 890, - 'product': 823, - 'radical': 549, - 'dotmath': 250, - 'logicalnot': 713, - 'logicaland': 603, - 'logicalor': 603, - 'arrowdblboth': 1042, - 'arrowdblleft': 987, - 'arrowdblup': 603, - 'arrowdblright': 987, - 'arrowdbldown': 603, - 'lozenge': 494, - 'angleleft': 329, - 'registersans': 790, - 'copyrightsans': 790, - 'trademarksans': 786, - 'summation': 713, - 'parenlefttp': 384, - 'parenleftex': 384, - 'parenleftbt': 384, - 'bracketlefttp': 384, - 'bracketleftex': 384, - 'bracketleftbt': 384, - 'bracelefttp': 494, - 'braceleftmid': 494, - 'braceleftbt': 494, - 'braceex': 494, - 'angleright': 329, - 'integral': 274, - 'integraltp': 686, - 'integralex': 686, - 'integralbt': 686, - 'parenrighttp': 384, - 'parenrightex': 384, - 'parenrightbt': 384, - 'bracketrighttp': 384, - 'bracketrightex': 384, - 'bracketrightbt': 384, - 'bracerighttp': 494, - 'bracerightmid': 494, - 'bracerightbt': 494, - 'apple': 790 - }, - 'Times-Roman': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 408, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 564, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 278, - 'semicolon': 278, - 'less': 564, - 'equal': 564, - 'greater': 564, - 'question': 444, - 'at': 921, - 'A': 722, - 'B': 667, - 'C': 667, - 'D': 722, - 'E': 611, - 'F': 556, - 'G': 722, - 'H': 722, - 'I': 333, - 'J': 389, - 'K': 722, - 'L': 611, - 'M': 889, - 'N': 722, - 'O': 722, - 'P': 556, - 'Q': 722, - 'R': 667, - 'S': 556, - 'T': 611, - 'U': 722, - 'V': 722, - 'W': 944, - 'X': 722, - 'Y': 722, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 469, - 'underscore': 500, - 'quoteleft': 333, - 'a': 444, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 500, - 'i': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'm': 778, - 'n': 500, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 333, - 's': 389, - 't': 278, - 'u': 500, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 444, - 'braceleft': 480, - 'bar': 200, - 'braceright': 480, - 'asciitilde': 541, - 'exclamdown': 333, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 180, - 'quotedblleft': 444, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 453, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 444, - 'quotedblright': 444, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 444, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 889, - 'ordfeminine': 276, - 'Lslash': 611, - 'Oslash': 722, - 'OE': 889, - 'ordmasculine': 310, - 'ae': 667, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 500, - 'Idieresis': 333, - 'eacute': 444, - 'abreve': 444, - 'uhungarumlaut': 500, - 'ecaron': 444, - 'Ydieresis': 722, - 'divide': 564, - 'Yacute': 722, - 'Acircumflex': 722, - 'aacute': 444, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 444, - 'Uacute': 722, - 'uogonek': 500, - 'Edieresis': 611, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 760, - 'Emacron': 611, - 'ccaron': 444, - 'aring': 444, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 444, - 'Tcommaaccent': 611, - 'Cacute': 667, - 'atilde': 444, - 'Edotaccent': 611, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 667, - 'Gcommaaccent': 722, - 'ucircumflex': 500, - 'acircumflex': 444, - 'Amacron': 722, - 'rcaron': 333, - 'ccedilla': 444, - 'Zdotaccent': 611, - 'Thorn': 556, - 'Omacron': 722, - 'Racute': 667, - 'Sacute': 556, - 'dcaron': 588, - 'Umacron': 722, - 'uring': 500, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 564, - 'uacute': 500, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 611, - 'adieresis': 444, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 500, - 'umacron': 500, - 'Ncaron': 722, - 'Iacute': 333, - 'plusminus': 564, - 'brokenbar': 200, - 'registered': 760, - 'Gbreve': 722, - 'Idotaccent': 333, - 'summation': 600, - 'Egrave': 611, - 'racute': 333, - 'omacron': 500, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 326, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 444, - 'zacute': 444, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 444, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 500, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 611, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 344, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 980, - 'edotaccent': 444, - 'Igrave': 333, - 'Imacron': 333, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 500, - 'Uhungarumlaut': 722, - 'Eacute': 611, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 500, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 667, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 722, - 'zdotaccent': 444, - 'Ecaron': 611, - 'Iogonek': 333, - 'kcommaaccent': 500, - 'minus': 564, - 'Icircumflex': 333, - 'ncaron': 500, - 'tcommaaccent': 278, - 'logicalnot': 564, - 'odieresis': 500, - 'udieresis': 500, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 444, - 'ncommaaccent': 500, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-Bold': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 555, - 'numbersign': 500, - 'dollar': 500, - 'percent': 1000, - 'ampersand': 833, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 570, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 570, - 'equal': 570, - 'greater': 570, - 'question': 500, - 'at': 930, - 'A': 722, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 778, - 'I': 389, - 'J': 500, - 'K': 778, - 'L': 667, - 'M': 944, - 'N': 722, - 'O': 778, - 'P': 611, - 'Q': 778, - 'R': 722, - 'S': 556, - 'T': 667, - 'U': 722, - 'V': 722, - 'W': 1000, - 'X': 722, - 'Y': 722, - 'Z': 667, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 581, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 556, - 'c': 444, - 'd': 556, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 556, - 'i': 278, - 'j': 333, - 'k': 556, - 'l': 278, - 'm': 833, - 'n': 556, - 'o': 500, - 'p': 556, - 'q': 556, - 'r': 444, - 's': 389, - 't': 333, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 444, - 'braceleft': 394, - 'bar': 220, - 'braceright': 394, - 'asciitilde': 520, - 'exclamdown': 333, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 278, - 'quotedblleft': 500, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 540, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 300, - 'Lslash': 667, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 330, - 'ae': 722, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 556, - 'Idieresis': 389, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 556, - 'ecaron': 444, - 'Ydieresis': 722, - 'divide': 570, - 'Yacute': 722, - 'Acircumflex': 722, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 747, - 'Emacron': 667, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 667, - 'Cacute': 722, - 'atilde': 500, - 'Edotaccent': 667, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 500, - 'Amacron': 722, - 'rcaron': 444, - 'ccedilla': 444, - 'Zdotaccent': 667, - 'Thorn': 611, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 556, - 'dcaron': 672, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 300, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 570, - 'uacute': 556, - 'Tcaron': 667, - 'partialdiff': 494, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 389, - 'plusminus': 570, - 'brokenbar': 220, - 'registered': 747, - 'Gbreve': 778, - 'Idotaccent': 389, - 'summation': 600, - 'Egrave': 667, - 'racute': 444, - 'omacron': 500, - 'Zacute': 667, - 'Zcaron': 667, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 416, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 444, - 'zacute': 444, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 300, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 394, - 'Kcommaaccent': 778, - 'Lacute': 667, - 'trademark': 1000, - 'edotaccent': 444, - 'Igrave': 389, - 'Imacron': 389, - 'Lcaron': 667, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 444, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 722, - 'Lcommaaccent': 667, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 444, - 'Ecaron': 667, - 'Iogonek': 389, - 'kcommaaccent': 556, - 'minus': 570, - 'Icircumflex': 389, - 'ncaron': 556, - 'tcommaaccent': 333, - 'logicalnot': 570, - 'odieresis': 500, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 444, - 'ncommaaccent': 556, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-BoldItalic': { - 'space': 250, - 'exclam': 389, - 'quotedbl': 555, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 570, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 570, - 'equal': 570, - 'greater': 570, - 'question': 500, - 'at': 832, - 'A': 667, - 'B': 667, - 'C': 667, - 'D': 722, - 'E': 667, - 'F': 667, - 'G': 722, - 'H': 778, - 'I': 389, - 'J': 500, - 'K': 667, - 'L': 611, - 'M': 889, - 'N': 722, - 'O': 722, - 'P': 611, - 'Q': 722, - 'R': 667, - 'S': 556, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 889, - 'X': 667, - 'Y': 611, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 570, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 556, - 'i': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'm': 778, - 'n': 556, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 389, - 's': 389, - 't': 278, - 'u': 556, - 'v': 444, - 'w': 667, - 'x': 500, - 'y': 444, - 'z': 389, - 'braceleft': 348, - 'bar': 220, - 'braceright': 348, - 'asciitilde': 570, - 'exclamdown': 389, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 278, - 'quotedblleft': 500, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 500, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 944, - 'ordfeminine': 266, - 'Lslash': 611, - 'Oslash': 722, - 'OE': 944, - 'ordmasculine': 300, - 'ae': 722, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 500, - 'Idieresis': 389, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 556, - 'ecaron': 444, - 'Ydieresis': 611, - 'divide': 570, - 'Yacute': 611, - 'Acircumflex': 667, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 444, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 747, - 'Emacron': 667, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 611, - 'Cacute': 667, - 'atilde': 500, - 'Edotaccent': 667, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 667, - 'Gcommaaccent': 722, - 'ucircumflex': 556, - 'acircumflex': 500, - 'Amacron': 667, - 'rcaron': 389, - 'ccedilla': 444, - 'Zdotaccent': 611, - 'Thorn': 611, - 'Omacron': 722, - 'Racute': 667, - 'Sacute': 556, - 'dcaron': 608, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 570, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 444, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 389, - 'plusminus': 570, - 'brokenbar': 220, - 'registered': 747, - 'Gbreve': 722, - 'Idotaccent': 389, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 500, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 366, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 444, - 'zacute': 389, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 576, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 667, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 382, - 'Kcommaaccent': 667, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 444, - 'Igrave': 389, - 'Imacron': 389, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 556, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 667, - 'Lcommaaccent': 611, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 722, - 'zdotaccent': 389, - 'Ecaron': 667, - 'Iogonek': 389, - 'kcommaaccent': 500, - 'minus': 606, - 'Icircumflex': 389, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 606, - 'odieresis': 500, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 389, - 'ncommaaccent': 556, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-Italic': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 420, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 675, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 675, - 'equal': 675, - 'greater': 675, - 'question': 500, - 'at': 920, - 'A': 611, - 'B': 611, - 'C': 667, - 'D': 722, - 'E': 611, - 'F': 611, - 'G': 722, - 'H': 722, - 'I': 333, - 'J': 444, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 667, - 'O': 722, - 'P': 611, - 'Q': 722, - 'R': 611, - 'S': 500, - 'T': 556, - 'U': 722, - 'V': 611, - 'W': 833, - 'X': 611, - 'Y': 556, - 'Z': 556, - 'bracketleft': 389, - 'backslash': 278, - 'bracketright': 389, - 'asciicircum': 422, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 278, - 'g': 500, - 'h': 500, - 'i': 278, - 'j': 278, - 'k': 444, - 'l': 278, - 'm': 722, - 'n': 500, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 389, - 's': 389, - 't': 278, - 'u': 500, - 'v': 444, - 'w': 667, - 'x': 444, - 'y': 444, - 'z': 389, - 'braceleft': 400, - 'bar': 275, - 'braceright': 400, - 'asciitilde': 541, - 'exclamdown': 389, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 214, - 'quotedblleft': 556, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 523, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 556, - 'quotedblright': 556, - 'guillemotright': 500, - 'ellipsis': 889, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 889, - 'AE': 889, - 'ordfeminine': 276, - 'Lslash': 556, - 'Oslash': 722, - 'OE': 944, - 'ordmasculine': 310, - 'ae': 667, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 667, - 'germandbls': 500, - 'Idieresis': 333, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 500, - 'ecaron': 444, - 'Ydieresis': 556, - 'divide': 675, - 'Yacute': 556, - 'Acircumflex': 611, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 444, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 500, - 'Edieresis': 611, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 760, - 'Emacron': 611, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 667, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 556, - 'Cacute': 667, - 'atilde': 500, - 'Edotaccent': 611, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 611, - 'Gcommaaccent': 722, - 'ucircumflex': 500, - 'acircumflex': 500, - 'Amacron': 611, - 'rcaron': 389, - 'ccedilla': 444, - 'Zdotaccent': 556, - 'Thorn': 611, - 'Omacron': 722, - 'Racute': 611, - 'Sacute': 500, - 'dcaron': 544, - 'Umacron': 722, - 'uring': 500, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 611, - 'Abreve': 611, - 'multiply': 675, - 'uacute': 500, - 'Tcaron': 556, - 'partialdiff': 476, - 'ydieresis': 444, - 'Nacute': 667, - 'icircumflex': 278, - 'Ecircumflex': 611, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 500, - 'umacron': 500, - 'Ncaron': 667, - 'Iacute': 333, - 'plusminus': 675, - 'brokenbar': 275, - 'registered': 760, - 'Gbreve': 722, - 'Idotaccent': 333, - 'summation': 600, - 'Egrave': 611, - 'racute': 389, - 'omacron': 500, - 'Zacute': 556, - 'Zcaron': 556, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 300, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 611, - 'Adieresis': 611, - 'egrave': 444, - 'zacute': 389, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 500, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 611, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 500, - 'lcaron': 300, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 980, - 'edotaccent': 444, - 'Igrave': 333, - 'Imacron': 333, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 500, - 'Uhungarumlaut': 722, - 'Eacute': 611, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 500, - 'Scommaaccent': 500, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 500, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 667, - 'otilde': 500, - 'Rcommaaccent': 611, - 'Lcommaaccent': 556, - 'Atilde': 611, - 'Aogonek': 611, - 'Aring': 611, - 'Otilde': 722, - 'zdotaccent': 389, - 'Ecaron': 611, - 'Iogonek': 333, - 'kcommaaccent': 444, - 'minus': 675, - 'Icircumflex': 333, - 'ncaron': 500, - 'tcommaaccent': 278, - 'logicalnot': 675, - 'odieresis': 500, - 'udieresis': 500, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 389, - 'ncommaaccent': 500, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'ZapfDingbats': { - 'space': 278, - 'a1': 974, - 'a2': 961, - 'a202': 974, - 'a3': 980, - 'a4': 719, - 'a5': 789, - 'a119': 790, - 'a118': 791, - 'a117': 690, - 'a11': 960, - 'a12': 939, - 'a13': 549, - 'a14': 855, - 'a15': 911, - 'a16': 933, - 'a105': 911, - 'a17': 945, - 'a18': 974, - 'a19': 755, - 'a20': 846, - 'a21': 762, - 'a22': 761, - 'a23': 571, - 'a24': 677, - 'a25': 763, - 'a26': 760, - 'a27': 759, - 'a28': 754, - 'a6': 494, - 'a7': 552, - 'a8': 537, - 'a9': 577, - 'a10': 692, - 'a29': 786, - 'a30': 788, - 'a31': 788, - 'a32': 790, - 'a33': 793, - 'a34': 794, - 'a35': 816, - 'a36': 823, - 'a37': 789, - 'a38': 841, - 'a39': 823, - 'a40': 833, - 'a41': 816, - 'a42': 831, - 'a43': 923, - 'a44': 744, - 'a45': 723, - 'a46': 749, - 'a47': 790, - 'a48': 792, - 'a49': 695, - 'a50': 776, - 'a51': 768, - 'a52': 792, - 'a53': 759, - 'a54': 707, - 'a55': 708, - 'a56': 682, - 'a57': 701, - 'a58': 826, - 'a59': 815, - 'a60': 789, - 'a61': 789, - 'a62': 707, - 'a63': 687, - 'a64': 696, - 'a65': 689, - 'a66': 786, - 'a67': 787, - 'a68': 713, - 'a69': 791, - 'a70': 785, - 'a71': 791, - 'a72': 873, - 'a73': 761, - 'a74': 762, - 'a203': 762, - 'a75': 759, - 'a204': 759, - 'a76': 892, - 'a77': 892, - 'a78': 788, - 'a79': 784, - 'a81': 438, - 'a82': 138, - 'a83': 277, - 'a84': 415, - 'a97': 392, - 'a98': 392, - 'a99': 668, - 'a100': 668, - 'a89': 390, - 'a90': 390, - 'a93': 317, - 'a94': 317, - 'a91': 276, - 'a92': 276, - 'a205': 509, - 'a85': 509, - 'a206': 410, - 'a86': 410, - 'a87': 234, - 'a88': 234, - 'a95': 334, - 'a96': 334, - 'a101': 732, - 'a102': 544, - 'a103': 544, - 'a104': 910, - 'a106': 667, - 'a107': 760, - 'a108': 760, - 'a112': 776, - 'a111': 595, - 'a110': 694, - 'a109': 626, - 'a120': 788, - 'a121': 788, - 'a122': 788, - 'a123': 788, - 'a124': 788, - 'a125': 788, - 'a126': 788, - 'a127': 788, - 'a128': 788, - 'a129': 788, - 'a130': 788, - 'a131': 788, - 'a132': 788, - 'a133': 788, - 'a134': 788, - 'a135': 788, - 'a136': 788, - 'a137': 788, - 'a138': 788, - 'a139': 788, - 'a140': 788, - 'a141': 788, - 'a142': 788, - 'a143': 788, - 'a144': 788, - 'a145': 788, - 'a146': 788, - 'a147': 788, - 'a148': 788, - 'a149': 788, - 'a150': 788, - 'a151': 788, - 'a152': 788, - 'a153': 788, - 'a154': 788, - 'a155': 788, - 'a156': 788, - 'a157': 788, - 'a158': 788, - 'a159': 788, - 'a160': 894, - 'a161': 838, - 'a163': 1016, - 'a164': 458, - 'a196': 748, - 'a165': 924, - 'a192': 748, - 'a166': 918, - 'a167': 927, - 'a168': 928, - 'a169': 928, - 'a170': 834, - 'a171': 873, - 'a172': 828, - 'a173': 924, - 'a162': 924, - 'a174': 917, - 'a175': 930, - 'a176': 931, - 'a177': 463, - 'a178': 883, - 'a179': 836, - 'a193': 836, - 'a180': 867, - 'a199': 867, - 'a181': 696, - 'a200': 696, - 'a182': 874, - 'a201': 874, - 'a183': 760, - 'a184': 946, - 'a197': 771, - 'a185': 865, - 'a194': 771, - 'a198': 888, - 'a186': 967, - 'a195': 888, - 'a187': 831, - 'a188': 873, - 'a189': 927, - 'a190': 970, - 'a191': 918 - } -}; - - -var EOF = {}; - -function isEOF(v) { - return (v === EOF); -} - -var MAX_LENGTH_TO_CACHE = 1000; - -var Parser = (function ParserClosure() { - function Parser(lexer, allowStreams, xref) { - this.lexer = lexer; - this.allowStreams = allowStreams; - this.xref = xref; - this.imageCache = {}; - this.refill(); - } - - Parser.prototype = { - refill: function Parser_refill() { - this.buf1 = this.lexer.getObj(); - this.buf2 = this.lexer.getObj(); - }, - shift: function Parser_shift() { - if (isCmd(this.buf2, 'ID')) { - this.buf1 = this.buf2; - this.buf2 = null; - } else { - this.buf1 = this.buf2; - this.buf2 = this.lexer.getObj(); - } - }, - tryShift: function Parser_tryShift() { - try { - this.shift(); - return true; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - // Upon failure, the caller should reset this.lexer.pos to a known good - // state and call this.shift() twice to reset the buffers. - return false; - } - }, - getObj: function Parser_getObj(cipherTransform) { - var buf1 = this.buf1; - this.shift(); - - if (buf1 instanceof Cmd) { - switch (buf1.cmd) { - case 'BI': // inline image - return this.makeInlineImage(cipherTransform); - case '[': // array - var array = []; - while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) { - array.push(this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - error('End of file inside array'); - } - this.shift(); - return array; - case '<<': // dictionary or stream - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - info('Malformed dictionary: key must be a name object'); - this.shift(); - continue; - } - - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - error('End of file inside dictionary'); - } - - // Stream objects are not allowed inside content streams or - // object streams. - if (isCmd(this.buf2, 'stream')) { - return (this.allowStreams ? - this.makeStream(dict, cipherTransform) : dict); - } - this.shift(); - return dict; - default: // simple object - return buf1; - } - } - - if (isInt(buf1)) { // indirect reference or integer - var num = buf1; - if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { - var ref = new Ref(num, this.buf1); - this.shift(); - this.shift(); - return ref; - } - return num; - } - - if (isString(buf1)) { // string - var str = buf1; - if (cipherTransform) { - str = cipherTransform.decryptString(str); - } - return str; - } - - // simple object - return buf1; - }, - /** - * Find the end of the stream by searching for the /EI\s/. - * @returns {number} The inline stream length. - */ - findDefaultInlineStreamEnd: - function Parser_findDefaultInlineStreamEnd(stream) { - var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD; - var startPos = stream.pos, state = 0, ch, i, n, followingBytes; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else { - assert(state === 2); - if (ch === SPACE || ch === LF || ch === CR) { - // Let's check the next five bytes are ASCII... just be sure. - n = 5; - followingBytes = stream.peekBytes(n); - for (i = 0; i < n; i++) { - ch = followingBytes[i]; - if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) { - // Not a LF, CR, SPACE or any visible ASCII character, i.e. - // it's binary stuff. Resetting the state. - state = 0; - break; - } - } - if (state === 2) { - break; // Finished! - } - } else { - state = 0; - } - } - } - return ((stream.pos - 4) - startPos); - }, - /** - * Find the EOI (end-of-image) marker 0xFFD9 of the stream. - * @returns {number} The inline stream length. - */ - findDCTDecodeInlineStreamEnd: - function Parser_findDCTDecodeInlineStreamEnd(stream) { - var startPos = stream.pos, foundEOI = false, b, markerLength, length; - while ((b = stream.getByte()) !== -1) { - if (b !== 0xFF) { // Not a valid marker. - continue; - } - switch (stream.getByte()) { - case 0x00: // Byte stuffing. - // 0xFF00 appears to be a very common byte sequence in JPEG images. - break; - - case 0xFF: // Fill byte. - // Avoid skipping a valid marker, resetting the stream position. - stream.skip(-1); - break; - - case 0xD9: // EOI - foundEOI = true; - break; - - case 0xC0: // SOF0 - case 0xC1: // SOF1 - case 0xC2: // SOF2 - case 0xC3: // SOF3 - - case 0xC5: // SOF5 - case 0xC6: // SOF6 - case 0xC7: // SOF7 - - case 0xC9: // SOF9 - case 0xCA: // SOF10 - case 0xCB: // SOF11 - - case 0xCD: // SOF13 - case 0xCE: // SOF14 - case 0xCF: // SOF15 - - case 0xC4: // DHT - case 0xCC: // DAC - - case 0xDA: // SOS - case 0xDB: // DQT - case 0xDC: // DNL - case 0xDD: // DRI - case 0xDE: // DHP - case 0xDF: // EXP - - case 0xE0: // APP0 - case 0xE1: // APP1 - case 0xE2: // APP2 - case 0xE3: // APP3 - case 0xE4: // APP4 - case 0xE5: // APP5 - case 0xE6: // APP6 - case 0xE7: // APP7 - case 0xE8: // APP8 - case 0xE9: // APP9 - case 0xEA: // APP10 - case 0xEB: // APP11 - case 0xEC: // APP12 - case 0xED: // APP13 - case 0xEE: // APP14 - case 0xEF: // APP15 - - case 0xFE: // COM - // The marker should be followed by the length of the segment. - markerLength = stream.getUint16(); - if (markerLength > 2) { - // |markerLength| contains the byte length of the marker segment, - // including its own length (2 bytes) and excluding the marker. - stream.skip(markerLength - 2); // Jump to the next marker. - } else { - // The marker length is invalid, resetting the stream position. - stream.skip(-2); - } - break; - } - if (foundEOI) { - break; - } - } - length = stream.pos - startPos; - if (b === -1) { - warn('Inline DCTDecode image stream: ' + - 'EOI marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCII85DecodeInlineStreamEnd: - function Parser_findASCII85DecodeInlineStreamEnd(stream) { - var TILDE = 0x7E, GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === TILDE && stream.peekByte() === GT) { - stream.skip(); - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCII85Decode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCIIHexDecodeInlineStreamEnd: - function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { - var GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === GT) { - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCIIHexDecode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Skip over the /EI/ for streams where we search for an EOD marker. - */ - inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { - var E = 0x45, I = 0x49; - var state = 0, ch; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else if (state === 2) { - break; - } - } - }, - makeInlineImage: function Parser_makeInlineImage(cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // Parse dictionary. - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - error('Dictionary key must be a name object'); - } - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - - // Extract the name of the first (i.e. the current) image filter. - var filter = dict.get('Filter', 'F'), filterName; - if (isName(filter)) { - filterName = filter.name; - } else if (isArray(filter) && isName(filter[0])) { - filterName = filter[0].name; - } - - // Parse image stream. - var startPos = stream.pos, length, i, ii; - if (filterName === 'DCTDecode' || filterName === 'DCT') { - length = this.findDCTDecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCII85Decide' || filterName === 'A85') { - length = this.findASCII85DecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') { - length = this.findASCIIHexDecodeInlineStreamEnd(stream); - } else { - length = this.findDefaultInlineStreamEnd(stream); - } - var imageStream = stream.makeSubStream(startPos, length, dict); - - // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their - // adler32 checksum. - var adler32; - if (length < MAX_LENGTH_TO_CACHE) { - var imageBytes = imageStream.getBytes(); - imageStream.reset(); - - var a = 1; - var b = 0; - for (i = 0, ii = imageBytes.length; i < ii; ++i) { - // No modulo required in the loop if imageBytes.length < 5552. - a += imageBytes[i] & 0xff; - b += a; - } - adler32 = ((b % 65521) << 16) | (a % 65521); - - if (this.imageCache.adler32 === adler32) { - this.buf2 = Cmd.get('EI'); - this.shift(); - - this.imageCache[adler32].reset(); - return this.imageCache[adler32]; - } - } - - if (cipherTransform) { - imageStream = cipherTransform.createStream(imageStream, length); - } - - imageStream = this.filter(imageStream, dict, length); - imageStream.dict = dict; - if (adler32 !== undefined) { - imageStream.cacheKey = 'inline_' + length + '_' + adler32; - this.imageCache[adler32] = imageStream; - } - - this.buf2 = Cmd.get('EI'); - this.shift(); - - return imageStream; - }, - makeStream: function Parser_makeStream(dict, cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // get stream start position - lexer.skipToNextLine(); - var pos = stream.pos - 1; - - // get length - var length = dict.get('Length'); - if (!isInt(length)) { - info('Bad ' + length + ' attribute in stream'); - length = 0; - } - - // skip over the stream data - stream.pos = pos + length; - lexer.nextChar(); - - // Shift '>>' and check whether the new object marks the end of the stream - if (this.tryShift() && isCmd(this.buf2, 'endstream')) { - this.shift(); // 'stream' - } else { - // bad stream length, scanning for endstream - stream.pos = pos; - var SCAN_BLOCK_SIZE = 2048; - var ENDSTREAM_SIGNATURE_LENGTH = 9; - var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6D]; - var skipped = 0, found = false, i, j; - while (stream.pos < stream.end) { - var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE); - var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH; - if (scanLength <= 0) { - break; - } - found = false; - for (i = 0, j = 0; i < scanLength; i++) { - var b = scanBytes[i]; - if (b !== ENDSTREAM_SIGNATURE[j]) { - i -= j; - j = 0; - } else { - j++; - if (j >= ENDSTREAM_SIGNATURE_LENGTH) { - i++; - found = true; - break; - } - } - } - if (found) { - skipped += i - ENDSTREAM_SIGNATURE_LENGTH; - stream.pos += i - ENDSTREAM_SIGNATURE_LENGTH; - break; - } - skipped += scanLength; - stream.pos += scanLength; - } - if (!found) { - error('Missing endstream'); - } - length = skipped; - - lexer.nextChar(); - this.shift(); - this.shift(); - } - this.shift(); // 'endstream' - - stream = stream.makeSubStream(pos, length, dict); - if (cipherTransform) { - stream = cipherTransform.createStream(stream, length); - } - stream = this.filter(stream, dict, length); - stream.dict = dict; - return stream; - }, - filter: function Parser_filter(stream, dict, length) { - var filter = dict.get('Filter', 'F'); - var params = dict.get('DecodeParms', 'DP'); - if (isName(filter)) { - return this.makeFilter(stream, filter.name, length, params); - } - - var maybeLength = length; - if (isArray(filter)) { - var filterArray = filter; - var paramsArray = params; - for (var i = 0, ii = filterArray.length; i < ii; ++i) { - filter = filterArray[i]; - if (!isName(filter)) { - error('Bad filter name: ' + filter); - } - - params = null; - if (isArray(paramsArray) && (i in paramsArray)) { - params = paramsArray[i]; - } - stream = this.makeFilter(stream, filter.name, maybeLength, params); - // after the first stream the length variable is invalid - maybeLength = null; - } - } - return stream; - }, - makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { - if (stream.dict.get('Length') === 0 && !maybeLength) { - warn('Empty "' + name + '" stream.'); - return new NullStream(stream); - } - try { - if (params && this.xref) { - params = this.xref.fetchIfRef(params); - } - var xrefStreamStats = this.xref.stats.streamTypes; - if (name === 'FlateDecode' || name === 'Fl') { - xrefStreamStats[StreamType.FLATE] = true; - if (params) { - return new PredictorStream(new FlateStream(stream, maybeLength), - maybeLength, params); - } - return new FlateStream(stream, maybeLength); - } - if (name === 'LZWDecode' || name === 'LZW') { - xrefStreamStats[StreamType.LZW] = true; - var earlyChange = 1; - if (params) { - if (params.has('EarlyChange')) { - earlyChange = params.get('EarlyChange'); - } - return new PredictorStream( - new LZWStream(stream, maybeLength, earlyChange), - maybeLength, params); - } - return new LZWStream(stream, maybeLength, earlyChange); - } - if (name === 'DCTDecode' || name === 'DCT') { - xrefStreamStats[StreamType.DCT] = true; - return new JpegStream(stream, maybeLength, stream.dict, this.xref); - } - if (name === 'JPXDecode' || name === 'JPX') { - xrefStreamStats[StreamType.JPX] = true; - return new JpxStream(stream, maybeLength, stream.dict); - } - if (name === 'ASCII85Decode' || name === 'A85') { - xrefStreamStats[StreamType.A85] = true; - return new Ascii85Stream(stream, maybeLength); - } - if (name === 'ASCIIHexDecode' || name === 'AHx') { - xrefStreamStats[StreamType.AHX] = true; - return new AsciiHexStream(stream, maybeLength); - } - if (name === 'CCITTFaxDecode' || name === 'CCF') { - xrefStreamStats[StreamType.CCF] = true; - return new CCITTFaxStream(stream, maybeLength, params); - } - if (name === 'RunLengthDecode' || name === 'RL') { - xrefStreamStats[StreamType.RL] = true; - return new RunLengthStream(stream, maybeLength); - } - if (name === 'JBIG2Decode') { - xrefStreamStats[StreamType.JBIG] = true; - return new Jbig2Stream(stream, maybeLength, stream.dict); - } - warn('filter "' + name + '" not supported yet'); - return stream; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Invalid stream: \"' + ex + '\"'); - return new NullStream(stream); - } - } - }; - - return Parser; -})(); - -var Lexer = (function LexerClosure() { - function Lexer(stream, knownCommands) { - this.stream = stream; - this.nextChar(); - - // While lexing, we build up many strings one char at a time. Using += for - // this can result in lots of garbage strings. It's better to build an - // array of single-char strings and then join() them together at the end. - // And reusing a single array (i.e. |this.strBuf|) over and over for this - // purpose uses less memory than using a new array for each string. - this.strBuf = []; - - // The PDFs might have "glued" commands with other commands, operands or - // literals, e.g. "q1". The knownCommands is a dictionary of the valid - // commands and their prefixes. The prefixes are built the following way: - // if there a command that is a prefix of the other valid command or - // literal (e.g. 'f' and 'false') the following prefixes must be included, - // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no - // other commands or literals as a prefix. The knowCommands is optional. - this.knownCommands = knownCommands; - } - - Lexer.isSpace = function Lexer_isSpace(ch) { - // Space is one of the following characters: SPACE, TAB, CR or LF. - return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); - }; - - // A '1' in this array means the character is white space. A '1' or - // '2' means the character ends a name or command. - var specialChars = [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x - 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx - ]; - - function toHexDigit(ch) { - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - return ch & 0x0F; - } - if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'F', 'a'-'f' - return (ch & 0x0F) + 9; - } - return -1; - } - - Lexer.prototype = { - nextChar: function Lexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - peekChar: function Lexer_peekChar() { - return this.stream.peekByte(); - }, - getNumber: function Lexer_getNumber() { - var ch = this.currentChar; - var eNotation = false; - var divideBy = 0; // different from 0 if it's a floating point value - var sign = 1; - - if (ch === 0x2D) { // '-' - sign = -1; - ch = this.nextChar(); - - if (ch === 0x2D) { // '-' - // Ignore double negative (this is consistent with Adobe Reader). - ch = this.nextChar(); - } - } else if (ch === 0x2B) { // '+' - ch = this.nextChar(); - } - if (ch === 0x2E) { // '.' - divideBy = 10; - ch = this.nextChar(); - } - if (ch < 0x30 || ch > 0x39) { // '0' - '9' - error('Invalid number: ' + String.fromCharCode(ch)); - return 0; - } - - var baseValue = ch - 0x30; // '0' - var powerValue = 0; - var powerValueSign = 1; - - while ((ch = this.nextChar()) >= 0) { - if (0x30 <= ch && ch <= 0x39) { // '0' - '9' - var currentDigit = ch - 0x30; // '0' - if (eNotation) { // We are after an 'e' or 'E' - powerValue = powerValue * 10 + currentDigit; - } else { - if (divideBy !== 0) { // We are after a point - divideBy *= 10; - } - baseValue = baseValue * 10 + currentDigit; - } - } else if (ch === 0x2E) { // '.' - if (divideBy === 0) { - divideBy = 1; - } else { - // A number can have only one '.' - break; - } - } else if (ch === 0x2D) { // '-' - // ignore minus signs in the middle of numbers to match - // Adobe's behavior - warn('Badly formated number'); - } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e' - // 'E' can be either a scientific notation or the beginning of a new - // operator - ch = this.peekChar(); - if (ch === 0x2B || ch === 0x2D) { // '+', '-' - powerValueSign = (ch === 0x2D) ? -1 : 1; - this.nextChar(); // Consume the sign character - } else if (ch < 0x30 || ch > 0x39) { // '0' - '9' - // The 'E' must be the beginning of a new operator - break; - } - eNotation = true; - } else { - // the last character doesn't belong to us - break; - } - } - - if (divideBy !== 0) { - baseValue /= divideBy; - } - if (eNotation) { - baseValue *= Math.pow(10, powerValueSign * powerValue); - } - return sign * baseValue; - }, - getString: function Lexer_getString() { - var numParen = 1; - var done = false; - var strBuf = this.strBuf; - strBuf.length = 0; - - var ch = this.nextChar(); - while (true) { - var charBuffered = false; - switch (ch | 0) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x28: // '(' - ++numParen; - strBuf.push('('); - break; - case 0x29: // ')' - if (--numParen === 0) { - this.nextChar(); // consume strings ')' - done = true; - } else { - strBuf.push(')'); - } - break; - case 0x5C: // '\\' - ch = this.nextChar(); - switch (ch) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x6E: // 'n' - strBuf.push('\n'); - break; - case 0x72: // 'r' - strBuf.push('\r'); - break; - case 0x74: // 't' - strBuf.push('\t'); - break; - case 0x62: // 'b' - strBuf.push('\b'); - break; - case 0x66: // 'f' - strBuf.push('\f'); - break; - case 0x5C: // '\' - case 0x28: // '(' - case 0x29: // ')' - strBuf.push(String.fromCharCode(ch)); - break; - case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3' - case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7' - var x = ch & 0x0F; - ch = this.nextChar(); - charBuffered = true; - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - x = (x << 3) + (ch & 0x0F); - ch = this.nextChar(); - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - charBuffered = false; - x = (x << 3) + (ch & 0x0F); - } - } - strBuf.push(String.fromCharCode(x)); - break; - case 0x0D: // CR - if (this.peekChar() === 0x0A) { // LF - this.nextChar(); - } - break; - case 0x0A: // LF - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - if (done) { - break; - } - if (!charBuffered) { - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getName: function Lexer_getName() { - var ch, previousCh; - var strBuf = this.strBuf; - strBuf.length = 0; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - if (ch === 0x23) { // '#' - ch = this.nextChar(); - if (specialChars[ch]) { - warn('Lexer_getName: ' + - 'NUMBER SIGN (#) should be followed by a hexadecimal number.'); - strBuf.push('#'); - break; - } - var x = toHexDigit(ch); - if (x !== -1) { - previousCh = ch; - ch = this.nextChar(); - var x2 = toHexDigit(ch); - if (x2 === -1) { - warn('Lexer_getName: Illegal digit (' + - String.fromCharCode(ch) +') in hexadecimal number.'); - strBuf.push('#', String.fromCharCode(previousCh)); - if (specialChars[ch]) { - break; - } - strBuf.push(String.fromCharCode(ch)); - continue; - } - strBuf.push(String.fromCharCode((x << 4) | x2)); - } else { - strBuf.push('#', String.fromCharCode(ch)); - } - } else { - strBuf.push(String.fromCharCode(ch)); - } - } - if (strBuf.length > 127) { - warn('name token is longer than allowed by the spec: ' + strBuf.length); - } - return Name.get(strBuf.join('')); - }, - getHexString: function Lexer_getHexString() { - var strBuf = this.strBuf; - strBuf.length = 0; - var ch = this.currentChar; - var isFirstHex = true; - var firstDigit; - var secondDigit; - while (true) { - if (ch < 0) { - warn('Unterminated hex string'); - break; - } else if (ch === 0x3E) { // '>' - this.nextChar(); - break; - } else if (specialChars[ch] === 1) { - ch = this.nextChar(); - continue; - } else { - if (isFirstHex) { - firstDigit = toHexDigit(ch); - if (firstDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - } else { - secondDigit = toHexDigit(ch); - if (secondDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit)); - } - isFirstHex = !isFirstHex; - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getObj: function Lexer_getObj() { - // skip whitespace and comments - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0A || ch === 0x0D) { // LF, CR - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (specialChars[ch] !== 1) { - break; - } - ch = this.nextChar(); - } - - // start reading token - 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 this.getNumber(); - case 0x28: // '(' - return this.getString(); - case 0x2F: // '/' - return this.getName(); - // array punctuation - case 0x5B: // '[' - this.nextChar(); - return Cmd.get('['); - case 0x5D: // ']' - this.nextChar(); - return Cmd.get(']'); - // hex string or dict punctuation - case 0x3C: // '<' - ch = this.nextChar(); - if (ch === 0x3C) { - // dict punctuation - this.nextChar(); - return Cmd.get('<<'); - } - return this.getHexString(); - // dict punctuation - case 0x3E: // '>' - ch = this.nextChar(); - if (ch === 0x3E) { - this.nextChar(); - return Cmd.get('>>'); - } - return Cmd.get('>'); - case 0x7B: // '{' - this.nextChar(); - return Cmd.get('{'); - case 0x7D: // '}' - this.nextChar(); - return Cmd.get('}'); - case 0x29: // ')' - error('Illegal character: ' + ch); - break; - } - - // command - var str = String.fromCharCode(ch); - var knownCommands = this.knownCommands; - var knownCommandFound = knownCommands && knownCommands[str] !== undefined; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - // stop if known command is found and next character does not make - // the str a command - var possibleCommand = str + String.fromCharCode(ch); - if (knownCommandFound && knownCommands[possibleCommand] === undefined) { - break; - } - if (str.length === 128) { - error('Command token too long: ' + str.length); - } - str = possibleCommand; - knownCommandFound = knownCommands && knownCommands[str] !== undefined; - } - if (str === 'true') { - return true; - } - if (str === 'false') { - return false; - } - if (str === 'null') { - return null; - } - return Cmd.get(str); - }, - skipToNextLine: function Lexer_skipToNextLine() { - var ch = this.currentChar; - while (ch >= 0) { - if (ch === 0x0D) { // CR - ch = this.nextChar(); - if (ch === 0x0A) { // LF - this.nextChar(); - } - break; - } else if (ch === 0x0A) { // LF - this.nextChar(); - break; - } - ch = this.nextChar(); - } - } - }; - - return Lexer; -})(); - -var Linearization = { - create: function LinearizationCreate(stream) { - function getInt(name, allowZeroValue) { - var obj = linDict.get(name); - if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; - } - throw new Error('The "' + name + '" parameter in the linearization ' + - 'dictionary is invalid.'); - } - function getHints() { - var hints = linDict.get('H'), hintsLength, item; - if (isArray(hints) && - ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (var index = 0; index < hintsLength; index++) { - if (!(isInt(item = hints[index]) && item > 0)) { - throw new Error('Hint (' + index + - ') in the linearization dictionary is invalid.'); - } - } - return hints; - } - throw new Error('Hint array in the linearization dictionary is invalid.'); - } - var parser = new Parser(new Lexer(stream), false, null); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - var linDict = parser.getObj(); - var obj, length; - if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) && - isNum(obj = linDict.get('Linearized')) && obj > 0)) { - return null; // No valid linearization dictionary found. - } else if ((length = getInt('L')) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + - 'does not equal the stream length.'); - } - return { - length: length, - hints: getHints(), - objectNumberFirst: getInt('O'), - endFirst: getInt('E'), - numPages: getInt('N'), - mainXRefEntriesOffset: getInt('T'), - pageFirst: (linDict.has('P') ? getInt('P', true) : 0) - }; - } -}; - - -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(); - - this.strBuf = []; - } - PostScriptLexer.prototype = { - nextChar: function PostScriptLexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - getToken: function PostScriptLexer_getToken() { - 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 strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z' - ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) { - strBuf.push(String.fromCharCode(ch)); - } - var str = strBuf.join(''); - 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 strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0) { - if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9' - ch === 0x2D || ch === 0x2E) { // '-', '.' - strBuf.push(String.fromCharCode(ch)); - } else { - break; - } - } - var value = parseFloat(strBuf.join('')); - if (isNaN(value)) { - error('Invalid floating point number: ' + value); - } - return value; - } - }; - return PostScriptLexer; -})(); - - -var Stream = (function StreamClosure() { - function Stream(arrayBuffer, start, length, dict) { - this.bytes = (arrayBuffer instanceof Uint8Array ? - arrayBuffer : new Uint8Array(arrayBuffer)); - this.start = start || 0; - this.pos = this.start; - this.end = (start + length) || this.bytes.length; - this.dict = dict; - } - - // required methods for a stream. if a particular stream does not - // implement these, an error should be thrown - Stream.prototype = { - get length() { - return this.end - this.start; - }, - get isEmpty() { - return this.length === 0; - }, - getByte: function Stream_getByte() { - if (this.pos >= this.end) { - return -1; - } - return this.bytes[this.pos++]; - }, - getUint16: function Stream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function Stream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - // returns subarray of original buffer - // should only be read - getBytes: function Stream_getBytes(length) { - var bytes = this.bytes; - var pos = this.pos; - var strEnd = this.end; - - if (!length) { - return bytes.subarray(pos, strEnd); - } - var end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.pos = end; - return bytes.subarray(pos, end); - }, - peekByte: function Stream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function Stream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - skip: function Stream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function Stream_reset() { - this.pos = this.start; - }, - moveStart: function Stream_moveStart() { - this.start = this.pos; - }, - makeSubStream: function Stream_makeSubStream(start, length, dict) { - return new Stream(this.bytes.buffer, start, length, dict); - }, - isStream: true - }; - - return Stream; -})(); - -var StringStream = (function StringStreamClosure() { - function StringStream(str) { - var length = str.length; - var bytes = new Uint8Array(length); - for (var n = 0; n < length; ++n) { - bytes[n] = str.charCodeAt(n); - } - Stream.call(this, bytes); - } - - StringStream.prototype = Stream.prototype; - - return StringStream; -})(); - -// super class for the decoding streams -var DecodeStream = (function DecodeStreamClosure() { - // Lots of DecodeStreams are created whose buffers are never used. For these - // we share a single empty buffer. This is (a) space-efficient and (b) avoids - // having special cases that would be required if we used |null| for an empty - // buffer. - var emptyBuffer = new Uint8Array(0); - - function DecodeStream(maybeMinBufferLength) { - this.pos = 0; - this.bufferLength = 0; - this.eof = false; - this.buffer = emptyBuffer; - this.minBufferLength = 512; - if (maybeMinBufferLength) { - // Compute the first power of two that is as big as maybeMinBufferLength. - while (this.minBufferLength < maybeMinBufferLength) { - this.minBufferLength *= 2; - } - } - } - - DecodeStream.prototype = { - get isEmpty() { - while (!this.eof && this.bufferLength === 0) { - this.readBlock(); - } - return this.bufferLength === 0; - }, - ensureBuffer: function DecodeStream_ensureBuffer(requested) { - var buffer = this.buffer; - if (requested <= buffer.byteLength) { - return buffer; - } - var size = this.minBufferLength; - while (size < requested) { - size *= 2; - } - var buffer2 = new Uint8Array(size); - buffer2.set(buffer); - return (this.buffer = buffer2); - }, - getByte: function DecodeStream_getByte() { - var pos = this.pos; - while (this.bufferLength <= pos) { - if (this.eof) { - return -1; - } - this.readBlock(); - } - return this.buffer[this.pos++]; - }, - getUint16: function DecodeStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function DecodeStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - getBytes: function DecodeStream_getBytes(length) { - var end, pos = this.pos; - - if (length) { - this.ensureBuffer(pos + length); - end = pos + length; - - while (!this.eof && this.bufferLength < end) { - this.readBlock(); - } - var bufEnd = this.bufferLength; - if (end > bufEnd) { - end = bufEnd; - } - } else { - while (!this.eof) { - this.readBlock(); - } - end = this.bufferLength; - } - - this.pos = end; - return this.buffer.subarray(pos, end); - }, - peekByte: function DecodeStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function DecodeStream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { - var end = start + length; - while (this.bufferLength <= end && !this.eof) { - this.readBlock(); - } - return new Stream(this.buffer, start, length, dict); - }, - skip: function DecodeStream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function DecodeStream_reset() { - this.pos = 0; - }, - getBaseStreams: function DecodeStream_getBaseStreams() { - if (this.str && this.str.getBaseStreams) { - return this.str.getBaseStreams(); - } - return []; - } - }; - - return DecodeStream; -})(); - -var StreamsSequenceStream = (function StreamsSequenceStreamClosure() { - function StreamsSequenceStream(streams) { - this.streams = streams; - DecodeStream.call(this, /* maybeLength = */ null); - } - - StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); - - StreamsSequenceStream.prototype.readBlock = - function streamSequenceStreamReadBlock() { - - var streams = this.streams; - if (streams.length === 0) { - this.eof = true; - return; - } - var stream = streams.shift(); - var chunk = stream.getBytes(); - var bufferLength = this.bufferLength; - var newLength = bufferLength + chunk.length; - var buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - }; - - StreamsSequenceStream.prototype.getBaseStreams = - function StreamsSequenceStream_getBaseStreams() { - - var baseStreams = []; - for (var i = 0, ii = this.streams.length; i < ii; i++) { - var stream = this.streams[i]; - if (stream.getBaseStreams) { - Util.appendToArray(baseStreams, stream.getBaseStreams()); - } - } - return baseStreams; - }; - - return StreamsSequenceStream; -})(); - -var FlateStream = (function FlateStreamClosure() { - var codeLenCodeMap = new Int32Array([ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - ]); - - var lengthDecode = new Int32Array([ - 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, - 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, - 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, - 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 - ]); - - var distDecode = new Int32Array([ - 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, - 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, - 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, - 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 - ]); - - var fixedLitCodeTab = [new Int32Array([ - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, - 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, - 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, - 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, - 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, - 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, - 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, - 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, - 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, - 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, - 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, - 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, - 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, - 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, - 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, - 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, - 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, - 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, - 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, - 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, - 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, - 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, - 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, - 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, - 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, - 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, - 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, - 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, - 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, - 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, - 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, - 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, - 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, - 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, - 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, - 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, - 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, - 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, - 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, - 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, - 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, - 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, - 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, - 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, - 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, - 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, - 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, - 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, - 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff - ]), 9]; - - var fixedDistCodeTab = [new Int32Array([ - 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, - 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, - 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, - 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 - ]), 5]; - - function FlateStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - var cmf = str.getByte(); - var flg = str.getByte(); - if (cmf === -1 || flg === -1) { - error('Invalid header in flate stream: ' + cmf + ', ' + flg); - } - if ((cmf & 0x0f) !== 0x08) { - error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); - } - if ((((cmf << 8) + flg) % 31) !== 0) { - error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); - } - if (flg & 0x20) { - error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); - } - - this.codeSize = 0; - this.codeBuf = 0; - - DecodeStream.call(this, maybeLength); - } - - FlateStream.prototype = Object.create(DecodeStream.prototype); - - FlateStream.prototype.getBits = function FlateStream_getBits(bits) { - var str = this.str; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < bits) { - if ((b = str.getByte()) === -1) { - error('Bad encoding in flate stream'); - } - codeBuf |= b << codeSize; - codeSize += 8; - } - b = codeBuf & ((1 << bits) - 1); - this.codeBuf = codeBuf >> bits; - this.codeSize = codeSize -= bits; - - return b; - }; - - FlateStream.prototype.getCode = function FlateStream_getCode(table) { - var str = this.str; - var codes = table[0]; - var maxLen = table[1]; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < maxLen) { - if ((b = str.getByte()) === -1) { - // premature end of stream. code might however still be valid. - // codeSize < codeLen check below guards against incomplete codeVal. - break; - } - codeBuf |= (b << codeSize); - codeSize += 8; - } - var code = codes[codeBuf & ((1 << maxLen) - 1)]; - var codeLen = code >> 16; - var codeVal = code & 0xffff; - if (codeLen < 1 || codeSize < codeLen) { - error('Bad encoding in flate stream'); - } - this.codeBuf = (codeBuf >> codeLen); - this.codeSize = (codeSize - codeLen); - return codeVal; - }; - - FlateStream.prototype.generateHuffmanTable = - function flateStreamGenerateHuffmanTable(lengths) { - var n = lengths.length; - - // find max code length - var maxLen = 0; - var i; - for (i = 0; i < n; ++i) { - if (lengths[i] > maxLen) { - maxLen = lengths[i]; - } - } - - // build the table - var size = 1 << maxLen; - var codes = new Int32Array(size); - for (var len = 1, code = 0, skip = 2; - len <= maxLen; - ++len, code <<= 1, skip <<= 1) { - for (var val = 0; val < n; ++val) { - if (lengths[val] === len) { - // bit-reverse the code - var code2 = 0; - var t = code; - for (i = 0; i < len; ++i) { - code2 = (code2 << 1) | (t & 1); - t >>= 1; - } - - // fill the table entries - for (i = code2; i < size; i += skip) { - codes[i] = (len << 16) | val; - } - ++code; - } - } - } - - return [codes, maxLen]; - }; - - FlateStream.prototype.readBlock = function FlateStream_readBlock() { - var buffer, len; - var str = this.str; - // read block header - var hdr = this.getBits(3); - if (hdr & 1) { - this.eof = true; - } - hdr >>= 1; - - if (hdr === 0) { // uncompressed block - var b; - - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var blockLen = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - blockLen |= (b << 8); - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var check = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - check |= (b << 8); - if (check !== (~blockLen & 0xffff) && - (blockLen !== 0 || check !== 0)) { - // Ignoring error for bad "empty" block (see issue 1277) - error('Bad uncompressed block length in flate stream'); - } - - this.codeBuf = 0; - this.codeSize = 0; - - var bufferLength = this.bufferLength; - buffer = this.ensureBuffer(bufferLength + blockLen); - var end = bufferLength + blockLen; - this.bufferLength = end; - if (blockLen === 0) { - if (str.peekByte() === -1) { - this.eof = true; - } - } else { - for (var n = bufferLength; n < end; ++n) { - if ((b = str.getByte()) === -1) { - this.eof = true; - break; - } - buffer[n] = b; - } - } - return; - } - - var litCodeTable; - var distCodeTable; - if (hdr === 1) { // compressed block, fixed codes - litCodeTable = fixedLitCodeTab; - distCodeTable = fixedDistCodeTab; - } else if (hdr === 2) { // compressed block, dynamic codes - var numLitCodes = this.getBits(5) + 257; - var numDistCodes = this.getBits(5) + 1; - var numCodeLenCodes = this.getBits(4) + 4; - - // build the code lengths code table - var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); - - var i; - for (i = 0; i < numCodeLenCodes; ++i) { - codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); - } - var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); - - // build the literal and distance code tables - len = 0; - i = 0; - var codes = numLitCodes + numDistCodes; - var codeLengths = new Uint8Array(codes); - var bitsLength, bitsOffset, what; - while (i < codes) { - var code = this.getCode(codeLenCodeTab); - if (code === 16) { - bitsLength = 2; bitsOffset = 3; what = len; - } else if (code === 17) { - bitsLength = 3; bitsOffset = 3; what = (len = 0); - } else if (code === 18) { - bitsLength = 7; bitsOffset = 11; what = (len = 0); - } else { - codeLengths[i++] = len = code; - continue; - } - - var repeatLength = this.getBits(bitsLength) + bitsOffset; - while (repeatLength-- > 0) { - codeLengths[i++] = what; - } - } - - litCodeTable = - this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); - distCodeTable = - this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); - } else { - error('Unknown block type in flate stream'); - } - - buffer = this.buffer; - var limit = buffer ? buffer.length : 0; - var pos = this.bufferLength; - while (true) { - var code1 = this.getCode(litCodeTable); - if (code1 < 256) { - if (pos + 1 >= limit) { - buffer = this.ensureBuffer(pos + 1); - limit = buffer.length; - } - buffer[pos++] = code1; - continue; - } - if (code1 === 256) { - this.bufferLength = pos; - return; - } - code1 -= 257; - code1 = lengthDecode[code1]; - var code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - var dist = (code1 & 0xffff) + code2; - if (pos + len >= limit) { - buffer = this.ensureBuffer(pos + len); - limit = buffer.length; - } - for (var k = 0; k < len; ++k, ++pos) { - buffer[pos] = buffer[pos - dist]; - } - } - }; - - return FlateStream; -})(); - -var PredictorStream = (function PredictorStreamClosure() { - function PredictorStream(str, maybeLength, params) { - var predictor = this.predictor = params.get('Predictor') || 1; - - if (predictor <= 1) { - return str; // no prediction - } - if (predictor !== 2 && (predictor < 10 || predictor > 15)) { - error('Unsupported predictor: ' + predictor); - } - - if (predictor === 2) { - this.readBlock = this.readBlockTiff; - } else { - this.readBlock = this.readBlockPng; - } - - this.str = str; - this.dict = str.dict; - - var colors = this.colors = params.get('Colors') || 1; - var bits = this.bits = params.get('BitsPerComponent') || 8; - var columns = this.columns = params.get('Columns') || 1; - - this.pixBytes = (colors * bits + 7) >> 3; - this.rowBytes = (columns * colors * bits + 7) >> 3; - - DecodeStream.call(this, maybeLength); - return this; - } - - PredictorStream.prototype = Object.create(DecodeStream.prototype); - - PredictorStream.prototype.readBlockTiff = - function predictorStreamReadBlockTiff() { - var rowBytes = this.rowBytes; - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var bits = this.bits; - var colors = this.colors; - - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var inbuf = 0, outbuf = 0; - var inbits = 0, outbits = 0; - var pos = bufferLength; - var i; - - if (bits === 1) { - for (i = 0; i < rowBytes; ++i) { - var c = rawBytes[i]; - inbuf = (inbuf << 8) | c; - // bitwise addition is exclusive or - // first shift inbuf and then add - buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF; - // truncate inbuf (assumes colors < 16) - inbuf &= 0xFFFF; - } - } else if (bits === 8) { - for (i = 0; i < colors; ++i) { - buffer[pos++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[pos] = buffer[pos - colors] + rawBytes[i]; - pos++; - } - } else { - var compArray = new Uint8Array(colors + 1); - var bitMask = (1 << bits) - 1; - var j = 0, k = bufferLength; - var columns = this.columns; - for (i = 0; i < columns; ++i) { - for (var kk = 0; kk < colors; ++kk) { - if (inbits < bits) { - inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF); - inbits += 8; - } - compArray[kk] = (compArray[kk] + - (inbuf >> (inbits - bits))) & bitMask; - inbits -= bits; - outbuf = (outbuf << bits) | compArray[kk]; - outbits += bits; - if (outbits >= 8) { - buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF; - outbits -= 8; - } - } - } - if (outbits > 0) { - buffer[k++] = (outbuf << (8 - outbits)) + - (inbuf & ((1 << (8 - outbits)) - 1)); - } - } - this.bufferLength += rowBytes; - }; - - PredictorStream.prototype.readBlockPng = - function predictorStreamReadBlockPng() { - - var rowBytes = this.rowBytes; - var pixBytes = this.pixBytes; - - var predictor = this.str.getByte(); - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); - if (prevRow.length === 0) { - prevRow = new Uint8Array(rowBytes); - } - - var i, j = bufferLength, up, c; - switch (predictor) { - case 0: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - break; - case 1: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF; - j++; - } - break; - case 2: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF; - } - break; - case 3: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) + - rawBytes[i]) & 0xFF; - j++; - } - break; - case 4: - // we need to save the up left pixels values. the simplest way - // is to create a new buffer - for (i = 0; i < pixBytes; ++i) { - up = prevRow[i]; - c = rawBytes[i]; - buffer[j++] = up + c; - } - for (; i < rowBytes; ++i) { - up = prevRow[i]; - var upLeft = prevRow[i - pixBytes]; - var left = buffer[j - pixBytes]; - var p = left + up - upLeft; - - var pa = p - left; - if (pa < 0) { - pa = -pa; - } - var pb = p - up; - if (pb < 0) { - pb = -pb; - } - var pc = p - upLeft; - if (pc < 0) { - pc = -pc; - } - - c = rawBytes[i]; - if (pa <= pb && pa <= pc) { - buffer[j++] = left + c; - } else if (pb <= pc) { - buffer[j++] = up + c; - } else { - buffer[j++] = upLeft + c; - } - } - break; - default: - error('Unsupported predictor: ' + predictor); - } - this.bufferLength += rowBytes; - }; - - return PredictorStream; -})(); - -/** - * Depending on the type of JPEG a JpegStream is handled in different ways. For - * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image - * data is stored and then loaded by the browser. For unsupported JPEG's we use - * a library to decode these images and the stream behaves like all the other - * DecodeStreams. - */ -var JpegStream = (function JpegStreamClosure() { - function JpegStream(stream, maybeLength, dict, xref) { - // Some images may contain 'junk' before the SOI (start-of-image) marker. - // Note: this seems to mainly affect inline images. - var ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8). - stream.skip(-1); // Reset the stream position to the SOI. - break; - } - } - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpegStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpegStream.prototype, 'bytes', { - get: function JpegStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - try { - var jpegImage = new JpegImage(); - - // checking if values needs to be transformed before conversion - if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) { - var decodeArr = this.dict.get('Decode'); - var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; - var decodeArrLength = decodeArr.length; - var transform = new Int32Array(decodeArrLength); - var transformNeeded = false; - var maxValue = (1 << bitsPerComponent) - 1; - for (var i = 0; i < decodeArrLength; i += 2) { - transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0; - transform[i + 1] = (decodeArr[i] * maxValue) | 0; - if (transform[i] !== 256 || transform[i + 1] !== 0) { - transformNeeded = true; - } - } - if (transformNeeded) { - jpegImage.decodeTransform = transform; - } - } - - jpegImage.parse(this.bytes); - var data = jpegImage.getData(this.drawWidth, this.drawHeight, - this.forceRGB); - this.buffer = data; - this.bufferLength = data.length; - this.eof = true; - } catch (e) { - error('JPEG error: ' + e); - } - }; - - JpegStream.prototype.getBytes = function JpegStream_getBytes(length) { - this.ensureBuffer(); - return this.buffer; - }; - - JpegStream.prototype.getIR = function JpegStream_getIR() { - return PDFJS.createObjectURL(this.bytes, 'image/jpeg'); - }; - /** - * Checks if the image can be decoded and displayed by the browser without any - * further processing such as color space conversions. - */ - JpegStream.prototype.isNativelySupported = - function JpegStream_isNativelySupported(xref, res) { - var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res); - return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && - cs.isDefaultDecode(this.dict.get('Decode', 'D')); - }; - /** - * Checks if the image can be decoded by the browser. - */ - JpegStream.prototype.isNativelyDecodable = - function JpegStream_isNativelyDecodable(xref, res) { - var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res); - return (cs.numComps === 1 || cs.numComps === 3) && - cs.isDefaultDecode(this.dict.get('Decode', 'D')); - }; - - return JpegStream; -})(); - -/** - * For JPEG 2000's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var JpxStream = (function JpxStreamClosure() { - function JpxStream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpxStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpxStream.prototype, 'bytes', { - get: function JpxStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jpxImage = new JpxImage(); - jpxImage.parse(this.bytes); - - var width = jpxImage.width; - var height = jpxImage.height; - var componentsCount = jpxImage.componentsCount; - var tileCount = jpxImage.tiles.length; - if (tileCount === 1) { - this.buffer = jpxImage.tiles[0].items; - } else { - var data = new Uint8Array(width * height * componentsCount); - - for (var k = 0; k < tileCount; k++) { - var tileComponents = jpxImage.tiles[k]; - var tileWidth = tileComponents.width; - var tileHeight = tileComponents.height; - var tileLeft = tileComponents.left; - var tileTop = tileComponents.top; - - var src = tileComponents.items; - var srcPosition = 0; - var dataPosition = (width * tileTop + tileLeft) * componentsCount; - var imgRowSize = width * componentsCount; - var tileRowSize = tileWidth * componentsCount; - - for (var j = 0; j < tileHeight; j++) { - var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); - data.set(rowBytes, dataPosition); - srcPosition += tileRowSize; - dataPosition += imgRowSize; - } - } - this.buffer = data; - } - this.bufferLength = this.buffer.length; - this.eof = true; - }; - - return JpxStream; -})(); - -/** - * For JBIG2's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var Jbig2Stream = (function Jbig2StreamClosure() { - function Jbig2Stream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - Jbig2Stream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(Jbig2Stream.prototype, 'bytes', { - get: function Jbig2Stream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jbig2Image = new Jbig2Image(); - - var chunks = [], xref = this.dict.xref; - var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms')); - - // According to the PDF specification, DecodeParms can be either - // a dictionary, or an array whose elements are dictionaries. - if (isArray(decodeParams)) { - if (decodeParams.length > 1) { - warn('JBIG2 - \'DecodeParms\' array with multiple elements ' + - 'not supported.'); - } - decodeParams = xref.fetchIfRef(decodeParams[0]); - } - if (decodeParams && decodeParams.has('JBIG2Globals')) { - var globalsStream = decodeParams.get('JBIG2Globals'); - var globals = globalsStream.getBytes(); - chunks.push({data: globals, start: 0, end: globals.length}); - } - chunks.push({data: this.bytes, start: 0, end: this.bytes.length}); - var data = jbig2Image.parseChunks(chunks); - var dataLength = data.length; - - // JBIG2 had black as 1 and white as 0, inverting the colors - for (var i = 0; i < dataLength; i++) { - data[i] ^= 0xFF; - } - - this.buffer = data; - this.bufferLength = dataLength; - this.eof = true; - }; - - return Jbig2Stream; -})(); - -var DecryptStream = (function DecryptStreamClosure() { - function DecryptStream(str, maybeLength, decrypt) { - this.str = str; - this.dict = str.dict; - this.decrypt = decrypt; - this.nextChunk = null; - this.initialized = false; - - DecodeStream.call(this, maybeLength); - } - - var chunkSize = 512; - - DecryptStream.prototype = Object.create(DecodeStream.prototype); - - DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { - var chunk; - if (this.initialized) { - chunk = this.nextChunk; - } else { - chunk = this.str.getBytes(chunkSize); - this.initialized = true; - } - if (!chunk || chunk.length === 0) { - this.eof = true; - return; - } - this.nextChunk = this.str.getBytes(chunkSize); - var hasMoreData = this.nextChunk && this.nextChunk.length > 0; - - var decrypt = this.decrypt; - chunk = decrypt(chunk, !hasMoreData); - - var bufferLength = this.bufferLength; - var i, n = chunk.length; - var buffer = this.ensureBuffer(bufferLength + n); - for (i = 0; i < n; i++) { - buffer[bufferLength++] = chunk[i]; - } - this.bufferLength = bufferLength; - }; - - return DecryptStream; -})(); - -var Ascii85Stream = (function Ascii85StreamClosure() { - function Ascii85Stream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - this.input = new Uint8Array(5); - - // Most streams increase in size when decoded, but Ascii85 streams - // typically shrink by ~20%. - if (maybeLength) { - maybeLength = 0.8 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - Ascii85Stream.prototype = Object.create(DecodeStream.prototype); - - Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { - var TILDA_CHAR = 0x7E; // '~' - var Z_LOWER_CHAR = 0x7A; // 'z' - var EOF = -1; - - var str = this.str; - - var c = str.getByte(); - while (Lexer.isSpace(c)) { - c = str.getByte(); - } - - if (c === EOF || c === TILDA_CHAR) { - this.eof = true; - return; - } - - var bufferLength = this.bufferLength, buffer; - var i; - - // special code for z - if (c === Z_LOWER_CHAR) { - buffer = this.ensureBuffer(bufferLength + 4); - for (i = 0; i < 4; ++i) { - buffer[bufferLength + i] = 0; - } - this.bufferLength += 4; - } else { - var input = this.input; - input[0] = c; - for (i = 1; i < 5; ++i) { - c = str.getByte(); - while (Lexer.isSpace(c)) { - c = str.getByte(); - } - - input[i] = c; - - if (c === EOF || c === TILDA_CHAR) { - break; - } - } - buffer = this.ensureBuffer(bufferLength + i - 1); - this.bufferLength += i - 1; - - // partial ending; - if (i < 5) { - for (; i < 5; ++i) { - input[i] = 0x21 + 84; - } - this.eof = true; - } - var t = 0; - for (i = 0; i < 5; ++i) { - t = t * 85 + (input[i] - 0x21); - } - - for (i = 3; i >= 0; --i) { - buffer[bufferLength + i] = t & 0xFF; - t >>= 8; - } - } - }; - - return Ascii85Stream; -})(); - -var AsciiHexStream = (function AsciiHexStreamClosure() { - function AsciiHexStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - this.firstDigit = -1; - - // Most streams increase in size when decoded, but AsciiHex streams shrink - // by 50%. - if (maybeLength) { - maybeLength = 0.5 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - AsciiHexStream.prototype = Object.create(DecodeStream.prototype); - - AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { - var UPSTREAM_BLOCK_SIZE = 8000; - var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - - var maxDecodeLength = (bytes.length + 1) >> 1; - var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - var bufferLength = this.bufferLength; - - var firstDigit = this.firstDigit; - for (var i = 0, ii = bytes.length; i < ii; i++) { - var ch = bytes[i], digit; - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - digit = ch & 0x0F; - } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'Z', 'a'-'z' - digit = (ch & 0x0F) + 9; - } else if (ch === 0x3E) { // '>' - this.eof = true; - break; - } else { // probably whitespace - continue; // ignoring - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = (firstDigit << 4) | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - // incomplete byte - buffer[bufferLength++] = (firstDigit << 4); - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - }; - - return AsciiHexStream; -})(); - -var RunLengthStream = (function RunLengthStreamClosure() { - function RunLengthStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - DecodeStream.call(this, maybeLength); - } - - RunLengthStream.prototype = Object.create(DecodeStream.prototype); - - RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { - // The repeatHeader has following format. The first byte defines type of run - // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes - // (in addition to the second byte from the header), n = 129 through 255 - - // duplicate the second byte from the header (257 - n) times, n = 128 - end. - var repeatHeader = this.str.getBytes(2); - if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { - this.eof = true; - return; - } - - var buffer; - var bufferLength = this.bufferLength; - var n = repeatHeader[0]; - if (n < 128) { - // copy n bytes - buffer = this.ensureBuffer(bufferLength + n + 1); - buffer[bufferLength++] = repeatHeader[1]; - if (n > 0) { - var source = this.str.getBytes(n); - buffer.set(source, bufferLength); - bufferLength += n; - } - } else { - n = 257 - n; - var b = repeatHeader[1]; - buffer = this.ensureBuffer(bufferLength + n + 1); - for (var i = 0; i < n; i++) { - buffer[bufferLength++] = b; - } - } - this.bufferLength = bufferLength; - }; - - return RunLengthStream; -})(); - -var CCITTFaxStream = (function CCITTFaxStreamClosure() { - - var ccittEOL = -2; - var twoDimPass = 0; - var twoDimHoriz = 1; - var twoDimVert0 = 2; - var twoDimVertR1 = 3; - var twoDimVertL1 = 4; - var twoDimVertR2 = 5; - var twoDimVertL2 = 6; - var twoDimVertR3 = 7; - var twoDimVertL3 = 8; - - var twoDimTable = [ - [-1, -1], [-1, -1], // 000000x - [7, twoDimVertL3], // 0000010 - [7, twoDimVertR3], // 0000011 - [6, twoDimVertL2], [6, twoDimVertL2], // 000010x - [6, twoDimVertR2], [6, twoDimVertR2], // 000011x - [4, twoDimPass], [4, twoDimPass], // 0001xxx - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0] - ]; - - var whiteTable1 = [ - [-1, -1], // 00000 - [12, ccittEOL], // 00001 - [-1, -1], [-1, -1], // 0001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx - [11, 1792], [11, 1792], // 1000x - [12, 1984], // 10010 - [12, 2048], // 10011 - [12, 2112], // 10100 - [12, 2176], // 10101 - [12, 2240], // 10110 - [12, 2304], // 10111 - [11, 1856], [11, 1856], // 1100x - [11, 1920], [11, 1920], // 1101x - [12, 2368], // 11100 - [12, 2432], // 11101 - [12, 2496], // 11110 - [12, 2560] // 11111 - ]; - - var whiteTable2 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx - [8, 29], [8, 29], // 00000010x - [8, 30], [8, 30], // 00000011x - [8, 45], [8, 45], // 00000100x - [8, 46], [8, 46], // 00000101x - [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx - [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx - [8, 47], [8, 47], // 00001010x - [8, 48], [8, 48], // 00001011x - [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx - [6, 13], [6, 13], [6, 13], [6, 13], - [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx - [8, 33], [8, 33], // 00010010x - [8, 34], [8, 34], // 00010011x - [8, 35], [8, 35], // 00010100x - [8, 36], [8, 36], // 00010101x - [8, 37], [8, 37], // 00010110x - [8, 38], [8, 38], // 00010111x - [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx - [8, 31], [8, 31], // 00011010x - [8, 32], [8, 32], // 00011011x - [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx - [6, 1], [6, 1], [6, 1], [6, 1], - [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx - [6, 12], [6, 12], [6, 12], [6, 12], - [8, 53], [8, 53], // 00100100x - [8, 54], [8, 54], // 00100101x - [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx - [8, 39], [8, 39], // 00101000x - [8, 40], [8, 40], // 00101001x - [8, 41], [8, 41], // 00101010x - [8, 42], [8, 42], // 00101011x - [8, 43], [8, 43], // 00101100x - [8, 44], [8, 44], // 00101101x - [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx - [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx - [8, 61], [8, 61], // 00110010x - [8, 62], [8, 62], // 00110011x - [8, 63], [8, 63], // 00110100x - [8, 0], [8, 0], // 00110101x - [8, 320], [8, 320], // 00110110x - [8, 384], [8, 384], // 00110111x - [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx - [8, 59], [8, 59], // 01001010x - [8, 60], [8, 60], // 01001011x - [9, 1472], // 010011000 - [9, 1536], // 010011001 - [9, 1600], // 010011010 - [9, 1728], // 010011011 - [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx - [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx - [8, 49], [8, 49], // 01010010x - [8, 50], [8, 50], // 01010011x - [8, 51], [8, 51], // 01010100x - [8, 52], [8, 52], // 01010101x - [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx - [8, 55], [8, 55], // 01011000x - [8, 56], [8, 56], // 01011001x - [8, 57], [8, 57], // 01011010x - [8, 58], [8, 58], // 01011011x - [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx - [6, 192], [6, 192], [6, 192], [6, 192], - [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx - [6, 1664], [6, 1664], [6, 1664], [6, 1664], - [8, 448], [8, 448], // 01100100x - [8, 512], [8, 512], // 01100101x - [9, 704], // 011001100 - [9, 768], // 011001101 - [8, 640], [8, 640], // 01100111x - [8, 576], [8, 576], // 01101000x - [9, 832], // 011010010 - [9, 896], // 011010011 - [9, 960], // 011010100 - [9, 1024], // 011010101 - [9, 1088], // 011010110 - [9, 1152], // 011010111 - [9, 1216], // 011011000 - [9, 1280], // 011011001 - [9, 1344], // 011011010 - [9, 1408], // 011011011 - [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx - [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx - [6, 16], [6, 16], [6, 16], [6, 16], - [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx - [6, 17], [6, 17], [6, 17], [6, 17], - [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx - [6, 14], [6, 14], [6, 14], [6, 14], - [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx - [6, 15], [6, 15], [6, 15], [6, 15], - [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7] - ]; - - var blackTable1 = [ - [-1, -1], [-1, -1], // 000000000000x - [12, ccittEOL], [12, ccittEOL], // 000000000001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx - [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx - [12, 1984], [12, 1984], // 000000010010x - [12, 2048], [12, 2048], // 000000010011x - [12, 2112], [12, 2112], // 000000010100x - [12, 2176], [12, 2176], // 000000010101x - [12, 2240], [12, 2240], // 000000010110x - [12, 2304], [12, 2304], // 000000010111x - [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx - [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx - [12, 2368], [12, 2368], // 000000011100x - [12, 2432], [12, 2432], // 000000011101x - [12, 2496], [12, 2496], // 000000011110x - [12, 2560], [12, 2560], // 000000011111x - [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx - [10, 18], [10, 18], [10, 18], [10, 18], - [12, 52], [12, 52], // 000000100100x - [13, 640], // 0000001001010 - [13, 704], // 0000001001011 - [13, 768], // 0000001001100 - [13, 832], // 0000001001101 - [12, 55], [12, 55], // 000000100111x - [12, 56], [12, 56], // 000000101000x - [13, 1280], // 0000001010010 - [13, 1344], // 0000001010011 - [13, 1408], // 0000001010100 - [13, 1472], // 0000001010101 - [12, 59], [12, 59], // 000000101011x - [12, 60], [12, 60], // 000000101100x - [13, 1536], // 0000001011010 - [13, 1600], // 0000001011011 - [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx - [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx - [13, 1664], // 0000001100100 - [13, 1728], // 0000001100101 - [12, 320], [12, 320], // 000000110011x - [12, 384], [12, 384], // 000000110100x - [12, 448], [12, 448], // 000000110101x - [13, 512], // 0000001101100 - [13, 576], // 0000001101101 - [12, 53], [12, 53], // 000000110111x - [12, 54], [12, 54], // 000000111000x - [13, 896], // 0000001110010 - [13, 960], // 0000001110011 - [13, 1024], // 0000001110100 - [13, 1088], // 0000001110101 - [13, 1152], // 0000001110110 - [13, 1216], // 0000001110111 - [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx - [10, 64], [10, 64], [10, 64], [10, 64] - ]; - - var blackTable2 = [ - [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [11, 23], [11, 23], // 00000101000x - [12, 50], // 000001010010 - [12, 51], // 000001010011 - [12, 44], // 000001010100 - [12, 45], // 000001010101 - [12, 46], // 000001010110 - [12, 47], // 000001010111 - [12, 57], // 000001011000 - [12, 58], // 000001011001 - [12, 61], // 000001011010 - [12, 256], // 000001011011 - [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx - [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx - [12, 48], // 000001100100 - [12, 49], // 000001100101 - [12, 62], // 000001100110 - [12, 63], // 000001100111 - [12, 30], // 000001101000 - [12, 31], // 000001101001 - [12, 32], // 000001101010 - [12, 33], // 000001101011 - [12, 40], // 000001101100 - [12, 41], // 000001101101 - [11, 22], [11, 22], // 00000110111x - [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx - [9, 15], [9, 15], [9, 15], [9, 15], - [12, 128], // 000011001000 - [12, 192], // 000011001001 - [12, 26], // 000011001010 - [12, 27], // 000011001011 - [12, 28], // 000011001100 - [12, 29], // 000011001101 - [11, 19], [11, 19], // 00001100111x - [11, 20], [11, 20], // 00001101000x - [12, 34], // 000011010010 - [12, 35], // 000011010011 - [12, 36], // 000011010100 - [12, 37], // 000011010101 - [12, 38], // 000011010110 - [12, 39], // 000011010111 - [11, 21], [11, 21], // 00001101100x - [12, 42], // 000011011010 - [12, 43], // 000011011011 - [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx - [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12] - ]; - - var blackTable3 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx - [6, 9], // 000100 - [6, 8], // 000101 - [5, 7], [5, 7], // 00011x - [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx - [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx - [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx - [3, 1], [3, 1], [3, 1], [3, 1], - [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx - [3, 4], [3, 4], [3, 4], [3, 4], - [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2] - ]; - - function CCITTFaxStream(str, maybeLength, params) { - this.str = str; - this.dict = str.dict; - - params = params || Dict.empty; - - this.encoding = params.get('K') || 0; - this.eoline = params.get('EndOfLine') || false; - this.byteAlign = params.get('EncodedByteAlign') || false; - this.columns = params.get('Columns') || 1728; - this.rows = params.get('Rows') || 0; - var eoblock = params.get('EndOfBlock'); - if (eoblock === null || eoblock === undefined) { - eoblock = true; - } - this.eoblock = eoblock; - this.black = params.get('BlackIs1') || false; - - this.codingLine = new Uint32Array(this.columns + 1); - this.refLine = new Uint32Array(this.columns + 2); - - this.codingLine[0] = this.columns; - this.codingPos = 0; - - this.row = 0; - this.nextLine2D = this.encoding < 0; - this.inputBits = 0; - this.inputBuf = 0; - this.outputBits = 0; - - var code1; - while ((code1 = this.lookBits(12)) === 0) { - this.eatBits(1); - } - if (code1 === 1) { - this.eatBits(12); - } - if (this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - DecodeStream.call(this, maybeLength); - } - - CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); - - CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { - while (!this.eof) { - var c = this.lookChar(); - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } - }; - - CCITTFaxStream.prototype.addPixels = - function ccittFaxStreamAddPixels(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.addPixelsNeg = - function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } else if (a1 < codingLine[codingPos]) { - if (a1 < 0) { - info('invalid code'); - this.err = true; - a1 = 0; - } - while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { - --codingPos; - } - codingLine[codingPos] = a1; - } - - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { - var refLine = this.refLine; - var codingLine = this.codingLine; - var columns = this.columns; - - var refPos, blackPixels, bits, i; - - if (this.outputBits === 0) { - if (this.eof) { - return null; - } - this.err = false; - - var code1, code2, code3; - if (this.nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - this.codingPos = 0; - refPos = 0; - blackPixels = 0; - - while (codingLine[this.codingPos] < columns) { - code1 = this.getTwoDimCode(); - switch (code1) { - case twoDimPass: - this.addPixels(refLine[refPos + 1], blackPixels); - if (refLine[refPos + 1] < columns) { - refPos += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + - code1, blackPixels); - if (codingLine[this.codingPos] < columns) { - this.addPixels(codingLine[this.codingPos] + code2, - blackPixels ^ 1); - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - break; - case twoDimVertR3: - this.addPixels(refLine[refPos] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR2: - this.addPixels(refLine[refPos] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR1: - this.addPixels(refLine[refPos] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVert0: - this.addPixels(refLine[refPos], blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL3: - this.addPixelsNeg(refLine[refPos] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL2: - this.addPixelsNeg(refLine[refPos] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL1: - this.addPixelsNeg(refLine[refPos] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case EOF: - this.addPixels(columns, 0); - this.eof = true; - break; - default: - info('bad 2d code'); - this.addPixels(columns, 0); - this.err = true; - } - } - } else { - codingLine[0] = 0; - this.codingPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + code1, blackPixels); - blackPixels ^= 1; - } - } - - var gotEOL = false; - - if (this.byteAlign) { - this.inputBits &= ~7; - } - - if (!this.eoblock && this.row === this.rows - 1) { - this.eof = true; - } else { - code1 = this.lookBits(12); - if (this.eoline) { - while (code1 !== EOF && code1 !== 1) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } else { - while (code1 === 0) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } - if (code1 === 1) { - this.eatBits(12); - gotEOL = true; - } else if (code1 === EOF) { - this.eof = true; - } - } - - if (!this.eof && this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - if (this.eoblock && gotEOL && this.byteAlign) { - code1 = this.lookBits(12); - if (code1 === 1) { - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - if (this.encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = this.lookBits(12); - if (code1 !== 1) { - info('bad rtc code: ' + code1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - } - } - this.eof = true; - } - } else if (this.err && this.eoline) { - while (true) { - code1 = this.lookBits(13); - if (code1 === EOF) { - this.eof = true; - return null; - } - if ((code1 >> 1) === 1) { - break; - } - this.eatBits(1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.eatBits(1); - this.nextLine2D = !(code1 & 1); - } - } - - if (codingLine[0] > 0) { - this.outputBits = codingLine[this.codingPos = 0]; - } else { - this.outputBits = codingLine[this.codingPos = 1]; - } - this.row++; - } - - var c; - if (this.outputBits >= 8) { - c = (this.codingPos & 1) ? 0 : 0xFF; - this.outputBits -= 8; - if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } - } else { - bits = 8; - c = 0; - do { - if (this.outputBits > bits) { - c <<= bits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - bits); - } - this.outputBits -= bits; - bits = 0; - } else { - c <<= this.outputBits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - this.outputBits); - } - bits -= this.outputBits; - this.outputBits = 0; - if (codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } else if (bits > 0) { - c <<= bits; - bits = 0; - } - } - } while (bits); - } - if (this.black) { - c ^= 0xFF; - } - return c; - }; - - // This functions returns the code found from the table. - // The start and end parameters set the boundaries for searching the table. - // The limit parameter is optional. Function returns an array with three - // values. The first array element indicates whether a valid code is being - // returned. The second array element is the actual code. The third array - // element indicates whether EOF was reached. - CCITTFaxStream.prototype.findTableCode = - function ccittFaxStreamFindTableCode(start, end, table, limit) { - - var limitValue = limit || 0; - for (var i = start; i <= end; ++i) { - var code = this.lookBits(i); - if (code === EOF) { - return [true, 1, false]; - } - if (i < end) { - code <<= end - i; - } - if (!limitValue || code >= limitValue) { - var p = table[code - limitValue]; - if (p[0] === i) { - this.eatBits(i); - return [true, p[1], true]; - } - } - } - return [false, 0, false]; - }; - - CCITTFaxStream.prototype.getTwoDimCode = - function ccittFaxStreamGetTwoDimCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(7); - p = twoDimTable[code]; - if (p && p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 7, twoDimTable); - if (result[0] && result[2]) { - return result[1]; - } - } - info('Bad two dim code'); - return EOF; - }; - - CCITTFaxStream.prototype.getWhiteCode = - function ccittFaxStreamGetWhiteCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(12); - if (code === EOF) { - return 1; - } - - if ((code >> 5) === 0) { - p = whiteTable1[code]; - } else { - p = whiteTable2[code >> 3]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 9, whiteTable2); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(11, 12, whiteTable1); - if (result[0]) { - return result[1]; - } - } - info('bad white code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.getBlackCode = - function ccittFaxStreamGetBlackCode() { - - var code, p; - if (this.eoblock) { - code = this.lookBits(13); - if (code === EOF) { - return 1; - } - if ((code >> 7) === 0) { - p = blackTable1[code]; - } else if ((code >> 9) === 0 && (code >> 7) !== 0) { - p = blackTable2[(code >> 1) - 64]; - } else { - p = blackTable3[code >> 7]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(2, 6, blackTable3); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(7, 12, blackTable2, 64); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(10, 13, blackTable1); - if (result[0]) { - return result[1]; - } - } - info('bad black code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { - var c; - while (this.inputBits < n) { - if ((c = this.str.getByte()) === -1) { - if (this.inputBits === 0) { - return EOF; - } - return ((this.inputBuf << (n - this.inputBits)) & - (0xFFFF >> (16 - n))); - } - this.inputBuf = (this.inputBuf << 8) + c; - this.inputBits += 8; - } - return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n)); - }; - - CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { - if ((this.inputBits -= n) < 0) { - this.inputBits = 0; - } - }; - - return CCITTFaxStream; -})(); - -var LZWStream = (function LZWStreamClosure() { - function LZWStream(str, maybeLength, earlyChange) { - this.str = str; - this.dict = str.dict; - this.cachedData = 0; - this.bitsCached = 0; - - var maxLzwDictionarySize = 4096; - var lzwState = { - earlyChange: earlyChange, - codeLength: 9, - nextCode: 258, - dictionaryValues: new Uint8Array(maxLzwDictionarySize), - dictionaryLengths: new Uint16Array(maxLzwDictionarySize), - dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), - currentSequence: new Uint8Array(maxLzwDictionarySize), - currentSequenceLength: 0 - }; - for (var i = 0; i < 256; ++i) { - lzwState.dictionaryValues[i] = i; - lzwState.dictionaryLengths[i] = 1; - } - this.lzwState = lzwState; - - DecodeStream.call(this, maybeLength); - } - - LZWStream.prototype = Object.create(DecodeStream.prototype); - - LZWStream.prototype.readBits = function LZWStream_readBits(n) { - var bitsCached = this.bitsCached; - var cachedData = this.cachedData; - while (bitsCached < n) { - var c = this.str.getByte(); - if (c === -1) { - this.eof = true; - return null; - } - cachedData = (cachedData << 8) | c; - bitsCached += 8; - } - this.bitsCached = (bitsCached -= n); - this.cachedData = cachedData; - this.lastCode = null; - return (cachedData >>> bitsCached) & ((1 << n) - 1); - }; - - LZWStream.prototype.readBlock = function LZWStream_readBlock() { - var blockSize = 512; - var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; - var i, j, q; - - var lzwState = this.lzwState; - if (!lzwState) { - return; // eof was found - } - - var earlyChange = lzwState.earlyChange; - var nextCode = lzwState.nextCode; - var dictionaryValues = lzwState.dictionaryValues; - var dictionaryLengths = lzwState.dictionaryLengths; - var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; - var codeLength = lzwState.codeLength; - var prevCode = lzwState.prevCode; - var currentSequence = lzwState.currentSequence; - var currentSequenceLength = lzwState.currentSequenceLength; - - var decodedLength = 0; - var currentBufferLength = this.bufferLength; - var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - - for (i = 0; i < blockSize; i++) { - var code = this.readBits(codeLength); - var hasPrev = currentSequenceLength > 0; - if (code < 256) { - currentSequence[0] = code; - currentSequenceLength = 1; - } else if (code >= 258) { - if (code < nextCode) { - currentSequenceLength = dictionaryLengths[code]; - for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { - currentSequence[j] = dictionaryValues[q]; - q = dictionaryPrevCodes[q]; - } - } else { - currentSequence[currentSequenceLength++] = currentSequence[0]; - } - } else if (code === 256) { - codeLength = 9; - nextCode = 258; - currentSequenceLength = 0; - continue; - } else { - this.eof = true; - delete this.lzwState; - break; - } - - if (hasPrev) { - dictionaryPrevCodes[nextCode] = prevCode; - dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; - dictionaryValues[nextCode] = currentSequence[0]; - nextCode++; - codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ? - codeLength : Math.min(Math.log(nextCode + earlyChange) / - 0.6931471805599453 + 1, 12) | 0; - } - prevCode = code; - - decodedLength += currentSequenceLength; - if (estimatedDecodedSize < decodedLength) { - do { - estimatedDecodedSize += decodedSizeDelta; - } while (estimatedDecodedSize < decodedLength); - buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - } - for (j = 0; j < currentSequenceLength; j++) { - buffer[currentBufferLength++] = currentSequence[j]; - } - } - lzwState.nextCode = nextCode; - lzwState.codeLength = codeLength; - lzwState.prevCode = prevCode; - lzwState.currentSequenceLength = currentSequenceLength; - - this.bufferLength = currentBufferLength; - }; - - return LZWStream; -})(); - -var NullStream = (function NullStreamClosure() { - function NullStream() { - Stream.call(this, new Uint8Array(0)); - } - - NullStream.prototype = Stream.prototype; - - return NullStream; -})(); - - -var WorkerTask = (function WorkerTaskClosure() { - function WorkerTask(name) { - this.name = name; - this.terminated = false; - this._capability = createPromiseCapability(); - } - - WorkerTask.prototype = { - get finished() { - return this._capability.promise; - }, - - finish: function () { - this._capability.resolve(); - }, - - terminate: function () { - this.terminated = true; - }, - - ensureNotTerminated: function () { - if (this.terminated) { - throw new Error('Worker task was terminated'); - } - } - }; - - return WorkerTask; -})(); - -var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { - setup: function wphSetup(handler, port) { - handler.on('test', function wphSetupTest(data) { - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', 'main', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); - }, - createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { - // This context is actually holds references on pdfManager and handler, - // until the latter is destroyed. - var pdfManager; - var terminated = false; - var cancelXHRs = null; - var WorkerTasks = []; - - var docId = docParams.docId; - var workerHandlerName = docParams.docId + '_worker'; - var handler = new MessageHandler(workerHandlerName, docId, port); - - function ensureNotTerminated() { - if (terminated) { - throw new Error('Worker was terminated'); - } - } - - function startWorkerTask(task) { - WorkerTasks.push(task); - } - - function finishWorkerTask(task) { - task.finish(); - var i = WorkerTasks.indexOf(task); - WorkerTasks.splice(i, 1); - } - - function loadDocument(recoveryMode) { - var loadDocumentCapability = createPromiseCapability(); - - var parseSuccess = function parseSuccess() { - var numPagesPromise = pdfManager.ensureDoc('numPages'); - var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); - var encryptedPromise = pdfManager.ensureXRef('encrypt'); - Promise.all([numPagesPromise, fingerprintPromise, - encryptedPromise]).then(function onDocReady(results) { - var doc = { - numPages: results[0], - fingerprint: results[1], - encrypted: !!results[2], - }; - loadDocumentCapability.resolve(doc); - }, - parseFailure); - }; - - var parseFailure = function parseFailure(e) { - loadDocumentCapability.reject(e); - }; - - pdfManager.ensureDoc('checkHeader', []).then(function() { - pdfManager.ensureDoc('parseStartXRef', []).then(function() { - pdfManager.ensureDoc('parse', [recoveryMode]).then( - parseSuccess, parseFailure); - }, parseFailure); - }, parseFailure); - - return loadDocumentCapability.promise; - } - - function getPdfManager(data) { - var pdfManagerCapability = createPromiseCapability(); - var pdfManager; - - var source = data.source; - var disableRange = data.disableRange; - if (source.data) { - try { - pdfManager = new LocalPdfManager(docId, source.data, source.password); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } else if (source.chunkedViewerLoading) { - try { - pdfManager = new NetworkPdfManager(docId, source, handler); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } - - var networkManager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - var cachedChunks = []; - var fullRequestXhrId = networkManager.requestFull({ - onHeadersReceived: function onHeadersReceived() { - if (disableRange) { - return; - } - - var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); - if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { - return; - } - - var contentEncoding = - fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; - if (contentEncoding !== 'identity') { - return; - } - - var length = fullRequestXhr.getResponseHeader('Content-Length'); - length = parseInt(length, 10); - if (!isInt(length)) { - return; - } - source.length = length; - if (length <= 2 * source.rangeChunkSize) { - // The file size is smaller than the size of two chunks, so it does - // not make any sense to abort the request and retry with a range - // request. - return; - } - - if (networkManager.isStreamingRequest(fullRequestXhrId)) { - // We can continue fetching when progressive loading is enabled, - // and we don't need the autoFetch feature. - source.disableAutoFetch = true; - } else { - // NOTE: by cancelling the full request, and then issuing range - // requests, there will be an issue for sites where you can only - // request the pdf once. However, if this is the case, then the - // server should not be returning that it can support range - // requests. - networkManager.abortRequest(fullRequestXhrId); - } - - try { - pdfManager = new NetworkPdfManager(docId, source, handler); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cancelXHRs = null; - }, - - onProgressiveData: source.disableStream ? null : - function onProgressiveData(chunk) { - if (!pdfManager) { - cachedChunks.push(chunk); - return; - } - pdfManager.sendProgressiveData(chunk); - }, - - onDone: function onDone(args) { - if (pdfManager) { - return; // already processed - } - - var pdfFile; - if (args === null) { - // TODO add some streaming manager, e.g. for unknown length files. - // The data was returned in the onProgressiveData, combining... - var pdfFileLength = 0, pos = 0; - cachedChunks.forEach(function (chunk) { - pdfFileLength += chunk.byteLength; - }); - if (source.length && pdfFileLength !== source.length) { - warn('reported HTTP length is different from actual'); - } - var pdfFileArray = new Uint8Array(pdfFileLength); - cachedChunks.forEach(function (chunk) { - pdfFileArray.set(new Uint8Array(chunk), pos); - pos += chunk.byteLength; - }); - pdfFile = pdfFileArray.buffer; - } else { - pdfFile = args.chunk; - } - - // the data is array, instantiating directly from it - try { - pdfManager = new LocalPdfManager(docId, pdfFile, source.password); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cancelXHRs = null; - }, - - onError: function onError(status) { - var exception; - if (status === 404 || status === 0 && /^file:/.test(source.url)) { - exception = new MissingPDFException('Missing PDF "' + - source.url + '".'); - handler.send('MissingPDF', exception); - } else { - exception = new UnexpectedResponseException( - 'Unexpected server response (' + status + - ') while retrieving PDF "' + source.url + '".', status); - handler.send('UnexpectedResponse', exception); - } - cancelXHRs = null; - }, - - onProgress: function onProgress(evt) { - handler.send('DocProgress', { - loaded: evt.loaded, - total: evt.lengthComputable ? evt.total : source.length - }); - } - }); - - cancelXHRs = function () { - networkManager.abortRequest(fullRequestXhrId); - }; - - return pdfManagerCapability.promise; - } - - var setupDoc = function(data) { - var onSuccess = function(doc) { - ensureNotTerminated(); - handler.send('GetDoc', { pdfInfo: doc }); - }; - - var onFailure = function(e) { - if (e instanceof PasswordException) { - if (e.code === PasswordResponses.NEED_PASSWORD) { - handler.send('NeedPassword', e); - } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) { - handler.send('IncorrectPassword', e); - } - } else if (e instanceof InvalidPDFException) { - handler.send('InvalidPDF', e); - } else if (e instanceof MissingPDFException) { - handler.send('MissingPDF', e); - } else if (e instanceof UnexpectedResponseException) { - handler.send('UnexpectedResponse', e); - } else { - handler.send('UnknownError', - new UnknownErrorException(e.message, e.toString())); - } - }; - - ensureNotTerminated(); - - PDFJS.maxImageSize = data.maxImageSize === undefined ? - -1 : data.maxImageSize; - PDFJS.disableFontFace = data.disableFontFace; - PDFJS.disableCreateObjectURL = data.disableCreateObjectURL; - PDFJS.verbosity = data.verbosity; - PDFJS.cMapUrl = data.cMapUrl === undefined ? - null : data.cMapUrl; - PDFJS.cMapPacked = data.cMapPacked === true; - - getPdfManager(data).then(function (newPdfManager) { - if (terminated) { - // We were in a process of setting up the manager, but it got - // terminated in the middle. - newPdfManager.terminate(); - throw new Error('Worker was terminated'); - } - - pdfManager = newPdfManager; - handler.send('PDFManagerReady', null); - pdfManager.onLoadedStream().then(function(stream) { - handler.send('DataLoaded', { length: stream.bytes.byteLength }); - }); - }).then(function pdfManagerReady() { - ensureNotTerminated(); - - loadDocument(false).then(onSuccess, function loadFailure(ex) { - ensureNotTerminated(); - - // Try again with recoveryMode == true - if (!(ex instanceof XRefParseException)) { - if (ex instanceof PasswordException) { - // after password exception prepare to receive a new password - // to repeat loading - pdfManager.passwordChanged().then(pdfManagerReady); - } - - onFailure(ex); - return; - } - - pdfManager.requestLoadedStream(); - pdfManager.onLoadedStream().then(function() { - ensureNotTerminated(); - - loadDocument(true).then(onSuccess, onFailure); - }); - }, onFailure); - }, onFailure); - }; - - handler.on('GetPage', function wphSetupGetPage(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - var rotatePromise = pdfManager.ensure(page, 'rotate'); - var refPromise = pdfManager.ensure(page, 'ref'); - var viewPromise = pdfManager.ensure(page, 'view'); - - return Promise.all([rotatePromise, refPromise, viewPromise]).then( - function(results) { - return { - rotate: results[0], - ref: results[1], - view: results[2] - }; - }); - }); - }); - - handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new Ref(data.ref.num, data.ref.gen); - var catalog = pdfManager.pdfDocument.catalog; - return catalog.getPageIndex(ref); - }); - - handler.on('GetDestinations', - function wphSetupGetDestinations(data) { - return pdfManager.ensureCatalog('destinations'); - } - ); - - handler.on('GetDestination', - function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [data.id]); - } - ); - - handler.on('GetAttachments', - function wphSetupGetAttachments(data) { - return pdfManager.ensureCatalog('attachments'); - } - ); - - handler.on('GetJavaScript', - function wphSetupGetJavaScript(data) { - return pdfManager.ensureCatalog('javaScript'); - } - ); - - handler.on('GetOutline', - function wphSetupGetOutline(data) { - return pdfManager.ensureCatalog('documentOutline'); - } - ); - - handler.on('GetMetadata', - function wphSetupGetMetadata(data) { - return Promise.all([pdfManager.ensureDoc('documentInfo'), - pdfManager.ensureCatalog('metadata')]); - } - ); - - handler.on('GetData', function wphSetupGetData(data) { - pdfManager.requestLoadedStream(); - return pdfManager.onLoadedStream().then(function(stream) { - return stream.bytes; - }); - }); - - handler.on('GetStats', - function wphSetupGetStats(data) { - return pdfManager.pdfDocument.xref.stats; - } - ); - - handler.on('UpdatePassword', function wphSetupUpdatePassword(data) { - pdfManager.updatePassword(data); - }); - - handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); - }); - }); - - handler.on('RenderPageRequest', function wphSetupRenderPage(data) { - var pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); - startWorkerTask(task); - - var pageNum = pageIndex + 1; - var start = Date.now(); - // Pre compile the pdf page and fetch the fonts/images. - page.getOperatorList(handler, task, data.intent).then( - function(operatorList) { - finishWorkerTask(task); - - info('page=' + pageNum + ' - getOperatorList: time=' + - (Date.now() - start) + 'ms, len=' + operatorList.totalLength); - }, function(e) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - - // For compatibility with older behavior, generating unknown - // unsupported feature notification on errors. - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.unknown}); - - var minimumStackMessage = - 'worker.js: while trying to getPage() and getOperatorList()'; - - var wrappedException; - - // Turn the error into an obj that can be serialized - if (typeof e === 'string') { - wrappedException = { - message: e, - stack: minimumStackMessage - }; - } else if (typeof e === 'object') { - wrappedException = { - message: e.message || e.toString(), - stack: e.stack || minimumStackMessage - }; - } else { - wrappedException = { - message: 'Unknown exception type: ' + (typeof e), - stack: minimumStackMessage - }; - } - - handler.send('PageError', { - pageNum: pageNum, - error: wrappedException, - intent: data.intent - }); - }); - }); - }, this); - - handler.on('GetTextContent', function wphExtractText(data) { - var pageIndex = data.pageIndex; - var normalizeWhitespace = data.normalizeWhitespace; - return pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('GetTextContent: page ' + pageIndex); - startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); - return page.extractTextContent(task, normalizeWhitespace).then( - function(textContent) { - finishWorkerTask(task); - info('text indexing: page=' + pageNum + ' - time=' + - (Date.now() - start) + 'ms'); - return textContent; - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - throw reason; - }); - }); - }); - - handler.on('Cleanup', function wphCleanup(data) { - return pdfManager.cleanup(); - }); - - handler.on('Terminate', function wphTerminate(data) { - terminated = true; - if (pdfManager) { - pdfManager.terminate(); - pdfManager = null; - } - if (cancelXHRs) { - cancelXHRs(); - } - - var waitOn = []; - WorkerTasks.forEach(function (task) { - waitOn.push(task.finished); - task.terminate(); - }); - - return Promise.all(waitOn).then(function () { - // Notice that even if we destroying handler, resolved response promise - // must be sent back. - handler.destroy(); - handler = null; - }); - }); - - handler.on('Ready', function wphReady(data) { - setupDoc(docParams); - docParams = null; // we don't need docParams anymore -- saving memory. - }); - return workerHandlerName; - } -}; - -var consoleTimer = {}; - -var workerConsole = { - log: function log() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_log', - data: args - }); - }, - - error: function error() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_error', - data: args - }); - throw 'pdf.js execution error'; - }, - - time: function time(name) { - consoleTimer[name] = Date.now(); - }, - - timeEnd: function timeEnd(name) { - var time = consoleTimer[name]; - if (!time) { - error('Unknown timer name ' + name); - } - this.log('Timer:', name, Date.now() - time); - } -}; - - -// Worker thread? -if (typeof window === 'undefined') { - if (!('console' in globalScope)) { - globalScope.console = workerConsole; - } - - var handler = new MessageHandler('worker', 'main', this); - WorkerMessageHandler.setup(handler, this); -} - - -/* This class implements the QM Coder decoding as defined in - * JPEG 2000 Part I Final Committee Draft Version 1.0 - * Annex C.3 Arithmetic decoding procedure - * available at http://www.jpeg.org/public/fcd15444-1.pdf - * - * The arithmetic decoder is used in conjunction with context models to decode - * JPEG2000 and JBIG2 streams. - */ -var ArithmeticDecoder = (function ArithmeticDecoderClosure() { - // Table C-2 - var QeTable = [ - {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1}, - {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0}, - {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0}, - {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0}, - {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0}, - {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0}, - {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1}, - {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0}, - {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0}, - {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0}, - {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0}, - {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0}, - {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0}, - {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0}, - {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1}, - {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0}, - {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0}, - {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0}, - {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0}, - {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0}, - {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0}, - {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0}, - {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0}, - {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0}, - {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0}, - {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0}, - {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0}, - {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0}, - {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0}, - {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0}, - {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0}, - {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0}, - {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0}, - {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0}, - {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0}, - {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0}, - {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0}, - {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0}, - {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0}, - {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0}, - {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0}, - {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0}, - {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0}, - {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0}, - {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0}, - {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0}, - {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0} - ]; - - // C.3.5 Initialisation of the decoder (INITDEC) - function ArithmeticDecoder(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - - this.chigh = data[start]; - this.clow = 0; - - this.byteIn(); - - this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F); - this.clow = (this.clow << 7) & 0xFFFF; - this.ct -= 7; - this.a = 0x8000; - } - - ArithmeticDecoder.prototype = { - // C.3.4 Compressed data input (BYTEIN) - byteIn: function ArithmeticDecoder_byteIn() { - var data = this.data; - var bp = this.bp; - if (data[bp] === 0xFF) { - var b1 = data[bp + 1]; - if (b1 > 0x8F) { - this.clow += 0xFF00; - this.ct = 8; - } else { - bp++; - this.clow += (data[bp] << 9); - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 0xFFFF) { - this.chigh += (this.clow >> 16); - this.clow &= 0xFFFF; - } - }, - // C.3.2 Decoding a decision (DECODE) - readBit: function ArithmeticDecoder_readBit(contexts, pos) { - // contexts are packed into 1 byte: - // highest 7 bits carry cx.index, lowest bit carries cx.mps - var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; - var qeTableIcx = QeTable[cx_index]; - var qeIcx = qeTableIcx.qe; - var d; - var a = this.a - qeIcx; - - if (this.chigh < qeIcx) { - // exchangeLps - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - // exchangeMps - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - // C.3.3 renormD; - do { - if (this.ct === 0) { - this.byteIn(); - } - - a <<= 1; - this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1); - this.clow = (this.clow << 1) & 0xFFFF; - this.ct--; - } while ((a & 0x8000) === 0); - this.a = a; - - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } - }; - - return ArithmeticDecoder; -})(); - - - -var JpegImage = (function jpegImage() { - var dctZigZag = new Uint8Array([ - 0, - 1, 8, - 16, 9, 2, - 3, 10, 17, 24, - 32, 25, 18, 11, 4, - 5, 12, 19, 26, 33, 40, - 48, 41, 34, 27, 20, 13, 6, - 7, 14, 21, 28, 35, 42, 49, 56, - 57, 50, 43, 36, 29, 22, 15, - 23, 30, 37, 44, 51, 58, - 59, 52, 45, 38, 31, - 39, 46, 53, 60, - 61, 54, 47, - 55, 62, - 63 - ]); - - var dctCos1 = 4017; // cos(pi/16) - var dctSin1 = 799; // sin(pi/16) - var dctCos3 = 3406; // cos(3*pi/16) - var dctSin3 = 2276; // sin(3*pi/16) - var dctCos6 = 1567; // cos(6*pi/16) - var dctSin6 = 3784; // sin(6*pi/16) - var dctSqrt2 = 5793; // sqrt(2) - var dctSqrt1d2 = 2896; // sqrt(2) / 2 - - function constructor() { - } - - function buildHuffmanTable(codeLengths, values) { - var k = 0, code = [], i, j, length = 16; - while (length > 0 && !codeLengths[length - 1]) { - length--; - } - code.push({children: [], index: 0}); - var p = code[0], q; - for (i = 0; i < length; i++) { - for (j = 0; j < codeLengths[i]; j++) { - p = code.pop(); - p.children[p.index] = values[k]; - while (p.index > 0) { - p = code.pop(); - } - p.index++; - code.push(p); - while (code.length <= i) { - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - k++; - } - if (i + 1 < length) { - // p here points to last code - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - } - return code[0].children; - } - - function getBlockBufferOffset(component, row, col) { - return 64 * ((component.blocksPerLine + 1) * row + col); - } - - function decodeScan(data, offset, frame, components, resetInterval, - spectralStart, spectralEnd, successivePrev, successive) { - var precision = frame.precision; - var samplesPerLine = frame.samplesPerLine; - var scanLines = frame.scanLines; - var mcusPerLine = frame.mcusPerLine; - var progressive = frame.progressive; - var maxH = frame.maxH, maxV = frame.maxV; - - var startOffset = offset, bitsData = 0, bitsCount = 0; - - function readBit() { - if (bitsCount > 0) { - bitsCount--; - return (bitsData >> bitsCount) & 1; - } - bitsData = data[offset++]; - if (bitsData === 0xFF) { - var nextByte = data[offset++]; - if (nextByte) { - throw 'unexpected marker: ' + - ((bitsData << 8) | nextByte).toString(16); - } - // unstuff 0 - } - bitsCount = 7; - return bitsData >>> 7; - } - - function decodeHuffman(tree) { - var node = tree; - while (true) { - node = node[readBit()]; - if (typeof node === 'number') { - return node; - } - if (typeof node !== 'object') { - throw 'invalid huffman sequence'; - } - } - } - - function receive(length) { - var n = 0; - while (length > 0) { - n = (n << 1) | readBit(); - length--; - } - return n; - } - - function receiveAndExtend(length) { - if (length === 1) { - return readBit() === 1 ? 1 : -1; - } - var n = receive(length); - if (n >= 1 << (length - 1)) { - return n; - } - return n + (-1 << length) + 1; - } - - function decodeBaseline(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : receiveAndExtend(t); - component.blockData[offset] = (component.pred += diff); - var k = 1; - while (k < 64) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = receiveAndExtend(s); - k++; - } - } - - function decodeDCFirst(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); - component.blockData[offset] = (component.pred += diff); - } - - function decodeDCSuccessive(component, offset) { - component.blockData[offset] |= readBit() << successive; - } - - var eobrun = 0; - function decodeACFirst(component, offset) { - if (eobrun > 0) { - eobrun--; - return; - } - var k = spectralStart, e = spectralEnd; - while (k <= e) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r) - 1; - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = - receiveAndExtend(s) * (1 << successive); - k++; - } - } - - var successiveACState = 0, successiveACNextValue; - function decodeACSuccessive(component, offset) { - var k = spectralStart; - var e = spectralEnd; - var r = 0; - var s; - var rs; - while (k <= e) { - var z = dctZigZag[k]; - switch (successiveACState) { - case 0: // initial state - rs = decodeHuffman(component.huffmanTableAC); - s = rs & 15; - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r); - successiveACState = 4; - } else { - r = 16; - successiveACState = 1; - } - } else { - if (s !== 1) { - throw 'invalid ACn encoding'; - } - successiveACNextValue = receiveAndExtend(s); - successiveACState = r ? 2 : 3; - } - continue; - case 1: // skipping r zero items - case 2: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - r--; - if (r === 0) { - successiveACState = successiveACState === 2 ? 3 : 0; - } - } - break; - case 3: // set value for a zero item - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - component.blockData[offset + z] = - successiveACNextValue << successive; - successiveACState = 0; - } - break; - case 4: // eob - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } - break; - } - k++; - } - if (successiveACState === 4) { - eobrun--; - if (eobrun === 0) { - successiveACState = 0; - } - } - } - - function decodeMcu(component, decode, mcu, row, col) { - var mcuRow = (mcu / mcusPerLine) | 0; - var mcuCol = mcu % mcusPerLine; - var blockRow = mcuRow * component.v + row; - var blockCol = mcuCol * component.h + col; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - function decodeBlock(component, decode, mcu) { - var blockRow = (mcu / component.blocksPerLine) | 0; - var blockCol = mcu % component.blocksPerLine; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - var componentsLength = components.length; - var component, i, j, k, n; - var decodeFn; - if (progressive) { - if (spectralStart === 0) { - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - } else { - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } - } else { - decodeFn = decodeBaseline; - } - - var mcu = 0, marker; - var mcuExpected; - if (componentsLength === 1) { - mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; - } else { - mcuExpected = mcusPerLine * frame.mcusPerColumn; - } - if (!resetInterval) { - resetInterval = mcuExpected; - } - - var h, v; - while (mcu < mcuExpected) { - // reset interval stuff - for (i = 0; i < componentsLength; i++) { - components[i].pred = 0; - } - eobrun = 0; - - if (componentsLength === 1) { - component = components[0]; - for (n = 0; n < resetInterval; n++) { - decodeBlock(component, decodeFn, mcu); - mcu++; - } - } else { - for (n = 0; n < resetInterval; n++) { - for (i = 0; i < componentsLength; i++) { - component = components[i]; - h = component.h; - v = component.v; - for (j = 0; j < v; j++) { - for (k = 0; k < h; k++) { - decodeMcu(component, decodeFn, mcu, j, k); - } - } - } - mcu++; - } - } - - // find marker - bitsCount = 0; - marker = (data[offset] << 8) | data[offset + 1]; - if (marker <= 0xFF00) { - throw 'marker was not found'; - } - - if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx - offset += 2; - } else { - break; - } - } - - return offset - startOffset; - } - - // A port of poppler's IDCT method which in turn is taken from: - // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, - // 'Practical Fast 1-D DCT Algorithms with 11 Multiplications', - // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, - // 988-991. - function quantizeAndInverse(component, blockBufferOffset, p) { - var qt = component.quantizationTable, blockData = component.blockData; - var v0, v1, v2, v3, v4, v5, v6, v7; - var p0, p1, p2, p3, p4, p5, p6, p7; - var t; - - // inverse DCT on rows - for (var row = 0; row < 64; row += 8) { - // gather block data - p0 = blockData[blockBufferOffset + row]; - p1 = blockData[blockBufferOffset + row + 1]; - p2 = blockData[blockBufferOffset + row + 2]; - p3 = blockData[blockBufferOffset + row + 3]; - p4 = blockData[blockBufferOffset + row + 4]; - p5 = blockData[blockBufferOffset + row + 5]; - p6 = blockData[blockBufferOffset + row + 6]; - p7 = blockData[blockBufferOffset + row + 7]; - - // dequant p0 - p0 *= qt[row]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 512) >> 10; - p[row] = t; - p[row + 1] = t; - p[row + 2] = t; - p[row + 3] = t; - p[row + 4] = t; - p[row + 5] = t; - p[row + 6] = t; - p[row + 7] = t; - continue; - } - // dequant p1 ... p7 - p1 *= qt[row + 1]; - p2 *= qt[row + 2]; - p3 *= qt[row + 3]; - p4 *= qt[row + 4]; - p5 *= qt[row + 5]; - p6 *= qt[row + 6]; - p7 *= qt[row + 7]; - - // stage 4 - v0 = (dctSqrt2 * p0 + 128) >> 8; - v1 = (dctSqrt2 * p4 + 128) >> 8; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8; - v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8; - v5 = p3 << 4; - v6 = p5 << 4; - - // stage 3 - v0 = (v0 + v1 + 1) >> 1; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p[row] = v0 + v7; - p[row + 7] = v0 - v7; - p[row + 1] = v1 + v6; - p[row + 6] = v1 - v6; - p[row + 2] = v2 + v5; - p[row + 5] = v2 - v5; - p[row + 3] = v3 + v4; - p[row + 4] = v3 - v4; - } - - // inverse DCT on columns - for (var col = 0; col < 8; ++col) { - p0 = p[col]; - p1 = p[col + 8]; - p2 = p[col + 16]; - p3 = p[col + 24]; - p4 = p[col + 32]; - p5 = p[col + 40]; - p6 = p[col + 48]; - p7 = p[col + 56]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 8192) >> 14; - // convert to 8 bit - t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4; - blockData[blockBufferOffset + col] = t; - blockData[blockBufferOffset + col + 8] = t; - blockData[blockBufferOffset + col + 16] = t; - blockData[blockBufferOffset + col + 24] = t; - blockData[blockBufferOffset + col + 32] = t; - blockData[blockBufferOffset + col + 40] = t; - blockData[blockBufferOffset + col + 48] = t; - blockData[blockBufferOffset + col + 56] = t; - continue; - } - - // stage 4 - v0 = (dctSqrt2 * p0 + 2048) >> 12; - v1 = (dctSqrt2 * p4 + 2048) >> 12; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12; - v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12; - v5 = p3; - v6 = p5; - - // stage 3 - // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when - // converting to UInt8 range later. - v0 = ((v0 + v1 + 1) >> 1) + 4112; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p0 = v0 + v7; - p7 = v0 - v7; - p1 = v1 + v6; - p6 = v1 - v6; - p2 = v2 + v5; - p5 = v2 - v5; - p3 = v3 + v4; - p4 = v3 - v4; - - // convert to 8-bit integers - p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4; - p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4; - p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4; - p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4; - p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4; - p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4; - p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4; - p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4; - - // store block data - blockData[blockBufferOffset + col] = p0; - blockData[blockBufferOffset + col + 8] = p1; - blockData[blockBufferOffset + col + 16] = p2; - blockData[blockBufferOffset + col + 24] = p3; - blockData[blockBufferOffset + col + 32] = p4; - blockData[blockBufferOffset + col + 40] = p5; - blockData[blockBufferOffset + col + 48] = p6; - blockData[blockBufferOffset + col + 56] = p7; - } - } - - function buildComponentData(frame, component) { - var blocksPerLine = component.blocksPerLine; - var blocksPerColumn = component.blocksPerColumn; - var computationBuffer = new Int16Array(64); - - for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { - for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { - var offset = getBlockBufferOffset(component, blockRow, blockCol); - quantizeAndInverse(component, offset, computationBuffer); - } - } - return component.blockData; - } - - function clamp0to255(a) { - return a <= 0 ? 0 : a >= 255 ? 255 : a; - } - - constructor.prototype = { - parse: function parse(data) { - - function readUint16() { - var value = (data[offset] << 8) | data[offset + 1]; - offset += 2; - return value; - } - - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - - function prepareComponents(frame) { - var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (var i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * - component.h / frame.maxH); - var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * - component.v / frame.maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - - var blocksBufferSize = 64 * blocksPerColumnForMcu * - (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; - } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; - } - - var offset = 0, length = data.length; - var jfif = null; - var adobe = null; - var pixels = null; - var frame, resetInterval; - var quantizationTables = []; - var huffmanTablesAC = [], huffmanTablesDC = []; - var fileMarker = readUint16(); - if (fileMarker !== 0xFFD8) { // SOI (Start of Image) - throw 'SOI not found'; - } - - fileMarker = readUint16(); - while (fileMarker !== 0xFFD9) { // EOI (End of image) - var i, j, l; - switch(fileMarker) { - case 0xFFE0: // APP0 (Application Specific) - case 0xFFE1: // APP1 - case 0xFFE2: // APP2 - case 0xFFE3: // APP3 - case 0xFFE4: // APP4 - case 0xFFE5: // APP5 - case 0xFFE6: // APP6 - case 0xFFE7: // APP7 - case 0xFFE8: // APP8 - case 0xFFE9: // APP9 - case 0xFFEA: // APP10 - case 0xFFEB: // APP11 - case 0xFFEC: // APP12 - case 0xFFED: // APP13 - case 0xFFEE: // APP14 - case 0xFFEF: // APP15 - case 0xFFFE: // COM (Comment) - var appData = readDataBlock(); - - if (fileMarker === 0xFFE0) { - if (appData[0] === 0x4A && appData[1] === 0x46 && - appData[2] === 0x49 && appData[3] === 0x46 && - appData[4] === 0) { // 'JFIF\x00' - jfif = { - version: { major: appData[5], minor: appData[6] }, - densityUnits: appData[7], - xDensity: (appData[8] << 8) | appData[9], - yDensity: (appData[10] << 8) | appData[11], - thumbWidth: appData[12], - thumbHeight: appData[13], - thumbData: appData.subarray(14, 14 + - 3 * appData[12] * appData[13]) - }; - } - } - // TODO APP1 - Exif - if (fileMarker === 0xFFEE) { - if (appData[0] === 0x41 && appData[1] === 0x64 && - appData[2] === 0x6F && appData[3] === 0x62 && - appData[4] === 0x65) { // 'Adobe' - adobe = { - version: (appData[5] << 8) | appData[6], - flags0: (appData[7] << 8) | appData[8], - flags1: (appData[9] << 8) | appData[10], - transformCode: appData[11] - }; - } - } - break; - - case 0xFFDB: // DQT (Define Quantization Tables) - var quantizationTablesLength = readUint16(); - var quantizationTablesEnd = quantizationTablesLength + offset - 2; - var z; - while (offset < quantizationTablesEnd) { - var quantizationTableSpec = data[offset++]; - var tableData = new Uint16Array(64); - if ((quantizationTableSpec >> 4) === 0) { // 8 bit values - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = data[offset++]; - } - } else if ((quantizationTableSpec >> 4) === 1) { //16 bit - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = readUint16(); - } - } else { - throw 'DQT: invalid table spec'; - } - quantizationTables[quantizationTableSpec & 15] = tableData; - } - break; - - case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) - case 0xFFC1: // SOF1 (Start of Frame, Extended DCT) - case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) - if (frame) { - throw 'Only single frame JPEGs supported'; - } - readUint16(); // skip data length - frame = {}; - frame.extended = (fileMarker === 0xFFC1); - frame.progressive = (fileMarker === 0xFFC2); - frame.precision = data[offset++]; - frame.scanLines = readUint16(); - frame.samplesPerLine = readUint16(); - frame.components = []; - frame.componentIds = {}; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) { - maxH = h; - } - if (maxV < v) { - maxV = v; - } - var qId = data[offset + 2]; - l = frame.components.push({ - h: h, - v: v, - quantizationTable: quantizationTables[qId] - }); - frame.componentIds[componentId] = l - 1; - offset += 3; - } - frame.maxH = maxH; - frame.maxV = maxV; - prepareComponents(frame); - break; - - case 0xFFC4: // DHT (Define Huffman Tables) - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength;) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) { - codeLengthSum += (codeLengths[j] = data[offset]); - } - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) { - huffmanValues[j] = data[offset]; - } - i += 17 + codeLengthSum; - - ((huffmanTableSpec >> 4) === 0 ? - huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = - buildHuffmanTable(codeLengths, huffmanValues); - } - break; - - case 0xFFDD: // DRI (Define Restart Interval) - readUint16(); // skip data length - resetInterval = readUint16(); - break; - - case 0xFFDA: // SOS (Start of Scan) - var scanLength = readUint16(); - var selectorsCount = data[offset++]; - var components = [], component; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = frame.componentIds[data[offset++]]; - component = frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, - frame, components, resetInterval, - spectralStart, spectralEnd, - successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - break; - - case 0xFFFF: // Fill bytes - if (data[offset] !== 0xFF) { // Avoid skipping a valid marker. - offset--; - } - break; - - default: - if (data[offset - 3] === 0xFF && - data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) { - // could be incorrect encoding -- last 0xFF byte of the previous - // block was eaten by the encoder - offset -= 3; - break; - } - throw 'unknown JPEG marker ' + fileMarker.toString(16); - } - fileMarker = readUint16(); - } - - this.width = frame.samplesPerLine; - this.height = frame.scanLines; - this.jfif = jfif; - this.adobe = adobe; - this.components = []; - for (i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - this.components.push({ - output: buildComponentData(frame, component), - scaleX: component.h / frame.maxH, - scaleY: component.v / frame.maxV, - blocksPerLine: component.blocksPerLine, - blocksPerColumn: component.blocksPerColumn - }); - } - this.numComponents = this.components.length; - }, - - _getLinearizedBlockData: function getLinearizedBlockData(width, height) { - var scaleX = this.width / width, scaleY = this.height / height; - - var component, componentScaleX, componentScaleY, blocksPerScanline; - var x, y, i, j, k; - var index; - var offset = 0; - var output; - var numComponents = this.components.length; - var dataLength = width * height * numComponents; - var data = new Uint8Array(dataLength); - var xScaleBlockOffset = new Uint32Array(width); - var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs - - for (i = 0; i < numComponents; i++) { - component = this.components[i]; - componentScaleX = component.scaleX * scaleX; - componentScaleY = component.scaleY * scaleY; - offset = i; - output = component.output; - blocksPerScanline = (component.blocksPerLine + 1) << 3; - // precalculate the xScaleBlockOffset - for (x = 0; x < width; x++) { - j = 0 | (x * componentScaleX); - xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); - } - // linearize the blocks of the component - for (y = 0; y < height; y++) { - j = 0 | (y * componentScaleY); - index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3); - for (x = 0; x < width; x++) { - data[offset] = output[index + xScaleBlockOffset[x]]; - offset += numComponents; - } - } - } - - // decodeTransform contains pairs of multiplier (-256..256) and additive - var transform = this.decodeTransform; - if (transform) { - for (i = 0; i < dataLength;) { - for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { - data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; - } - } - } - return data; - }, - - _isColorConversionNeeded: function isColorConversionNeeded() { - if (this.adobe && this.adobe.transformCode) { - // The adobe transform marker overrides any previous setting - return true; - } else if (this.numComponents === 3) { - return true; - } else { - return false; - } - }, - - _convertYccToRgb: function convertYccToRgb(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 3) { - Y = data[i ]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(Y - 179.456 + 1.402 * Cr); - data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); - data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); - } - return data; - }, - - _convertYcckToRgb: function convertYcckToRgb(data) { - var Y, Cb, Cr, k; - var offset = 0; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - k = data[i + 3]; - - var r = -122.67195406894 + - Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - - 0.154362151871126) + - Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - - 0.00477271405408747 * k + 1.53380253221734) + - Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + - 0.48357088451265) + - k * (-0.000336197177618394 * k + 0.484791561490776); - - var g = 107.268039397724 + - Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + - 0.000659397001245577 * Y + 0.000426105652938837 * k - - 0.176491792462875) + - Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + - 0.000770482631801132 * k - 0.151051492775562) + - Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + - 0.25802910206845) + - k * (-0.000318913117588328 * k - 0.213742400323665); - - var b = -20.810012546947 + - Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + - 0.0020741088115012 * Y - 0.00288260236853442 * k + - 0.814272968359295) + - Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + - 0.000560833691242812 * k - 0.195152027534049) + - Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + - 0.116935020465145) + - k * (-0.000343531996510555 * k + 0.24165260232407); - - data[offset++] = clamp0to255(r); - data[offset++] = clamp0to255(g); - data[offset++] = clamp0to255(b); - } - return data; - }, - - _convertYcckToCmyk: function convertYcckToCmyk(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(434.456 - Y - 1.402 * Cr); - data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); - data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); - // K in data[i + 3] is unchanged - } - return data; - }, - - _convertCmykToRgb: function convertCmykToRgb(data) { - var c, m, y, k; - var offset = 0; - var min = -255 * 255 * 255; - var scale = 1 / 255 / 255; - for (var i = 0, length = data.length; i < length; i += 4) { - c = data[i]; - m = data[i + 1]; - y = data[i + 2]; - k = data[i + 3]; - - var r = - c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k - - 72734.4411664936) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y - - 17.873870861415444 * k - 1401.7366389350734) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 4465.541406466231) - - k * (21.86122147463605 * k + 48317.86113160301); - var g = - c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k - - 20220.756542821975) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 48691.05921601825) + - y * (4.444339102852739 * y + 9.8632861493405 * k - - 6341.191035517494) - - k * (20.737325471181034 * k + 47890.15695978492); - var b = - c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k - - 3616.812083916688) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 28620.90484698408) + - y * (0.03296041114873217 * y + 115.60384449646641 * k - - 49363.43385999684) - - k * (22.33816807309886 * k + 45932.16563550634); - - data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; - data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; - data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; - } - return data; - }, - - getData: function getData(width, height, forceRGBoutput) { - if (this.numComponents > 4) { - throw 'Unsupported color mode'; - } - // type of data: Uint8Array(width * height * numComponents) - var data = this._getLinearizedBlockData(width, height); - - if (this.numComponents === 3) { - return this._convertYccToRgb(data); - } else if (this.numComponents === 4) { - if (this._isColorConversionNeeded()) { - if (forceRGBoutput) { - return this._convertYcckToRgb(data); - } else { - return this._convertYcckToCmyk(data); - } - } else if (forceRGBoutput) { - return this._convertCmykToRgb(data); - } - } - return data; - } - }; - - return constructor; -})(); - - -var JpxImage = (function JpxImageClosure() { - // Table E.1 - var SubbandsGainLog2 = { - 'LL': 0, - 'LH': 1, - 'HL': 1, - 'HH': 2 - }; - function JpxImage() { - this.failOnCorruptedImage = false; - } - JpxImage.prototype = { - parse: function JpxImage_parse(data) { - - var head = readUint16(data, 0); - // No box header, immediate start of codestream (SOC) - if (head === 0xFF4F) { - this.parseCodestream(data, 0, data.length); - return; - } - - var position = 0, length = data.length; - while (position < length) { - var headerSize = 8; - var lbox = readUint32(data, position); - var tbox = readUint32(data, position + 4); - position += headerSize; - if (lbox === 1) { - // XLBox: read UInt64 according to spec. - // JavaScript's int precision of 53 bit should be sufficient here. - lbox = readUint32(data, position) * 4294967296 + - readUint32(data, position + 4); - position += 8; - headerSize += 8; - } - if (lbox === 0) { - lbox = length - position + headerSize; - } - if (lbox < headerSize) { - throw new Error('JPX Error: Invalid box field size'); - } - var dataLength = lbox - headerSize; - var jumpDataLength = true; - switch (tbox) { - case 0x6A703268: // 'jp2h' - jumpDataLength = false; // parsing child boxes - break; - case 0x636F6C72: // 'colr' - // Colorspaces are not used, the CS from the PDF is used. - var method = data[position]; - var precedence = data[position + 1]; - var approximation = data[position + 2]; - if (method === 1) { - // enumerated colorspace - var colorspace = readUint32(data, position + 3); - switch (colorspace) { - case 16: // this indicates a sRGB colorspace - case 17: // this indicates a grayscale colorspace - case 18: // this indicates a YUV colorspace - break; - default: - warn('Unknown colorspace ' + colorspace); - break; - } - } else if (method === 2) { - info('ICC profile not supported'); - } - break; - case 0x6A703263: // 'jp2c' - this.parseCodestream(data, position, position + dataLength); - break; - case 0x6A502020: // 'jP\024\024' - if (0x0d0a870a !== readUint32(data, position)) { - warn('Invalid JP2 signature'); - } - break; - // The following header types are valid but currently not used: - case 0x6A501A1A: // 'jP\032\032' - case 0x66747970: // 'ftyp' - case 0x72726571: // 'rreq' - case 0x72657320: // 'res ' - case 0x69686472: // 'ihdr' - break; - default: - var headerType = String.fromCharCode((tbox >> 24) & 0xFF, - (tbox >> 16) & 0xFF, - (tbox >> 8) & 0xFF, - tbox & 0xFF); - warn('Unsupported header type ' + tbox + ' (' + headerType + ')'); - break; - } - if (jumpDataLength) { - position += dataLength; - } - } - }, - parseImageProperties: function JpxImage_parseImageProperties(stream) { - var newByte = stream.getByte(); - while (newByte >= 0) { - var oldByte = newByte; - newByte = stream.getByte(); - var code = (oldByte << 8) | newByte; - // Image and tile size (SIZ) - if (code === 0xFF51) { - stream.skip(4); - var Xsiz = stream.getInt32() >>> 0; // Byte 4 - var Ysiz = stream.getInt32() >>> 0; // Byte 8 - var XOsiz = stream.getInt32() >>> 0; // Byte 12 - var YOsiz = stream.getInt32() >>> 0; // Byte 16 - stream.skip(16); - var Csiz = stream.getUint16(); // Byte 36 - this.width = Xsiz - XOsiz; - this.height = Ysiz - YOsiz; - this.componentsCount = Csiz; - // Results are always returned as Uint8Arrays - this.bitsPerComponent = 8; - return; - } - } - throw new Error('JPX Error: No size marker found in JPX stream'); - }, - parseCodestream: function JpxImage_parseCodestream(data, start, end) { - var context = {}; - try { - var doNotRecover = false; - var position = start; - while (position + 1 < end) { - var code = readUint16(data, position); - position += 2; - - var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; - switch (code) { - case 0xFF4F: // Start of codestream (SOC) - context.mainHeader = true; - break; - case 0xFFD9: // End of codestream (EOC) - break; - case 0xFF51: // Image and tile size (SIZ) - length = readUint16(data, position); - var siz = {}; - siz.Xsiz = readUint32(data, position + 4); - siz.Ysiz = readUint32(data, position + 8); - siz.XOsiz = readUint32(data, position + 12); - siz.YOsiz = readUint32(data, position + 16); - siz.XTsiz = readUint32(data, position + 20); - siz.YTsiz = readUint32(data, position + 24); - siz.XTOsiz = readUint32(data, position + 28); - siz.YTOsiz = readUint32(data, position + 32); - var componentsCount = readUint16(data, position + 36); - siz.Csiz = componentsCount; - var components = []; - j = position + 38; - for (var i = 0; i < componentsCount; i++) { - var component = { - precision: (data[j] & 0x7F) + 1, - isSigned: !!(data[j] & 0x80), - XRsiz: data[j + 1], - YRsiz: data[j + 1] - }; - calculateComponentDimensions(component, siz); - components.push(component); - } - context.SIZ = siz; - context.components = components; - calculateTileGrids(context, components); - context.QCC = []; - context.COC = []; - break; - case 0xFF5C: // Quantization default (QCD) - length = readUint16(data, position); - var qcd = {}; - j = position + 2; - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('JPX Error: Invalid SQcd value ' + sqcd); - } - qcd.noQuantization = (spqcdSize === 8); - qcd.scalarExpounded = scalarExpounded; - qcd.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - var spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcd.SPqcds = spqcds; - if (context.mainHeader) { - context.QCD = qcd; - } else { - context.currentTile.QCD = qcd; - context.currentTile.QCC = []; - } - break; - case 0xFF5D: // Quantization component (QCC) - length = readUint16(data, position); - var qcc = {}; - j = position + 2; - var cqcc; - if (context.SIZ.Csiz < 257) { - cqcc = data[j++]; - } else { - cqcc = readUint16(data, j); - j += 2; - } - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('JPX Error: Invalid SQcd value ' + sqcd); - } - qcc.noQuantization = (spqcdSize === 8); - qcc.scalarExpounded = scalarExpounded; - qcc.guardBits = sqcd >> 5; - spqcds = []; - while (j < (length + position)) { - spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcc.SPqcds = spqcds; - if (context.mainHeader) { - context.QCC[cqcc] = qcc; - } else { - context.currentTile.QCC[cqcc] = qcc; - } - break; - case 0xFF52: // Coding style default (COD) - length = readUint16(data, position); - var cod = {}; - j = position + 2; - var scod = data[j++]; - cod.entropyCoderWithCustomPrecincts = !!(scod & 1); - cod.sopMarkerUsed = !!(scod & 2); - cod.ephMarkerUsed = !!(scod & 4); - cod.progressionOrder = data[j++]; - cod.layersCount = readUint16(data, j); - j += 2; - cod.multipleComponentTransform = data[j++]; - - cod.decompositionLevelsCount = data[j++]; - cod.xcb = (data[j++] & 0xF) + 2; - cod.ycb = (data[j++] & 0xF) + 2; - var blockStyle = data[j++]; - cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); - cod.resetContextProbabilities = !!(blockStyle & 2); - cod.terminationOnEachCodingPass = !!(blockStyle & 4); - cod.verticalyStripe = !!(blockStyle & 8); - cod.predictableTermination = !!(blockStyle & 16); - cod.segmentationSymbolUsed = !!(blockStyle & 32); - cod.reversibleTransformation = data[j++]; - if (cod.entropyCoderWithCustomPrecincts) { - var precinctsSizes = []; - while (j < length + position) { - var precinctsSize = data[j++]; - precinctsSizes.push({ - PPx: precinctsSize & 0xF, - PPy: precinctsSize >> 4 - }); - } - cod.precinctsSizes = precinctsSizes; - } - var unsupported = []; - if (cod.selectiveArithmeticCodingBypass) { - unsupported.push('selectiveArithmeticCodingBypass'); - } - if (cod.resetContextProbabilities) { - unsupported.push('resetContextProbabilities'); - } - if (cod.terminationOnEachCodingPass) { - unsupported.push('terminationOnEachCodingPass'); - } - if (cod.verticalyStripe) { - unsupported.push('verticalyStripe'); - } - if (cod.predictableTermination) { - unsupported.push('predictableTermination'); - } - if (unsupported.length > 0) { - doNotRecover = true; - throw new Error('JPX Error: Unsupported COD options (' + - unsupported.join(', ') + ')'); - } - if (context.mainHeader) { - context.COD = cod; - } else { - context.currentTile.COD = cod; - context.currentTile.COC = []; - } - break; - case 0xFF90: // Start of tile-part (SOT) - length = readUint16(data, position); - tile = {}; - tile.index = readUint16(data, position + 2); - tile.length = readUint32(data, position + 4); - tile.dataEnd = tile.length + position - 2; - tile.partIndex = data[position + 8]; - tile.partsCount = data[position + 9]; - - context.mainHeader = false; - if (tile.partIndex === 0) { - // reset component specific settings - tile.COD = context.COD; - tile.COC = context.COC.slice(0); // clone of the global COC - tile.QCD = context.QCD; - tile.QCC = context.QCC.slice(0); // clone of the global COC - } - context.currentTile = tile; - break; - case 0xFF93: // Start of data (SOD) - tile = context.currentTile; - if (tile.partIndex === 0) { - initializeTile(context, tile.index); - buildPackets(context); - } - - // moving to the end of the data - length = tile.dataEnd - position; - parseTilePackets(context, data, position, length); - break; - case 0xFF55: // Tile-part lengths, main header (TLM) - case 0xFF57: // Packet length, main header (PLM) - case 0xFF58: // Packet length, tile-part header (PLT) - case 0xFF64: // Comment (COM) - length = readUint16(data, position); - // skipping content - break; - case 0xFF53: // Coding style component (COC) - throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' + - 'not implemented'); - default: - throw new Error('JPX Error: Unknown codestream code: ' + - code.toString(16)); - } - position += length; - } - } catch (e) { - if (doNotRecover || this.failOnCorruptedImage) { - throw e; - } else { - warn('Trying to recover from ' + e.message); - } - } - this.tiles = transformComponents(context); - this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; - this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; - this.componentsCount = context.SIZ.Csiz; - } - }; - function calculateComponentDimensions(component, siz) { - // Section B.2 Component mapping - component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); - component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); - component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); - component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); - component.width = component.x1 - component.x0; - component.height = component.y1 - component.y0; - } - function calculateTileGrids(context, components) { - var siz = context.SIZ; - // Section B.3 Division into tile and tile-components - var tile, tiles = []; - var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); - var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); - for (var q = 0; q < numYtiles; q++) { - for (var p = 0; p < numXtiles; p++) { - tile = {}; - tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); - tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); - tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); - tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); - tile.width = tile.tx1 - tile.tx0; - tile.height = tile.ty1 - tile.ty0; - tile.components = []; - tiles.push(tile); - } - } - context.tiles = tiles; - - var componentsCount = siz.Csiz; - for (var i = 0, ii = componentsCount; i < ii; i++) { - var component = components[i]; - for (var j = 0, jj = tiles.length; j < jj; j++) { - var tileComponent = {}; - tile = tiles[j]; - tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); - tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); - tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); - tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); - tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; - tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; - tile.components[i] = tileComponent; - } - } - } - function getBlocksDimensions(context, component, r) { - var codOrCoc = component.codingStyleParameters; - var result = {}; - if (!codOrCoc.entropyCoderWithCustomPrecincts) { - result.PPx = 15; - result.PPy = 15; - } else { - result.PPx = codOrCoc.precinctsSizes[r].PPx; - result.PPy = codOrCoc.precinctsSizes[r].PPy; - } - // calculate codeblock size as described in section B.7 - result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : - Math.min(codOrCoc.xcb, result.PPx)); - result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : - Math.min(codOrCoc.ycb, result.PPy)); - return result; - } - function buildPrecincts(context, resolution, dimensions) { - // Section B.6 Division resolution to precincts - var precinctWidth = 1 << dimensions.PPx; - var precinctHeight = 1 << dimensions.PPy; - // Jasper introduces codeblock groups for mapping each subband codeblocks - // to precincts. Precinct partition divides a resolution according to width - // and height parameters. The subband that belongs to the resolution level - // has a different size than the level, unless it is the zero resolution. - - // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding: - // The precinct partitioning for a particular subband is derived from a - // partitioning of its parent LL band (i.e., the LL band at the next higher - // resolution level)... The LL band associated with each resolution level is - // divided into precincts... Each of the resulting precinct regions is then - // mapped into its child subbands (if any) at the next lower resolution - // level. This is accomplished by using the coordinate transformation - // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the - // coordinates of a point in the LL band and child subband, respectively. - var isZeroRes = resolution.resLevel === 0; - var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1)); - var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1)); - var numprecinctswide = (resolution.trx1 > resolution.trx0 ? - Math.ceil(resolution.trx1 / precinctWidth) - - Math.floor(resolution.trx0 / precinctWidth) : 0); - var numprecinctshigh = (resolution.try1 > resolution.try0 ? - Math.ceil(resolution.try1 / precinctHeight) - - Math.floor(resolution.try0 / precinctHeight) : 0); - var numprecincts = numprecinctswide * numprecinctshigh; - - resolution.precinctParameters = { - precinctWidth: precinctWidth, - precinctHeight: precinctHeight, - numprecinctswide: numprecinctswide, - numprecinctshigh: numprecinctshigh, - numprecincts: numprecincts, - precinctWidthInSubband: precinctWidthInSubband, - precinctHeightInSubband: precinctHeightInSubband - }; - } - function buildCodeblocks(context, subband, dimensions) { - // Section B.7 Division sub-band into code-blocks - var xcb_ = dimensions.xcb_; - var ycb_ = dimensions.ycb_; - var codeblockWidth = 1 << xcb_; - var codeblockHeight = 1 << ycb_; - var cbx0 = subband.tbx0 >> xcb_; - var cby0 = subband.tby0 >> ycb_; - var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_; - var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_; - var precinctParameters = subband.resolution.precinctParameters; - var codeblocks = []; - var precincts = []; - var i, j, codeblock, precinctNumber; - for (j = cby0; j < cby1; j++) { - for (i = cbx0; i < cbx1; i++) { - codeblock = { - cbx: i, - cby: j, - tbx0: codeblockWidth * i, - tby0: codeblockHeight * j, - tbx1: codeblockWidth * (i + 1), - tby1: codeblockHeight * (j + 1) - }; - - codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); - codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); - codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); - codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); - - // Calculate precinct number for this codeblock, codeblock position - // should be relative to its subband, use actual dimension and position - // See comment about codeblock group width and height - var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / - precinctParameters.precinctWidthInSubband); - var pj = Math.floor((codeblock.tby0_ - subband.tby0) / - precinctParameters.precinctHeightInSubband); - precinctNumber = pi + (pj * precinctParameters.numprecinctswide); - - codeblock.precinctNumber = precinctNumber; - codeblock.subbandType = subband.type; - codeblock.Lblock = 3; - - if (codeblock.tbx1_ <= codeblock.tbx0_ || - codeblock.tby1_ <= codeblock.tby0_) { - continue; - } - codeblocks.push(codeblock); - // building precinct for the sub-band - var precinct = precincts[precinctNumber]; - if (precinct !== undefined) { - if (i < precinct.cbxMin) { - precinct.cbxMin = i; - } else if (i > precinct.cbxMax) { - precinct.cbxMax = i; - } - if (j < precinct.cbyMin) { - precinct.cbxMin = j; - } else if (j > precinct.cbyMax) { - precinct.cbyMax = j; - } - } else { - precincts[precinctNumber] = precinct = { - cbxMin: i, - cbyMin: j, - cbxMax: i, - cbyMax: j - }; - } - codeblock.precinct = precinct; - } - } - subband.codeblockParameters = { - codeblockWidth: xcb_, - codeblockHeight: ycb_, - numcodeblockwide: cbx1 - cbx0 + 1, - numcodeblockhigh: cby1 - cby0 + 1 - }; - subband.codeblocks = codeblocks; - subband.precincts = precincts; - } - function createPacket(resolution, precinctNumber, layerNumber) { - var precinctCodeblocks = []; - // Section B.10.8 Order of info in packet - var subbands = resolution.subbands; - // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence - for (var i = 0, ii = subbands.length; i < ii; i++) { - var subband = subbands[i]; - var codeblocks = subband.codeblocks; - for (var j = 0, jj = codeblocks.length; j < jj; j++) { - var codeblock = codeblocks[j]; - if (codeblock.precinctNumber !== precinctNumber) { - continue; - } - precinctCodeblocks.push(codeblock); - } - } - return { - layerNumber: layerNumber, - codeblocks: precinctCodeblocks - }; - } - function LayerResolutionComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var l = 0, r = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.1 Layer-resolution-component-position - for (; l < layersCount; l++) { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - r = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ResolutionLayerComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var r = 0, l = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.2 Resolution-layer-component-position - for (; r <= maxDecompositionLevelsCount; r++) { - for (; l < layersCount; l++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - l = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ResolutionPositionComponentLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var l, r, c, p; - var maxDecompositionLevelsCount = 0; - for (c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - component.codingStyleParameters.decompositionLevelsCount); - } - var maxNumPrecinctsInLevel = new Int32Array( - maxDecompositionLevelsCount + 1); - for (r = 0; r <= maxDecompositionLevelsCount; ++r) { - var maxNumPrecincts = 0; - for (c = 0; c < componentsCount; ++c) { - var resolutions = tile.components[c].resolutions; - if (r < resolutions.length) { - maxNumPrecincts = Math.max(maxNumPrecincts, - resolutions[r].precinctParameters.numprecincts); - } - } - maxNumPrecinctsInLevel[r] = maxNumPrecincts; - } - l = 0; - r = 0; - c = 0; - p = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.3 Resolution-position-component-layer - for (; r <= maxDecompositionLevelsCount; r++) { - for (; p < maxNumPrecinctsInLevel[r]; p++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - if (p >= numprecincts) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, p, l); - l++; - return packet; - } - l = 0; - } - c = 0; - } - p = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function PositionComponentResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var precinctsIterationSizes = precinctsSizes; - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.4 Position-component-resolution-layer - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = - precinctsSizes.components[c].resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - c = 0; - } - px = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ComponentPositionResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.5 Component-position-resolution-layer - for (; c < componentsCount; ++c) { - var component = tile.components[c]; - var precinctsIterationSizes = precinctsSizes.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = precinctsIterationSizes.resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - px = 0; - } - py = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function getPrecinctIndexIfExist( - pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { - var posX = pxIndex * precinctIterationSizes.minWidth; - var posY = pyIndex * precinctIterationSizes.minHeight; - if (posX % sizeInImageScale.width !== 0 || - posY % sizeInImageScale.height !== 0) { - return null; - } - var startPrecinctRowIndex = - (posY / sizeInImageScale.width) * - resolution.precinctParameters.numprecinctswide; - return (posX / sizeInImageScale.height) + startPrecinctRowIndex; - } - function getPrecinctSizesInImageScale(tile) { - var componentsCount = tile.components.length; - var minWidth = Number.MAX_VALUE; - var minHeight = Number.MAX_VALUE; - var maxNumWide = 0; - var maxNumHigh = 0; - var sizePerComponent = new Array(componentsCount); - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - var sizePerResolution = new Array(decompositionLevelsCount + 1); - var minWidthCurrentComponent = Number.MAX_VALUE; - var minHeightCurrentComponent = Number.MAX_VALUE; - var maxNumWideCurrentComponent = 0; - var maxNumHighCurrentComponent = 0; - var scale = 1; - for (var r = decompositionLevelsCount; r >= 0; --r) { - var resolution = component.resolutions[r]; - var widthCurrentResolution = - scale * resolution.precinctParameters.precinctWidth; - var heightCurrentResolution = - scale * resolution.precinctParameters.precinctHeight; - minWidthCurrentComponent = Math.min( - minWidthCurrentComponent, - widthCurrentResolution); - minHeightCurrentComponent = Math.min( - minHeightCurrentComponent, - heightCurrentResolution); - maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, - resolution.precinctParameters.numprecinctswide); - maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, - resolution.precinctParameters.numprecinctshigh); - sizePerResolution[r] = { - width: widthCurrentResolution, - height: heightCurrentResolution - }; - scale <<= 1; - } - minWidth = Math.min(minWidth, minWidthCurrentComponent); - minHeight = Math.min(minHeight, minHeightCurrentComponent); - maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); - maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); - sizePerComponent[c] = { - resolutions: sizePerResolution, - minWidth: minWidthCurrentComponent, - minHeight: minHeightCurrentComponent, - maxNumWide: maxNumWideCurrentComponent, - maxNumHigh: maxNumHighCurrentComponent - }; - } - return { - components: sizePerComponent, - minWidth: minWidth, - minHeight: minHeight, - maxNumWide: maxNumWide, - maxNumHigh: maxNumHigh - }; - } - function buildPackets(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var componentsCount = siz.Csiz; - // Creating resolutions and sub-bands for each component - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - // Section B.5 Resolution levels and sub-bands - var resolutions = []; - var subbands = []; - for (var r = 0; r <= decompositionLevelsCount; r++) { - var blocksDimensions = getBlocksDimensions(context, component, r); - var resolution = {}; - var scale = 1 << (decompositionLevelsCount - r); - resolution.trx0 = Math.ceil(component.tcx0 / scale); - resolution.try0 = Math.ceil(component.tcy0 / scale); - resolution.trx1 = Math.ceil(component.tcx1 / scale); - resolution.try1 = Math.ceil(component.tcy1 / scale); - resolution.resLevel = r; - buildPrecincts(context, resolution, blocksDimensions); - resolutions.push(resolution); - - var subband; - if (r === 0) { - // one sub-band (LL) with last decomposition - subband = {}; - subband.type = 'LL'; - subband.tbx0 = Math.ceil(component.tcx0 / scale); - subband.tby0 = Math.ceil(component.tcy0 / scale); - subband.tbx1 = Math.ceil(component.tcx1 / scale); - subband.tby1 = Math.ceil(component.tcy1 / scale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolution.subbands = [subband]; - } else { - var bscale = 1 << (decompositionLevelsCount - r + 1); - var resolutionSubbands = []; - // three sub-bands (HL, LH and HH) with rest of decompositions - subband = {}; - subband.type = 'HL'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'LH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'HH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - resolution.subbands = resolutionSubbands; - } - } - component.resolutions = resolutions; - component.subbands = subbands; - } - // Generate the packets sequence - var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; - switch (progressionOrder) { - case 0: - tile.packetsIterator = - new LayerResolutionComponentPositionIterator(context); - break; - case 1: - tile.packetsIterator = - new ResolutionLayerComponentPositionIterator(context); - break; - case 2: - tile.packetsIterator = - new ResolutionPositionComponentLayerIterator(context); - break; - case 3: - tile.packetsIterator = - new PositionComponentResolutionLayerIterator(context); - break; - case 4: - tile.packetsIterator = - new ComponentPositionResolutionLayerIterator(context); - break; - default: - throw new Error('JPX Error: Unsupported progression order ' + - progressionOrder); - } - } - function parseTilePackets(context, data, offset, dataLength) { - var position = 0; - var buffer, bufferSize = 0, skipNextBit = false; - function readBits(count) { - while (bufferSize < count) { - var b = data[offset + position]; - position++; - if (skipNextBit) { - buffer = (buffer << 7) | b; - bufferSize += 7; - skipNextBit = false; - } else { - buffer = (buffer << 8) | b; - bufferSize += 8; - } - if (b === 0xFF) { - skipNextBit = true; - } - } - bufferSize -= count; - return (buffer >>> bufferSize) & ((1 << count) - 1); - } - function skipMarkerIfEqual(value) { - if (data[offset + position - 1] === 0xFF && - data[offset + position] === value) { - skipBytes(1); - return true; - } else if (data[offset + position] === 0xFF && - data[offset + position + 1] === value) { - skipBytes(2); - return true; - } - return false; - } - function skipBytes(count) { - position += count; - } - function alignToByte() { - bufferSize = 0; - if (skipNextBit) { - position++; - skipNextBit = false; - } - } - function readCodingpasses() { - if (readBits(1) === 0) { - return 1; - } - if (readBits(1) === 0) { - return 2; - } - var value = readBits(2); - if (value < 3) { - return value + 3; - } - value = readBits(5); - if (value < 31) { - return value + 6; - } - value = readBits(7); - return value + 37; - } - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var sopMarkerUsed = context.COD.sopMarkerUsed; - var ephMarkerUsed = context.COD.ephMarkerUsed; - var packetsIterator = tile.packetsIterator; - while (position < dataLength) { - alignToByte(); - if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { - // Skip also marker segment length and packet sequence ID - skipBytes(4); - } - var packet = packetsIterator.nextPacket(); - if (!readBits(1)) { - continue; - } - var layerNumber = packet.layerNumber; - var queue = [], codeblock; - for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { - codeblock = packet.codeblocks[i]; - var precinct = codeblock.precinct; - var codeblockColumn = codeblock.cbx - precinct.cbxMin; - var codeblockRow = codeblock.cby - precinct.cbyMin; - var codeblockIncluded = false; - var firstTimeInclusion = false; - var valueReady; - if (codeblock['included'] !== undefined) { - codeblockIncluded = !!readBits(1); - } else { - // reading inclusion tree - precinct = codeblock.precinct; - var inclusionTree, zeroBitPlanesTree; - if (precinct['inclusionTree'] !== undefined) { - inclusionTree = precinct.inclusionTree; - } else { - // building inclusion and zero bit-planes trees - var width = precinct.cbxMax - precinct.cbxMin + 1; - var height = precinct.cbyMax - precinct.cbyMin + 1; - inclusionTree = new InclusionTree(width, height, layerNumber); - zeroBitPlanesTree = new TagTree(width, height); - precinct.inclusionTree = inclusionTree; - precinct.zeroBitPlanesTree = zeroBitPlanesTree; - } - - if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { - while (true) { - if (readBits(1)) { - valueReady = !inclusionTree.nextLevel(); - if (valueReady) { - codeblock.included = true; - codeblockIncluded = firstTimeInclusion = true; - break; - } - } else { - inclusionTree.incrementValue(layerNumber); - break; - } - } - } - } - if (!codeblockIncluded) { - continue; - } - if (firstTimeInclusion) { - zeroBitPlanesTree = precinct.zeroBitPlanesTree; - zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); - while (true) { - if (readBits(1)) { - valueReady = !zeroBitPlanesTree.nextLevel(); - if (valueReady) { - break; - } - } else { - zeroBitPlanesTree.incrementValue(); - } - } - codeblock.zeroBitPlanes = zeroBitPlanesTree.value; - } - var codingpasses = readCodingpasses(); - while (readBits(1)) { - codeblock.Lblock++; - } - var codingpassesLog2 = log2(codingpasses); - // rounding down log2 - var bits = ((codingpasses < (1 << codingpassesLog2)) ? - codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; - var codedDataLength = readBits(bits); - queue.push({ - codeblock: codeblock, - codingpasses: codingpasses, - dataLength: codedDataLength - }); - } - alignToByte(); - if (ephMarkerUsed) { - skipMarkerIfEqual(0x92); - } - while (queue.length > 0) { - var packetItem = queue.shift(); - codeblock = packetItem.codeblock; - if (codeblock['data'] === undefined) { - codeblock.data = []; - } - codeblock.data.push({ - data: data, - start: offset + position, - end: offset + position + packetItem.dataLength, - codingpasses: packetItem.codingpasses - }); - position += packetItem.dataLength; - } - } - return position; - } - function copyCoefficients(coefficients, levelWidth, levelHeight, subband, - delta, mb, reversible, segmentationSymbolUsed) { - var x0 = subband.tbx0; - var y0 = subband.tby0; - var width = subband.tbx1 - subband.tbx0; - var codeblocks = subband.codeblocks; - var right = subband.type.charAt(0) === 'H' ? 1 : 0; - var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0; - - for (var i = 0, ii = codeblocks.length; i < ii; ++i) { - var codeblock = codeblocks[i]; - var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; - var blockHeight = codeblock.tby1_ - codeblock.tby0_; - if (blockWidth === 0 || blockHeight === 0) { - continue; - } - if (codeblock['data'] === undefined) { - continue; - } - - var bitModel, currentCodingpassType; - bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, - codeblock.zeroBitPlanes, mb); - currentCodingpassType = 2; // first bit plane starts from cleanup - - // collect data - var data = codeblock.data, totalLength = 0, codingpasses = 0; - var j, jj, dataItem; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - totalLength += dataItem.end - dataItem.start; - codingpasses += dataItem.codingpasses; - } - var encodedData = new Uint8Array(totalLength); - var position = 0; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); - encodedData.set(chunk, position); - position += chunk.length; - } - // decoding the item - var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); - bitModel.setDecoder(decoder); - - for (j = 0; j < codingpasses; j++) { - switch (currentCodingpassType) { - case 0: - bitModel.runSignificancePropogationPass(); - break; - case 1: - bitModel.runMagnitudeRefinementPass(); - break; - case 2: - bitModel.runCleanupPass(); - if (segmentationSymbolUsed) { - bitModel.checkSegmentationSymbol(); - } - break; - } - currentCodingpassType = (currentCodingpassType + 1) % 3; - } - - var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width; - var sign = bitModel.coefficentsSign; - var magnitude = bitModel.coefficentsMagnitude; - var bitsDecoded = bitModel.bitsDecoded; - var magnitudeCorrection = reversible ? 0 : 0.5; - var k, n, nb; - position = 0; - // Do the interleaving of Section F.3.3 here, so we do not need - // to copy later. LL level is not interleaved, just copied. - var interleave = (subband.type !== 'LL'); - for (j = 0; j < blockHeight; j++) { - var row = (offset / width) | 0; // row in the non-interleaved subband - var levelOffset = 2 * row * (levelWidth - width) + right + bottom; - for (k = 0; k < blockWidth; k++) { - n = magnitude[position]; - if (n !== 0) { - n = (n + magnitudeCorrection) * delta; - if (sign[position] !== 0) { - n = -n; - } - nb = bitsDecoded[position]; - var pos = interleave ? (levelOffset + (offset << 1)) : offset; - if (reversible && (nb >= mb)) { - coefficients[pos] = n; - } else { - coefficients[pos] = n * (1 << (mb - nb)); - } - } - offset++; - position++; - } - offset += width - blockWidth; - } - } - } - function transformTile(context, tile, c) { - var component = tile.components[c]; - var codingStyleParameters = component.codingStyleParameters; - var quantizationParameters = component.quantizationParameters; - var decompositionLevelsCount = - codingStyleParameters.decompositionLevelsCount; - var spqcds = quantizationParameters.SPqcds; - var scalarExpounded = quantizationParameters.scalarExpounded; - var guardBits = quantizationParameters.guardBits; - var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; - var precision = context.components[c].precision; - - var reversible = codingStyleParameters.reversibleTransformation; - var transform = (reversible ? new ReversibleTransform() : - new IrreversibleTransform()); - - var subbandCoefficients = []; - var b = 0; - for (var i = 0; i <= decompositionLevelsCount; i++) { - var resolution = component.resolutions[i]; - - var width = resolution.trx1 - resolution.trx0; - var height = resolution.try1 - resolution.try0; - // Allocate space for the whole sublevel. - var coefficients = new Float32Array(width * height); - - for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { - var mu, epsilon; - if (!scalarExpounded) { - // formula E-5 - mu = spqcds[0].mu; - epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); - } else { - mu = spqcds[b].mu; - epsilon = spqcds[b].epsilon; - b++; - } - - var subband = resolution.subbands[j]; - var gainLog2 = SubbandsGainLog2[subband.type]; - - // calulate quantization coefficient (Section E.1.1.1) - var delta = (reversible ? 1 : - Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048)); - var mb = (guardBits + epsilon - 1); - - // In the first resolution level, copyCoefficients will fill the - // whole array with coefficients. In the succeding passes, - // copyCoefficients will consecutively fill in the values that belong - // to the interleaved positions of the HL, LH, and HH coefficients. - // The LL coefficients will then be interleaved in Transform.iterate(). - copyCoefficients(coefficients, width, height, subband, delta, mb, - reversible, segmentationSymbolUsed); - } - subbandCoefficients.push({ - width: width, - height: height, - items: coefficients - }); - } - - var result = transform.calculate(subbandCoefficients, - component.tcx0, component.tcy0); - return { - left: component.tcx0, - top: component.tcy0, - width: result.width, - height: result.height, - items: result.items - }; - } - function transformComponents(context) { - var siz = context.SIZ; - var components = context.components; - var componentsCount = siz.Csiz; - var resultImages = []; - for (var i = 0, ii = context.tiles.length; i < ii; i++) { - var tile = context.tiles[i]; - var transformedTiles = []; - var c; - for (c = 0; c < componentsCount; c++) { - transformedTiles[c] = transformTile(context, tile, c); - } - var tile0 = transformedTiles[0]; - var out = new Uint8Array(tile0.items.length * componentsCount); - var result = { - left: tile0.left, - top: tile0.top, - width: tile0.width, - height: tile0.height, - items: out - }; - - // Section G.2.2 Inverse multi component transform - var shift, offset, max, min, maxK; - var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; - if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - var fourComponents = componentsCount === 4; - var y0items = transformedTiles[0].items; - var y1items = transformedTiles[1].items; - var y2items = transformedTiles[2].items; - var y3items = fourComponents ? transformedTiles[3].items : null; - - // HACK: The multiple component transform formulas below assume that - // all components have the same precision. With this in mind, we - // compute shift and offset only once. - shift = components[0].precision - 8; - offset = (128 << shift) + 0.5; - max = 255 * (1 << shift); - maxK = max * 0.5; - min = -maxK; - - var component0 = tile.components[0]; - var alpha01 = componentsCount - 3; - jj = y0items.length; - if (!component0.codingStyleParameters.reversibleTransformation) { - // inverse irreversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - r = y0 + 1.402 * y2; - g = y0 - 0.34413 * y1 - 0.71414 * y2; - b = y0 + 1.772 * y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } else { - // inverse reversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - g = y0 - ((y2 + y1) >> 2); - r = g + y2; - b = g + y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } - if (fourComponents) { - for (j = 0, pos = 3; j < jj; j++, pos += 4) { - k = y3items[j]; - out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift; - } - } - } else { // no multi-component transform - for (c = 0; c < componentsCount; c++) { - var items = transformedTiles[c].items; - shift = components[c].precision - 8; - offset = (128 << shift) + 0.5; - max = (127.5 * (1 << shift)); - min = -max; - for (pos = c, j = 0, jj = items.length; j < jj; j++) { - val = items[j]; - out[pos] = val <= min ? 0 : - val >= max ? 255 : (val + offset) >> shift; - pos += componentsCount; - } - } - } - resultImages.push(result); - } - return resultImages; - } - function initializeTile(context, tileIndex) { - var siz = context.SIZ; - var componentsCount = siz.Csiz; - var tile = context.tiles[tileIndex]; - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ? - context.currentTile.QCC[c] : context.currentTile.QCD); - component.quantizationParameters = qcdOrQcc; - var codOrCoc = (context.currentTile.COC[c] !== undefined ? - context.currentTile.COC[c] : context.currentTile.COD); - component.codingStyleParameters = codOrCoc; - } - tile.codingStyleDefaultParameters = context.currentTile.COD; - } - - // Section B.10.2 Tag trees - var TagTree = (function TagTreeClosure() { - function TagTree(width, height) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var level = { - width: width, - height: height, - items: [] - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - TagTree.prototype = { - reset: function TagTree_reset(i, j) { - var currentLevel = 0, value = 0, level; - while (currentLevel < this.levels.length) { - level = this.levels[currentLevel]; - var index = i + j * level.width; - if (level.items[index] !== undefined) { - value = level.items[index]; - break; - } - level.index = index; - i >>= 1; - j >>= 1; - currentLevel++; - } - currentLevel--; - level = this.levels[currentLevel]; - level.items[level.index] = value; - this.currentLevel = currentLevel; - delete this.value; - }, - incrementValue: function TagTree_incrementValue() { - var level = this.levels[this.currentLevel]; - level.items[level.index]++; - }, - nextLevel: function TagTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - currentLevel--; - if (currentLevel < 0) { - this.value = value; - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return TagTree; - })(); - - var InclusionTree = (function InclusionTreeClosure() { - function InclusionTree(width, height, defaultValue) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var items = new Uint8Array(width * height); - for (var j = 0, jj = items.length; j < jj; j++) { - items[j] = defaultValue; - } - - var level = { - width: width, - height: height, - items: items - }; - this.levels.push(level); - - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - InclusionTree.prototype = { - reset: function InclusionTree_reset(i, j, stopValue) { - var currentLevel = 0; - while (currentLevel < this.levels.length) { - var level = this.levels[currentLevel]; - var index = i + j * level.width; - level.index = index; - var value = level.items[index]; - - if (value === 0xFF) { - break; - } - - if (value > stopValue) { - this.currentLevel = currentLevel; - // already know about this one, propagating the value to top levels - this.propagateValues(); - return false; - } - - i >>= 1; - j >>= 1; - currentLevel++; - } - this.currentLevel = currentLevel - 1; - return true; - }, - incrementValue: function InclusionTree_incrementValue(stopValue) { - var level = this.levels[this.currentLevel]; - level.items[level.index] = stopValue + 1; - this.propagateValues(); - }, - propagateValues: function InclusionTree_propagateValues() { - var levelIndex = this.currentLevel; - var level = this.levels[levelIndex]; - var currentValue = level.items[level.index]; - while (--levelIndex >= 0) { - level = this.levels[levelIndex]; - level.items[level.index] = currentValue; - } - }, - nextLevel: function InclusionTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - level.items[level.index] = 0xFF; - currentLevel--; - if (currentLevel < 0) { - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return InclusionTree; - })(); - - // Section D. Coefficient bit modeling - var BitModel = (function BitModelClosure() { - var UNIFORM_CONTEXT = 17; - var RUNLENGTH_CONTEXT = 18; - // Table D-1 - // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4), - // vv - sum of Vi (0..2), and hh - sum of Hi (0..2) - var LLAndLHContextsLabel = new Uint8Array([ - 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, - 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, - 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 - ]); - var HLContextLabel = new Uint8Array([ - 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, - 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, - 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 - ]); - var HHContextLabel = new Uint8Array([ - 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, - 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, - 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 - ]); - - function BitModel(width, height, subband, zeroBitPlanes, mb) { - this.width = width; - this.height = height; - - this.contextLabelTable = (subband === 'HH' ? HHContextLabel : - (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel)); - - var coefficientCount = width * height; - - // coefficients outside the encoding region treated as insignificant - // add border state cells for significanceState - this.neighborsSignificance = new Uint8Array(coefficientCount); - this.coefficentsSign = new Uint8Array(coefficientCount); - this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : - mb > 6 ? new Uint16Array(coefficientCount) : - new Uint8Array(coefficientCount); - this.processingFlags = new Uint8Array(coefficientCount); - - var bitsDecoded = new Uint8Array(coefficientCount); - if (zeroBitPlanes !== 0) { - for (var i = 0; i < coefficientCount; i++) { - bitsDecoded[i] = zeroBitPlanes; - } - } - this.bitsDecoded = bitsDecoded; - - this.reset(); - } - - BitModel.prototype = { - setDecoder: function BitModel_setDecoder(decoder) { - this.decoder = decoder; - }, - reset: function BitModel_reset() { - // We have 17 contexts that are accessed via context labels, - // plus the uniform and runlength context. - this.contexts = new Int8Array(19); - - // Contexts are packed into 1 byte: - // highest 7 bits carry the index, lowest bit carries mps - this.contexts[0] = (4 << 1) | 0; - this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0; - this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0; - }, - setNeighborsSignificance: - function BitModel_setNeighborsSignificance(row, column, index) { - var neighborsSignificance = this.neighborsSignificance; - var width = this.width, height = this.height; - var left = (column > 0); - var right = (column + 1 < width); - var i; - - if (row > 0) { - i = index - width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (row + 1 < height) { - i = index + width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (left) { - neighborsSignificance[index - 1] += 0x01; - } - if (right) { - neighborsSignificance[index + 1] += 0x01; - } - neighborsSignificance[index] |= 0x80; - }, - runSignificancePropogationPass: - function BitModel_runSignificancePropogationPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var neighborsSignificance = this.neighborsSignificance; - var processingFlags = this.processingFlags; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processedInverseMask = ~1; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - - for (var i0 = 0; i0 < height; i0 += 4) { - for (var j = 0; j < width; j++) { - var index = i0 * width + j; - for (var i1 = 0; i1 < 4; i1++, index += width) { - var i = i0 + i1; - if (i >= height) { - break; - } - // clear processed flag first - processingFlags[index] &= processedInverseMask; - - if (coefficentsMagnitude[index] || - !neighborsSignificance[index]) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision) { - var sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - decodeSignBit: function BitModel_decodeSignBit(row, column, index) { - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contribution, sign0, sign1, significance1; - var contextLabel, decoded; - - // calculate horizontal contribution - significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0); - if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { - sign1 = coefficentsSign[index + 1]; - if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign1 - sign0; - } else { - contribution = 1 - sign1 - sign1; - } - } else if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign0 - sign0; - } else { - contribution = 0; - } - var horizontalContribution = 3 * contribution; - - // calculate vertical contribution and combine with the horizontal - significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0); - if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { - sign1 = coefficentsSign[index + width]; - if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign1 - sign0 + horizontalContribution; - } else { - contribution = 1 - sign1 - sign1 + horizontalContribution; - } - } else if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign0 - sign0 + horizontalContribution; - } else { - contribution = horizontalContribution; - } - - if (contribution >= 0) { - contextLabel = 9 + contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel); - } else { - contextLabel = 9 - contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; - } - return decoded; - }, - runMagnitudeRefinementPass: - function BitModel_runMagnitudeRefinementPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var neighborsSignificance = this.neighborsSignificance; - var contexts = this.contexts; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var length = width * height; - var width4 = width * 4; - - for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { - indexNext = Math.min(length, index0 + width4); - for (var j = 0; j < width; j++) { - for (var index = index0 + j; index < indexNext; index += width) { - - // significant but not those that have just become - if (!coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = 16; - if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { - processingFlags[index] ^= firstMagnitudeBitMask; - // first refinement - var significance = neighborsSignificance[index] & 127; - contextLabel = significance === 0 ? 15 : 14; - } - - var bit = decoder.readBit(contexts, contextLabel); - coefficentsMagnitude[index] = - (coefficentsMagnitude[index] << 1) | bit; - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - runCleanupPass: function BitModel_runCleanupPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var neighborsSignificance = this.neighborsSignificance; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var oneRowDown = width; - var twoRowsDown = width * 2; - var threeRowsDown = width * 3; - var iNext; - for (var i0 = 0; i0 < height; i0 = iNext) { - iNext = Math.min(i0 + 4, height); - var indexBase = i0 * width; - var checkAllEmpty = i0 + 3 < height; - for (var j = 0; j < width; j++) { - var index0 = indexBase + j; - // using the property: labels[neighborsSignificance[index]] === 0 - // when neighborsSignificance[index] === 0 - var allEmpty = (checkAllEmpty && - processingFlags[index0] === 0 && - processingFlags[index0 + oneRowDown] === 0 && - processingFlags[index0 + twoRowsDown] === 0 && - processingFlags[index0 + threeRowsDown] === 0 && - neighborsSignificance[index0] === 0 && - neighborsSignificance[index0 + oneRowDown] === 0 && - neighborsSignificance[index0 + twoRowsDown] === 0 && - neighborsSignificance[index0 + threeRowsDown] === 0); - var i1 = 0, index = index0; - var i = i0, sign; - if (allEmpty) { - var hasSignificantCoefficent = - decoder.readBit(contexts, RUNLENGTH_CONTEXT); - if (!hasSignificantCoefficent) { - bitsDecoded[index0]++; - bitsDecoded[index0 + oneRowDown]++; - bitsDecoded[index0 + twoRowsDown]++; - bitsDecoded[index0 + threeRowsDown]++; - continue; // next column - } - i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (i1 !== 0) { - i = i0 + i1; - index += i1 * width; - } - - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - - index = index0; - for (var i2 = i0; i2 <= i; i2++, index += width) { - bitsDecoded[index]++; - } - - i1++; - } - for (i = i0 + i1; i < iNext; i++, index += width) { - if (coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision === 1) { - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - } - } - } - }, - checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { - var decoder = this.decoder; - var contexts = this.contexts; - var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (symbol !== 0xA) { - throw new Error('JPX Error: Invalid segmentation symbol'); - } - } - }; - - return BitModel; - })(); - - // Section F, Discrete wavelet transformation - var Transform = (function TransformClosure() { - function Transform() {} - - Transform.prototype.calculate = - function transformCalculate(subbands, u0, v0) { - var ll = subbands[0]; - for (var i = 1, ii = subbands.length; i < ii; i++) { - ll = this.iterate(ll, subbands[i], u0, v0); - } - return ll; - }; - Transform.prototype.extend = function extend(buffer, offset, size) { - // Section F.3.7 extending... using max extension of 4 - var i1 = offset - 1, j1 = offset + 1; - var i2 = offset + size - 2, j2 = offset + size; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1] = buffer[j1]; - buffer[j2] = buffer[i2]; - }; - Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, - u0, v0) { - var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; - var width = hl_lh_hh.width; - var height = hl_lh_hh.height; - var items = hl_lh_hh.items; - var i, j, k, l, u, v; - - // Interleave LL according to Section F.3.3 - for (k = 0, i = 0; i < llHeight; i++) { - l = i * 2 * width; - for (j = 0; j < llWidth; j++, k++, l += 2) { - items[l] = llItems[k]; - } - } - // The LL band is not needed anymore. - llItems = ll.items = null; - - var bufferPadding = 4; - var rowBuffer = new Float32Array(width + 2 * bufferPadding); - - // Section F.3.4 HOR_SR - if (width === 1) { - // if width = 1, when u0 even keep items as is, when odd divide by 2 - if ((u0 & 1) !== 0) { - for (v = 0, k = 0; v < height; v++, k += width) { - items[k] *= 0.5; - } - } - } else { - for (v = 0, k = 0; v < height; v++, k += width) { - rowBuffer.set(items.subarray(k, k + width), bufferPadding); - - this.extend(rowBuffer, bufferPadding, width); - this.filter(rowBuffer, bufferPadding, width); - - items.set( - rowBuffer.subarray(bufferPadding, bufferPadding + width), - k); - } - } - - // Accesses to the items array can take long, because it may not fit into - // CPU cache and has to be fetched from main memory. Since subsequent - // accesses to the items array are not local when reading columns, we - // have a cache miss every time. To reduce cache misses, get up to - // 'numBuffers' items at a time and store them into the individual - // buffers. The colBuffers should be small enough to fit into CPU cache. - var numBuffers = 16; - var colBuffers = []; - for (i = 0; i < numBuffers; i++) { - colBuffers.push(new Float32Array(height + 2 * bufferPadding)); - } - var b, currentBuffer = 0; - ll = bufferPadding + height; - - // Section F.3.5 VER_SR - if (height === 1) { - // if height = 1, when v0 even keep items as is, when odd divide by 2 - if ((v0 & 1) !== 0) { - for (u = 0; u < width; u++) { - items[u] *= 0.5; - } - } - } else { - for (u = 0; u < width; u++) { - // if we ran out of buffers, copy several image columns at once - if (currentBuffer === 0) { - numBuffers = Math.min(width - u, numBuffers); - for (k = u, l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - colBuffers[b][l] = items[k + b]; - } - } - currentBuffer = numBuffers; - } - - currentBuffer--; - var buffer = colBuffers[currentBuffer]; - this.extend(buffer, bufferPadding, height); - this.filter(buffer, bufferPadding, height); - - // If this is last buffer in this group of buffers, flush all buffers. - if (currentBuffer === 0) { - k = u - numBuffers + 1; - for (l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - items[k + b] = colBuffers[b][l]; - } - } - } - } - } - - return { - width: width, - height: height, - items: items - }; - }; - return Transform; - })(); - - // Section 3.8.2 Irreversible 9-7 filter - var IrreversibleTransform = (function IrreversibleTransformClosure() { - function IrreversibleTransform() { - Transform.call(this); - } - - IrreversibleTransform.prototype = Object.create(Transform.prototype); - IrreversibleTransform.prototype.filter = - function irreversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n, current, next; - - var alpha = -1.586134342059924; - var beta = -0.052980118572961; - var gamma = 0.882911075530934; - var delta = 0.443506852043971; - var K = 1.230174104914001; - var K_ = 1 / K; - - // step 1 is combined with step 3 - - // step 2 - j = offset - 3; - for (n = len + 4; n--; j += 2) { - x[j] *= K_; - } - - // step 1 & 3 - j = offset - 2; - current = delta * x[j -1]; - for (n = len + 3; n--; j += 2) { - next = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - if (n--) { - j += 2; - current = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - } else { - break; - } - } - - // step 4 - j = offset - 1; - current = gamma * x[j - 1]; - for (n = len + 2; n--; j += 2) { - next = gamma * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = gamma * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 5 - j = offset; - current = beta * x[j - 1]; - for (n = len + 1; n--; j += 2) { - next = beta * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = beta * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 6 - if (len !== 0) { - j = offset + 1; - current = alpha * x[j - 1]; - for (n = len; n--; j += 2) { - next = alpha * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = alpha * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - } - }; - - return IrreversibleTransform; - })(); - - // Section 3.8.1 Reversible 5-3 filter - var ReversibleTransform = (function ReversibleTransformClosure() { - function ReversibleTransform() { - Transform.call(this); - } - - ReversibleTransform.prototype = Object.create(Transform.prototype); - ReversibleTransform.prototype.filter = - function reversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n; - - for (j = offset, n = len + 1; n--; j += 2) { - x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2; - } - - for (j = offset + 1, n = len; n--; j += 2) { - x[j] += (x[j - 1] + x[j + 1]) >> 1; - } - }; - - return ReversibleTransform; - })(); - - return JpxImage; -})(); - - -var Jbig2Image = (function Jbig2ImageClosure() { - // Utility data structures - function ContextCache() {} - - ContextCache.prototype = { - getContexts: function(id) { - if (id in this) { - return this[id]; - } - return (this[id] = new Int8Array(1 << 16)); - } - }; - - function DecodingContext(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - - DecodingContext.prototype = { - get decoder() { - var decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, 'decoder', decoder); - }, - get contextCache() { - var cache = new ContextCache(); - return shadow(this, 'contextCache', cache); - } - }; - - // Annex A. Arithmetic Integer Decoding Procedure - // A.2 Procedure for decoding values - function decodeInteger(contextCache, procedure, decoder) { - var contexts = contextCache.getContexts(procedure); - var prev = 1; - - function readBits(length) { - var v = 0; - for (var i = 0; i < length; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev < 256 ? (prev << 1) | bit : - (((prev << 1) | bit) & 511) | 256); - v = (v << 1) | bit; - } - return v >>> 0; - } - - var sign = readBits(1); - var value = readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(32) + 4436) : - readBits(12) + 340) : - readBits(8) + 84) : - readBits(6) + 20) : - readBits(4) + 4) : - readBits(2); - return (sign === 0 ? value : (value > 0 ? -value : null)); - } - - // A.3 The IAID decoding procedure - function decodeIAID(contextCache, decoder, codeLength) { - var contexts = contextCache.getContexts('IAID'); - - var prev = 1; - for (var i = 0; i < codeLength; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev << 1) | bit; - } - if (codeLength < 31) { - return prev & ((1 << codeLength) - 1); - } - return prev & 0x7FFFFFFF; - } - - // 7.3 Segment types - var SegmentTypes = [ - 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, - 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, - null, null, null, null, null, 'patternDictionary', null, null, null, - 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', - 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, - null, null, null, null, null, 'IntermediateGenericRegion', null, - 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', - 'IntermediateGenericRefinementRegion', null, - 'ImmediateGenericRefinementRegion', - 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, - 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', - 'Tables', null, null, null, null, null, null, null, null, - 'Extension' - ]; - - var CodingTemplates = [ - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1}, - {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2}, - {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, - {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0}, - {x: -1, y: 0}], - [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, - {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}] - ]; - - var RefinementTemplates = [ - { - coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, - {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}] - }, - { - coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0}, - {x: 0, y: 1}, {x: 1, y: 1}] - } - ]; - - // See 6.2.5.7 Decoding the bitmap. - var ReusedContexts = [ - 0x9B25, // 10011 0110010 0101 - 0x0795, // 0011 110010 101 - 0x00E5, // 001 11001 01 - 0x0195 // 011001 0101 - ]; - - var RefinementReusedContexts = [ - 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference) - 0x0008 // '0000' + '001000' - ]; - - function decodeBitmapTemplate0(width, height, decodingContext) { - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; - - // ...ooooo.... - // ..ooooooo... Context template for current pixel (X) - // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel) - var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111 - - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = (i < 1) ? row : bitmap[i - 1]; - row2 = (i < 2) ? row : bitmap[i - 2]; - - // At the beginning of each row: - // Fill contextLabel with pixels that are above/right of (X) - contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) | - (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) | - (row1[3] << 4); - - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - - // At each pixel: Clear contextLabel pixels that are shifted - // out of the context, then add new ones. - contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) | - (j + 3 < width ? row2[j + 3] << 11 : 0) | - (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - - return bitmap; - } - - // 6.2 Generic Region Decoding Procedure - function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, - decodingContext) { - if (mmr) { - error('JBIG2 error: MMR encoding is not supported'); - } - - // Use optimized version for the most common case - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && - at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && - at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - - var useskip = !!skip; - var template = CodingTemplates[templateIndex].concat(at); - - // Sorting is non-standard, and it is not required. But sorting increases - // the number of template bits that can be reused from the previous - // contextLabel in the main loop. - template.sort(function (a, b) { - return (a.y - b.y) || (a.x - b.x); - }); - - var templateLength = template.length; - var templateX = new Int8Array(templateLength); - var templateY = new Int8Array(templateLength); - var changingTemplateEntries = []; - var reuseMask = 0, minX = 0, maxX = 0, minY = 0; - var c, k; - - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - // Check if the template pixel appears in two consecutive context labels, - // so it can be reused. Otherwise, we add it to the list of changing - // template entries. - if (k < templateLength - 1 && - template[k].y === template[k + 1].y && - template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << (templateLength - 1 - k); - } else { - changingTemplateEntries.push(k); - } - } - var changingEntriesLength = changingTemplateEntries.length; - - var changingTemplateX = new Int8Array(changingEntriesLength); - var changingTemplateY = new Int8Array(changingEntriesLength); - var changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << (templateLength - 1 - k); - } - - // Get the safe bounding box edges from the width, height, minX, maxX, minY - var sbb_left = -minX; - var sbb_top = -minY; - var sbb_right = width - maxX; - - var pseudoPixelContext = ReusedContexts[templateIndex]; - var row = new Uint8Array(width); - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - - var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); // duplicate previous row - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - // Are we in the middle of a scanline, so we can reuse contextLabel - // bits? - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - // If yes, we can just shift the bits that are reusable and only - // fetch the remaining ones. - contextLabel = (contextLabel << 1) & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - // compute the contextLabel from scratch - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; - } - } - } - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; - } - - // 6.3.2 Generic Refinement Region Decoding Procedure - function decodeRefinement(width, height, templateIndex, referenceBitmap, - offsetX, offsetY, prediction, at, - decodingContext) { - var codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([at[0]]); - } - var codingTemplateLength = codingTemplate.length; - var codingTemplateX = new Int32Array(codingTemplateLength); - var codingTemplateY = new Int32Array(codingTemplateLength); - var k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - - var referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([at[1]]); - } - var referenceTemplateLength = referenceTemplate.length; - var referenceTemplateX = new Int32Array(referenceTemplateLength); - var referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - var referenceWidth = referenceBitmap[0].length; - var referenceHeight = referenceBitmap.length; - - var pseudoPixelContext = RefinementReusedContexts[templateIndex]; - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GR'); - - var ltp = 0; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - error('JBIG2 error: prediction is not supported'); - } - } - var row = new Uint8Array(width); - bitmap.push(row); - for (var j = 0; j < width; j++) { - var i0, j0; - var contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] + offsetY; - j0 = j + referenceTemplateX[k] + offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || - j0 >= referenceWidth) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - - return bitmap; - } - - // 6.5.5 Decoding the symbol dictionary - function decodeSymbolDictionary(huffman, refinement, symbols, - numberOfNewSymbols, numberOfExportedSymbols, - huffmanTables, templateIndex, at, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - var newSymbols = []; - var currentHeight = 0; - var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - - while (newSymbols.length < numberOfNewSymbols) { - var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6 - currentHeight += deltaHeight; - var currentWidth = 0; - var totalWidth = 0; - while (true) { - var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7 - if (deltaWidth === null) { - break; // OOB - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - var bitmap; - if (refinement) { - // 6.5.8.2 Refinement/aggregate-coded symbol bitmap - var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, - currentWidth, currentHeight, 0, - numberOfInstances, 1, //strip size - symbols.concat(newSymbols), - symbolCodeLength, - 0, //transposed - 0, //ds offset - 1, //top left 7.4.3.1.1 - 0, //OR operator - huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext); - } else { - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - var symbol = (symbolId < symbols.length ? symbols[symbolId] : - newSymbols[symbolId - symbols.length]); - bitmap = decodeRefinement(currentWidth, currentHeight, - refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, - decodingContext); - } - } else { - // 6.5.8.1 Direct-coded symbol bitmap - bitmap = decodeBitmap(false, currentWidth, currentHeight, - templateIndex, false, null, at, decodingContext); - } - newSymbols.push(bitmap); - } - } - // 6.5.10 Exported symbols - var exportedSymbols = []; - var flags = [], currentFlag = false; - var totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - var runLength = decodeInteger(contextCache, 'IAEX', decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (var i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (var j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; - } - - function decodeTextRegion(huffman, refinement, width, height, - defaultPixelValue, numberOfSymbolInstances, - stripSize, inputSymbols, symbolCodeLength, - transposed, dsOffset, referenceCorner, - combinationOperator, huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Prepare bitmap - var bitmap = []; - var i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - for (var j = 0; j < width; j++) { - row[j] = defaultPixelValue; - } - } - bitmap.push(row); - } - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - var firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - stripT += deltaT; - - var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7 - firstS += deltaFirstS; - var currentS = firstS; - do { - var currentT = (stripSize === 1 ? 0 : - decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9 - var t = stripSize * stripT + currentT; - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var applyRefinement = (refinement && - decodeInteger(contextCache, 'IARI', decoder)); - var symbolBitmap = inputSymbols[symbolId]; - var symbolWidth = symbolBitmap[0].length; - var symbolHeight = symbolBitmap.length; - if (applyRefinement) { - var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1 - var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2 - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, - refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, - (rdh >> 1) + rdy, false, refinementAt, - decodingContext); - } - var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight); - var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0); - var s2, t2, symbolRow; - if (transposed) { - // Place Symbol Bitmap from T1,S1 - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - // To ignore Parts of Symbol bitmap which goes - // outside bitmap region - var maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: // OR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - case 2: // XOR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolHeight - 1; - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: // OR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; - } - break; - case 2: // XOR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolWidth - 1; - } - i++; - var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8 - if (deltaS === null) { - break; // OOB - } - currentS += deltaS + dsOffset; - } while (true); - } - return bitmap; - } - - function readSegmentHeader(data, start) { - var segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - var flags = data[start + 4]; - var segmentType = flags & 0x3F; - if (!SegmentTypes[segmentType]) { - error('JBIG2 error: invalid segment type: ' + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 0x80); - - var pageAssociationFieldSize = !!(flags & 0x40); - var referredFlags = data[start + 5]; - var referredToCount = (referredFlags >> 5) & 7; - var retainBits = [referredFlags & 31]; - var position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF; - position += 3; - var bytes = (referredToCount + 7) >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - error('JBIG2 error: invalid referred-to flags'); - } - - segmentHeader.retainBits = retainBits; - var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 : - (segmentHeader.number <= 65536 ? 2 : 4)); - var referredTo = []; - var i, ii; - for (i = 0; i < referredToCount; i++) { - var number = (referredToSegmentNumberSize === 1 ? data[position] : - (referredToSegmentNumberSize === 2 ? readUint16(data, position) : - readUint32(data, position))); - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - - if (segmentHeader.length === 0xFFFFFFFF) { - // 7.2.7 Segment data length, unknown segment length - if (segmentType === 38) { // ImmediateGenericRegion - var genericRegionInfo = readRegionSegmentInformation(data, position); - var genericRegionSegmentFlags = data[position + - RegionSegmentInformationFieldLength]; - var genericRegionMmr = !!(genericRegionSegmentFlags & 1); - // searching for the segment end - var searchPatternLength = 6; - var searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 0xFF; - searchPattern[1] = 0xAC; - } - searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF; - searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF; - searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF; - searchPattern[5] = genericRegionInfo.height & 0xFF; - for (i = position, ii = data.length; i < ii; i++) { - var j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 0xFFFFFFFF) { - error('JBIG2 error: segment end was not found'); - } - } else { - error('JBIG2 error: invalid unknown segment length'); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; - } - - function readSegments(header, data, start, end) { - var segments = []; - var position = start; - while (position < end) { - var segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - var segment = { - header: segmentHeader, - data: data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; // end of file is found - } - } - if (header.randomAccess) { - for (var i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; - } - - // 7.4.1 Region segment information field - function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; - } - var RegionSegmentInformationFieldLength = 17; - - function processSegment(segment, visitor) { - var header = segment.header; - - var data = segment.data, position = segment.start, end = segment.end; - var args, at, i, atLength; - switch (header.type) { - case 0: // SymbolDictionary - // 7.4.2 Symbol dictionary segment syntax - var dictionary = {}; - var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1 - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3; - dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3; - dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1; - dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = (dictionaryFlags >> 10) & 3; - dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [dictionary, header.number, header.referredTo, - data, position, end]; - break; - case 6: // ImmediateTextRegion - case 7: // ImmediateLosslessTextRegion - var textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3); - textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3; - textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1; - textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27; - textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1; - if (textRegion.huffman) { - var textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = (textRegionHuffmanFlags) & 3; - textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3; - textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3; - textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3; - textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3; - textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3; - textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3; - textRegion.huffmanRefinementSizeSelector = - !!(textRegionHuffmanFlags & 14); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - // TODO 7.4.3.1.7 Symbol ID Huffman table decoding - if (textRegion.huffman) { - error('JBIG2 error: huffman is not supported'); - } - args = [textRegion, header.referredTo, data, position, end]; - break; - case 38: // ImmediateGenericRegion - case 39: // ImmediateLosslessGenericRegion - var genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = (genericRegionSegmentFlags >> 1) & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [genericRegion, data, position, end]; - break; - case 48: // PageInformation - var pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 0xFFFFFFFF) { - delete pageInfo.height; - } - var pageSegmentFlags = data[position + 16]; - var pageStripingInformatiom = readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1; - pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [pageInfo]; - break; - case 49: // EndOfPage - break; - case 50: // EndOfStripe - break; - case 51: // EndOfFile - break; - case 62: // 7.4.15 defines 2 extension types which - // are comments and can be ignored. - break; - default: - error('JBIG2 error: segment type ' + header.typeName + '(' + - header.type + ') is not implemented'); - } - var callbackName = 'on' + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } - } - - function processSegments(segments, visitor) { - for (var i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } - } - - function parseJbig2(data, start, end) { - var position = start; - if (data[position] !== 0x97 || data[position + 1] !== 0x4A || - data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || - data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || - data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) { - error('JBIG2 error: invalid header'); - } - var header = {}; - position += 8; - var flags = data[position++]; - header.randomAccess = !(flags & 1); - if (!(flags & 2)) { - header.numberOfPages = readUint32(data, position); - position += 4; - } - var segments = readSegments(header, data, position, end); - error('Not implemented'); - // processSegments(segments, new SimpleSegmentVisitor()); - } - - function parseJbig2Chunks(chunks) { - var visitor = new SimpleSegmentVisitor(); - for (var i = 0, ii = chunks.length; i < ii; i++) { - var chunk = chunks[i]; - var segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor.buffer; - } - - function SimpleSegmentVisitor() {} - - SimpleSegmentVisitor.prototype = { - onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { - this.currentPageInfo = info; - var rowSize = (info.width + 7) >> 3; - var buffer = new Uint8Array(rowSize * info.height); - // The contents of ArrayBuffers are initialized to 0. - // Fill the buffer with 0xFF only if info.defaultPixelValue is set - if (info.defaultPixelValue) { - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = 0xFF; - } - } - this.buffer = buffer; - }, - drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { - var pageInfo = this.currentPageInfo; - var width = regionInfo.width, height = regionInfo.height; - var rowSize = (pageInfo.width + 7) >> 3; - var combinationOperator = pageInfo.combinationOperatorOverride ? - regionInfo.combinationOperator : pageInfo.combinationOperator; - var buffer = this.buffer; - var mask0 = 128 >> (regionInfo.x & 7); - var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - var i, j, mask, offset; - switch (combinationOperator) { - case 0: // OR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - case 2: // XOR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - }, - onImmediateGenericRegion: - function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, - start, end) { - var regionInfo = region.info; - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, - region.template, region.prediction, null, - region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessGenericRegion: - function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion.apply(this, arguments); - }, - onSymbolDictionary: - function SimpleSegmentVisitor_onSymbolDictionary(dictionary, - currentSegment, - referredSegments, - data, start, end) { - var huffmanTables; - if (dictionary.huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - - var decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, - dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, - dictionary.numberOfExportedSymbols, huffmanTables, - dictionary.template, dictionary.at, - dictionary.refinementTemplate, dictionary.refinementAt, - decodingContext); - }, - onImmediateTextRegion: - function SimpleSegmentVisitor_onImmediateTextRegion(region, - referredSegments, - data, start, end) { - var regionInfo = region.info; - var huffmanTables; - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - var symbolCodeLength = log2(inputSymbols.length); - - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeTextRegion(region.huffman, region.refinement, - regionInfo.width, regionInfo.height, region.defaultPixelValue, - region.numberOfSymbolInstances, region.stripSize, inputSymbols, - symbolCodeLength, region.transposed, region.dsOffset, - region.referenceCorner, region.combinationOperator, huffmanTables, - region.refinementTemplate, region.refinementAt, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessTextRegion: - function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { - this.onImmediateTextRegion.apply(this, arguments); - } - }; - - function Jbig2Image() {} - - Jbig2Image.prototype = { - parseChunks: function Jbig2Image_parseChunks(chunks) { - return parseJbig2Chunks(chunks); - } - }; - - return Jbig2Image; -})(); - - -var bidi = PDFJS.bidi = (function bidiClosure() { - // Character types for symbols from 0000 to 00FF. - var baseTypes = [ - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', - 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN', - 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON', - 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', - 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', - 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' - ]; - - // Character types for symbols from 0600 to 06FF - var arabicTypes = [ - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', - 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM', - 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL' - ]; - - function isOdd(i) { - return (i & 1) !== 0; - } - - function isEven(i) { - return (i & 1) === 0; - } - - function findUnequal(arr, start, value) { - for (var j = start, jj = arr.length; j < jj; ++j) { - if (arr[j] !== value) { - return j; - } - } - return j; - } - - function setValues(arr, start, end, value) { - for (var j = start; j < end; ++j) { - arr[j] = value; - } - } - - function reverseValues(arr, start, end) { - for (var i = start, j = end - 1; i < j; ++i, --j) { - var temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - } - - function createBidiText(str, isLTR, vertical) { - return { - str: str, - dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl')) - }; - } - - // These are used in bidi(), which is called frequently. We re-use them on - // each call to avoid unnecessary allocations. - var chars = []; - var types = []; - - function bidi(str, startLevel, vertical) { - var isLTR = true; - var strLength = str.length; - if (strLength === 0 || vertical) { - return createBidiText(str, isLTR, vertical); - } - - // Get types and fill arrays - chars.length = strLength; - types.length = strLength; - var numBidi = 0; - - var i, ii; - for (i = 0; i < strLength; ++i) { - chars[i] = str.charAt(i); - - var charCode = str.charCodeAt(i); - var charType = 'L'; - if (charCode <= 0x00ff) { - charType = baseTypes[charCode]; - } else if (0x0590 <= charCode && charCode <= 0x05f4) { - charType = 'R'; - } else if (0x0600 <= charCode && charCode <= 0x06ff) { - charType = arabicTypes[charCode & 0xff]; - } else if (0x0700 <= charCode && charCode <= 0x08AC) { - charType = 'AL'; - } - if (charType === 'R' || charType === 'AL' || charType === 'AN') { - numBidi++; - } - types[i] = charType; - } - - // Detect the bidi method - // - If there are no rtl characters then no bidi needed - // - If less than 30% chars are rtl then string is primarily ltr - // - If more than 30% chars are rtl then string is primarily rtl - if (numBidi === 0) { - isLTR = true; - return createBidiText(str, isLTR); - } - - if (startLevel === -1) { - if ((strLength / numBidi) < 0.3) { - isLTR = true; - startLevel = 0; - } else { - isLTR = false; - startLevel = 1; - } - } - - var levels = []; - for (i = 0; i < strLength; ++i) { - levels[i] = startLevel; - } - - /* - X1-X10: skip most of this, since we are NOT doing the embeddings. - */ - var e = (isOdd(startLevel) ? 'R' : 'L'); - var sor = e; - var eor = sor; - - /* - W1. Examine each non-spacing mark (NSM) in the level run, and change the - type of the NSM to the type of the previous character. If the NSM is at the - start of the level run, it will get the type of sor. - */ - var lastType = sor; - for (i = 0; i < strLength; ++i) { - if (types[i] === 'NSM') { - types[i] = lastType; - } else { - lastType = types[i]; - } - } - - /* - W2. Search backwards from each instance of a European number until the - first strong type (R, L, AL, or sor) is found. If an AL is found, change - the type of the European number to Arabic number. - */ - lastType = sor; - var t; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = (lastType === 'AL') ? 'AN' : 'EN'; - } else if (t === 'R' || t === 'L' || t === 'AL') { - lastType = t; - } - } - - /* - W3. Change all ALs to R. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'AL') { - types[i] = 'R'; - } - } - - /* - W4. A single European separator between two European numbers changes to a - European number. A single common separator between two numbers of the same - type changes to that type: - */ - for (i = 1; i < strLength - 1; ++i) { - if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') { - types[i] = 'EN'; - } - if (types[i] === 'CS' && - (types[i - 1] === 'EN' || types[i - 1] === 'AN') && - types[i + 1] === types[i - 1]) { - types[i] = types[i - 1]; - } - } - - /* - W5. A sequence of European terminators adjacent to European numbers changes - to all European numbers: - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'EN') { - // do before - var j; - for (j = i - 1; j >= 0; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - // do after - for (j = i + 1; j < strLength; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - } - } - - /* - W6. Otherwise, separators and terminators change to Other Neutral: - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') { - types[i] = 'ON'; - } - } - - /* - W7. Search backwards from each instance of a European number until the - first strong type (R, L, or sor) is found. If an L is found, then change - the type of the European number to L. - */ - lastType = sor; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = ((lastType === 'L') ? 'L' : 'EN'); - } else if (t === 'R' || t === 'L') { - lastType = t; - } - } - - /* - N1. A sequence of neutrals takes the direction of the surrounding strong - text if the text on both sides has the same direction. European and Arabic - numbers are treated as though they were R. Start-of-level-run (sor) and - end-of-level-run (eor) are used at level run boundaries. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - var end = findUnequal(types, i + 1, 'ON'); - var before = sor; - if (i > 0) { - before = types[i - 1]; - } - - var after = eor; - if (end + 1 < strLength) { - after = types[end + 1]; - } - if (before !== 'L') { - before = 'R'; - } - if (after !== 'L') { - after = 'R'; - } - if (before === after) { - setValues(types, i, end, before); - } - i = end - 1; // reset to end (-1 so next iteration is ok) - } - } - - /* - N2. Any remaining neutrals take the embedding direction. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - types[i] = e; - } - } - - /* - I1. For all characters with an even (left-to-right) embedding direction, - those of type R go up one level and those of type AN or EN go up two - levels. - I2. For all characters with an odd (right-to-left) embedding direction, - those of type L, EN or AN go up one level. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (isEven(levels[i])) { - if (t === 'R') { - levels[i] += 1; - } else if (t === 'AN' || t === 'EN') { - levels[i] += 2; - } - } else { // isOdd - if (t === 'L' || t === 'AN' || t === 'EN') { - levels[i] += 1; - } - } - } - - /* - L1. On each line, reset the embedding level of the following characters to - the paragraph embedding level: - - segment separators, - paragraph separators, - any sequence of whitespace characters preceding a segment separator or - paragraph separator, and any sequence of white space characters at the end - of the line. - */ - - // don't bother as text is only single line - - /* - L2. From the highest level found in the text to the lowest odd level on - each line, reverse any contiguous sequence of characters that are at that - level or higher. - */ - - // find highest level & lowest odd level - var highestLevel = -1; - var lowestOddLevel = 99; - var level; - for (i = 0, ii = levels.length; i < ii; ++i) { - level = levels[i]; - if (highestLevel < level) { - highestLevel = level; - } - if (lowestOddLevel > level && isOdd(level)) { - lowestOddLevel = level; - } - } - - // now reverse between those limits - for (level = highestLevel; level >= lowestOddLevel; --level) { - // find segments to reverse - var start = -1; - for (i = 0, ii = levels.length; i < ii; ++i) { - if (levels[i] < level) { - if (start >= 0) { - reverseValues(chars, start, i); - start = -1; - } - } else if (start < 0) { - start = i; - } - } - if (start >= 0) { - reverseValues(chars, start, levels.length); - } - } - - /* - L3. Combining marks applied to a right-to-left base character will at this - point precede their base character. If the rendering engine expects them to - follow the base characters in the final display process, then the ordering - of the marks and the base character must be reversed. - */ - - // don't bother for now - - /* - L4. A character that possesses the mirrored property as specified by - Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved - directionality of that character is R. - */ - - // don't mirror as characters are already mirrored in the pdf - - // Finally, return string - for (i = 0, ii = chars.length; i < ii; ++i) { - var ch = chars[i]; - if (ch === '<' || ch === '>') { - chars[i] = ''; - } - } - return createBidiText(chars.join(''), isLTR); - } - - return bidi; -})(); - - - -var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) { - // Workaround for missing math precison in JS. - var MASK_HIGH = 0xffff0000; - var MASK_LOW = 0xffff; - - function MurmurHash3_64 (seed) { - var SEED = 0xc3d2e1f0; - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; - } - - var alwaysUseUint32ArrayView = false; - // old webkits have issues with non-aligned arrays - try { - new Uint32Array(new Uint8Array(5).buffer, 0, 1); - } catch (e) { - alwaysUseUint32ArrayView = true; - } - - MurmurHash3_64.prototype = { - update: function MurmurHash3_64_update(input) { - var useUint32ArrayView = alwaysUseUint32ArrayView; - var i; - if (typeof input === 'string') { - var data = new Uint8Array(input.length * 2); - var length = 0; - for (i = 0; i < input.length; i++) { - var code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; - } - else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; - } - } - } else if (input instanceof Uint8Array) { - data = input; - length = data.length; - } else if (typeof input === 'object' && ('length' in input)) { - // processing regular arrays as well, e.g. for IE9 - data = input; - length = data.length; - useUint32ArrayView = true; - } else { - throw new Error('Wrong data format in MurmurHash3_64_update. ' + - 'Input must be a string or array.'); - } - - var blockCounts = length >> 2; - var tailLength = length - blockCounts * 4; - // we don't care about endianness here - var dataUint32 = useUint32ArrayView ? - new Uint32ArrayView(data, blockCounts) : - new Uint32Array(data.buffer, 0, blockCounts); - var k1 = 0; - var k2 = 0; - var h1 = this.h1; - var h2 = this.h2; - var C1 = 0xcc9e2d51; - var C2 = 0x1b873593; - var C1_LOW = C1 & MASK_LOW; - var C2_LOW = C2 & MASK_LOW; - - for (i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW); - k2 = k2 << 15 | k2 >>> 17; - k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW); - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; - } - } - - k1 = 0; - - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - /* falls through */ - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - /* falls through */ - case 1: - k1 ^= data[blockCounts * 4]; - /* falls through */ - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } - } - - this.h1 = h1; - this.h2 = h2; - return this; - }, - - hexdigest: function MurmurHash3_64_hexdigest () { - var h1 = this.h1; - var h2 = this.h2; - - h1 ^= h2 >>> 1; - h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW); - h2 = (h2 * 0xff51afd7 & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW); - h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - - for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) { - var hex = (arr[i] >>> 0).toString(16); - while (hex.length < 8) { - hex = '0' + hex; - } - str += hex; - } - - return str; - } - }; - - return MurmurHash3_64; -})(); - - -}).call((typeof window === 'undefined') ? this : window); - -if (!PDFJS.workerSrc && typeof document !== 'undefined') { - // workerSrc is not set -- using last script url to define default location - PDFJS.workerSrc = (function () { - 'use strict'; - var pdfJsSrc = document.currentScript.src; - return pdfJsSrc && pdfJsSrc.replace(/\.js$/i, '.worker.js'); - })(); -} - - From 81e8e0e1defa4911ce1307a6aa9e156a683e11d2 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 2 Mar 2017 09:38:49 +0000 Subject: [PATCH 11/60] delete pdfjs-1.6.210p1 --- .../pdfjs-1.6.210p1/bcmaps/.gitattributes | 1 - .../pdfjs-1.6.210p1/bcmaps/78-EUC-H.bcmap | Bin 2404 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/78-EUC-V.bcmap | Bin 173 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/78-H.bcmap | Bin 2379 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/78-RKSJ-H.bcmap | Bin 2398 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/78-RKSJ-V.bcmap | Bin 173 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/78-V.bcmap | Bin 169 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-H.bcmap | Bin 2651 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-V.bcmap | Bin 290 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/83pv-RKSJ-H.bcmap | Bin 905 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-H.bcmap | Bin 721 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-V.bcmap | Bin 290 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-H.bcmap | Bin 715 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-V.bcmap | Bin 291 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/90pv-RKSJ-H.bcmap | Bin 982 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/90pv-RKSJ-V.bcmap | Bin 260 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/Add-H.bcmap | Bin 2419 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Add-RKSJ-H.bcmap | Bin 2413 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Add-RKSJ-V.bcmap | Bin 287 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/Add-V.bcmap | Bin 282 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-0.bcmap | Bin 317 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-1.bcmap | Bin 371 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-2.bcmap | Bin 376 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-3.bcmap | Bin 401 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-4.bcmap | Bin 405 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-5.bcmap | Bin 406 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-6.bcmap | Bin 406 -> 0 bytes .../bcmaps/Adobe-CNS1-UCS2.bcmap | Bin 41193 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-GB1-0.bcmap | Bin 217 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-GB1-1.bcmap | Bin 250 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-GB1-2.bcmap | Bin 465 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-GB1-3.bcmap | Bin 470 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-GB1-4.bcmap | Bin 601 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Adobe-GB1-5.bcmap | Bin 625 -> 0 bytes .../bcmaps/Adobe-GB1-UCS2.bcmap | Bin 33974 -> 0 bytes .../bcmaps/Adobe-Japan1-0.bcmap | Bin 225 -> 0 bytes .../bcmaps/Adobe-Japan1-1.bcmap | Bin 226 -> 0 bytes .../bcmaps/Adobe-Japan1-2.bcmap | Bin 233 -> 0 bytes .../bcmaps/Adobe-Japan1-3.bcmap | Bin 242 -> 0 bytes .../bcmaps/Adobe-Japan1-4.bcmap | Bin 337 -> 0 bytes .../bcmaps/Adobe-Japan1-5.bcmap | Bin 430 -> 0 bytes .../bcmaps/Adobe-Japan1-6.bcmap | Bin 485 -> 0 bytes .../bcmaps/Adobe-Japan1-UCS2.bcmap | Bin 40951 -> 0 bytes .../bcmaps/Adobe-Korea1-0.bcmap | Bin 241 -> 0 bytes .../bcmaps/Adobe-Korea1-1.bcmap | Bin 386 -> 0 bytes .../bcmaps/Adobe-Korea1-2.bcmap | Bin 391 -> 0 bytes .../bcmaps/Adobe-Korea1-UCS2.bcmap | Bin 23293 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/B5-H.bcmap | Bin 1086 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/B5-V.bcmap | Bin 142 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/B5pc-H.bcmap | Bin 1099 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/B5pc-V.bcmap | Bin 144 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/CNS-EUC-H.bcmap | Bin 1780 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/CNS-EUC-V.bcmap | Bin 1920 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/CNS1-H.bcmap | Bin 706 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/CNS1-V.bcmap | Bin 143 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/CNS2-H.bcmap | Bin 504 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/CNS2-V.bcmap | 3 - .../pdfjs-1.6.210p1/bcmaps/ETHK-B5-H.bcmap | Bin 4426 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/ETHK-B5-V.bcmap | Bin 158 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/ETen-B5-H.bcmap | Bin 1125 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/ETen-B5-V.bcmap | Bin 158 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/ETenms-B5-H.bcmap | 3 - .../pdfjs-1.6.210p1/bcmaps/ETenms-B5-V.bcmap | Bin 172 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/EUC-H.bcmap | Bin 578 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/EUC-V.bcmap | Bin 170 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/Ext-H.bcmap | Bin 2536 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Ext-RKSJ-H.bcmap | Bin 2542 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Ext-RKSJ-V.bcmap | Bin 218 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/Ext-V.bcmap | Bin 215 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GB-EUC-H.bcmap | Bin 549 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GB-EUC-V.bcmap | Bin 179 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/GB-H.bcmap | 4 - .../js/libs/pdfjs-1.6.210p1/bcmaps/GB-V.bcmap | Bin 175 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBK-EUC-H.bcmap | Bin 14692 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBK-EUC-V.bcmap | Bin 180 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/GBK2K-H.bcmap | Bin 19662 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/GBK2K-V.bcmap | Bin 219 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBKp-EUC-H.bcmap | Bin 14686 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBKp-EUC-V.bcmap | Bin 181 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBT-EUC-H.bcmap | Bin 7290 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBT-EUC-V.bcmap | Bin 180 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/GBT-H.bcmap | Bin 7269 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/GBT-V.bcmap | Bin 176 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBTpc-EUC-H.bcmap | Bin 7298 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBTpc-EUC-V.bcmap | Bin 182 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBpc-EUC-H.bcmap | Bin 557 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/GBpc-EUC-V.bcmap | Bin 181 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/H.bcmap | Bin 553 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKdla-B5-H.bcmap | Bin 2654 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKdla-B5-V.bcmap | Bin 148 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKdlb-B5-H.bcmap | Bin 2414 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKdlb-B5-V.bcmap | Bin 148 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKgccs-B5-H.bcmap | Bin 2292 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKgccs-B5-V.bcmap | Bin 149 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKm314-B5-H.bcmap | Bin 1772 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKm314-B5-V.bcmap | Bin 149 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKm471-B5-H.bcmap | Bin 2171 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKm471-B5-V.bcmap | Bin 149 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKscs-B5-H.bcmap | Bin 4437 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/HKscs-B5-V.bcmap | Bin 159 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/Hankaku.bcmap | Bin 132 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Hiragana.bcmap | Bin 124 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSC-EUC-H.bcmap | Bin 1848 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSC-EUC-V.bcmap | Bin 164 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/KSC-H.bcmap | Bin 1831 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSC-Johab-H.bcmap | Bin 16791 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSC-Johab-V.bcmap | Bin 166 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/KSC-V.bcmap | Bin 160 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSCms-UHC-H.bcmap | Bin 2787 -> 0 bytes .../bcmaps/KSCms-UHC-HW-H.bcmap | Bin 2789 -> 0 bytes .../bcmaps/KSCms-UHC-HW-V.bcmap | Bin 169 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSCms-UHC-V.bcmap | Bin 166 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-H.bcmap | Bin 2024 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-V.bcmap | Bin 166 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/Katakana.bcmap | Bin 100 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/LICENSE | 36 - .../libs/pdfjs-1.6.210p1/bcmaps/NWP-H.bcmap | Bin 2765 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/NWP-V.bcmap | Bin 252 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/RKSJ-H.bcmap | Bin 534 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/RKSJ-V.bcmap | Bin 170 -> 0 bytes .../libs/pdfjs-1.6.210p1/bcmaps/Roman.bcmap | Bin 96 -> 0 bytes .../bcmaps/UniCNS-UCS2-H.bcmap | Bin 48280 -> 0 bytes .../bcmaps/UniCNS-UCS2-V.bcmap | Bin 156 -> 0 bytes .../bcmaps/UniCNS-UTF16-H.bcmap | Bin 50419 -> 0 bytes .../bcmaps/UniCNS-UTF16-V.bcmap | Bin 156 -> 0 bytes .../bcmaps/UniCNS-UTF32-H.bcmap | Bin 52679 -> 0 bytes .../bcmaps/UniCNS-UTF32-V.bcmap | Bin 160 -> 0 bytes .../bcmaps/UniCNS-UTF8-H.bcmap | Bin 53629 -> 0 bytes .../bcmaps/UniCNS-UTF8-V.bcmap | Bin 157 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniGB-UCS2-H.bcmap | Bin 43366 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniGB-UCS2-V.bcmap | Bin 193 -> 0 bytes .../bcmaps/UniGB-UTF16-H.bcmap | Bin 44086 -> 0 bytes .../bcmaps/UniGB-UTF16-V.bcmap | Bin 178 -> 0 bytes .../bcmaps/UniGB-UTF32-H.bcmap | Bin 45738 -> 0 bytes .../bcmaps/UniGB-UTF32-V.bcmap | Bin 182 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniGB-UTF8-H.bcmap | Bin 46837 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniGB-UTF8-V.bcmap | Bin 181 -> 0 bytes .../bcmaps/UniJIS-UCS2-H.bcmap | Bin 25439 -> 0 bytes .../bcmaps/UniJIS-UCS2-HW-H.bcmap | Bin 119 -> 0 bytes .../bcmaps/UniJIS-UCS2-HW-V.bcmap | Bin 680 -> 0 bytes .../bcmaps/UniJIS-UCS2-V.bcmap | Bin 664 -> 0 bytes .../bcmaps/UniJIS-UTF16-H.bcmap | Bin 39443 -> 0 bytes .../bcmaps/UniJIS-UTF16-V.bcmap | Bin 643 -> 0 bytes .../bcmaps/UniJIS-UTF32-H.bcmap | Bin 40539 -> 0 bytes .../bcmaps/UniJIS-UTF32-V.bcmap | Bin 677 -> 0 bytes .../bcmaps/UniJIS-UTF8-H.bcmap | Bin 41695 -> 0 bytes .../bcmaps/UniJIS-UTF8-V.bcmap | Bin 678 -> 0 bytes .../bcmaps/UniJIS2004-UTF16-H.bcmap | Bin 39534 -> 0 bytes .../bcmaps/UniJIS2004-UTF16-V.bcmap | Bin 647 -> 0 bytes .../bcmaps/UniJIS2004-UTF32-H.bcmap | Bin 40630 -> 0 bytes .../bcmaps/UniJIS2004-UTF32-V.bcmap | Bin 681 -> 0 bytes .../bcmaps/UniJIS2004-UTF8-H.bcmap | Bin 41779 -> 0 bytes .../bcmaps/UniJIS2004-UTF8-V.bcmap | Bin 682 -> 0 bytes .../bcmaps/UniJISPro-UCS2-HW-V.bcmap | Bin 705 -> 0 bytes .../bcmaps/UniJISPro-UCS2-V.bcmap | Bin 689 -> 0 bytes .../bcmaps/UniJISPro-UTF8-V.bcmap | Bin 726 -> 0 bytes .../bcmaps/UniJISX0213-UTF32-H.bcmap | Bin 40517 -> 0 bytes .../bcmaps/UniJISX0213-UTF32-V.bcmap | Bin 684 -> 0 bytes .../bcmaps/UniJISX02132004-UTF32-H.bcmap | Bin 40608 -> 0 bytes .../bcmaps/UniJISX02132004-UTF32-V.bcmap | Bin 688 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniKS-UCS2-H.bcmap | Bin 25783 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniKS-UCS2-V.bcmap | Bin 178 -> 0 bytes .../bcmaps/UniKS-UTF16-H.bcmap | Bin 26327 -> 0 bytes .../bcmaps/UniKS-UTF16-V.bcmap | Bin 164 -> 0 bytes .../bcmaps/UniKS-UTF32-H.bcmap | Bin 26451 -> 0 bytes .../bcmaps/UniKS-UTF32-V.bcmap | Bin 168 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-H.bcmap | Bin 27790 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-V.bcmap | Bin 169 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/bcmaps/V.bcmap | Bin 166 -> 0 bytes .../pdfjs-1.6.210p1/bcmaps/WP-Symbol.bcmap | Bin 179 -> 0 bytes .../js/libs/pdfjs-1.6.210p1/compatibility.js | 596 - .../web/public/js/libs/pdfjs-1.6.210p1/pdf.js | 11515 ---- .../js/libs/pdfjs-1.6.210p1/pdf.worker.js | 43512 ---------------- 173 files changed, 55670 deletions(-) delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/.gitattributes delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/83pv-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90pv-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90pv-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-0.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-1.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-3.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-4.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-5.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-6.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-UCS2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-0.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-1.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-3.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-4.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-5.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-UCS2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-0.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-1.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-3.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-4.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-5.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-6.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-UCS2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-0.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-1.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-UCS2.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5pc-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5pc-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS1-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS1-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETHK-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETHK-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETen-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETen-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Ext-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Ext-RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Ext-RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Ext-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK2K-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK2K-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBKp-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBKp-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBTpc-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBTpc-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBpc-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBpc-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdla-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdla-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdlb-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdlb-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKgccs-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKgccs-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm314-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm314-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm471-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm471-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKscs-B5-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKscs-B5-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Hankaku.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Hiragana.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-Johab-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-Johab-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-HW-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-HW-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Katakana.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/LICENSE delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/NWP-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/NWP-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/RKSJ-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/RKSJ-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Roman.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UCS2-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UCS2-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF16-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF16-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF8-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF8-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UCS2-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UCS2-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF16-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF16-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF8-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF8-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-HW-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-HW-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF16-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF16-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF8-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF8-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF16-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF16-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF8-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF8-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UCS2-HW-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UCS2-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UTF8-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX0213-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX0213-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX02132004-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX02132004-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UCS2-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UCS2-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF16-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF16-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF32-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF32-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-H.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/V.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/WP-Symbol.bcmap delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/compatibility.js delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/pdf.js delete mode 100644 services/web/public/js/libs/pdfjs-1.6.210p1/pdf.worker.js diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/.gitattributes b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/.gitattributes deleted file mode 100644 index 556f8c827b..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* binary diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-EUC-H.bcmap deleted file mode 100644 index 2655fc70ae706c7ba52a5d647cbfdfad6072c697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2404 zcmW+#SyWV47TvdAJ*r+6RRxF)G8F|XpkSd0DozL*KyfC)0pS@-L>YX5;1pdiNgJS` zL=Y%uFUFQ8f-Z~Eh|{myy!p1b$i=bHX> zys+`=ji%a~OD*o~?c2SXo4wxc?t%-A=Y8%IH=0{~_08^*hPNA=t~NHQExrp`wt~7k z_y6}dyPJH?zNXf1lP7#Wch;suC58JBpV$uq9mEuPwC72IzEbHXNYZPniTj*hqlSv? zy9b^WRK9;h_c*@u*1JTx7ix*U7ZnnF&#SLHey>!|EdL-u&xrn@*&5w$*NfflDK2+= zkrwuXqTL7MnA~22Pf9KA4fr?~%bt+->oAUIcL2r-sbdR_la`KcFv>|sf##T_){a6L zZz>&SFy1nCRKTb(b)1E9TI#5Vab|sosCYJ_)2Z3#X-H=>j7lt*z&MxFxdBF1Os5K? znsnZRp`!DS7QR5yc^Ag{L_fj2D*Kc1G--`L4aVDMe-VreA^uVrKH@))*=&=)9L7b- ze@e40Qn$YnMh&K$tX+cWC8^7XMR$0Y3r1~Bmq(SCsM3`${#?eYt^)$EU{}`}E&L@# zcPxy$knT7b^=rCQu(H|Gy$41^e0MR7M!EYUjH_~YJq!)qEijtU-Ks^sqNeUP7|r3` zf_Y15zzO4;B@hpz)f89@qm2a8VO%!{HsZCz64(smhCPrE<7P-e6ul({j>5RD%CBie zpj>cy2lha%z&qF(Xw_WHRJkwOeAjk=HyD)rrC=oHemQ0;UH2QoOmYvvB&o*&W;XYP zs+JX+-4iZyG9r441ct!gQz6g-rN^f!29ReQNEi0ZYj2)4&qthisov>87Kbo+0Qh$=>`~j8wQ^3-&*x>3Hw9>=- zcY6s*N`t`uwl zJ1hsAweX+N_@Hq1h-oMq>}c3f9AU@ILs^8KkcPH`l}kfA2z!$Z?FFl_4HaUk-ZFGV zbNrNAhJ^G}&Y^0s)A2)B!Ol2`g^y>kAUv%!4GW9Tg$<`_j-OG}u&7jJ9o`OBjbTAg z^$ZKU&W8@yg1sF++y-{RI%3npeois6iZGvTBnqqsQ~4MXj$I-nYr$%j5iuHDe6<}sNk|Fmn#UW714D_*&efd>yQ_i2~OPOauHUkuj&1aB|`CO7Re_m7mPE89T7)~S$Ht^iY1qXPZcOeCQn{%ODQ~p827A}Bq zPhV(7m(#MC48Fs;m;s(|S=^zLZ$3wVhU)l+Zdlw$)+{y>Wyvm9l2ziFj!tF)!oDx|dspKQGU!)^ENB-zje1rJn-dodCW^Ovqk+2Y7)PjD4}- zg_`Z3H071Z9I(Br0)NB&>I!&q+$#-%Z1586YnMv?MJr#&XtsY-`|DQlQpd7*1_xcs k5om7%Ka{$hiq3Rpxm1<^LpLp-6zwQO#)>TPFtC#SKLc+9MgRZ+ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-EUC-V.bcmap deleted file mode 100644 index f1ed8538287499647d923d7d8f517a00cdac4e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVQ!)88tSa;k;uAm5#wHeUdFwF voJ@OznOOFQu?X&sb`)LsaBps_Jp&^YN;1fUS!@iAMpy(B8JB)#+{Xj}Q4TH^ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-H.bcmap deleted file mode 100644 index 39e89d3339c74cbe06e7e4f76d60bf3556b0d4b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2379 zcmW+#`CAjo7Cn_tlXOB7KxC0E6;J^M1G0!Hh@b)rDv093(r8qa#RddiM!%k!=Kz6- zAR+9oPaY$vEGl%>eDkNgKjqcDAL=`OZ&%$q=bl@p|JIdvKX}yBe&=qVJEy3~o0aSJ z7P-rAb+`H4^^bb{e4V}Ss;-;eJrBBj)IQ&>Y+G4Jhx`Bgd)+<0USCiDKgoKZ&z*hf zTvhq0+WJ$3P^#}Vsdh@6et)EU9RIrVD^XsATjF2DgvGz`>igTdVHlSz!$)8= zkl`}TkwdM+YY0@hN4GKOM$Rv%dnytuTKz3?K2= zVJ*kxZ-8-I@?X_#dDQK1f^i2cJ=Re{^sY2&!=^iO)CHqGZq%d7`BWJ#7Ju$x*XU`1 z_i=pmx)xbLF%}P_BWx@IM(3WfRP5wh#!6vyC5~0X=$6NB!+0Q%b;8gv)(4{pWBpo8 zAvKK+!03$}6U_U<15OwZErCQB{ieWP7y~4b0b|e{IEbGPOCT4ULyiuS9%D7Kcim5y<&RNNLKbV5?M_@Ml_!BUD z#Vf07Jx2Gvsu8;#zczp_tCci!d=JC81TT_)OJ7H<^R4ifpq^T6mSw`ilRIqex zcDbemt&GU2V_=zN>O9y1=TsfoLF-f-SXT5@hvqs-6M_UR+Zjv-JLCvvgL&oPaj+a) zumUXC9K1l-VL5mOEFZyU%~ek2U<+6Qg0~4PB*AvViX6dCu;QHHQ?O&w^dYe0@^l_p z37Ia|Top87TGT65rmumWz_bsnj7$saCoz2wtX!Jzz~5)(X$|l5J=23)!YPVS0$7C< zN&-72hdf}X!$KKgXDp!{uu4nlC|DHr(K(@ZSbg@~C1!Y-O;vI(n~X7a%rq?x0HT_!Upz#45c<=E=9 z%$(O8XQ*XHNWbcwX$8BMIP(DPx^q_ecmo^4(Qq!!c)MA}20&B&r zpr?9fgEM}u|Q=Y?I}N%O+r2j=-|&3Tq$UKp&&^B2K--1CiK zy-D+rv2)nG5D(TDwvd9q4&u!r^Fq4jI!6yIWPv@jEeKEg%?r1|2FOAO*x>GkZmbI# zkFaO~dyGY)@`+}zp%IIAu&0TO!joT2i^X8i%!{Si$#X0UiO-`KFR8X#nz7hUvX-Jv zrlkr!)wxtjq@_kemYPWXQmbB*xAYiT*pK~hyec_gfVBZtu00EmY{H4Y7hH0In=Rn7 zrd*^6ZyLeFtZyEITTE}BgIn=d0$03mWtG&?rnd!}Qcs=lqQPy}cWK~u&%11Jhy7h0 zxHIZqi%PBz!oOeLb%}c3^^oNEF~IZy;@=nOo`m-oNZR{OvggAt-GdL=2)xNT171=RQ}dVa*r7lYVOePdNhaj=@g8o(E3NgnKlljVh}#;AzFH6fe85 z+KkXeX|)x6uXEL>T5i(x)jojlgLN%g;C_MWfd3Lw)^auF7L8pKT~4>J-N(|6#5K`| z4C@zBFVpqKt(w|Bc=fOlez!{6v#}_vi9QS%Fz7{Bl|Mq@8>Ux`|+@q$AFw7>C4I6kt^o9ex(7TZee#E)apegrh#KtY~qKu7xj5;lw z6#S@jGZVbnvUyY`9W|KBR2?1kz~)J^XS16qTXwNxbkD&pH%Z*8CD`g9t}QVumaS(b z>br%+eNQ0!zUK>nzTZ%-9qr)9#LdU`tKcO`;H6?hPUuI$%fw)uj0Z2*Y!7Ja50N=- z`_Te^#{A|N;KN^GfuPhQ2Wn*@M_1lcm`)(+ff)A06&+uoraMN ZWxHCHd+DL=OQIb$$lQ?y)&e^@{{yR6zuEu* diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-RKSJ-H.bcmap deleted file mode 100644 index e4167cb51f66c60ef7d9500b450303b5da175574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2398 zcmW+%X4)d#tmFZT%e3CqAV65xJ4VEnS`dH zL7+EQ*O3^3$f82sn)^Iqy?t_}J*`zImsoz3p0` zy|l8@v3sw>QE9Ke(tX)&Z@Sal=kDya*LQu@-E*_MN9}W8DKXb}blCqN-)rx2_qu!f z|99EscH2w#d|vN5biC;h2nIpOpu(y_p41TXQQ54v6J!szwG#WK!8X-8s5t+0hZO($ zz+kTYO|+EuO)`HR#>Q_Njyu22B+1`iFr|FkYf2fiwA+XBVr)ZoByOlliyd0PkQ@3b zai|SHHAq8U_%RKexlu#6p*NO#0li7^mO(!)c@IE8L%g+`#jBXSF6d`v?=k4-4Blqw z%?9rU=wAxnR_Nz5yl&0v^_YhZ&@ZG7+n`^>W;%}}aVdOB!8^{_tuf_R1*&}zMcSMb* zL+{)+nuo2u(r69zu8h$m(7VOatI%(Xqn*$-jP^nA!Dzo0Golzq2cY-HjdK2d(SAPN zEy6>+>9)I`SnL1m2J0X193?}1vjKQ^h7-*f13i6Q!NKQT@i z4cQYGmprkH$P*Q$V4_wf{=Z?hP!;`u1-05hZ6cvDouF}M(0DCw%ww6jPH2KKahuR2 z+r$IVl;}wwmujBO08LArECAhRn&dO23zJ7cGtwrHsp7a|nr!35GqHP8!FR4O&Y=ocE^)T?cgup$`0XR19f&UY;AettCt<2&aSA3E@o8Lt;1=^l((T z5cD%CTnc(b3LgZmCt(+8gE4%V(4#{57?xV3aHEzs=@G)b&oNWD1&b$za64XC2;nZ! zkbJ_T@7*F;%=6J7L<~gogzj5v==m44HJ8?T{t{badoI9A8K<{Fn z4|z|MLrUzt1@wN#Joo2o!#p?lfpNYDTlFq9BR4uc6XU`7c{)Z~bg{-hZ! z%Jk$Gm}GeJ5X^+90+<~4R8-0I&j<~u@e$AcrztMmvqWNgmQQk@l@L5@B<5#Lr2JV6 z$$Fkl(w-{9}^>Jc)-K&c8SHRMYVB2!Q(s{>>N0nfit^7y#=&)+~s5oEWCwbpjk^SGdlB73j zM0(?J$!`u2;f>3%`%S${KK=(=<*M=H3$W}1VD=8M93x@5n*4W9!J7fF{HmoKjCEn@ z62hm1rB<-*wk5YJ{j3x$^#N=LOv_mucXBKMe5Zlsy_)>9r((GbtiZB-0}B^2mT!X< znpTp*iegsms^uR_%8G+$?E+TnITk}+Im&T2QdiCr*Ge}(mtg-7`&`Z+IyCD)J;K{v zV0(nO4lsxGwj8W9>#Y-PulV*7SlRx!Zm@mwYL+VfqF|Ntczg@y)goYCMA2#m=Vga+ z^|B`a;>lTU!*mu|GlNwmu5lyxJJz_R2W)F+RPk3OcI^u9U5UcAeqh7~vYw+^e)Wj! zJm#Qny$GzTZ2cetMcdZ9!K&pA3)m;}MzSjWrW9}3d9D+&8^<-vZyw7=3s?;{xTZ?V zMi*FZ{5!t9pQgS`2XpOsSFV!Z73aGPn)!Fnr|K!Rk#P zVpQ^n;{1@Rng8$8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TX>Oq#ygOX=*YO&pO=jMENuV) diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78-V.bcmap deleted file mode 100644 index d7af99b5e2ae9a21d534f1965c35a2b572143322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TVs4@9k;tm3#JJa=mvL_(C)3_w qCYHTnEP{KZ9Yqxr_vW_RGcZD-B!fJd#m3NRgheosQMHtD9}@un{3-|l diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-H.bcmap deleted file mode 100644 index 37077d01e26f9ee2427592f6deebb145d628e731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2651 zcmW+&>su379)3?IlVlPI_nQO=7v(Aj5fH&R7(l=(3boRT!dN4sTpU0UwHkd20)c>B zl5n?bS84?+7Zv6VTibnh{|&dhz3ubte%bx9{j_KMVV?IlGv{}E-`~tRn)fx1_UpYJ z%}rOjtT}~+w!QmpwnA&krS^+XYi)05m$S9gTG{q#d&l+m4yns|Dce}m(qjF6eW$g< z+3D=){{O>Tr_-9f?}JK5*~!{65ZnhL_eHfB%z{z!J&v^D)zC+!d8NaVwML)61g zL)3t&**cIMWF9CbAp^Cit)DM$7idCtX2BdE5^wI&L^3mynek^WK^AjaN>oayL>`K9 z3MU6XY#>S^b}mCn!Oj&Zd$4nrC~4SfAxb88t`Q|0JMB6phk4w^J5ClJx;W(^c6yA; zVf5WXUoZNJPN_gYh*B*F4=iH93FS0D(1dTR^aE|!iNRKqZr~=Anw&vEspST9p?s(x zJP73s87z@agQ8*30p%lM@C1~zn!!3Kb(+C?D4%eHjZn^62Ay)?pvyRI+UAQPZr(=a-RKi;INDH zN1UAB{Ym1ze#9>dHgPDRKNsV7j2xdfX0MRq=D`-Ot2nexrqu; zOU%Rxi60XU6YS%mao9T{GmHm6X_d`mF3<%1WGbjNV$ueh7(aOoG%0Da2{c)lG7*}> zPel>Bhnq@}O^-x=Dj75l8*M>TnV{(*Q^lYeWU3l8(>zrJnk9!kav7#Bg6_3VwSZ=u zz44&?0=?OwHr{&}G{@*=Z0*;2PZ65Sd(VRA!Fxd##zo%S0Gbc)WkL&xx0%qwKridN zDA9XIju>|Z`BJp~pG@2`o40 z{WWsTgp2dDJSPnP1}vT8{LOfg&-vRxPbT?0L8~>>QJ|-Sr(+2{t)0#$w3eIB13kk{ zA0qT4GA)AE8K)iCY}HR!OZrJsKYf$x$ZQE{OWyL9sj*vZ1xOZj z@z$-KzYN+#=Gjc#jF@l78Y8C{3wqF7SYS=wmIa>}ykG*oV_9JOe5P4o;@;IR9KrSh z?LwJk^0^EPRm8sVA=$eauF))(mYNqU2)9^A$l`etv)Gt*VDT0(pNiDSHi`JpV5LXW z`36Dn9f68$qLOl`To6>P9x5*j(_-x7I;c9s;~P-*n#cE`8t?@NRS5Zlm&nWy@Ug9C z+I8oPD2Mq;I59j)AxTfN37*st#WuEQrKD3nS;A z*&OyS14!bR$H~WEwmIy7sE~x2YN$p5swo+2U?5a;KGdN5F;Ii|Kn<}#4ShhMhReoz z7t{#ja|6^!|G zF)ld>mY81tE8v$-lcuFQhy5#&O-m-ENYPw-H5^6@!s#P-mO^jN#F|SNuwUS{L zgw^8=_ab`rBjQ+XXLdFUzB%Bqf72od{@umB%7nU)du4-a)4$4tniK!Z4s}2O>H^f< zf>%zc2ZXhFN&lmWHCD%?8!)bA01G@a*78|hR%q8Q%EFJX#I+{O#FKR+)co*uCS-wa zok@DoynaUFe-eY&FR|Q(NMG*;hRq-wiL&V@7r(*Q95QcYKrPDMIE1N;T^sFCi-k=S z)WgDNq{RI!W^G!TuN}dgCuP&mF4JZM)FaqroQhGKZBR=>U$fyo8vQyJs$_%p#y8C4nD)&zs1>nqWO#C*RvO+0N#s}2{x(`R{_4tjdlqU{;1-+o z<3U@Y7+@NGkg}D6p>$!ZN+SRIFZ$Xg^3M&7R!Zi7i2JsfBI*eQZu7*l9medF&~E2| zd|TfaYk!wYa^GDh$G+R;uzz=vw0xha5&mc)nw>IP_)TP{phU5F>>kQdD2Lc#h@F0t c-la;q-(1!2s=%@!^LOuZa_4*AVfvHif0(Q+AOHXW diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/78ms-RKSJ-V.bcmap deleted file mode 100644 index acf23231aea22e1a95761f7eafd35f1d42ea6b84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZElfUtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6ERIW@ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/83pv-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/83pv-RKSJ-H.bcmap deleted file mode 100644 index 2359bc529d160857cce4c1d1bfca1322290205c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 905 zcmaiy;cpXl7{{OI+O^wmYtyl`HDmR3WD>!x+fX(zk2fF27#QYSGOjrry9(r-~(pVo1{Nw?mtLYJ4UUE`k0lkkCo*kO1UE(D(}Ha zIX$MVRMvM&ErC!&C=p47ic-|WsE3L1&Ed_Vp)Ij3En2goQt2?lasb+wwgN2;Lt;6| zwA_i2WgTGY5s;UQrFk$;02m7ZCI-O-t-D+~RMwf^W)!C+rc;Y3P7~9a-6+nSV0x#B z;@u~h&i0`=n`3$}i{kw*rgPg+oO_k&gBcVbb~2ssKyiMW>7z*$A19bDw4u20BGV`1 zC_arcUEGA?Vv6arQ52ttm@dgEF74;u%JB9>6;J2#3n;#bF|D?uSWPosc^1W&VWz81 zD6Sr0`f4AFuf2cP{3zC#>6(h-+M*UPR}ZZ3Otn{i7_C0k7_RpF0@Zzp)zK+0oTa^* zw4u^B0>!txwbtKNy55iCdXee70*deZm~JFd+{iNhFpJ{HZA>?}qPRK3^iu}K&mBy+ z6co26nSPl-@oO8??Kq0t<4kv+!-v;5Y52z#{B2@hzN>;4wmsUkBG4YIH)P39qY?Al z&-;u-#D2+V?9k-9C&B0ku;<`WW7q$+Vyxj_#Xjl|yL;UscaO{N)9#?F&dc}K;$|A` ze8QXqy8u=**sp^X2K#uO6#={Gx8h?Bj%vT*Jnrmp`kY>;$4NTfPM79$M&eedr~f9j zS?YYFb5gPx0b5+mtNTAx&)Lh;5 ZujiWNPKIm#2-aGseD|Rg2PkC##Gk&38VCRY diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-H.bcmap deleted file mode 100644 index af8293829c90ce63cc4c5eda0318003785ffcba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 721 zcmW-eTTc^l5XJwq#gw8#R@%k}Gf`{k zMMO~)MNz7F#ryrXv0C+m@CEc;pImvE1P@4ZMh0a$e!5_#hJh!c`*BVy;Neh zTkWo5mpv{y40IUiYAY)$v->KYl_e^qm8H6=e}1|X^yMOVNa&R!*CX^Qk?RA!TI52Y zyG8CW=pK;^oAnw)aZ=<>{nqqplU^rs@wxhDkvt)i10n@xy-}nD=&hzZk)D1k^M|e31e5HzTtO9tf zi|}eE@HH3Vcq#Dse!}Z*z&9L(6AOSR{De1Kfp6IfCvCu!&9pYVV^v4ixO00S@Es@N z)I#8?0O8%;!1sy>@6Q9izmxDmBk)5D;iCfJN2E$w1*a9@=~D-cn9ek)@cWNQhE@3W zR*W>Mt{DX%Gw_p*giq^$pT-HF#ekpJ629;PzX%h)3<1A#6TYqnejOxy(+&K#g7BRT z{H~MmeLL`nQo@gmfIqeoe%cG=pBD)D)}AcI{0gYeAA%j u^{--}Rd*VGj9%#5gucOu!1#H2euZlOd%88>EDV>zJ*#d2{xOGaKc#=yUE^>7 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90ms-RKSJ-V.bcmap deleted file mode 100644 index 780549de19de05b6cbea4ccd4737351bc9ff6104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TZE28OtQ+JV?4|3G$lSPsp*5L- zp*4wtu{9x)to?* z-GEF#OMV%BCslD3bEiU{_ISp9EDQ%Z8TPR=9292Q$H{O|h;bh`!$AqgeS8cDWf=Df PG8~jmWNdF>+$RD6C)7)p diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-H.bcmap deleted file mode 100644 index bfd3119c62d9976dde9b1e59c572c678cf5811a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmW-eTTc^l5XJw~VoNEO2&Pqmx?BQ85Gy1Kg5&B40vb?if-xX2vLIS5w2cHZ5is;3 zUQoQDs8tjNMNzzg8>r(=1dvVfUk4O5y@0Wb4U-e!1H*~A2RJ`p_EmhUK zs|1K40Wc(gs}%5L55S7NSSf+n3@1T40ZQtSjKh6U6fCovgKDBFc+P4I2F&J=F+qf^ zjh0Zdd1J_~mn)$$R9BDTOt6QW6CGiHq9bDMk|H@Nw#a^17jYkvhNEA18d6O*i_N*t zY3nuEb+qf~Y|2Q9qDB-#>D2`>}yh(Xyh zBIC#a@D(JyS^<2upYU2Q@bw*pqou&3KEfMb;G4ySV}-zDX9#a~0^iOfypscbr;YG# zEATxh;dnam_;JGfO~4QAgcE7N6ODuq8-O3#2p?O4AJ`z>C7g2s&v^;od4S&+63!O@&vz1jXb1k7L-e=3qL;^Px1}0SA^g5iYfXXF1DY`JMrWSXGZ@Ro2m> pIdngIFSLC^+oeaK|2#XMub5T`8{&0BcPR@0tE+*R*O2w6;V*K+;HLlp diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90msp-RKSJ-V.bcmap deleted file mode 100644 index 25ef14ab4af42f4b70ccac76cddac8f3b22d8813..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|TV`-3ET%a4|9qgs+k;vS*f}u5; zfuS{tfw46qk*(2@aj!owG3?DvWNLI~IN-y;a3IK0v~kS= zzs90gM@9w+lw^69KH^V^*#(jJY2W1%d Q2{Ig%O=N6uVB9AH0G^~w2LJ#7 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90pv-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/90pv-RKSJ-H.bcmap deleted file mode 100644 index 02f713bb838a8cd46f5b262c934d0edc8c6e8fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-RKSJ-H.bcmap deleted file mode 100644 index a3065e441a0e1f1a65e9109ec9bc4f826fccac24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2413 zcmW+&Yg<#t7JgTDc9NYyAOwPxTexVs69h$s#!VxNsHort6_ss`c;R9I;draTQz>^5 zB-}yKw$@sywYJqgd*Ivo8$RvnH=n29&!;oze3<>NJu~k+Yt~xN%$Pnj1Uj$X=(^l` zsmEJVQQ<4x>ho22t1on(4|*GKboT_?yS@85zUb__*4d@?1TPfXtJ~VV|DWIO?Fx1W zyL$iE*%%CZi;55I3)Iv%)_~9tqJGt=0zKYE^g(@B;gL7U}%yTf_E$7&sr%ouPqC<9T}qydj;K6ArB9ZcM_-~V+gdA@G8C4Sv)OB{4u z_6}ynI0tu=Yq0T%_p6on<)%1`Q*oxb(wu!Jk1##LOgoVhlj5w&PRx$0HVv)}2JzSN zQ1svv=U^*%l69~TdPB(&pf}P`DflNC+7A7wb!Z3lV>DD9iXKvJLjmZ=twRUFlQDE0 z`U%re6L^Ygs2TbxX{ZJI>6D?Mm>RYZo1ix*4LhNq!Ei40vt`5i(9g-k8hEN}_!9IM zY50~V4XYTwD^@*^su2oB4~Oj|e&`o0BX!V&@<;>pi`gS5p|>g{ccEYMjM|}J-ZYx2 z$s?*VS}B-U;2zy0@G84aeD1G1$MURD}9&~}3tu@a#Q3Iv5M$O zJ6L5#P#irE@kEvn2MPoShY0M3Kl4uX$!?oshCX$ z+bzweg4M{gnP7V?v$%d<}SB-25@H^Xc=K z!7kVq?4jss6$@@+LHmM`Xr%?Qp-Z%|8SJvMAbh_PwNMInHFlvoUaZsPh-zItBz)_Fcdl88sIc}ZlZkCxiN{^3~?b$kQMRV{XI5?o@L1T7Pm%NSb#gtCY1@-Ts(Dhc*=LS`-4+SEBY}OH z0Cu;74B7)jih*Ia!jSJtFf8In(WIIGfEV5qnJel6FAgd5s&h3ShTXQB4Z{(&S_JNk zU#)@>jnxJ*9Ja4E!f=9@l&!YFhymZa`Dr3}sq3j_@0!2!dQ2P3h+07jA+PS(r|v*2atiEq1C2VUOq z1K$x+R>JuHE_lWM7lN8+}oo?e^C7|Zd2S3l@#;CAu9i& zh0+CEa& z_S2@dK8#}NwGW2R`g$9T zlFhIEFiK-z2f=swUiWFz$GsQ;aQ~)gH?)+$RR7O8l=^ckee%X)^1aC-=bK}J*f$rb z;7u>dzhu$5U-Bsats_wI)=RN(>uJl|a}@WhmDFF81O8u|ss6WQD){Ycp#1kuB>#Sd z@_s)-(eEUReHTZ?@3I5M?~au$E;rrIsR73IE0M@*l19U hBiJ~FjYe!VVdI#~IGtd0&_=Ch`g=^e-y*oZ{{`ID*(m@3 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-RKSJ-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-RKSJ-V.bcmap deleted file mode 100644 index 040014cfc0880371c20a89212942727c5dc30a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<(QJ98{{4ArR$N%-RQ`;*Pnsm zfDaG{aWn1>~Fdm56S{nsR6Mn5Gw+)3Jb$Qmev}EgS-IcxJ}{! diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Add-V.bcmap deleted file mode 100644 index 2f816d320f08b8671498299c4d00e4564d2ece6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>X?$E>ygNGht``8&6_OUQ99OMMjtU#KJf$^YlAa{AfKF&6QHh#7?i8gWe mHX)Wa;Wmy$_VR4TgR($XYCxDx8|p%l=LmHM8lDo74dk4_$_P(g(w!-Hg>R!685l< z1014^3aY5#2*)_VDe5@GIWEvZ6D?e#jSjAGjT_wJ4)^Hd0grgXGhWccE8ft@07Hy0 T#ycjM;sc-f!Z&`z(oFmT7oB|o diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-1.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-1.bcmap deleted file mode 100644 index 03a501477c91d8156723f0c274a37d397ed65bad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmW;IQAa~@7{~FmUG^&eZ(!@RyK_0)E=Ic8c?GTgwb(lAe~#GII?0+zl4K@HGLs}p zW|AaHlF3YxOp+u?l9{CMiRbhDcsy4>e>V}aa(Oi|o_55LVd#O7t{WnpvXWAmdE1d$ zTf`^FES0m=s3TLsfp8`x{{L;Eq%GC7cQmCG!NK8pBsOBkd_GNc=L=I&qQJ~z4n>qu z#sU_xgk`K?6%|ymhIMRU6I-aEj&1B<7kk*p0S?hX6Gu442~Kf_b6nsOSGYzCH)x}S qTioFu59s0%Pk6=)Uh#%^eBcvb_(l(X{NNYvjJLc7T(1JRsQm#8LY3P9 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-2.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-2.bcmap deleted file mode 100644 index 2aa95141f9f5802818e34b0aa626e34e7cfee805..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 376 zcmW;I(MLmJ7{~FmF8eFqf1vHu-MQP$xfto9^A}WmtyrDyJxAWRfH^ z$xM>WB$*^hCP|WHk|gPS;`uy39?#XUt34QZGdVSu8udl5WtlyFrfG>-(jAt<$$7pU z_e5f1#8nwr4f!$|?vAC?;{V?hN_tXF21iFq5svgH;`V@JheC#-XY*N`$TL%z#te#> z!#ozSh$SqegcYn}4eQvzCbqDRGIp?wJ?!HE6;yGEBh*mGF-~xbGc?e|IWBOC7OrrO s8{Fa!_h{n*k9fi}Uhs-HyrY8;eBuk=_`xr9Ay`2JI;cR?K~xuwKLRC}r~m)} diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-3.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-3.bcmap deleted file mode 100644 index 86d8b8c79cfa3907281aa3f25a46f178b87aedfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 401 zcmW;IK`TU26u|K}mcGN({Q|~g_m$`K@18oH)xWONo(l2>)7#w>sV2{J8=76$Q^{=5sg+*{Bi$FO zOn+Bk@`34ybT(0+%;nVoeW;8MwHdTaUu%_UY|W(7ZGJiya~zo}4zw_eykU%>gi(xP z921yC8Pk}-Eaote1uS9-%UHoG*07EZY+?)B*ugILu#W>A;t0n$!70vgjtgAk3fH*7 zE$(oS2UPHgDr$JbGhXnDH@xEmpZLNze((z!vY#y=Hi6g%Vk3yHAU1>84nl~yl$}3x CU7_Cq diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-4.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-4.bcmap deleted file mode 100644 index f50fc6c14e67a228c4ba9a61b1357c16410e8228..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmW;IK`TU26u|K}mexMN{Q|~g_m#NRlK?k|s%# zBuSDaNs^>Vk|arzB>7);fA`estp0Vij%1K8n7*FgNHu$&+t}i|o=RkbF0K4R80r2{ zrE}eZ$p@x0(wTUDBAZqJ_n|U6)Mn5weXUizsV$vMwfm`9%yDG8IMB){@`f>jQH)_6 z6PUylN+@FnvzWs?7O;pVETe)ItYQsStYZV4*upk;u!}wH;{b;^!ZA*8iZh(!0++bL zHEwW=JJfKG2Rz~l&v?Nr-tdkOeBuk=_`xq^$bPnf*aTu5h>ak&g4hgVJBSS-C8t5k F&L0K8qip~H diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-5.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-5.bcmap deleted file mode 100644 index 6caf4a83146a60a2db652647b9cfed5fb71bd97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406 zcmW;IK`TU26u|K}mNve^{Q|~g_mN!#-X5)|zBpQ#PGx_A`luPwPmMBxy;KBx#c*Ns=T< zk|arzv`LaANs=W0qwepXI-RF~O|>;06pCSYXIE?*JkPCbbY0J+azVQ_eldz|Ph_&a z9YI(K!nWAvlC`OP-u&N3CbW?a`*rDCYm)WN*>tAG&m-sM?B#fFL=cp-tmD?eBm2E_=ODUrv*e4h&B+7AX-5*gJ=iQ5JCxG%FZ9F CgrqG1 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-UCS2.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-CNS1-UCS2.bcmap deleted file mode 100644 index 69d79a2c2c2b00207ab27b68ebf4404aa17c6f2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41193 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 R!5J=ag&W-A0Z)>CkuT=vPT>Fm diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-1.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-1.bcmap deleted file mode 100644 index 707bb1065c76d69551c287141cb258519132ef8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmW;C!HPjq0LJmd(o>ur8(emGDOo64xKA)R4P{);y(uf1rfHfqO`0Z2k|asfBuSDa zNgD6qQRYv5zs=X*d(Fh{N?jKp3$BcqrV)%9hACrtJFBEscU<-4$YeQZ>x!)(T$K;` zVx^M2_m0%cQMz_JEu~~AoJz(MX)EFJ2ytmt{X#Sw>=`e3#T(wy!UsOl#uvWPK^Hyr kF~ATbj4{C!GyLEeb1bmL3Ttez#SVKMaKs5`(G2{Fe=CDsrT_o{ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-2.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-2.bcmap deleted file mode 100644 index f7648cc3ff02c44e9594ccbd71deec742e253c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmW;IK`TU26u|K}mOjP(0>)!E%W0a$lq|f3HRgsI^TvBGHLGzXNs=TL-VlZ{f>DfN z921zt6s9qQS&{5KST4 dLNtbG4bdE;Jw$_u77-d=%W0a$lq7Fsi@BkOH{N@xS&bt}k|arzBx%w#BuSDa zNs=TU}~*Hl|me!dX&bah9j!F3aLjfsS7l3BmQ8m|yWwl_4H zzD_^L`$2nTv+>$wE@%GlLlfB01_QeEtTplarc5f`?4@Hd$C0&Se;cF78^SO~Fp4pZ zV*-4l~8|5gz6Tq;Wr6vm{3v&eie4&Qnn@L%5OOhl>k|arzBuSDaNs=T< zlB5Yqk|arzT(^3E?^93D>MAPKr?QAtrsV)XL*F@Qk~ zVHhJA#Tdphfk{kZ8Z(&19OkirMJ!<%D_F%E*0F(2Y+)Na*u@_9aezY{;TR`4#Tm|V zflFNB8aKE_0e5)7BcAY#7rf#P@A$wczVMA7{6c;HTtH4BH;^O9732(Z2RVdXLQWyK zkYmU-4m-=_tMvz_6R8WHFJ2IRbyaP#C_M$ZFh@BuSDaNs=TCWD$wYeo5lqC}J;_`Sr5mYp#8^R#fo5_alnIPHG zn2tKrQGGUSDk-XHYYYDGGeHz)!l>KJR2T*&r8UXQs@halK|w60mt0p5BggB<00uFH zVT@oDV;IK-CNYI+%wQICn8yMZv4mx;U=?dv#|AdBg>CF$7kk*p0S|+(wQg*OBwcedIuLAvuxUNRA{|k~7Jj ijwRQUbIHBrU~(}zncPf{rl(l7o@0OOeg}^L diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-UCS2.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-GB1-UCS2.bcmap deleted file mode 100644 index 7586525936cc5398b86d3752a4eb45b15825b25c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33974 zcmbSyg#^~;Dq`SLCNL%sw+i2N{zNG!^ z$?Yk$5++TC7EIHnbl@j zL>j^%M!o;^j0oPervI<+6Q?2wVGh2R4+reFD~3GkG$FYsWlU|O`ryo7Cx}AGcZY)y zxsPa^R$VF>bccxgAnSh6i^M5Kw40o9+-AI+wOSW<^;T!D3K)+#RruRmSh72~5X)V# z-T|%ochcM4uxZZv7+gyHqKeh!_-lLDY)7n!H8Eo%`FO!4GknRxko>LUi&DGoCuy}s zfAX&z;xJptdPg7;|?<=Zs- znM9ir8jGLO2K){r-Ozd>nt4A?g zlM(Vbk|{oJLa=XV{LRK8tzHA77?akx>58?KiL!3{8tsAHL;kyru_^u}qty~6qGoG) zWXmSP3#+77PeXmua`g*Ic&)V06D^fD7WKFdv4ydxV^_L|0EtGDStAtM!rM) zw#F6Kfq-AL>LhWDj{$=xvV_GEMI6d}Gy~g$_r#&qw%QZfXF_Z2urmU;TqlcaopB}x zha?9LCiBL;rmQbUU`nrDeOKPU0jQbTA&yOk|IWQpw$vFXTp`M=VVz4RI@NGW_m#p% zSIPaRCj^8O&bWTne-wsl#y!PTPE8W;)v-Sp0~Cy;)&;z&JS>mnG1%yEKpy*i`p3d?YxKWwJqxHWdtrs5x!9#vjH{k`K)eT>ep )hMjqg! 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 U103N5XSl!>Zg7VOJW1|FzIH}ZoB#j- diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-1.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-1.bcmap deleted file mode 100644 index dad42c5ad7dad57954fc9a051ee7e222e83bee45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmW;C(F(y(0LJk%m!9Idac9QeF4x+{N-pdPuoG%*&RJ?#Ymy{Mk|arzBuSDai8t{m zKI;43eEnmeg6?_&uT`o(&8Vu9$|{OVHQOyQY6Ze)bwSNW+2x+gi$1gExaK(Y-wVo_ zV7&D^Eyk#v&Y8NAw+u-lghV0Mh7NS02Ynd85JoVD2~1%Ib6CI`GD7x@CoEK=wI diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-2.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-2.bcmap deleted file mode 100644 index 090819a064533f20aa68f562275556397683ae81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmW;C!HPjq0LJmd(q>-alr^r|-KAuqWZ^!6;WQL3=iZc+NRl*3(xgd}BuSbiNs@RE zkK#{#zs=X*`$$FYa!u#IbFK`VrV;ow3{yt3_Lq`Y&2d%Hk?~T-)@56#U6l>`B87r{ z_m0%cQM&p%Eu~~Il!!-TNh{{@2yw4h{6aM9tce!d=%9-pe$dANLyYi?G5#>Y6f?}R Zz!EF0vB4Jq*kO+YjyU0r3$EhhCY~ULRonmo diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-3.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-3.bcmap deleted file mode 100644 index 087dfc155860e65d2dc828dd432ffe88239fde23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmW;C!Ab&A0EOW@?&>M-#%1H=ZkB`0VnAFpPf*Pzg~>bJ83I>gL_|b{h=@pth)9G) zNJNB)MCe=iDE;OXBS?d4* diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-4.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-4.bcmap deleted file mode 100644 index 46aa9bffe576e9a8b714646aed7f9e1a4e99dfe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmW;CQAa~z0LJlmyWFREzd-BM-MQ#uW*1|2(fI_`UM;qr?LEiX)ig;aNs=U)B$;HA zWRlEGW+pQ;NhZlmk|cH4fARco9)Is(HfX1FdTBB4$|=({CZ-L;l!2H%ucVc8T$OZW zIJIEww5{h{74!Q7iG=*`9jTS0bas4NN=g4@BpeJyt&qnf#BV+`BgAr^6|jO;tf7c? zY+w^x*v1Zav4?#epoBvl;TR_<;}mD8;2amY#1*Qz#tm*!Lmds=p@|mSxJL(F^w7rx a9`S?$p7DZL3^BqR-tmD?eBoPIKjIHvDu)yR diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-5.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Japan1-5.bcmap deleted file mode 100644 index 5b4b65cc6292a5ba7d89e976565bf08814bb88b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 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 BxW^%pYjuN-9#jwV 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-0.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-0.bcmap deleted file mode 100644 index cef1a9985191f53c4a8a35811d1caeecdd1a1820..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmW;CK}*750LJlm9s3mT#ba}M+i{E?2I0Ydf^;t$thU~bV5eb3M1+Wlh=_;<6+}yI|M2!7c7^j|X(nMGt)pFvJLB jOfba^k9fi}Uhs-HyyF9NeBuk=Sl|as{9=Vak*&o)>2O)q diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-1.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-1.bcmap deleted file mode 100644 index 11ffa36df8404ab970df2a24b2d80b1dc6348436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmW;IVMjwz7{KwnUhY$zFR*p%-F-PT8QF{OC#ZI;vURs}uh^?~l4MqrBuSDalO#zd zNs=Ts!7SO2zVPu$BF)nH~I5FL(VM>=iW5wWz_Cxu(|1DW$h za=719c~A8QG93-avRUze?+Yb;sYcAwl~P38yOZ%m%1wkqmZhgkg)T;kH->RcU=n3i zFpU|^Vh;0Iz#^8gj1{b64eQuI6`RR!J?x`~103QA$2h?$&Tx(kT;dAXxWO&% wP)7szXyO5nc)~MUc)=^)@Qx3B;tSvS!7ucv`Ah+A5@^#vn+Tc;L%L%90TF_m@Bjb+ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-2.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Adobe-Korea1-2.bcmap deleted file mode 100644 index 3172308c79d57147cdbe05930228043faa48ca54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 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 f42+FTOpJ|eK+FZid_XJ }}!1;lb046pnFxKb%J diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5pc-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5pc-H.bcmap deleted file mode 100644 index ce0013167f852a873b639e301088c094d468a750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1099 zcmW-g`%~0q6vodN6a}qhlS>5pun5Mq5J!##vdM@Bf}@NT7m;gd^fxrqTR%L%JoC!)l4};NoKa|MO+K-CAa~m;Yy` zTdjJ8G1Z)yv?e_XG;o5ZH6}Pa2(*7(bPX13xi0#9ng;QCPDf*cZvnXeZG=E4V1^R` zoRvxy;O4Ai+72k&S1{ECpkGb4=2BAudTmq=)uyA=8JOxyQ9dy;?RWuYM=I0Kr6@a# zm_A*FvdfKWmj&gsAg0|K%I*ZFJ®2-Ds;%-*{dpuU>v^DLBo-c0)(C|^V~)q7$@ z{aT1<0Hy{bN<#_Lm#HZG=P~UsLiy@7rUPy$2a=c$2B93xXF8OCa!B3vwV)jKXF9wU zz5g(KznM_BQqZ}<``gR@4u?0-WN-(%F9AX;RGaa9ga(p$@iBOaih3t7U8K5x( z!cJ~LIW>#vR6fe-K&I2xDBlrNlRvsQZG!Zs_nFSbV(6JFfF>(MH3zZYoCyKVmFUyr z4bWm#ih#tHNcL)R05n%X$XO4Rvr$av7NDFerWB1l#fLaIWt>s{7^F{x*Fn~56 z2yaUP&$bGt^X|C*e2VhQ!L5A}Q~MH>b_>(@D^V_JOc!!cE-L@xHk2RYm@d77a%lro zM+{2GM@&B|SeF&7%L>*{3f2_`>xzPPRl&NdVEwFMT~n~GS#W7*5I}bZEbB~TQ!#G>3#<@hBFz@ zM%>t20?@00cFW9kYcD~&Idml6XmW^`%Ri^t@ zD8IkS^uQbCftv9!8s(v#>5sK2k6vPWv<0=k*I`qik>BW_2Xp&XCjAQLV+HeZA^Qy^ zL(o7zrVY9Q^hLn@K~;vq0(@&o6}_Kf@lX!aP&LjSCde30VR{mP<|o+zV++AB63jGW zLK&%Kucw&+!>b_VX)%V5E(93JgQ!tr9Q_dHjClb}%IsOxnO}JO%^D zQz35L#>*$dzIW`GnjFD7QmDR{H8-t vrdKjO(@~zOJ)g&;Jm1DKe{F<0GX}&NKY$rerFbPXc+3#E&b*VWK6&oH7Gi0w diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5pc-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/B5pc-V.bcmap deleted file mode 100644 index 73b99ff2fbca40e7ca5501f61e3f2f29c1fc1af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=44ustm~1;v(TI2l^-9&YkfwB h*M71;l(nECj@2Kr98sav2P-`~e{wDhU7p diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS-EUC-H.bcmap deleted file mode 100644 index 61d1d0cb001dd484630e52eb7e47eaabbdee62cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1780 zcmeIy+gDU&9LDkA-kV{N7%VIoIuhGKu~2XrO+`8pQjuoF2qrneFl_OF49p-n=(4rp z-2+WBSyWb*wJk$C%#4~H6s;_^QahLCDe_RpU(xgP!rQ!QtuDIxto6R@z54FG9(lO3 z)ZZEktY})^t`-&*IrCjkXOUXc=x@+ecPQAdtq!W?Ek1vs)gSP-YmEh|CC$z1)%QU) zpar!+2Vc51O)Z$dpuDtfp}UME(n(RGrfKT?Jl%&K*Oa8ISE@wWBNg?MT02tVv+_HS zPj`6q65WyCovl}Tx*ygZ^LwUBa!;r3%Pa+^P)YbG<|i>x5{)Dr6l*1sLt+_;5XII=qKm{NMXV<=Sutdab&!!vB3Cj} zBqL20Q)DAu5_uHsRE!ETsz^*zjA|13$wm#uQx(HY@w6mEqqt2mR#Lb+XpfpZOiOq% zg=;C?Ac+EN*hg`f9A2gLc2FWi?(ItI-H_5}p~M(UWGa25DKX9xNuga$)<`-DCq?XX zL{<97k|`G=D!S4IO9+lYu-d_s#&IKQ2G9BQSW&+^53h;da_#us134VMK{FDoRPGTCsFZY6z zw=(O&sT%O>9B_Ip(+BSGeC5?)Mk^<&5Nct^c?LZLa_74z$_-g%xPCUH1lfi~k>h>l%Q+0o(|0 ALjV8( diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS-EUC-V.bcmap deleted file mode 100644 index 1a393a51e079d1b5e7898423463fac5e87170da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1920 zcmeIy`%_eP7{~GFoWo_^SS+j^bOnx!Vxi!&+J)#M5fy1jtYA?KEX#@)WZ7K=7a5uZ z-?Pvrt3_pHS%)&T%d&RQ=w_*1?0&x)S(fcz(dXG8`k9%gnSN;Inb*wu&hyjz%sk3W zeU-mE9NgTosYfjDp%s%u@69_ddT88nTiQ(_(^a+T4!l$f6$HPPXY%xE?V2SsgiR8_{TB+8Vr z0`s0Cd3<}w5;G1NG`*6>chK}IX*`_1*CX$%pyRD{GDqIOQ<@+;Fh`nn(kY8q!}d`_ z70%%nw{U58w_XM!bD3>mWDOX-2;7;;ptL($1@2nJ+yQpE!B_=|&1d?+?gp@DCAj-M z#t-hnzj2Q*1NY8hI>3F^;Qm6eS7KVg16P6vZA=(Ev;pk97(6_W34lk|f&C@m(Q}y1 z;IZq0u>?#gj0Ze^HFzSA*$EEZ3ZA?aOkTi*z`>irp%vgM3$qnGT?3w33Z6}8yqdi@ zUO9B4!5#0!_tcFbaUnRI!L)UUWP%#P@7xMc6WB24|Xx8 zY35Ho20e9rXrB%2sdE||WmzF8D zqL^bn7bOfE!Cp|rMG$>}M-|Zz=*<^{kS$U~2(ra_!hozx5jVl=kGhX&4r>6cYhaBq zY<5~<$ojc8p`_*^SH@F|d8s=ED-Ot&L#{$uDTQ36BV7PL#+>OAKp&*tJgq9L2LW4^ z)#{?PI-Z$}x*9atYlF-!*gM8D3CBi=Z+5`1VfbCfx0cv8z)m6C^}`=msN=MzqCYvL zV~{Eot%Ox7nIcj>#7YBk&nYp8bSH6NliVd9=)`IV@vu^|Ks@Rr*4l{2`y~-#ohH#U zO~jKz$r$mpi+EN;Y%s|X@%$w5!YxS8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=Ij@2sOyo)qo~91%8!qshLNF; gfw7T^iLsFlh`E564~T_;SPY1zfLN|EgW;7w0IZHEdH?_b diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-H.bcmap deleted file mode 100644 index c89b3527fe57ad3b32061f36b73c756ead3fb071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504 zcmW;IX)8ow0L5`6Ns=T<(sPF-F)m3)lCgy(%}A1wWv;C;ce;0)jHG-a`#Sc0-}im& z!>4eLH@_FB^Xebsx0I?buh!Gm?H1W4lbo3&%O+vAtL=)gdUdzbr;93QhpM?$twYNk~HkIwOJ&|HsTmI*hZ_tSQ;1)BX%%R z0wx6+0#nUkx&X|?6AzfJ2Xi@KKAJdzuLdlngT-*t36{#hvH`3FkruF82-XrvKUi-7 z8@XUJhPc31E!fTgI}xNC>{fui6tEvcTERgPI7}o1;HVKC=Yf-0qJh&oaApMOk)#(~ zRD#P?a1~10!F4gXNg{*bwh7$jgZnt*1`ihSD1)ac!hX-}_riXD_VcsfEBn2%-y8eA dv)>2%eX`#t`+c$BH~R(HFTj33=$HJP{s+tZ#wGv& diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-V.bcmap deleted file mode 100644 index 7588cec83e..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/CNS2-V.bcmap +++ /dev/null @@ -1,3 +0,0 @@ -àRCopyright 1990-2009 Adobe Systems Incorporated. -All rights reserved. -See ./LICENSEáCNS2-H \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETHK-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETHK-B5-H.bcmap deleted file mode 100644 index cb29415de4f5a669c1b47e34ab889b5fdee6e428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4426 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 VUn5lgC0;DLe}&hDRI?#j{~y^L&k+Cs diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETHK-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETHK-B5-V.bcmap deleted file mode 100644 index f09aec6318dbec88491e3e488526882eaa930f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^EnUt?Oi}>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q09TwZ8~^|S diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETen-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETen-B5-H.bcmap deleted file mode 100644 index c2d77462d298cdb261f5e2eed5218fcba35cbe4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1125 zcmW-g`&ZOe6vfY1bQH7_;w1qNhb4%_41%&6h$BY=Az6ZfV9H5>nS>Pr!NhA>tPy-< zY6h8_Y2qsc1xeEk6EqM_%``zCBG1qU{U5sZ!~SKjv(CMDfA*a=@?LCVQAKgyrd+Fj zvB?w~5*8Y2(zCfR+oDgcD6v{Lm*^77PG;L^Yiup&zI(^f#)x{RsX2feB@wQ1F5HlUhRlx;3d+lo-O8<}>zg0drtY3Cx8oq0^3uRz(Q zW7=g#`NE%Rw}!GihG~y4${u0b8-!!;IuV3&BA1;{#sk!+LGa17D5s_~ zoytZz?ZQJ6V>x;>xdSvAl?)Ku z6v}Q*R)EGb2t4bAayE?V++37%$xO{5=u=$@o;CA8Hx&-h;tIY~kxWzXqrC8BdQpmD zFPG*!Hs=G>SV7-h3N9_4=-m>mW<4OJB>|jU%9zeO;+pdb$}0t3t1naQ0+d!W(~rwh zE@(^_HlSQo{>3dQKSeQJnul^}Ez{))l*^wm{j7LiQ9Q3Gp1&xbZHi}`;(1l^ysCKq zs(4;gJg=E?QM*4tXBsSSPi9kx2GC^!hmI(e4poxtJ}B2SnQla)+)(BDEd!%FRTk~5 zz_(Ln-D$-cUEz??rQUec1?A>yrfwsy>n;H3)i~KTFsEPjr9TJX9#9{lmtp?E2Bv{3 zoHa<0HkiQl#0L|fWCD!1g3C|<(~t>esGQxNrUMMFfWW8u7&Pn((3b^a!^AlJG0Yrs z0~p%~E+Z_$7eu=kfZbUs SS}75n>;w+>cVXen+8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^B!nr|V>@>ygN@FqW~AiHWh1 w4T!mbm=B1BfLIKOrGQv2k!7Jb!z({NhS&Ox46h9v*%)5=Co&#;!uU=Q0BE@{TmS$7 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-H.bcmap deleted file mode 100644 index a7d69db5e3..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-H.bcmap +++ /dev/null @@ -1,3 +0,0 @@ -àRCopyright 1990-2009 Adobe Systems Incorporated. -All rights reserved. -See ./LICENSEá ETen-B5-H` ^ \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/ETenms-B5-V.bcmap deleted file mode 100644 index adc5d618d6912cb3a67e4745b63764120f93d17f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?HZDrms_msWUA}o$hOe?l^;Xn zWoOQ25yqxk#>Oidj7*6<3u74@nV1+G*?^b}i1~n62#CdiSPF>cfS5@MD9-?tKV{GO GP7na4qA}0_ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/EUC-H.bcmap deleted file mode 100644 index e92ea5b3b99b1f20d31c9760481de0472e72685b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmW;HX-^Yj6b0a!LR#wJkfLdA#QItYF__k&#-$pgwHAR0XbY(^j9ToQiYX4xOdvHz z^BOzU4fhQfs9HsF!Cm{wpW;vPT)#Xy_vC!JuD|J|F9gk~~n5M;9B5#aw zmMK{_pRicpnUjV&X_z^i=c6kU#UlH^x0uN-Zcb5|;haS`AM8t}1~Vy1mV_j`W*7F< z5~8j%Sz0d&CuDX^6mmYamwIXm{c=f!SC+Gir_7t&NfCV zHDQ96hrp{Ss5KL(!Rub|rV}hS5@X=)UhpnNoCixs!TTNHgP*X$$29n)fn}8_g3tZn n%SQ0kP2|D1ec(GIE`T4S;O9>8YYj04eh-UqLp>(Re@6cS^@+ph diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/EUC-V.bcmap deleted file mode 100644 index 7a7c183228dfdc5c236b7914ca68298520ac60a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>Kf{->ygO1a1rBPe_qDDft*Zx sgPB`_!~OsLz3v`wueYcFuf=+=*PWVn zy}YQTs=kB}N|oa#DU8z6zYh`Dt1F6VfA!-q5nkI&;jcpi!e4uo({-;al$3^_qm|^) zpL@-rqgJKNJsRh9j~0)l6(|pYkpM&wCn{pWa4BL&Oo~`DavB&;fOTYGM8>P9z^ftP zH8J5eBol4NarS)Pwc{KmJzCY15S0o}^}IenEh9v&mPkqq{?N;I55=e#YOQnhK90nI z(Ltzn>0^LeuOB-H^@eHeJk$mJP$LCDb2vV~tQ7$=Ge8-qeq^LcNtR z#tYpJ9(Tyr3>q*_p*G>D9BOms_!+1zVdE0iRx); zF*d@N2=$J^R}A%TfUg3om-yzjubVmrb%0DIK^-(q zoyB*%X(|Kikaa2_>eGNJUi6uMss`$F$#|XyPc?8Ze}i?Zo#P8!nCh3Exm1|uZGLH) zE&zitT>(bIrW>%+0j=dz?8@|tBm^BdQjGeX0 z!bK{~o&gIIX0yS9GiM74JE5N)Bz^W1%~=#)7bEXMfO4Hj#9n*io^z4ge}%M@=*z-Y|dQZP|`%eTe} z^H##*jq{;|oz~CC%8o*6oR0%b#6g#Hp3_PSn!f;+Oy;Y>&N$}lz|NZI+rUy>^BuDD z3XNPKV5yFU7_c<^LMoWYxNs3H-Lg;&mSI?^A?%!S;YYA6EHul`B5GV{0n5h1J;HLx zLOWr(_JvNc{PczAU>Ed@XgTE|&Hff_)#&~0*v{7byTGc9{$4rgDvk1UORIHDput@(BBZEL{d`v@8|ju+y|uE!#_}X^D%z=~!w7`zdPaG1x7~GI#Jc_PLu)x@B%o zbKr8kY%im_WnQVpyqpWxie*ku5|_DAZMNlhuscD^17LT}D;7DhoMPn!VP4Bh2-tmW zW*IJ&OSD* zR><~i6sz1?*|=H@*5h7n1nZ4neTw6AhP808KGRw(-lZAV5@qLgdS)#J?1^QKThVV= zy9YKv);hojPp)-ik82phx(Vzl*15!IvbB;1u3N#LN3C;1{-#^c2YX>yzl7sV`#RV6 z(zSj=vQ*Ke^>&i7;nL|gij_FWMj6p>G!nAWM8Y>(mCDQw{+(S*K*BqZM5?o~J0KaW zu0ca8(TH*in%)V`V1j0pg<2Ze@_&X0vS;L$g~q>!3M;H(Mlfa}d4+$#sK@n>{4veF(5PfbjR(iWvF6 zhQz<`BoV)!P(=KiN~(VK5bFmhV$%nkBI-UoBsV{F@!!Tj%82EonGY8+esn8h=*QC} z_~Rww`B*PmZt(k@${@5rE+I%MfEHX0?ZikrG}mxGw3Ak7AjJb$Y*oYmz_?WlElSvGlyuFx@OS3J_fm4+rcGOIoY+4v^Xs=` z$jR*-61QDN%-g++SiAk4SbnQkM8j`Ck(}RJ$;nUQ#PrFdh{C7yME|Kscl}ejWNNN~ z7CkINi%~M5#h!=e4#9Djk_n9(h$hNH8x?j!pvC9!P)v7Wry2fQ{Z1>iQ;r?4WV%BW zclrSBG|am(91}Pu0=^rF-OZ4NyEJr{w>{Ci`v@Diqjq^ulFXlZy=3QSw-n~3p`Shc z)EVG&ImfdQK40UQf}GDkC}RBY4n9dm&hMFuc;)vFK1qZA%U>rvFn!75m=5cg0!0k| zQo$z~Fn(#~cn&#Vyc{zj?8V4JJH=ii-aN7FC1c%a+slTQ6}49kpF3`^O%@(f-F^U; zW5~V*TDEK74lT#C9|!HcW4}Qb9?`)4yU=oz_WLp6Fda~6d5(i*X!)jtJc)EvVm?`N zbkH*gS4hM`HxUl4e1s_C*+VypI;>$oV9vai(3ljX*M8dvClG9(a6tU>*Z4&m4 zNko6%BJ*#j@=&4f@8HO9H=DLc41D)&i~6 z@a++_vdC{Trg*~2&EK68k!jQSFxk>Wt>62hRoIXCi*n6*6pYaUXxHP9;xV2i992l< z`7^xgmdMj=OqWZxUYd4vgLkeH$;U>HRlsq&Pi*=lK@nYl8cFG&5j=5!^4L}W=dw=t KcNEe6tK@(8IPMSt diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Ext-RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Ext-RKSJ-H.bcmap deleted file mode 100644 index ea4d2d97b8bc1df2abebce0d4f8c58789f723eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2542 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 n1WGc8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>RM5v>ygN#sKmI}pMl|k4-f~j zG8_m1(*FERdxM!+_J#r3kw6>*#Nj|3#vr&i+EGF=`+zS48-q}zgLHFIt0N-=1WGc< ggIR10jYd!*Mh1jnBC~2K<36T-PyT%@0*w1a03e<=y#N3J diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-EUC-H.bcmap deleted file mode 100644 index e39908b9844939a3c6d6baccced5771b8c1b1b2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmW;HX-^Yj6b0bvh=x@^fcgdPo2C^bbR!B*V$ecRss^bX`N|ESR}dF ziYT(U;(|CJ$SNud2>cj-3g`OeNzTp5Nv`@Y)R0Q|8Qq;-8R6G7pS#-U(?lSVit8fW zXJ+&VrU>?Qq>OaRh-LJIr!bIAivN967`mw&y?hMoy6|{!1{)fi!;OkfA;o61EZUXA zrr7tLQB^4WPDMWP#3Gg@qg3suI<?M`$=f?v}^3bnaxfB>#NYMU^7k zeoSNs$ZOA)=ecs1NV}1XlOHqWu#XgvM&(EqIpotqrVET-1<#z|xynSrSRHs#&h&%v z2$-k=lVywnrf!3m7?rPznS0=M6L@n5yv<|c;N2B4eVQ2r@7uwLi{Rr4CIdc&z>E)k zKFTD)>~-+vEU@sWv=U&h9?T1JMCOO6LVj&UT(|%hOPPn@+byu<2FpcEH(0p_R$XB2 z5EBFIm%;Z_%mCPE13zlP&*O{KFoB0odEc2XC8swyI@Z{ E08&E2d;kCd diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-EUC-V.bcmap deleted file mode 100644 index d5be5446aa40898742183202ce0624b8acee5234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;qIjC8tSa;ktnio5kreT14D}) z8$(MN1LGbEAUm9ex5dqlVUJX^5<`m<8)J(L6GMwFBf}nPZpIb|AT7hl(Bdr3utyfi TmIJaQq#0U5fOIGW!yb76lc_S5 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-H.bcmap deleted file mode 100644 index 39189c54e3..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-H.bcmap +++ /dev/null @@ -1,4 +0,0 @@ -àRCopyright 1990-2009 Adobe Systems Incorporated. -All rights reserved. -See ./LICENSE!!º]aX!!]`21> p z$]‚"R‚d-Uƒ7*„ 4„%+ „Z „{/…%…<9K…b1]†."‡ ‰`]‡,"]ˆ -"]ˆh"]‰F"]Š$"]‹"]‹`"]Œ>"]"]z"]ŽX"]6"]"]r"]‘P"]’."]“ "]“j"]”H"]•&"]–"]–b"]—@"]˜"]˜|"]™Z"]š8"]›"]›t"]œR"]0"]ž"]žl"]ŸJ"] ("]¡"]¡d"]¢B"]£ "X£~']¤W"]¥5"]¦"]¦q"]§O"]¨-"]© "]©i"]ªG"]«%"]¬"]¬a"]­?"]®"]®{"]¯Y"]°7"]±"]±s"]²Q"]³/"]´ "]´k"]µI"]¶'"]·"]·c"]¸A"]¹"]¹}"]º["]»9 \ No newline at end of file diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GB-V.bcmap deleted file mode 100644 index 310834512ffe49cbb7ca903abc2dc1aaa934e6f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T;_jsDktm|5#L!~Tz|dmH#?TVR zz_>>O$PQ=WZE>?>*dx^plyqWaY;j>?Xt8Bv*dxu&*x~@BWf&P+oTVA|$O74NKz4*Q OLrVyd4rO52BM$&=>M(}@ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK-EUC-H.bcmap deleted file mode 100644 index 05fff7e8254c995031783fb3b4892d58a6b176ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14692 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 U$d&`LBcvHxLV$EA1H&G90L*YQ;Q#;t diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK2K-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBK2K-H.bcmap deleted file mode 100644 index 46f6ba5967cdfb381f001eb1193f17b43d943962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19662 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 BHq8J4 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBKp-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBKp-EUC-H.bcmap deleted file mode 100644 index 5cb0af687ee20a10ecc367892ae49d7b1e74acd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14686 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBKp-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBKp-EUC-V.bcmap deleted file mode 100644 index bca93b8efbb18a13e15025ad41d23db8267d2577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|Tof+Gg1Hm diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-EUC-H.bcmap deleted file mode 100644 index 4b4e2d32294538b5093ed3870bb9de37abf21599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7290 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-EUC-V.bcmap deleted file mode 100644 index 38f706699f395dcdad5c6ad93d1a9b6fe9f66c78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>FyMw>l*5;>yaq3a1ld`Jp)6F z9UDVS7z5)T2_QS1g}24cj$w~fvl2s#6B}cT3ll?&EhEDoX>P_A2OurO$k5^}&9Fxn U$d&`LBcvHxLV$EA1H&G90MDZ`>Hq)$ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBT-H.bcmap deleted file mode 100644 index 8437ac33771536813228e3f9c1cb6c35af3acc72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7269 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 WM;6GI1F|Ee8CpVsbSMME9(e#*4Ku$0 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBpc-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/GBpc-EUC-H.bcmap deleted file mode 100644 index c9edf67cf6d640607080ad2775c14760df77dd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmW;JSx*yT6b9g#5sk8Wp~4N)&xVRox)HTbV$ezus|KWvvDSQMS~>x=+B(ya0BUlu z6%kOt4Hc2GF1UglxbS2ABPP6unKL6=RYgKy|sm^&HD=; z+9wK$t)ehQepj)s%u_r}`l(`yg7UVH+^&(zQA3V2kz3v=XL`Ztad5W*jA@Jk##_Kd z9Ww~-#lii9U~)TSfvGcK8b{@WO6C%Hcmh1y4IY;=1Zf!{oti z6ubz4xoRc@UY-Q=dw_$U(n*6?$3RJtJ6^g;jq>$5#5V`P+ilD>@U9aqc)|M$rVo5* z2OmA)(*`C9J|6*Jb}~a?@jO@xfv-Cl8+_{m-~Hf66>}N8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|To({Gim?; diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/H.bcmap deleted file mode 100644 index 7b24ea4629d0d4cc9f0cd5852edde324156ef0b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmW;HTTc^F6a`>fNJ|+U1WZdKHfIVU1k*BRx(Q8g4%)hO%E=p&pZ zbEd^7Ox8PjMK`8&BW>|axS~6oW&igkGq}l(87h;Uvv6yFZ!CT`8Fx4oMHIF4enru4 z=0tE`J|(&Hyxf(akmS7OcH5<8CAK8mJa(nqZ+l&STNO*h{HDE1f!7`2 zO)W7E7S4gi5O^yQV7GO1K*p$4;PUEKTm>RjJOVd4}m{N!QVP! Q2JBoE!O~)+#IZZH2g5hHiU0rr diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdla-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdla-B5-H.bcmap deleted file mode 100644 index 7d30c0500520d563d0e5891c8f4781c61ddcca5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2654 zcmW-fc~p~E8piLJgoLoDV1iVG#EWdQB!Dska^Z@KEGiKJt6VieWR+b7OJVMpTBmj!JFV@ww9{?uR9m&JOC9YvJu_$KuQ_Vzd^3MM|2*fO=e_Uydjxkk zm-X}x_qVsU4JvaA3e;J-YIT7UxAZjWl(oYHgStHf%8Kshp8npRe(j*HB|8Flbt(V< zen8o;8_@Od`=42>(l)3 z5_3C7W8#28sxAh9N4WMd$)m11OH42hj!JPI28xLDHX45P6A}5PLQrD$ZsAaCQO6I=ddkoZXMn>rz{cbfRZ!j3W zu@jQ>ynlWKk~fPmdh0nz-r9=M+xd{Zy%(c*cv$c9u-@fi{ho()froX0hxHy0>pdRU zA9z^r^RV7;fy+Kf0^rgXkn_PNTyT*A;Bo;FUMzy-BHw@y6CnAp5u=X^A^C`J#vdDC z@g;uI4>p3um-s_o8iZk&^FYJpLX57&LUKie(Nz`PcC{OTs|;X1uE6NyDo8$w!03}U zNdA6O5 z0B)Cq)E~NF`W+bn-)ceb9faYXJ|MX(2jKoL5PO%u&s{Z6y*CGdAA5lOUOrrMuNoBH z>%q(KX8`GaEhP6laq^E9ApXZ*IRAkZfP39w-GcZ1 z*f5LIpX{hHKy!>);gx&0*sJYz)=EPI+r=(0R|)l5F2!`8f6%JZ59>$tNqY5!E~K=V zTNiLc`YkgW!xod`NL;gnjCYK`5N+346rMbn+FWm6XX(^4292RReV((`ImqQXdXJC!_bHv5U)?UWD{U!X6n!SL9x#vjlBPtFQT9el&rG6k#4*p2 zVM%hYG&OLW9L%vcu6bNb7avMKw0NTN)YxRx^79mE#^|#4E2O?df~~r zN72z%SG_l%O*s***ZJU~hG4y=V6w<5*5p4e{YT;HQ7>~yHd$itVWUh5&NyeUUgcjg zHDYY!P_WhC@4@audUp~1d7ro0v_>$!VWqRup*^ zG@Ihd^E7$(dgswfeU?6DwPBq(r-$EW#d>|WVUMBLH*9DQ=F*rwmMp76AmBzPvbd-{ z`UrM~p(|U+_DhVN?C5m+jKa9nsh~~nM}8Y+vHUq*G^_qfnlDpw%s&fU+I_IhwQob9(!YiX*+$GL+{kvchE<} z^e2(Xw3o|tByvl+PEE9o$X%aUSIvD*hb200lQ$u^I7Yvj*DvsL4eUVM?hyZ#(=BF%-SwbR>N z&sWihQu=VtVs{Pwr<{I1472&JDDSx02)CG12S|>J&OGMUP#zv#oHbA4y zGWT3_lx-`u4pUoGg+)V)G$p^3{yIv_sW>Xes3s zwsnSZw^U`GPd}`nA4dhof&%eiyF|0&m(Z^(U;j;DwQFggC@3`47%D;?LXj}sD4(ti zcNRKxWYQ>SyyJzCa;`Aet#zgz9t}6{rI#i2vO?llg%s9G57Rn6dPL&Nx9<#=imudM z=}HXZU?xq@4;0PRICnY~GtxkuE8VWU6LUuv0Pg(B4VEzHMpni?XO1z5^;Kp?5W}fz z{VJQ(u}0#kHH?}wgXMvgnRNSzYt_tfFe(@w7}BK8mOh<7UKvcDIY4EBy)$d5dc4Y~ zz92oNpc!euF>KQJvkPfwgd|KF>rA(&POqm~(*?A~FB1yG4pyG2^=~b6L?3R`GP7;W zlTM9%wu5q`u2ycqlQ)&=UrSdy)2<4y3Y-a(rH1YXM|+ge*&EKL$7^J>p(~rOFP~CR zCHb=1N`I@T(Ssv=g{EQ?@)i5CeTlZ!_8no|3O@Qx=3l!t>u2Alzg?jZo08a;+tQ7T z&ZV7>v}M}Xu;GqP&TdO8C-a2~d`(=Dc`2JD@GgoJc%#Bu#H!fkbd2trO7{*er=qDG zuOQ!B;;uI?vTkIX&3(pjM!LhBo?^ QxJF!^-VRzcnd;s4Uw8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lc?)ts_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~ljyD=Pp1 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdlb-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKdlb-B5-H.bcmap deleted file mode 100644 index d829a231015161e107123e211d4a78110daab6bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2414 zcmW;KX;hO}8VB$j_OQsJG{|PSK#(=aRsp%;$|5LKBC^T_S%M&IO_arj-Z$Gz_5=fj z1VX@Cs}=3EQ`_lc+tJ!qJ5D>*+SPSz$IhI7m~(pO%=EPL&V2ZPdCq(8z3=n;d)?bp zHZnSKsQ*BpLb#={Fgr6RJG)Sbdq%os!ukohLN+89Ru6ZN92y-t)Txm5WCh~ELE-B;W z>=~{S^;T8=(q_#RJ5FO4i>c5VZ75m`ou9Nf8*`oVGS$>tnzf9nTkfR7MP!W81!^;V zwykXOG^!MuZoU8P5p}fETA5h1wR5Hhvv7sxWE7|U9cf4}_ ze82Ocr+9vyre9N~sWy9gv+J$tb5(N_svvFbeELE5|e?s^WIqqRpM|qx_izCj;nF%}(a1GS}GZNHzEwqh1&}Ri!&HKhz|Z zSW2ntIPEd7cLmYNA-B*NV3L@MPPUkeXu4bCiB^?qTB~$2O@K_U${6xr95Dx2kGzzx z&oLd-$5U7OjoRs~)mD0`w|~v|VxCoQNpg1wdB%Oc)&4F?uvugq-leYhSMR4EAEnp* zV$=<)M!IQfi?rS1`DId7YR)Iz@*=7gD^ur4noDzY5u5$HD)gD)`w`{X+w}(%ssS~B~R?k00w8Sw; zu|1#ONT5IXFnu}+D`Gc=vwK{Tt|CN`JYGcT%;$g0I zv-OML1bO-_y^KD`|Ftpp1dHwMrbs$z$TLU+)M8r%*XS~OJ%N7Ita*02nF(hHmqD&v z77sF_W1e)nV=>2_NuxEPj8_ZOd#;fQI!`P$OZ(Zw?%LIW9-6D#peJ;YKAz~La!+Yg zH}L*Z3=$}Sdnp8fj&m6UeslsO20+3{FjB_BXk{DEOF2dXQq@DEj=)Gg3W-LHkv0Sp zZ4E|j8YFB#M$w!d{h>?K@iJ=rDV>~2Af|02hwwWdYuuWlPZi2+}6h;;W zB-UJvY~e7=RtK_X07f%nNM?pHI#~mWJqROvKP0o8F`Dy(WUd0E`9w(OyD)N;LgL`g zS|E@(V=;10LgFgKXi)&kVk1UNd5|p0F>*^GSq{T!c^Ha3nV`VafYC}YBrCfxT1|yy zwGW4%sszBZ7o?wRhU9r4jGpg;7u!0bz6|7V^*R1NCQmF?z8GroK1*>Na1_Y?r<#9XpK*|}^Sc}@Yq*)fpvQXnKR(Qe2tekADiD5Q45N#D*l@9mn;ijuFUMo_axx?@_h9t9?U1~} z!|0U`NM7aUuO5Ts_r(~!wh@xonlZXm0Li7p7`@J6y}@CQVMkyjMZ_i8R^x>|(M2N95bAjRmK7`9#;2H+YG@II`@=)+x*d=!Y$ zM}3fdoPyDHUr4T(V{`*Ta-$QYPb83hass12wLx+-2BVu3ko8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T<>8%@lceips_T)+v(TI2l^-9& lYkfwB*M71;l(nECj@2Kr98sav2P-`~lkWD=Yv2 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKgccs-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKgccs-B5-H.bcmap deleted file mode 100644 index 971a4f23f791f75d4e604ad717735ee55529eda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2292 zcmW+&3s{t87Cz_yhk+4LK)HmV!xluLDa-%_0}!{Q89xgv!bn_%)-tr4wyp+MR&IvNCGYw6h3((wIh9R8} zvURRQ=(1v9R}@;ik`TL!a#Z(9^u8U0 zgKvl1;C2j_+>Vvvj+y-LWSA!0DMa5MFGiq@?uo?Uo(%HoDZ!AQN{s4x5>0m_G3YKy zue*=n#Jf{S-L02?_X^PWUK!f%t)Nl&2jj&1NmAUeqQqZfG3FN~#joC^e$AB0y`wbf zUBFm47J5s3p|{iwy^8fR9ec}l=(QvCRv`8+w)<{L6UHVVnrUpxDnX;oPXnWEFqgA! z$iNXWa0H@mv<2xbg$x{_1GX?3wc}c^LkBO=xcU~zd~k+?4raE*fG>En91Vd`%pO11 z%rJ;wNnm0f+3&-r9e1A7TxRLNv)yGuPOvacFpE!oaKS*R9d})V4~E(C#VWYD!k)gX z3|%1sx+_f6ToD?&Mk2VP2wa5dvT3?&H0v=MxMDSL*EkcnlF;l**1IQ*?08$Od;h=gnkWrnKzNb7v2f4%>%n?LppLuwh(6yYa-H zw6MjdCb0mc~m!j6(Xn<%bB-I)uMQbgoP4QB+`IBnP zm11)&sm;r!_)Qk6EoLdURFe9wO^TtEwE){TNb$RQq@E3t z;@JjLzvn647D#d1@*!?JNU=Sh)b>?U{2`arbG}kMx17`;$4c?Mnbh+cQtYsi+EF3J z3u&ZY;JbDzQoACg*tM3_i>XrV4kfjFt`sjNlX|IMia!;QdO1Lfmsio4J>wx|Pq7qx z{YdSdEyXJ_q+VGj17FPq*i!`KUY$>BpGk^+6{KE^lH#=ur2Z_V*dIZb{UuPie~A>Y zPo|jHn*jDZAn|}rS`W;H$OCIA^k4|U!FWa-q#sO>!3P@v4m3ja8-qx_ktoHR0i@o{ zlj6|$R%tm@4baj6)qz}&iWKiXMC!fyQoNr+>is9A_<)=BAvfzoZq{G9Ss!t; zKH_G5%+30koAozt)+gMoPbw+)s14vm5llFmCsU6hz{yn5kMT-5#uM;qB&knJr8qvB z)N!7Szt5v-C-{RNodY9Ia3N1Lkk`p1n0Ior6rTl=`m8{TQ}ML$)GB~e{N?;SM~cs9 zllo$i6kjYO^^a&NzVssXbp8A{+& zDOYP`a{D;2wA)FwSIN=WavWXjJA!TVMa(XDWRTY-#ej2swrOMrfBR!b8ck6#XZ%bRP# zX|>~?1^R#E?G?NC>F#`99!0z$ikav0LRrAPkWpencPTH3GF}vm7!_=*)J$#%$F49% zxmO~3hDh=RGAC=`NkQ;TG=panbE=M>$;?w3yevI}&@&x1kJQk^OUIMRayIA8W;vJr zb6Cz}Uq0tOhPtPS?ekgZ_u(mJR$8d1oO2r4zm|EO)I1wd@6!!r16b%Gfwd3d0ynk%qAp{S2oUCK%2jX)&DX{IlkK6wz=N;1I)E zhyjLkG5Q$J1`0KtPqCvp7)Kk;p=dFhr*TMgmh>^2=V7wZyomCRmSFTXT9(L%jTZh7 eV6=`zFQYYve2mt3Of*_2X?{j)l{Um^UGsmAm(QgD diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKgccs-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKgccs-B5-V.bcmap deleted file mode 100644 index d353ca256b54236a4acefafdbc08e5b719892014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctrCoLsEyWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxZLvn!hb diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm314-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm314-B5-H.bcmap deleted file mode 100644 index 576dc01112bd7f28c30804661f546ece203c53d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 zcmW-hX;9Q>62|+_CEy8y9C8dzGJu2|ML=I^i69Frj-ce=RRZ<=ems{ZVz@n00OLs6mXL4yS)n(eWt+g{b8nYHPhBhV` zV~s&}MupK|AES5C?@aXe(gzPD%ZWYP%&}bo&G9<5Xj3W82dfrZw7-Togc}@{-JWu7 zce0!suUp)3Nabr8nU|gmbTq$cUTuyws~vn)ihy3niMSzcSCUz+KiC@68g0lk?AJ@h za;+}3ccrOb^gJ)gEm0~D%SBnvXkD!LvKuThq?$G~d6{cYDP`!Y8Qgg?O0Q~MI<&j3 zWZ6MN93R;%yHT`+! zWVu+bG87HI+*#~p^c3-5M0_JTTK@HOFq|re2r#5W94vrsV60Xttx3ODFEG|GHYRLK z8~pu{o1L9&S9w=`cTV>qTbt(U>S6aTKe?bMZ#c+M))Cgfsx`&FHMJ?dBl3j%2}P4% zr&^b;wzU?B8R-DeqQORPa#k(3mi)5ojjf$==A_QUo%OwmW#+BA!tui4Ej_lKFP~k~ zRoD%SCOlL=){%dvtdP^Y)-F62+*3ECv3=oahH-Vr^2y-Iph>0Kf3S3{cywQTWLv1N zPPuMi?Lg|lMzxLgQ|a+akRJP~oUE7TqZ-RPv>iFkRA1A!-B6--uzn%7DFk@DQ@mx% zUVwiyfO&fn*rRf@UVBo~Q{(2`AK4$&?%YB04u4aHIc`FERBhyqPL0YVTlzAMp8MUc zkEGvRM7|t;wud#O@0??=h#hC-(I^l^v6QKYT9uPLM8C)i6h@Ex9?PoU&?*KSV`VpIa z9{FTGv3EBje@`Oz-Y(?t3;+E?$UjIV_MsQ@4__ko(Hi6*RTKMzpv%XCE*}fJ{87;5 zoS@4&L6=ViT|N30u;xjL70l&-Q^Dk@B{z?qwTuC7IxhwL|Rm3b2_==?rz#@TUO(SMa zM}F0r*wrHBUjz~R(jNJjFB1C-k$KhBe@rJm`4MCrqf<8Bk$op0b1m4QS%-aqC z*TZ4aZ9%WwdvM(yf#n+n{&#i}yK@*F?=r}~yP4SczL@rXF2IxyiI-h}Qi56<9Fqia6^HFzX_;UMLNmXBpVe{_ekxKy8fx diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm314-B5-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm314-B5-V.bcmap deleted file mode 100644 index 0e96d0e228e0608f77f035655140c6a235d4ea56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?ctqkY-pnEWUA|t$g|L!;gugB m!)tv;hS!D+jEzi8jE!tS%mu`JKr95rVn8ef#Bv!7ulxb;p(_9Y diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm471-B5-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/HKm471-B5-H.bcmap deleted file mode 100644 index 11d170c75ed8696f0705f9fb9f5afcf3b0aff4c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2171 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 W3S-b|;bUNIW?^7zv1XQNu>%0E(j#{O diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-EUC-H.bcmap deleted file mode 100644 index a45c65f008e7d6ff34edaf53af15ea471d4f6d90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1848 zcmW-i`CC-i8OOixy)y#?3=?IQ2uv?U1Z7bx1Vjvs#IU1aP?TlFfka8h8Nemd^tlqE zY0{)i(l!C)+;eVZ(YZ5oO(85Me?Xr;PnRG1OMmDOZIdqcZ|Ir+a6jjH&vMW5e&6?1 z{(8DH>z9aSZHI+weYU+K>S3_5VzP>wC)4?~Vd~I)yg(5dXk-&8DYE@eE zYf=pZr-eS649DE_8slzhYA6a`Kh#!yh# zPV0XC#L&G|T|0VjoXY3+>6&}a?{v>~rR2>Gq~^_q^n?C)Q}o8}cRTbW>U;rVzKBxh zi>YhAOxK3yXLRk{dwqK4`TGa-3g7)%ukS(O{pz6yO>*%4{Yktn@#6~;AJj^Gn4LsK z;wQZlA5}?woRP#eiJ!hI@v{RGKX)W?MdBAPOMFt4#H_@pgA%`dN#a+zNlZ)p`kcgP zH4>j^&Phz_TGc{3z_Q_3xC1N>!@KYf~RQ{cH^jl>Rs=Mg*TK?ST%UH z!j6I;13ON<7Q8-O_D2J(mUx50>Qvqc?gwiCKdrJ8;IF2!QxL@pYbWtNh*GdFhd2On z7_6H_rBl=>q7JNw#7Twql4u6&gYZMh^Y%mZtKu~hmmo$}c3u^;WD?j#GF2xV3^e`8 z7-FMRAVw2l3?rM%7h?xOJYUyTUI2L^IOL7wePm~eY)8?<<=f`+8EKqBmdKE8Cu)RG z*UH6N;BgJ|#9i8FW=S`gl@ed1C-H`^l{`8FtQMp2(RJWa1NN=BaP^Y>Z7;A^E5BR1wr8!54zIOIBLe5zOHI(c4R(IO z`Ij%SJ$$blJ9TqS*gW*085;rp5VqRGd4D%DqE`@&P&7om%^3}YcOZI;c$X`B8@wkq z`Xlf@SgGLsu-xG16)O#VK(jo=2O<4v)qr0P*Z#u*A0g`qcz~>9;8z^haqu9l28B<+ zl3u^2SdGN5E7mFSkjrWTdl^<6@i1BKV9hS86MR~+`oL$%dJX(0Sr@=s$QlH{1?w{S zZL)^I-v++}eizmV_$;hZ;_tw&CMy6zu*M)1`9x%0g;2qy>|TL24&iiI6XB9?4Tu!g znuJIt>js1yA{|yF>2~2EYYHOMW6eN#5mT`{p~f5#dmyruSSmygV(AdMh-Hw-qnHPx zAT8#F*ssP4APNyHf++IFiV-b!#j3-e?~K-1Er~O(*epbwl&&MLLUbUWn$%!i?%hf8 zG>ERS`=5q0o&nLT#`i*;EsEzt^p(etKC9i|IrD%mfu$sus0J}tXF3de-=fli` zT>vx3VZTUbzGC}eN^?KiCB!bf?NXRUF6kZ9M|LetjqI0TexK|HGD|&nBbjBe+hJCy zc1OVd+)&KQ4?SQb@3p|F)BP~=yf7-#U`)?|%^l||SZ2R6r$vNa)7#a4(iw_W7k&Y_C! yV!7M4%-TEI$l7s`XGdn5p&eNauv8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=^gB>>l*5;>yaq1a1rCa3Py%~ zRSXOV8JL*%RRh^|EZqC*bs6?^H=8o-=V4>q&&$NHpP!LozW_JuenDx5{o+8j1Q1I~ IGw+uI04wP+sQ>@~ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-H.bcmap deleted file mode 100644 index b9b22b67879d4043c75b617a24f96b0bd47cf4ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1831 zcmW-i`Cn648pfaZ-Xstpq{U(4L1XORb!_ZPeu>guX1 zE>>69d7H-P?uESmXY&i8*?Diaa zWmRWeOKZ2kmB{DQ4+Ft#K3^cDYuEJ_{Yv0Ps;*spF+pX^r*zG^++uewccpli2U0!D zbNbnqZ&UP!?r%Hv3+hTfVWp5#R*I-=rBv4fD~r0;_nlv_xb^akUhaLls3t;!n0D?n(UlGl{m8S0;@K7)-O=bdYi7Lua5xhgXmqK*0npY8-Ul1P&RUd)G>*DSCG2yLGDwfC~usdX^b~YGn^!oyAR0?FX5!f6?HkU8P&VqQJuBkj9@IxPdH@A=^$=3$Lz~iJQRNYIwwRI%Q-@Hy9NX|4vWhfvy$5xdCh!q2SFl z@TMN8ww!XCtzx>pC1s{=1K1is<+e?>izwK>M9%G-x;D6dSN^sa*r}1<6J0y8Q%mP} z+N2SIedjT-JByqhshghNlYkjU#;(*<`tF<@=||)4b2+mWAHA)Y=Xl$pYyNj-l=|-1 zda)zw0Nz!iKPsI+Fb*p(Xdf!U;qZ%Y9Mvv2V*lK$ChP_Eb2w-ZdqTd9=siRu6rCg9 zW{-x!I}m+Byvq@N3f_|%{RZ3*GZnlarW5>@Vy1x)Xr_z!AfzA7YVe_O&4dqpgv<-z zK{79a-?N#Q!9y_X6+Q`5dVNYU8;DOU<~8s+huIAF8O%1~VKUpnnjB^)_<~~k!57K= z68tflx51jp90Y#?a|rw?nE~*xz@LFXhdBbi1ap-5*RZO{3_=jhF$hII5t-u^5^UTs$e|mZF+75UFH7f^b5l!;B=|E?i{JLu9(lMF=-yDvl@Bm<{3tM3xdu zg~&lH9U>R83=$rSxghe>Vs41jYAhe30I@=dLU*hP(Go|jD(t%NYmL>AxZ#K`L9|Kf z+Ttoi2jZzo4aVi(ofJ=l=n6X@`0Vivh+Z{*65?iIJQu=W7Qc*Ne&vXdgfpgmMezy5 zrnQ6vBIrt#felci7Gg|I)Io%hxC${5&YSiriAIR~lxTvOLPCbj4A||=#B~x6k&r?3 zNJ+>D3Pa2*i2)J|YGM%L2_=RV@l@*EmKcS2UXlofOJ;mFD;Fg_ux zo{SQg)j&omtacdXs?`y6&iWLi;zt+Q$al@ytkqkv>2YJTJPn%*E8SR~Xu(>;ax>N^ zgSOd+*qQvk8}G&%5KaGK5nH3d(%DbitR8Z|m(`%|eHma4Lwi3aL*yq%65|s8Y1Xxm z_q=pvuYuIPr@H3eTcXZ=naS<@cjStGwC>B4`qOE+f0juh@bhI^C=Rj+2NS^l7*Y-< zWvV!sqs&7GIS+HF{IE#wb||y=~ivf-csQK7Np5q&`=XgZdQa)Uz L{tvCv`X&E=BnB!` diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-Johab-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-Johab-H.bcmap deleted file mode 100644 index 2531ffcf41acc01338f781c845c7f50f62fcc84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16791 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-Johab-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-Johab-V.bcmap deleted file mode 100644 index 367ceb226ab1e33624b30512716a3b65feb5a100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l_>y@98n565GC~(t=abE=^ z!@ep8hJy@DO#7;V>^c_ief7Ew`?(uU8TRwAG4AJOV%X2m$gp34n{~gSG{b&zAX@^6 KC3TtiO923;%QA`p diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSC-V.bcmap deleted file mode 100644 index 6ae2f0b6b7238adc67bd9231668d9853ea3c8e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T>K*K?>yap+sKmIhf{|fg6$8UT z1}3I`)j)O~3-`WyU55SK&87_ddDs~D^D;5)=VxTtFTl;ZUr?H1zc`RB0mPEh%=@JP DC895z diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-H.bcmap deleted file mode 100644 index a8d4240e6adb3ac1db859085b769a0715be03c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2787 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 P^z)@`@$;3W7gGNZsUm@q diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-HW-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-HW-V.bcmap deleted file mode 100644 index b655dbcfb123ed06c7eeb87dfc96ecf6759363dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=N;^vTdW)E;jHTsuIrH~uy7IM zz6wT$eN_w$2N{@{_EiJfbu8Tb>UA0Rb2pnZ?B`))+|SFzu%DliVZQ)3>wZCLhW+9| NwgeDMN;B`50suw^GhF}x diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCms-UHC-V.bcmap deleted file mode 100644 index 21f97f65b4a61adfa13f55d5a096ceab45eb485b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%l#TdW)E;jHVCD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE*uriJS diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-H.bcmap deleted file mode 100644 index e06f361eb6d429290806b9f9cd7a0aebce22be4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2024 zcmW-i*H27iO?oT*=I*WEh>y zWZwfw)x9+eYFE?kLGTF?ZkWX&sp}x1yUFzOj=XcJL{@hkG za{2n`g`xA~u00hMC53xSN-A8{=SKQ{uJ-F=KpToUWs(J`+TmV;>Nm~+UE9J5L641UahVi1pSv>ge>ZlTsm4xiL@ zUR92$HR^%xThXer_tqfgPo=AheX7Q4pK6Lqo$8EEof=W|YCeim-OV30sC(q;48pXN zqNcN`X*yR`x~C^prS0Q(weZC4ooa#W_GE(VPUh|6?mJat@RRKk+z|NoDS=PR1U^fO zU{v5ctpeXI68K(R1Q!Lqe@x&9I|Y7diJ)KLM~4M|?2KSi;3r)IKix0zvy=$N1%BQp z@QV_GU&c=f4691fOg*3_!7_6lnC(Hr%m7Pp@|W`a?N=-A$JDlSJ!h)XdoRZZ$n^{es8+ zT#}v752-uc&wFI&i*4fNMWr0`;%c*HL&}ghqK>#XVrBcrG0C>kCRsO5OSI8jo4(=o zxHoRf&X@aJ<6m}q+%E@Z=c{aWN9ik%+US0DMRvX}?TC5Z=5fF7mYr`hI^{PNkTyqa z+;0xbDQ|8R#BXldVcB%myEk*P6E^$T%kk{2-~L-2^Xa&IF=;+SFlD|Nvy-v&??TIV z&A0h8ey8u99|KE)<|b_?SSo3GR+a{>0D(M-Il&ZYyJVIPZ8umhv_fJ9(2BrzOIk5l zv83$HjCKe-OVa9z?*Pw%)@0#3 z!FNMzCSGXeB@!=()$LY1y#wucNAF2Lgu|oz`aVO-?xix?q}1f`yvwL z1pxOuQM6zY?F2FxO3A)(TvfUj&WO*p0*hthxvDB#7Rzb(Vx2HXVO_ieJa`Yui$dBh z54HlPA8`+a>|-B{h>;FdJ-8`m*5aLqmEs%^8&swJQ9eaK`j(n)3)p~1Md%1Py!6Mv zAe`p4{^@h9_S|a5)AFe*EbqEgjVE4p7gp;1sejeu0{sY#QecEwoi*SGYe3*Cu_jyK z8dyto;6t!>n9*PzFzsL`Br^uAQ!yRHx*+^$mVll0m;Fr#>m_p!n3v2_uzriV56lO% zQes0eh1V}irkmI$$vgx$VlzF^4#TV?<|nfrTD8q=1RIykcCZODPl8<`^At1>nO$I4 zVV(uMMrJqI4Y2EAH(~aIO~ULW_5s4hWO~5~<^Z@Pei51Hz-4GccJIO*1h-nuA%FJQ zI(U?94ueONc^TXe9t(3c;&$#Ja|}G*VNQT2ASh#PNDf-Sw}2-~!D#Sg1Y^Nd5R4<9 zNg$PYdy zg*u6k%b_mts}$;y_%)$(OQ;Y0W=_cG&-u4*3CF^)!HA~tJ1}D8@K%^rWW+%`L*Wz{ zTPU0cBN5>Y7|E9KHZszrunUGTw^KNqw6peb4h*MFc*k&2xD19u;r%eaLE%a=avWhd z8Mz48!zhr$4PN_OT`~$kb3p6;*aN*>t%07J0KFgv`uKD+W(I38>z?vpZpdqS`yVV0 zebS6a18xLjKb^q+K5y<@qb}S+36Dj=s(73agnOVo9uOh&g)M?}0>AR8%C;viI`G6z z@{?<-lJI1b8ka?}u`Zt$D>_iSEVBL=+mZ04NDAFw?i00aC6TZ)2rLgEYGp{Iij@(H zU$v2aHJJ)lv&3$zqOd$oLgG^kIi8A4)BRM`E39RbXU#&XYez-TTCb`^Jv&Gp&uWGB LRYsqvzytpSc&T|h diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/KSCpc-EUC-V.bcmap deleted file mode 100644 index f3c9113fcf0b02e1deea8246bfd27408becc8401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T?H%k~kgV$(>a6RLD6nu5x=3`|5QW_H#FzGVJGJW8BZn#IT>Akzv08H|u^uX@>pcK(+)B KOG-2EmjVE${4#z3 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Katakana.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/Katakana.bcmap deleted file mode 100644 index 524303c4f0c20e6cd19aa1d35805e98c2c05cb7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe y$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{bJea$}HdW(NS2fFFMV diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/LICENSE b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/LICENSE deleted file mode 100644 index b1ad168ad0..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/LICENSE +++ /dev/null @@ -1,36 +0,0 @@ -%%Copyright: ----------------------------------------------------------- -%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated. -%%Copyright: All rights reserved. -%%Copyright: -%%Copyright: Redistribution and use in source and binary forms, with or -%%Copyright: without modification, are permitted provided that the -%%Copyright: following conditions are met: -%%Copyright: -%%Copyright: Redistributions of source code must retain the above -%%Copyright: copyright notice, this list of conditions and the following -%%Copyright: disclaimer. -%%Copyright: -%%Copyright: Redistributions in binary form must reproduce the above -%%Copyright: copyright notice, this list of conditions and the following -%%Copyright: disclaimer in the documentation and/or other materials -%%Copyright: provided with the distribution. -%%Copyright: -%%Copyright: Neither the name of Adobe Systems Incorporated nor the names -%%Copyright: of its contributors may be used to endorse or promote -%%Copyright: products derived from this software without specific prior -%%Copyright: written permission. -%%Copyright: -%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -%%Copyright: ----------------------------------------------------------- diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/NWP-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/NWP-H.bcmap deleted file mode 100644 index afc5e4b05ee6f4be4f17eb616742b59aee4c5ac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2765 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 K#KF2yhX4S!xj~o! diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/RKSJ-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/RKSJ-H.bcmap deleted file mode 100644 index fb8d298e9bb8e090139bbc5e958f11a237672825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmW-dVM|kS6vlV1!_6jlIAtre^(Q4FZ7qdzD5oo@Ra#hW!6IgQZI@-tuH22r;(#pN zc3YNZS(fEYv$QPBvQ!BADC=#XqScEBemwl(fk!HbNFU1>Bk}7gaWoL{A8z;i1EMFU z4{IWvNv5>Xr0BhQO*h7LLrrNh->#lSLj3oW!qAeMaqC|h)->Tea;}$x{o$YmELjUc zR{7a&frS$QWo5ftfMs7cJ_O=wHmj={)2+bMHwYicfu9^8oM{H0876!>2>i@TINJz3dxh|M1o(xUaIPMBE=2h9Jn$=- zaNYqt-$(7G(`^H#%Fe=N;MX3)#RlNTFyYb#;5Saf(o zt}4K*<3p7z@0?PlvV!j!_(PZ4@LR#PPT;jP;l~v4rw+n(Kk&Lv_&EXmrIm2wAn-<< p@M{eCTQlLN0NxxV{2m4V(MY(p8+a>1xP1xs@6@aCX9<2q{{oKurl8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7UUi5rR$N%+UUr**PoYhZy+br u-e4w{y8J;XlZGnYh++xso>knU|bjRFGekSdyBe u$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC8-WN55UU{r`}Oa}lMG#?cJ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UCS2-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UCS2-H.bcmap deleted file mode 100644 index d5db27c5cf1f5b0e66e16f6314d042a4ef707222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48280 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 Jqc2`({U4}20Ez$r diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UCS2-V.bcmap deleted file mode 100644 index 1dc9b7a21bc59b6540d55b3d8933e5a6ba9f8947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 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�ksTLal!IJ% zSM%na{~u!pzTFIdNLsq{-7t&4ZOgeu)SU7_Z<;9_^=HC#(4i)S#l_{nmFLFlE#BZU zVRv^>@!L+W+=G-#WT5h3v{0~v91S6R`$DiJV$^Zehhef02K}N%=6m+#VO9PO@d*Au z?x)@xhO->w0 zOFfHq&zG9q%u9_9w;kAs9-Mt#P3T9P$k*$Elwi_w5D~Z!#(Xg8rQ=H%;nnb0gI^7z zUkA~zdqP&3nR0N$*<|=@)JGKDi@Na^7s0emStv0TeQ!r1ONLA)lLwDI_Bqw(XKF8fAUg_See40be=ET|^sV$pGHHQ-JDJ$T+P#WR7cFkI`uz4 z$LD+ksoJHkN}G+DaL;!R`9iJzLdVM8fP}({)HrwGC3kYkjlmnpCC=#*Y(seB7oEvP zv@7PSR_dz~8P1!0KFH(qfnFCDkPAySS6tOsT%5^9oCh-SX*cqzUk@_k&Re)&pk;H9)-tk4J7?Z6ogbHF=W({p}HfHUSuNiI@O;pIW+Up?)M$=*J^Ut>2h&1$0k`G(-gUsss zWJ~=5`S4SX{p8PiWsP|E~LO16wZ7Y92cuN>B5qQ3TxfbfX6@G{fdv_bXE!|bXATdTJY^`eo>&8zb=T#u!8e>c|UOkc}T zx}7~J6v)PnAX8WfyG^yw_|BmHaehUUFl9!acX2@X+yUdHDQ6<6lf{KQG1R>#$YtN4 zZY8Un&2yF2zSB(`ylfmXIs{|i!7Q0L|Dp_Hn;24=9a5!^Jl;n*)`Jv9p$~8*Osder z)b15qxI-&@7b?2tk0x}YrgF`M%B=2HI)$k>kAelkNtk~;nX4KZSLheJ!6P?BpWDsD zHpI;uMfR=Km2 z-8E*9er0JIU05{NYyX^XG{U!Xp{i(#YvC$=g(tElt|vxGxfzNQiIip%N(P}fSN_m$ zxq;m+l27SkVwpgSoqAUeaj#UllxS6zo5=~Ct1(nMq$ZebstK}8;mu)6YjyzDY08Ba zQm-2a@5Mbf#gN~1mI3Cqwn6gGsj!z}~1~?TD=MIVLBO4X@<4N^m zk~iGBavm}CAV!p0IXYlzSB1M*#<&*hNj`G68+>v--Sb082^yS_CDouF^5#xx5hshx zRfveb;$i4>13ZTv94xtyTUAA(_B(G*|~5i z@}~qla>X2C>=9@jpegRBDW5`)tRs~pdCMF{#XzYfLo~#>8hiU4?G=2mr($0((Yi{1 z#5HE`Y|njC)c!ON^K_bKjyAx&+ECc7cTsPT^8Z)TcL&6AU3=d%+n0sig@s+pF1`2O z5g?in5&|J4goJ1k0z{FJgg`?0%*^(MWoc?ivXES4J5J&+jvc2s`Rr7uzSz%B{Kbh& zVmp43?ZjzT@jILEkD0wQbMM@}cWycN+~4_~gmB+{;N`S9+jxX+qHS|a#Acmj;nWdp z!G5Qu$dixB?)|$KLo+U<6nM^N+IpM#Il1Rh6B_F-Sa{QQqhuijjmuTROJ^{Kh4bUG zxNiILM74rf82G$+L0;ksh+P~CVh7Z0vngovP{l@4Ha~n|ZI~^_nvL>HQi*L~&&HX6 zjj_DdBPKo#^*peR(Uu!IA!2#qY}Vpboju*K7KMlH6-T4mZzaa~Sdve1$j_VP#0-O60a(v&Pgu}MA?)3g{VsjuFgsJK}hcQY~Z=KfH(WLOwa(ba4W2j6N) zUfITH+v0oI4#+Vy_g16MT9jfdm$C-iff?6~)Xj3thO26}7Ms1^5qd2()S97krV(i< z$pmbTG~siZj?^S_wR4HZT+*@|{p`kYLUmv{E3>$Ds^wBly?WZ{>#P2vqeMBimBXoLb4uUS|>+A z#SK=%fu-dJ1}z2}Zj`0k3c+z!>zhe(Bt|Tph{5h~nQWsscw+~1lF^r<-!2mrH!FCP zbu9RL?CA9rzKY0N*0Y(TKJtP|N1A;5=|W#)H9r|)i;P?C(s{Fz$r1{?*%J9!ies*` z>`|Hx6K@Y2$_iFznJ<=x29lgMyA-Htm6Kp%pU-y~jIO;gi!IFA%N&i&7Rzpolx*xZ zxSI<+0c?FgbL?f_!Q28)h*w^Tl&)1I@@m$`7KRzYVeKQ#*Bj%EPIg8x!m)b@jkuTk zR``>VnNN(!HUj~3BsVO@H^Plr8RsI5XnpqPK3ee_byE2wmE2>}h-G7{cR#a+$bBJ7 zy>TtcAgIIFN-g3{nUz+&Q7#E1@3A%rSe**8<$-69*3%NX+Cfr0bIoS+ebM&VOlx=e z;t2D~*|lPJYk$&>Y3=pA7~hzLpGfA3^Z%5>QzTp0S6o#Rem{QmBwO8K^k#<;Ew+7U zj;E2k9;5emNiUS_SPSgD9MJmZ$=2l%{nFtwl;rZeD)_Elcw|_z%R54wCHdBXo~L$? zEq1UC4mOgBQ;}Uf$%O4{p+U7)&g@%_!hVS_k2xmPm1GdlR*$pA2DV_%SwG5d?O+Ra zN?QEz$7P-&<_%$vT;|g->x6&sy4K1rosnLz*Iw@AHUS<{0u33Wg1OsO>*q=L%5a1U z^aZslTb0@q5ol{=tNoG<+Ws{u=)>5LF=rohBr^McxS9}rGj^-cK!VRIE*uADu!O~s zw4)*R9hOq7j{;UX=%0z>DhzRQvME#r1sX!=F2#(~oAjo*5`UOuQ3<3Lk%s63{v&Dl zrGx+_aWl}ShF`)^kRF#L4tggkrRnUy`j1paVNwoJ%phs7T%#ntHeKuFL4DUzA9QLap+A_pM6#9L56+x)NIl9`MB13#X!&k6@WIp5IR^v=O1H86m)ahHzO_ zRv~jKJyIw==t(dO{YKl=sH4~7E8lT=%vphr&dN|{g^>~ALk-ip%E48Z$a4Jb4@zfr zp3{=W^v;7-&K?yjbxt%nC)I*n;vNfj^cFddyPYN~LOe=saeLVjS`iw>f^L-cySp*N zH!_M^1?u92HZ)tOv5JK{YuG}RgftL)aW>Skb+^k>?23-J@8axj2ZY%$>pAW2NZX-q zew#|L*yVz`-P#(xaE@=ni8jw!y~|X9!1l9jES9&5?P~jIgb>v|mBXi33Z`wY(CEef z%*9AN=h}HljLL9S7Fg?oh5pcGMY=l!lN}RN3kS07H5Qh{`q&tuyjYg4fFHNz)5Kns z!WWYQ0y`J-mG%=#Yn54uO9+T}rZZ=RQ5fv;4(s`zL>G~W5EYW&za-Zji$Vk6A{d4K zTk*H@1_a~gj@7uWR7$S7>fgkVpUT-|r0#4<71&GI!bFIzn@}Z;Z&QgHx!A?7gt6O) z^|yNz7v>3h!WOCnscZ`*`O#EoR?#*G(T4In<+gIR9K+VPtHl(RGd9psq;e$l0S`xo ztZuDHTkjSLbg25F87>TEsMCZdyh?R zTG=t^t~%^4jee{ETQ8IbOG-O%+ZIMu>fLW%D39U`qaTi#xY|hjt$c1pY;17cQUo@0 zWe=y7JiLR>LOvxc{! zBSE`--j#8M2WXBqiY( z^NIpDvkd%Xim;DnG^(@MHN8fd4Dq$G{Ky+|8c%kSU`kyYwz#V*ePQg8d3K?U1aaoo z7X&h2n{>68v!-(^bAjGGQmt|QBYqtx-D{BAsu=BGaXUUDYrR2}Ez>lJ0eBL1jzOKH zNaxDIJr~&q4+-l8iqS@MQ;_bCkqXIJB9vjT0t7{!J2MHt*;6hgI<1U#0Hqdhbql9nWoCQ$6PB?UGW+m4eFTfDtfnsU$qqEOq!+@qQt3h%SSQr>E!n<4n!I=kdo(5m^CUu&^znI(uVV+bz}q2=tS*HN zW({PbVW(Kt!k=K*^V0YpuxD0yOPP>=f+X3+l7iJkNf+zP7i-cU$qTs!;ZG3yHMP=S zujRL4qALT#7K(7_N-`=IrG3^Y@aS-Cu{vu7DlT_RIFqA;EmQ@rSrS(d$uFqQ7j|Ru zx-4n6PVLwmbz?U1`aCHYM#PW|uLk88_wM1x6K}VSIcBn5!v;^9?ACnrT8G+YD7ik( z&{Vk6q_>9Ztzprtd)bo)_GDzBrwY^UYBN8{SFdZCs*Gfu1ZG*NowQW|7GjTm1e?2+ zmv%%tD`bnc7`{B4x-v}|xT$3Q%HHtx@w}%ayO)zHFP^BwsD_oHLM)EGT%IOmD1>h9 z!xl7b)c3A81$oA?^rn%8W|_{eo(Nb94%j@T=2OFQK9o(|IG1rfJ+Li9hLewnCCPZj z;}XMK5X1I}<^7}{eiZb2wJXkI8}_@8vQO(=%IFIN;52e8C7e6V;F}^hs?0gfoIAsN zgO;-;x5hQ0f!Bxps5OU#9bm3}w$jAbD%i#1LNSYxP9!aikD}hoE^m!@ACdV&q>dJL zk~Vg=gpRfj`X$~P63qyD9qAzv<^XeV3tHJ3FPvpdql#NG(c-spaULQ+ZKZz+< z19EM7$&mq`W)ioT&dQdKBzVeo^2lrBHP_}@urWmGX-@MrhI$IpJgLFls1Ojm(FvEf zrLBzf9fD5KF9nosN^@$BOUb&WV7!^OzTLtbxl3WpGpEez6HNN{q{ZYwZ%YO?hdWv| zuB<~(?v`rIs8lVgjSJL)whFxjh36)N&^5Op<4qVNMDyn+LiwZ4a+R%QlHX=InX@Zg zu<){#IGkH$YWHF6z!uy^qvZ}k#V6sYumx}L#6c~7NXP5nyD8(>_wfrf* z3j-KA+leL>F3(7!?m-pKor|wa4B>{wp&~5TV1+dlE5lg=E2BsQG}y+lLu`aJ&BRl& zpW#6!){qfL^#MU9%n2n;_ETZ@gl2nUn%I%f$H(E3WIhD7d_^_xV0<#|DVlg=Vn+sx zw(e7kiF!V;fC#IsSz>@S8}sc^C+y~U5-(#pyHbipSfa;L1>5<2-#%oL<}&^DDMoUaq++N`_88EYFJ z>{;AnFTvGn+wK9<$+DOp7{DnCYyvO0j_HJ0kPCSVolr`@&Cl-yOyU4j_*zo;$yFjP zk#Gj}fQQM5sY@_Li+R;5VOFi8TAcu%HkJ71Km{My1$@J@nG;O}S?p$%F6h-q|x7x6H6f}DKdNvwS!wH~J55hk~F5Akc2dCGXPMMaoU#srZ8@|cbCFq|D~PNtW0-_yAXtdz)Jw!VvvNuTD>F=Xp^tG_ z$~o@Z*<3g*10>x&>gX`h5k-fF%BfTUrg2KXFNou5>`oBc#6jRgH5{+|+B`W=&I8-z zUT|eGVzM)WHJ$@&5+O5Z1HgJd9c*(|M7E7(u#``mELUo<6s#E$V3UT!(rz6%ifh28 zkb&4M<*d1c57UQ%qkJ1&n92vomSVWFi+nf~k_miZ39LqDgFRfvxej1CIQ9uaaHTg2 zu5_osbrYV1rI|puGDxt@i;>s}7h^2MyB7uaq9AaSZM+YJX%OdSVBZ4Zm`?|L%>jZk z#KXnx0&vR6adMmj78M#;J&*@Z6@Q4cs)E2)O5fF87z3-5q==|&BS+3UaF^@@cR4xR zi7>;(TA>)OcVG(G+cdCdB%N494%lkXgZmJ9tr>3zUmMoI#i3-_NFiboU#AH!o*06) z`e?B4C(Y|d&M?>ysNoXX5cmcSU~7&et}ioqg6yZjL%US4He3eF652e8GlP9n2lkO< zaJJI$o_rn_&)O=%IfMbQ9ufqXns_~swK6G@!}#5B=|BQpl~5k*$(ghZ1LUw;F0u8H zrOk;9SWhP<(q094Qy6%YG_YJ61M4}M2$#lHoHxA=mbYr*s%{Gz7vU&)D^UekV=);# zz0=^`8V25aY=Nr<&L+58KMa?nkTiIbBJlQL0bK3GY*;bzt#CnVm%-K3{2Z*5Rl((U zehVxq$Kje%%!HMe1h^LM+74H=4)VVfZ-AB2V7RcCzG8eJTAzf?LfUZR!*3iklOjkf5|~9yTWt6500PpU4Pj;hsqc_P1~jVCrZycGDPSZ0 zZl{B|w<4^LzLr*o?+q z@O*bPd^w^Op4pNL&ju2<{E0LC4tRc2EQHMh1AMu6FFaerw{Xuk<9Y6xDVrIdJ=P3g z)lnOG_G~tMBZ)r+kCa!!?as5XIiZ5b`nJF~YWQaOdI-Qbng-$jG!Q9w$q;;Fhd2wj z`}t6~sc46Qdahe`Ib{coX*GIM73(0sE9+@tJ+v6?p^@(BliUtqD zS6gcd%Eimzg=Pc1&=LlZvRwEYZOuKW-wt2xpi}qmFyd6ap_$6~Uv*NVt72 z4W5fmf#>4*v+!_TH@tAR7ar9G!xJn8zNsjNCnRO?TnW~}&DPWKWPAxcS1#k8t1O3y zyC@Tj37*QNM)hzHhQbq?5O^|!3jFXy5ImY51Iv7c(Mc)@U;dZ5uVzD=ipY5Fb0oyZigqg2>>@rv~Vj!3AfTxh`Wm9zT2S+c(N-1 zz7k1G@+T_9Y@ukuM+UDOi0N-kM z>EK)4e{6wo&gQ^3=a%~6ThUYSt+WB6^6Pm9zTGB9!?%09CiqS`tsK8o*#Y0F5qH3M z_Bze*BG`7qi}Cy*yqGB#!Hd=OAzo~u@XARXfLG3=0e;G%1%5eTrSvCb;FqTb3e5Or zgu~CkuTBjRh+?XT`>zo`1^(-#sONsI5)x54@qLk>d>`zaQR6w(jHJsGxuNs)V}stGaY}V?vN|uNH*B8?#g$ zuQpoXH%cKAeiJ5yz^kJMAdhDI;MG}C53dpY_&4Rv@LB)|uPIgVn<_pRUej4m!f%e* zy5Y4}nrL6!r9o~vDzy~Jh9(XHP0q^ct!iO?@BfM2s1n>5n;C;CQ zKCsAu_{C1ZTU$f8x3i<+kNX(>@gNZPI)FTk>EX|fLJGWlQU&h^(%}4dxhoFdZjivc z^YpUad?~y&77XwCt#;mSlfZjasQ1Gi^!LW7eg9r7g|~-=cKCg8AbfZb$ndO37PPY+63=qP}1LTQ^Gr8X85pw8vb9GAcsF0Oz>e82Okdc$KaiO5NHv>e{qDuefGg?{+`IVJol`WU>|B1FOOLa3{~zmviH+oIsZq%in%DZdN;V5ay3 zG%vn01n}MjHLwp_jNCipW_WL^jr&8f7T!Cpg+C{^zyXoQZ#{!DgTMr*r;v{@9 z)dKI4w@;1D4%b+Z2%VbT9{oQ3}-_=ThJm&}dr+(%`l?H|>s;G<%0 z&;Jo|e znyl{(g7nT23Xg)~&LnVmW$WZiG@oidhKZulQR!{T4_Kf7?yrVNn0= z1XKKN4gx-tLH=iYuzXezVV?~`>}O{I{%)ot226jC<8uC90rJ0(v!uVD;gSY;9gT4O0AYbxX-xwq1wb(GVh^^AL>=-9WxiAk}g zZ$uh!IW7^~EiMK7 z??w7U7Jn#N9f(U=v}{@;(GHiY=u0it5};_Q-k+>dNy)Ym3*gdDf(8!kr#@LQhdw1aobhSmC}faG(P#2MrC}F+ z#A1lPczUxhnLd;+RT_-G9QwPytyDl?BN5H{{G*w#RYsS)NqgbjM-ALZU5y+nspwuW zwF2K!D!FfzO71%mM3*!EWOG!GWuUanWZZ_!GWsveD*t5wrCko9w=C<3@R8sT6bh%N zy&Q=%a$L@#idinEUb9^0*d9u)mF3`aA2rmKs19n01yTvRimBPSDrf|BZBbKbic_QO zG`-PH1X}1O8U}O+$vAYAXK-|zX}oolQyO&VPEnLvod(_Y{&?;F6bCdEub=XCAC^*- zVJfzJoN{xYfC4`YV-&eyq3OX%L^!w-PnoZzk(u{OAywImf9PJR_J``Iuq!Q8h?OD# z;{wprK&AGy1IYt4 x?csufALFRc5)hf(hAPmNNa8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T7n+yp>=scVbr0e0##=xK; zT*1I3Al5NZfDtDxR{K@zi-U3!yHm(_c-s?}oq zcOn<8_wK#t%$f4eJ9FT_E685Ae#gcY%a(6W z>^E#!dY}I3>BADUmaJP;oH%XArp?7`HYJWc7AZ%W)) zys3EO*1*AO#l?wfeJ763&Ye6h7Z~hi>{q3aMsxPN($WV%j~3YfmX?;@``6E-6B#71 zEc1uQnP?XocB6k1<^ZMuY9!3Y1voMRs;Ah;aRE59FVorQ<4XH7m3?`Z{NcGj4G`=_ zwX^MWtW0oiw{EuvWo8Zds1)m#fFx@{f>4zXBz-7-($l9j)(s?)j*DqP@0cF5XF#GU z29o41kQBsm!EjgzJ*BjWRNKNVNMt6utS6HhXEX-}woN7&!AHu1q*4cKbvQ{Q8!ZE0 zm)7q9Zs@`FAb>%OYA#4>p5)3wJwvmArbz1y+ZtYAB*tXzVF+mT5w9+ zEYer+Kf=1TFcLFIz(`wF&-%E6xYvy}Rtvr~b~AMgHFb;pmfQ76@3_<-gDR@2eONq87J-U^0N94yN%+mIBw>5!dyb+TcOsH|~#;&+X)M)q=x@e3g{`G@W`!oSy6O_Pi6^aZ_t0a6B@s zEGybJ9~ZcbgB*h7oD0=OLPLaX-;OyATiB@#IF?NyAmgF&IAO4SD3sOA;Eg%Pnk`bD4)n~vPOcTfI$f-eg(C~(x)RK-n#o;J@g9b| ztKuTh#ER!P;U;&Ebod=!Jp$)78bXegsMXA4v@LV5!9~ZHsgH~i_h(!Asr=xhG1|sN zTt6D;o?M`*U8*`5EuY!Js@F@H$HQ=&wM4zIhkQ20xSZ#p#c39uy-ltu;3_elS`2ld zso9A0Y7Js}sOTER>UOCPrhv1zRq*8EM(bvFs9Q9y#e%Xhs~MAGY+0Cn#u#?Qz%{BP ziP5f+tf?<%SBdOkYH)bW5j`B$Vc}7eP_<5|n~HmCC)>8$hX@tJ#fm7YvbWJ?!etl6 zYh0$dQzp!B9K;%X^V9td@6P4*+hl9Flw`2Q;8aI(m?zy>8LvIr2gjc2E>^Ds_YSF| zo9g&*-GNDPQsy-(v)f>^G^X$}*=(B^Uo`?Z)mWG(f!FsFY&zK*BU|^N#TF^L$BOPk zp(;+QO^5x9_`VTBMHlW_DcPc!&B!XYs2oew_E2tHhMD#>;owSkY_`>$1p6{H`^MVl zp3D#DVb)>#kv1IfHdup?EY_A4@fxF**YNQAX*jNWRM5epa#d=ybs~;yNC(F@%@H9v znEc8*=3Z{Xk+!^Al?nHR;0{goW}GGB+R84em1C^hy3N9o8N7N7ZnGuJ_T^B&7T2Di zW;b57;QVZ4|>2*8VfgRd$vbCFJjTJzyA1qoWO;rqQjK=Jy(T4JOV1F!khRPR~ z8E`!o*`WKS!B|qi3yTjWNJUm@QoJi1b1TxUMn^Wd`*(E@!FiRl#eLmzi*0!y+X7rs z-ZRL#3Fp_$k59pwIaae<6;cz0D;$PMBhGPI^p)#_9FwK$AQ^Yz1oy6ZGzM9h%C-n* zkH+cyCYsNs>YbrD(-RV5AB?+Wa9z5gBHy;%wmI&=Mq%G3EUee{iN$RvR^zsPJ$S_+ zbyXs-+>TS4da$y5?o8#5FetZl6QDc+v+9gi!8MX=+kq)ZN+ z_lFpq>z7H`{PZ^~4a*su+$Fz~JZ;?noDbmCv_wTcq3&gC%tvalApU?AN1e zIBuyL5?VPDb5J(cNL>O^N7RaOmHDKpaaiK%6IR||C?7yaRoqY>Z(C*^YE7kaT+-=btIdWWBvk+`@c!ec;o>)Ey=a#Ql z=YT__b%3U#2Y9CA8bL4P(!?MfjD=XtJ>yMa*LZg7ttDX*haC-S(9Ym_JM2)*e=Inwc&O{Tpt#xn5 zz3wfzs*J14nCyB-R~2CuoSC?q+e6*mb#+6?5b|XqNFV0T)_4XAIhcz(gq(QCLR?;H z2(8P*B}vvaOaq*QQ*nB*OR_E7SfG1z*L7us-z%x$;ZVUg2(!1d-W)h-;?MwMlgpN{3M1?vA;^#pg2v7@&b8Y5 zM9i)h`IWJ-lOb?VB9teyG@c)TBOnR3-psi^FvJH}gD`ijs1G$H9WvsiLxNZtIm!zogD#pml_W<1NOzS$M%4$o8;=sB8^x3u?L9-nm6ws_4IM9tP8^4 zGp&c`TMrE3g2nLW{c~mE+M2=g{=Otdf|ZPeR;|)vchHLf@zMZ`_RagZf4vwdT%8oa zm!{rK1EL_v1ko&X(>rJ#$?oXb$8+J*Dt>h&PHvhPb2=X?w(#Ra=&ARwxrFA`&0FN= zJyFf;nm42C9UA)m`!3Ez7Kd4}syLEQB#U68q!FYr>k^0&RFeL{J4BlqL*ttpp^P`;X8SgE?n=g#0R$*Y!03T;8j;3ba@cZkMH59b>GHdH5~h zw^B1GyL8QZBYo+it*jdtApz3FLC_O=(Ky;jgI>@_M;ojW}pmi3}HHxQ-mlV}qR2mzzT{N_>34Hbz;0+~fY6pLnR#zP!k!6*e% z79HkjAxzL&$ytBQ9|DONvRo?6v zQ<#Ond0c;UE~sgUkN4eN?p>wwF7eLt7HPbzB13{S7CL;TW+L=q@k}jtV&Y6TqR2gQ*ulexuf*x-B?gYfl>s@1W?jJnN?uuC_P;>R8Uqb zQzN=_rMEH&KQ8%kL|m*z(^2}~-EQ#RboefpQOa~{GguwtG5b|K$;T%Y=sM8xV2sum z)4Zp7NAsSb=55U-&0Ey;9ISmXmGxoGD**lD0BytI&rqQ0z=I9Ed5=%iT%w7Nk-{y! z15YRyX2S%+^ zWGb>y&Q-F#fPq?4iQwF+a!}UDeWNim4OTJ%us@B#YNQuV_qEOpybO3T;| zyzw9d5^=J7CIksaAq*&Y5@Z%eLlA%xT`-7T>siXQAaWWk;RGFzAe4}0qJ&pN<5Pn^ zpoc2YbT9|-zqjMRM%*jBH`@}` z;W%xd$1oafnc&>a%BKOwi?)%1H6QF<1CkOdjF{WBO6zz>sF+V9s_Y8Kiou$wu8C*P zp6aGGV4EmdO?u~6i@w8IdOAq1FHl)G3N=8&o9P_CllFw)6B;T*}To%03h|pH z++U0}U9qN*GE5SboWOh67Iba)WO*zcoxH+g|lWAYhKO;-nlyIt>7-N2E}EWZ2NW2fSvmZlbZea%k`ZxO$Vp37Sfg)1B>O zxH}OPTIZgy6Ivp1f-(!9jS)Ux0MA#$lWBB)>tuTFKZXHCJxpVVL*Z5m%ZF!X_G~kd znCKBp=n-&sUbh@~9UdUmkF=;d%BkyVl3zZT4&}vqrqjXHRk5Sd+u!G4srmnYCX%4Y%g0u0`$v#kN)YnZ>IWn-| ze2VIP54C-T>d<`cp*~V=2F}<&9*zwc8um)IHS+%cGU)542qNKL*|AqBn+&eeM*Dhv zr+h}z^;ljrLp(55vi1k-P*r_z98)9eY9u3Sm}8Jwo5N4-lAMJys849&ga)Up^_;l} zkkMD2`XH+%2%iH|PJvr%E&B&qOa3sTbpU>}+7jAPb>l>^aDTynMU7(*YsI4*APJD1 zC*!gwBj6teN0H#{&adZ@nu9eHVnIiKzv|}i_TcKqb!6~W*RVVZ^Bej?#Xw5eO0+{(g#epPr^r zbGK|J`EdX(>w#I_2|uVf!Cxi|A*2^IcdliUth2cg#DY~CF^CkRw*22y;p$|#)~&$U zQG5JGn&92y-OeLKy>}OO?sP7|+R-u|Sx)1ty?Ud!Bi-M}-`_t)(JO{X0u6FU?S0R3 zP=g6A34vfikEwnC1|_u=7_!JYh!h%WiggaGoJ~)tEB9>CcsF`i;M)RxyNnRX8f)p+ z!wLANSi(1X*f@m7RCmy`k>NK>*$I6?SV!IQTVhl!Udn7RVAE9Z_~>qlW_1^DzSf)N zo#~x{ALQT%bMT)@G{U;ux0uR14gZ;fmzH^ZdB+d}D)NrCs5|OQE2mQUBV5IGK=?@% zEMiB!?PiHikkzVSi_}qH{#`O$D}k%I{K|AqhmaWGxrZw;MF;(-%=G{I{(7RAAyxir|H4?Wl?$$;%cF%ug$ zK=Up_HI250?kbszA0Y@P zSARkf-7%{VX|a~Vs72S&SovT+M6($3Rq7xOH=5mprBEhfRuBogu^#L4G$&^0$^=%q zShA);xf-nLQq6iA|2`*T8a|uaqJFj^)z}j5S?XC3g>H`Sh)6?=t|gJizptr@L3apZ z5wu#Nq%!;7{a{v{mPf_5^lj1qXF5Kc6|Z@=^4SiO`M&E-W(s5)l{WCjTOUl)c-CU3 zhQ&f32%yY;*Z#Uiu$#oId2nP1vl%eQ8eS09vEOxQ_KPJiro9*}NJ%f&y?7_$#n=}! zUo3u6sOMNVxy+2E!|2mcIyxB}$Kl&<7GuZ$cMmNP2(QD9b#P<3Y?56Zbdmuyq~?;E z>A^sv*?;0UTG^mB$({nxFatMXmVuC&s0t&y*ni<)CG6k~;^;spoDwBR7LGqUo|dMm z`t!8bF8FBfn{0LKu-25;1asi%p<}_VL)E`qiua@Nac0f@M#G5=x=qvRe{E-9B`|*% zXqTA^UYY=Jbs_CK)BD^DH?X2X3EEq9+j$w&w&;vP`Z3 zRH8jL$U2jQWSuQJAP`MOkqSA(DN=C>69ci7trhbn?8$v*dXIbPO!GKso1mBx}wN+$j^9 zNB>ePY0i_MP9T_0(^m=zi!0MeqYk?sY$lKC&Qp2TS~5Eh+<9TjGmGTJxlH-7xz~Dzg$4CHdI(gwWB%6wp;l+Byx*L!&vpnZ4HsEtSJVJyGI|zTjR; zbGSbr>UV|gU#fi&$()PPax?^zcpuV$BkpU{l?BRtNtwk(!Jy2i(0Jrs&u&f+q>_f9 zr}7f!Iwpc+p2{&-rPb>w;}EnWPIE?6PAYI`GGSaxYR8ciH?kz)VKj!ooCpe1^-2;& zrbbJU&e5G~MTufe2nm+pC1pJU(!dlH1+M9d-D!W^U9uaSe8V=`FQDrU0r=~*qVrCyL^MVPp^Bq z*SXcFj+H|wI2^BesAvD!$$m-|@H)Y#vsvWLjvxA%^FN;cv#jX#&?g{7nM$Y{1OF z4HV9;C&Pc&^@HV`EYI>6Q$^j2d|5}&f4BC~G6;qjnebu?yeJA>wExfw;lu zC}|y3XrM%v&}Gk#cTfH%k$jwqhskPY;-2A@%W5biOyFwF62L?WrIyw=ff=c^r-d$b zrB;X&-FcK2swsaIC2}BSKq|F+CFvIF7g{JGA-BRUK^^a&|EZW)M@SyRRC96uK`z)L zd0iBgPuHL8$6Yg}Q_I8;2g7-lc(@x*sTfZ4JXv+t(i!@w;-dA_b z$W9LkuFa=}eSL+RROKDg;P2 zk*h>1Z*l^Jfs^;I7SdEj@@SdF2&gG12&8OuCE>3#?w``N*1nQ$8kyLcBV`*ze6txF zQ}r5Unk*_qjmkVSuQQka$q1dExl*n(;+JZy3JUVBQ6NE&`!gCw;4_1FJMmvyS&6XL zk0Ydgw)Dm{2%>MCwcVJ4Rm<_qc_E5P!lP;U?I6j!*}KELk-(>9(wHf9pKYq#!t~56 z6X^gViR|pY8~LJRAO#c+i-%-RW!H|g2M{+DM0T7#SGnE0)VmnJ7>+FoPbPOmPny$! z_AYu^Rt1SzmEkGE1F7B#-ibn}cMGNM=df}Q(@D3j|GSVB^^YPuWMSwS zPirod5?!cz*vmcCQ}mA#e3j6W(=QlH)mX{`XAXR?#XFP4mJG3%3aN6_=Py%fEiRnG zhHL_>VHELN5?ISX_Mg=d_(pKYg)1MFM0qw!FJ?A?(Q`-n~SyBFovDh&8J_H=-BJ@z@2aWWy`O#+&#bC z-5!Xqcemnx6=iCd>m6i0YQRF-5lTVI-k+SLAUY;9XCh&uOJyhe2HX~KlVhW7A1V=V zCfElFW#e$HgUmeG6|Qq^<{(#Ou(CatejOJd`g+6Dci`!=UpO=}DlOSHVkkol0ixkP z>drpuMOOGv6a3RaxE6@-4dN#Fdw=-*5c*8zga5|ZvW5JE47j_P&;k*BT&HpAG3U&D z?$`?NZh(*S;PC_+ZxiskEr4@j-`wy^LzyjBJi41!{qnVjsjl=-BR`G9OC~(B4L|Ps z$64N0GYU-TzACjUxPTt+jSTfT5J|+x3==jw>gs#9!zSa(@BF#bpp&G;~nL zG7TA102-)>P!uHRcFgpRp)|P zy(EOz3}~H17q{j>Yc4m?JI8W(oDPrsk(dSeW-WZRODvBkx`uhXFo%d^DuF#;2}(96 z-jyCix_adTT6a--uaDU^lQ|1woRf4LFn2R4*_AukFcudZ$TY82d>H(3a{2UMP4mkw ztR)>!Q`zj)-sZlR;T_iwmM4mT@6XY`hM^4pp4_S@wnoVn{uT=@xvV`{c)S8WmMCeN z4=rino6U%<7ci%#JITPijXUzeTL9i!+?hf?CLru=P%;=%Rj=}8UlwbeND~#@DbTV& z@Z>SO5uVLv#EAHZl3pr9cyk&hS7WW=L=*oa(O-D;fmG#{N#T|8pp2tcyMFl(0{NnA zhp~JmyGprN20tpJxrBdS{t#e4!drNWRsVyOm)4{&2AiU$oVWhs2#|x1f4QvLT zcZe>9CQQY=g|1nw+VI(BzFrmQVnAAp%mB*h~DNhhNrjGO2=1Ww6E-*_Lby>N^t5)RBZ zy7a{UBOg?itf1i;KLL$P%~yGK`M1)C9vKk22UDzCI!+WssyMAJbOk` zT4<&oFj92xnM2i7QAg>Oy5r^}tVqSN4U9E_!MzZw7YeRbp{HVnW2?xZZr%BO1y(P| z>Ukkpm4{WMLyR(^!Q1v@*&OuL)FBXfzg_zIl7O+0s0k&|{na9IdX!5s9qE5C@$4dz z^#QP=3w+n{uYpqed|uWs>~JQ9?%QWy^i~_xpPN4K60A`hG)7Ba$L+gkC(_plu~1Kg zQNY0>b|sX*Qfx_P)JNq2XdVdGXn5Ke8WZ`ku@J~k=)sQOyk;PKJ6u59HeSn_cdPJz z4>&UeTDD@&V5STap5-%TJX6N;&s5yI2NZ&tMDc<`>6I1~9nlDmk>pps+ld?U?&Z(d z20YI&@|7+%_(n2c7R^E>y29bp?wIvy4`^A=T2?^I5@=Z?wkOfamr?LCP{9xcPhr5} z6VF9R=Jw4OgGl^kl>IsP1dIpsRc=}wN~rWt`yBwRe@i$nkCtDxu=M}*t(czcK>=uK53v- zKbKaFICApm_wS)Kn}R6Ed@-VaVrYFXoU%~3e^_=Rt3CA9=+{YKF2-ZMu|D^QuJ{|O z>6chmc06pjLHH~aKFEUBwea~Y;ZUgX>3DEYCqwY?Kw|!+7ue&$oD@s=oAMqam;=@#yqXBUA>^GU z=1T`(D)}m3fAICCGp&ngZY{HUOA&lN2VO?Q%NTeW&g(bx_7L!I2mfy7Si!!ftKiGU z&>0IA^NAg~P34~Xf^Q=KJcd;1X)FYKD(Obn9`vhu5ZJB(K2KS$e#xi=&TsJ09DP2S+KoPX>AyJJK9| zHEQqrh*(8uQFWHyDj!Q7K{;HIHQX6bxrxRS)>(Sv#$NJvD(*-l3^#^)Pl~`fhkRgI zpaqx04{?D)G;>Y_=RD>t1ZOePfMRFqb+j(jR4>BG^`lj1%rs;?QI+Bhb?ThjCo7#3 zpU-e6I*IIbhCf;Qq}bWRV(7%jjU01aX3$dUo4cq>Sf*A}K_^lLDwq=!Vlj8(jazeZ z5=A~vG0P25wu^WVw=9%xVr3hdTg7P&gg`~dAX2ry6K{P#lkJ-;@7s+F4(CXYX}nZvJ$nuSaW!yRR=<)cF#lExglK`fxS4dlwiwZMKIi-O;Uc z^s+D79qW$pWw#c&!`$KSzJbeXn{ox`iUMP&Z9i5F!aq;&CHZ1}iN1cm6s+itUruqZ zRJF|i-;$qFEmEiLOrr+yv&|GfJkj9Dp^@0GHBFXVCV#%bxvizBWyY6#JgJ{Aa|vS0 zqJK>M$0RL1!d}`m6P#=55q8^$IqIm-C*a+ocz2R>OG{qt+wFL7p-baj{&|Tdw9{VK zG>eCc&W*HQE{Qw$2+qBND^yQ)NSR8S)PU;T%bh#H6~tX8aQ)(HtGVcz&-5f<`+S|C9^vNNDc| z^{dz)I6OCie`nyUS5Az@d+YJu3jan~rEOi|m`M?Vjz2gtfiPLNM&+0&I7SnGcZ}qY z0g|Mll5nTvo-ZHV0_Li?n>ZI{0Cx$v7m6yP9o+ zL_^geUKK&keqT{RXs7e+i7DSKecj{L^!6~`u5K5;+@lj-jeYfwdtzDtKh8m~_D^%Z zTJqH@x`p#W>q7R&IqNXLG`=lS$_0Mz_E{D;&f^!E=+I8YTxp;Ba>lC3gxieOF(Wos#r|VjKSMo8P z;|p}1u3Hz0z_h0Px#Z8g|FH4*qyL)u*DUO6N$M;sy}Vu3JOx^MgKvspjio8tVgvqe zexTwk@V0pA12eRn2;z}rUo2Lc2Kt5bVRjwiRsK*#FZAFE(?#ny>G9;lPq^DQBr?wYHqYBZ4@n<;oxwT|AY$ZP2|)`=9M zjpSNXJODSf7S`!L_j4G@z*Fk(t}MbsMR;g~G7JA$h<_ZU4Am-&IbGwaxE@4<^3(( z;4NZC0#1xTly?I;bMGSX?kWiGEJtjdYOP;~?aQ%!9sYR{{&|qu5T%IT4Pi;9maTrX zcdmC6>2`S|+Nh%OXEG;(8FAp~%JJ)&Qd4F@SZDdgTbsQb%v`Ogm7wSO%4ny~yTs_- z>)oj`awSUEI*p_$6<9S0LPaw;!@=226)DDfVGvIXRndg5tg!m=p_Qb0;x*;qT?>`J37OJEU_4$LI0%7%Lb zSOWAWC&qyig_Wu#T09jb(Eut>{b#JorKe@6y!CL;r@dSuREMk0#Mg^ezS!iz4IlqJ z0WfXQOgr8>- zDM0pJUD`Ac{}76en&fDYy4~Pci~f+7)ro>%N8Wdt5$|%mtMNlYL}zv5hqGIj`DL@I zWtY^lRQMjgR~cH0@teW;&8QFb)D?Lo7VCz1mbEO4{Bk=jPW8>Em7*FaIycK2YRCx! zlS*I)-7lLZEb*PyS3fKup}BX0Cx*BVEvT@-(-pdstBzucY&7Y+o>I3+3Vyvvo&)(H zl6na7&t~o!$vr*jy@q5_eHU%Pyly@mokTS6xTE7pqib$p`D}E}Y7T2od)ez{Gh#m%R2YE4R8s$;8Ti<(^KcM%lZ>s-g?fRo&DVCLkOjN}nw1nK~aqoYC~ve!O- zN=26-URENw=Yo3%8DD_)pd1E*g%CK}gB?wW5N_mdGih2~B|4J@YX&{A?&68%6r=Ft z&G>7fJ+{4DJpQJuC8)FR(dk^0a#jfFDOeb2hW2!@kD{ufy{BMLr9n_{j(r$eT;0PL z(=eAyDq>|{6c)bvB5ZSbHcU?mNQItu2cata=0DHMDvCUd;Q#Gi%=Eu<;X-jiJ#2d}rmkCOpE z))BA9T!9{?%IWah1Z^?!?NWv(2qP6S%16i-Q~E%oBigui3HTW}S4;mE;dNj5&mx*% zF>4F{Wg@Z6y9cwL%%Ykir^X~DPbOgDqxveeE+Nr+y7E97lK*G~X9;smrh!n(jgMx* z^TF_ehS$y_Vv<>ti1}&Gppz7U0x9G~dP_)B{B$;Wmyk(Pw}p2xL5+rM|5_v-48>WM zab~UV@FsS6EzT04ZX9da1+}JLRddvpv$3FZE^m^IP1=~c!L)+=%CUYvd7vh1`7ZBV zjo!OV@13aej`vRY7E?pULhfB8n7s=GBVF6ngtmT!Jev;R)@Xm0@u^wm-KoZ-!T4>E zS&P6tfDA%0BaWomM{RHi8fJjPR^j|-t9nT zc%pMHmt>Lb|9~BB1BIF)yk)&WF{A?=e{uYZ`R_SF?eN={Oxvp zZ1BlG3EK*>Z5{!#0~bEr3va^VO)~QbQfd|W)ubX=x*71fL^0sN?WUdT_7qPaztFN% z!UhZeegp-OgZ9G%M2(;ooSQ`FN)l{<$s)ENxRdDr&V!{NmPnp>ftZ~@|0XqfQ@e=d z$qTH8${nanNSy~AXkDZ}G(fm2t4?*%RBosA;^1Yh8;AeXw>@0fu4&h{Z^nmGyX+tA z@Aqnf>h)m3Qq+0Kemajp2C1*!KA0+Gw$-$oiW5*t;W(HWMxi-dpl-jGmGDU}P*&-h z&aDeD+m*=OTJiEAuoEBB9lQ&u7p{Da;3{BF0#ow4^_i^W*e8JSvh7P&9t zE&khGCI&t?_XjoR5_u8m!5v8w3s5(cfjpc<4!(K@hBQBrz}L z?+eLYBvJK`l+imCygA^V!@bJ`uq7L)4CXDSuDLAla`JU%`l0-90bwUq=VAPa1@@H* z!AB>k8VG$wf-~Kc*m>~bi^cTpCtES|$u{zQCU~9%2LyP~iduw$)f(=W zrSlUpzhaNZmCM|M>O>K*93x(vDn1#{uB|m4wBRIH|5(o|s2xY$4#$bbRU_?kqKJI7 zyh8G>7tDAw+-jZYEsCJ_p+$;B%5!vog@GC%2^o6lP*;o0yh{PAHVP+ut7_+wr#*V* z_CRGsB>pj;nsLGuv!YdE6eIO@hxVX8`Oc${|FRP^zZ*dlO#!Mb5``l}5*tJoajg9I z$dCl15)oqz@5=)R_Wf9RU?m2Os{KrmIEd_;G!~koi^aL}ZykqC9 zW-FEL8!Lga@@?QMp1Tu-^2k%Y5s)<-N%7|z4@a%?x%5MBR zp9FIJ^t~k%mLX6d4FzQ|y$hz)R!34ie)HZO13J>H=i-}Hva&i=>8ru7y3%;xEv?&puAsdKcr+7_YP4oO z>DGyQBDN!WkYo&S0klS|G;jBXm{h*-S1VpmZd2i769xAZ_kIc$8Yff0J847PTx{EmA1D5?N6!d< z0)EjQzZl>b{gOY4I0>Sf#6 zK=2O(e|KV(ClTZ_kefSs<$&HF?Md|HwrukAH2-M7tV;AJg!S}mg@W+TQ>AEIAlQe} zrYn2DmTmr=ejMvL)~ynO$a27ma`v=!OQ^SOJ#|WDh;GyJOV7F&ZnCGnFQB%!u2fJuQDCktntiM z(Z;QuCXw4_6!hvmUHfDtf4Rks4}Gx&-g1zAWtWa@fmpFBdpRxA*o8@W@{z9Vz;8(#s7mm(%}6FQ>d5K9tt#OzF=V z3_scnU(9Dnv=08RuYeDV_%A#!;d3&cGxbkrz0Pv3Z%Z8bHvDaFbld2lg6PgON1qn` z%zqxy|AXFmcwt+7d|Pf?aNB^kfzfSQZG;=c+WLnX-fVo6)i$CnFSm_)9y`z6Kei2X z4J?{$~d1dv-QU| zg*s(1R8o-!pKW+LRSZ^_6%kI-5K30jw(VqscM(L+cMn|M_^*+0+@h^Bs1E394rgya zONdMOditc-i+THq_Cy`|mvg1QJ?#b~-pKdIwGaAorzJ+)J`6t?SQpZ~iB|Mn^|N@^ zK7_)`x%v~k+q=eOj2+ybi&w@pr+za0lM(IRRPFK9<)!UBck;v*vttZBo0^TNmuieY zP$A;9!@2X^>1S~i5PA?E(wLb>jwY1dgHS}Kn@G@cVk{p)qBwUR8+)=_Q=u^*jz&qi z4W~TV&W->=y>$<+4`a19R3<28; z{-OI*-k;WSo@97Em4to%(b?718Yl!@<@w7m*0X3iMqSnwvl18~ecBvE{Vkp6uVcj` zihfsC;MglGRSk2<-Y!(Mse6UKKNOG8=}gf^b@uH{kLU~{W4UkuD~i7!9n;wb@0xt; zRGlH6p`G2t&fZb6=ZBxqC4YM1()oF^AX1G6#}I{054do-J%f%=-y8qs<3+4kCLK?O z3NybnRDCs&tzUGs50vFk*B?o!%X@#0%0%C~Sp8Li^w6=lsem5^0RF|MfAqW-^|p_5 z)ZbRW9rSjjLFX7x&gar`$9%A>S=nl1eWc2{Jb<0a1TUVxD9hFq18o$Oa2)-Ql~zlr zHF~tvE-p9&o52L~R_?Cg?#A2{+E$Qw?uSaJo^>Vb83R$_HCklBSj}2 ze-_QWsbE{fZA+=agEWt`V@cBCT){d}z=;A<^2TrG!+VAY0q&)3s%C zGLOvXqbz$mFV~zDp*@4U#}P2#{PjHc$0Fz)#J-J%KMaAti0}<{{!bwOQT|0r8!rI9}hgRU$KBSD--a9Vb9AzyF z##wB;R)Ir^O{qptUcsw4D z_fWEx3}t{~QL?PgSgSLJ(&FpyyQfnhpoo?(0nUXwbYrCu2<0)fL(Rm(SSa*mY8v15 zyVuisBIek01p8vjlI;`0K95J!?mv4vvv(7z3mfct^!)4h&~B8@PsIhc9A4j_@WqV_ zSh3EEns{%2?^tY;u_8(d!q@rudJ@$WOr1Awzc-CU?43rrU7)Bw7UFm$Dc^kXt^(S- zLPuxQ;?lcF@=Wi!tJd4s;O|%BAEFc)_vPch38_63D9xGZothLu&wKB{dj*cI{$8>- zM~#(>@VEVf;=(8Zymz{y8#%rA&b~L(yGjYieHplKmk=H0?NuIH-p!lu-9fJHy<1g# zg->Qm)P_?K(s{G=_6!j(rQ@YO5&tw@r{Ad}r>#Be7vl3}N>5`KGkxXe{;D0cOW8m^ z<7U(C*@XBw7YTIsWPwEL=Dzns3!*x2p86phpT^-ocj7;biJwz->8_;rQ#3DvE2ez1 zP^SzvE0S3ms`QhTB&DAcPoDJ_R&9=O4g|F}(5n{=akL>cY;urPg{*b?Q`JpD008IZq|i0i&@GHAzT@p85L=W zqmkV%eLomaTk!N$lSCU43Y1NPQLC&CynWIOKii77gaJBbR(KD5lZFig)Z{~NU)X09 zdVs`3cpxC&zW8Vi$a28B37xl3VZ~OsvP*YmC+Ym{JC7#$60l`ET8D-EcKhZA`Dlkm z=bh3=xoj}$<{kS!LsV!lU;iYtZ>+($n%3t|^`k}HH^b-~(>F1yyDz(6PhWSs)19M@ zCBEK*FWWb8xNn^=$ETyPap&AV9qr~*NhV*kug7oJx(EAu`3BSJnZ7}EB!ME}oqLVD zX-Nbe&qG|H;M@()nS>Ig&N~l28V&A#Xz9y6a%5oj?mWW!B+R}sm6h$Fa!}b^>5P#B zVYR!*KC<}xX#8va#j?)iFABlBk(C?JzR4eF@MriJ`nLx87yI-4eQ9;>-aXJA{OiF# z0sQIQ-wXWVm`R=F%%4ErFMg3)Fa7<%KdvCI^IqkFVJ3XO2*>_sZ<^V^?K${Y;g3V{ z$I;ll{GS{AyZw`+g8d2p6jicc=g(0Yp9}s%e=?2z-jxFb2?j*tOr7jZAztX-#gFDo z0_y@E4K;X@JCJem1kn@VA_nnvTBCcnzndn#8;|2_)5Hrq2;0BE@9=_G-CqrO6^r&X zv@d%(FYJ{*OiX(<>eV>&tJGJfm%C}9-oJ2oF`-$y{K}KfRH=v!i41=gf!=iV&UzKz zS=hPa<(}YR;x+G=J}C%(Wqy_PN*6*KM5UMOqr0~+tIY6mPq4=v{i?^y zt*^}S6>C3TPP%gc((zax!6Qjy?>9YJE(k{2)A-*WxQSac0k*vww00DChvAPyqp@= zwu6-5LEY0`(6)l)LOXhXZGwg(_)jmPCn?~Aqux;Iw?V%R{cVsQzbO1UwXCFU4b9`h z`Qw@-RaD!`gtkF#)7uvFWc*^!zjvEs2y$)|`-T!<@yP~92}$;0saJrq0!Eelw=2p0 zJgj=U#m$4;SG6wBBQ8 z4RU}EGeV$F`taCFi-v7h!+)O+-t-a)b!rDs) zWsoEvm7XmD{4^AP2oy3N*-z@)3)`o)XTIt4rvF!&Uzz(!?W5_|k7}MxU;{`9)DT1a zDcW-hY(F}J_F=R|As-(O3H#cZ`nve_&e!X7uQ$5px~6G^l4C>p*9l)oe{I&{rOkM0 zHx2mFz0=ESD=bkmL@vql@jF)GZp z-j$siO|_ZFjpu+zaaq!Gov5W2DB8?Kuv`(&YJezp0BsXye266$}9ivGXgKF8)B8)OOj z1}{36iuQ2Hwv>tVmuLD1NMkNhhqohK4pe3Wr8boykqqb$QaRHsVc+2OYg%qyPk+E- ztbGZc)zR8eIgHpSRR9+-BWP6v7NP+Gfo2M?W z8L(j^HWbs|d;B2uugTh=V2k*Tt*P$+v-BQtQC(a6@IGxiy%!MyJNDjTM8vMx8!GmO z4NZzwp0VT)RBNzA+64K%NAcm_11z}~&=i~(xal2}5uOPz{)VtNuU-Hw&h zk|@quZ0oPv!|~iA7ufZ5(;Bn0XRKI+ro|F~m`PWzDy{geNne%$B?v zp4cxZkXD7N8H-L|xKn(`^>6pnaHB|bfaSp*@fPikKPRzi18C@lNM5@&Qf1K@3pdgF zoqtVe>en>9X&N?&Z|bHJr1l<7{a?uFwL!S7uIAWG`_x`Ya0CubXbAW$y7Tv8=>RWH5EB8Gi7Zew zGjP+uUQl8{bQk_FgsGg)oY_rMf=K>c_Kqj>?FvR4OQ&4z!(AT5r24ZLwnREw^tn{K z;`f6zF^;zFc@-mdw`1G5Ut;b59)D_A;~YWlYtdJhb%RwAsV<1Oqf-F6imMZqBM_=# za$0YQOu&A`UyI+-dXP9>;6P)9!Lu4q1s$&LW6_^#Sc4`K6^}L~n4cdSM2x{4I9`k! zS`u*c=+VS?STkZqIpZiphrNP9{Z@){0Qiq+alre;P#7Fb-3$h03jxgsoGNJ^Fm_Ij z2dVx~7fB{zGZwKKW9WjjtCc5X?b5f&PcI^+z3G%{XW99=eAXsXx>+dQLQaMf_<2jx z32P9YSsPg#-#D3u|JC)cFnWKICdn0RC+U2;6MrF=+?~RtjwQ*%$&mn3)M3m?q+Ptbq5Yf_hJj5Ex^=0S&M% zoM9bRgJGfH#p+`)y~e6b@nV((UM8kMzZV0~3B~{f?32JiK)_`&R{TANE={-Ri+4rZ zTTID!Ig>jl`OlXB?BE{Fc^>~T;^BF#`p~b z_RdatXFDVfpaxC?eU%7OFhQhnsHXge^^zj+OTm=VZU;C_bimjxrV^Sq+RkXl=NzO< zGJ3dXtj8=RU%fue?8OOYcbU06YxXn-M1`SA(fs4hBu-NvN2{wPrTo~uC)-8FyC{bD&ET9~$vr>M zp!5KoPRjYa5*A7`;DkKcrw^wu)}>7N&sI)Q%Pc9k3&E!bwPhu!N3s<3)bEn$b~@^M zz;aR(?t9>_OhJMPN_dPZ0A>x&&>?(x#6%$}yjuA|2eQ0rEXzTZpV?|v8~hfhztnC`>ZPluf@tY7Cw z>!LMD!=8rW3DR!Y%7J@?)X#^Rr)#brcBMCG)0=CZrB1ZakG|ekzpg7 z+DI?X8VKK?o^@S~Dzhv0ZM3Cge?pKd{`Ck=*adf*emtu`{fj;A^Y;{b1Wm*9|32{d zK35lW;Qe4+Grc;iFI+Kw9*$8+zx2O-KXvsGXo@RMar-d)!=z8WKJ}JATJ>lHRzOC= z9d{|MoJs#Z=?sZa$-7TSk4?%uyy@#*^J6#(NAI{krGztn|&^H+$a1;At~&m-VJ76$yZ@?JSws8V>w-edH3Ju(t<5@vu?)I z3W}U+JXMD;UirI#mIHzMq1n?8m;Jed*oJ&&2heeLS~EC;Q!8(_n4%Up#(GKSt2J zRWFyTy)8M~k$u;aYsMQ)` zr6L2K*KdPJAUa)BBGkPs*=K7(9a81{GbS{ez%PWD93`S818eLBtv3!RH%Dx9$UAS6 zG*+nF#ubf|w~W=KAV?^hK*RF_xGWzo6;sRQF--Cz zCWlj)RFWgULdIT_v5(8xD=l7urnC8&uv}C1^q=NGi=vknW$dQE^n0&rk=My#8@WX( z3+!~h@-$D@upX&B?v5zwM0*z9Evy0EF>t-PM=!hB>kfg;4<0`RaYPb34S_)+1{XQ( zm_bgYkyvtzscy1!#xU^9>CBYPe9;mt%)Gq2eH$6>N$ivT^!Ze(pYdehlfC%b{shc% z0@Kf{xZ4w9g((=3Qr@}y1DodXXm@N{A~;C6ruj{aWxK+Rt({@%~`mq(IOpWldt?(j*cIVEAaD!40!;jquE3 zEX}HTqc`T>9?1y6M5s*Q4|I}YI4a_T<){YTReZ|spp;nq%waT)Zo+ULOR03HKP))W zEpzZsbAOsiYrEU#-F8>cvK-4jy@%MA5Zh8>i^NW4$6Dm%_u1t4IYc94UL7E>u#kt7 z4-w4!e&i1o`NN6%b11JJiXvNY=1455pU1UB#wGyNeHxkwvi&4R7r}S<5@T0l9>N+n zkVnz1NkN|MW1hs~JKN?>e)J%117#WW7=09H>H#y>LwxV6wd7e8`L-vQwvx1Yvc?0< zQ#WFr&7`>!yoO#MK-J0E;`@NsAQGZQAob}2Vjd*@atZQiz3@DSJl_iO9lV``$O?uz zj_CZ!%l_o$5azcvq;n$N__0fWZdTh{j#d2Kha?`5riAkuo6rzEDP=8On^x{9;{d|Y zc|@KjWlwLyaxFOf%SKZVTwm||M9n?i0|AL$591IK71X5<#d<>WN7YI}g&2|eLWo1E zcD5AM*7}Mh5IWtCkqBtkmtYe?jZr|eGVcsb-x$Ccy#yn=wJ>3YDgTakIua)&Z)K9V z@X3p@$rN6?Gmw)#+98!ZTJ&h~qYaOCJlgbV8@zr|`mtE0el&Q2a8EOdK9o49m6jsy z-9eDMfcu0jgvl4(AY!orl^7UnQ3BPiWHTaNGiJdt6_pqHI5e$mTHG|RX@yeJ6m5)Q zF)BqDKcX+hQdCP*d)LgR7v|DOhXBLMTa*AC+z{RsYmbj+b$byzp~sx%?RDO0$kqlR z{YA8=cC{2Ipb(D)8JV>mD|!nKeu}$3mbu`7B7-=l;*vwWA%W1O9j;h>l&0C^lEvq! zZY{mx(HSA{oZLB8DG|MDNr8Sn$qW)QyA!=PB5N*r0e)M2>oi0F5XOfo6V;q1f?a|& zR($P0yTCf-ewhmT{w#7qMb6A6-)(8S5z{1wi$W@Ns`LqPhvI&WsfX}(1Fl{SxW$pUQ5L2gnp_NZ97 zW4e!DqlN`++CGxD3h|zpda!3AxvDur)oiAiBPsKpsusXS~#yt9IDWSs5Dsd;=DSVRx&zpn>cllrR>`CsbDVJ6FF5& zL4=i(?-lIVp67_NO$^&$dF9&L0bKnGP(hGl!bPIZke#AmQnC$CNenyFKRq zta%g=mF7kN-u~}B@<;n%oaL3d6M3RajR3zW6jL`8)=+-x&IBZ>u#Yd+$ea3Ome4?e z^h>noax@@pP^BVt$?n7E*s+kBGx=hdtH^k`;=l3#J&d8`Bn}^^+d^eR$5;eb6(t{| z$Q`U+!oy)yocwt=qUPgWwY@qcpRA!bMs?2APv>kK#aG_eZ^iqKcij7 zqn>g+h`Bq6POe^uX{$K@Vm71Q&S23bLK2fsKOV;%jln>iN=jMHY0{TzOm5V+faVLp zmu_qTtaR#V)*1$Mb|APz25)h0 z7^R#SV*=URqQ+jv-WWo_AHrfoR67mp_7AtDq&Xf0ZLYtgC) znvLaj;>Rslw*D)Yo|*7+Dt9*SPWMMXoZ8)TI6-tOKXR&?G zB8VP>9&R~(ksd({$csL#jX$!i$ z#Fy8UP37p3m1hqc2eF*7k06n%`&z25SGe)o06IB|u!+IsVRzw$v&7H?_amU7%CXuA z(&$GT1M!_V4QCoAk(SYVk(Vnk6ap1F@;ore7^0)ggPjCnSOUrapFj6lqj zi5W71yio-~G}7Qt8hSGgo}|GA#X%=a)s45K*zzfK%I!!+lB=ZDjY;w+N!|GLXg;|g zvzR2VP~~ivoQ$H=)3=d~kt(Cm$$+T)$4j!pf_U-d!StWQC~GgUx`I!0A*U zc{^EkXFO7}>a#Sh7fssHw2ht!y5AR|nY>|QLu9kO8L+ga`UXwwO~e1YifO?pj$~TK zkrtGaEH$QwTUy4ns5!o6Ld#(8PK4UQQj>FhE&>Q1NSp2u(JPgrmLq^K-7Y#=KaQjf zX63xjmDMRRiZ!`FLKN6Tl*B>mDNTxI(LIDd0|hUq)5M$P1vJkA%D2>1H{1v`O`H>&qoC=f8|{k@~iUYP-K&;`VaJ%Se2M$zINVxq$yG z9Ip7>#pg>9w1V(xIagcRw=>odTJ2xH`yP9DN9X>|Xk6rc!tEM&s#%7X zBTp$?O{g}C9C3lugrC7Jy@SFIOOYC%+`?QEQIhk0Nc9vkyb;|DDGp<3=5pBmO7Yd? z(`>v#1JG28gok|YPG~w%)b!otFG5bE{k~)tYud@{dolm@B@{Is+UiYcDl{?PjwKd5 zENiMKxH%~?uOj9p*g0A9c@g`0HM#G=H24uPX2kD-_%2|fHg;n`N|X}gF6M{6gr4>z zbTw({idH`c3RlfuOtX|U6VlB5zwaE1u`LneK(mNVUkqoPW-(V+lB=u8)n$a{dXcuV zc!=+U_?z3vJ#TW)2VS*p452ks8Co+R<|{fi=&5itWhJ4;0pz8cNnQYtt3_L#<-%on zMTy3ru0#<5#|j+keH5$#%cTpJZknx`+tcOgGLsLL(Yw<$iHERGF5NKhCmI?}Xf-&R zha&?mmlM)w)vu}FjIZT#nNS~9zgj<*csg93AW3EHuw2kW zCMWts5JlBPh5PAWCw8Zs#3g?v|8Ezza6aA4GWX}nX#{g)4#x0m;qm1yv!70Tx~yeY%et23EkpnA z0|@16MZHtcC!?RZ1m20H1&5_AGwoVdp?|v2l@@x5@X*z|;~N2Jx^eDwvW)eBrkv7p zwf5m*#v3L*5p7*a62&M+!n*Ta;3jKRsVRmr;33&_bD_Y8jH5R9?Y67i+9o*4+k(Ff zrsb<8ZR)ngZQmpdF@Mk|~h zWL~(fx`K*8I8ct~q}pJBgLU~$UC`za?k{Rt9EZ(Ej_IpA_4aV2i>0pmc}(Xnzs?Pv z`{kW6ovZoI?G|}wZ0Fj}y;85v^>*I4xoZi}<2tu>uI$`u;X4mIbRO#5+_?thbuFvP z35xXyeE!#uS^>>* zm8S}ll(C4Uu3dbw>i6}(uX6xD`}ftqZ_uuLH<^1Eab8RkuP3|`hyUFa?qfW_Ri1oU zOg=0j=b$29>VRRto@ogHb>a31_S5uFb3Xe)M@Y(k7K=eQuNrU+#Zc1dN*>N&4KrzY z8I)`+w-TFrFa{B)yk0^x$MC5@r0fV4d&L|GT?Z9##MHM8@1Se9f|mEWD(8M%{qaEQ z$l}Ex_9rf&mvGL1Vk0jn#A4%F}S~- zO$|%A3w@O=cJbS1A5Ubh!RY2_8)=;Siun-!%e-F}TgLnz^ZQor!}P?VA67hYX>+Y# zg$v!GSqBl~86c^|5mk;WE_5g1hNuq4aYj#sf=ZMajXNbdYM9fVqR&yd@jK=9UP&uI zjr}yPZF1XqXiPjC@-kk01Z~NTLt>7xd4q2?=M1e!oMb zB^oW0%ck^B3A*q2&RM5IEy^C8kOf@y%P zGLth9&F#$7wTw8i#S`z)I|k z5964J`+*U&a4`?#uyZ`zh#U=wDM*PAwj)}iETG~^N@AMLnx?6pt%;{;S{SPvA*Y+^^jsgV zRLP_VvFA{{7ZE_VY!qAI=3we0%{U~M-cRqQQzb(3p-4Nc&UE*1<0wVr(8dXk!@u`R z4Qw3V*bgG))_E8N2#l``2LSwNSt!bjxB-Rz25fU$Kc?!mXfyahArd5Zid^Vk& z=3!5q(meU}70Rr&m^4E|WhDKPr$5St&KSOPU+3O`h0&TJoltAC8d9q~Aw;ej%xG9% zGgi%54Jj=$wbW|JXmjOtP@rJ6QTUb!G2bYxLc@s~$&Z{S)nAhs`rhw*xAdW%n`otj z+SO_}n=J~E=lYQJ@xqBd1d6dY=QGA-G&E%_gLzGb_)>)UTO>4zEOR%I7?-j5Q(7-3 zH3)`hsJSQQD%PpK9z#QcU1fVqu7wHTj^K&|ND}%8tp)&Cb0kMr(N(#~?yX7r|E!|# z2Am9Qi))yBVRKWMeq}v?J8M$;jR}NidNcF|(15x=Xs|>i_hbV@wcW+HUHr;Z$~H`6 zxrUI22@N55htW_3(ctOcxf`V4&nJm7%&lJJYcI8zHR;Yha5s=^AQS=KC+E=yDQ+#8 zG6>;hK-&aUp~p-yx}l`XnN+#JaI4&flD1H(*rNlox0JLS1IwUjl3O9 z+;k~rUp;H*`Ea)!zx-z0H^U$9an_`GEzky)(w_XjTf!`nX7UYjRa>tOxH& zGse>P5fJ)6Sijxb2XKo?Rvk<0y7sW6IdN$tsD2eKiNgX)NvMSvQ98)vLG@D&3w|Dl zxlT#`8%T9B{M&lWSxWAWx#qdFZoJjOa=@}tZdF+};zm-A-c@!~^ z#0G30N6bA)|44gls^P|Bd-Fjljty{8nrF$)YV!#am|C015jS{*)Z824zQ%zV zF&XK>jbdF9$0%rMPe>F9*3>+jwp?+07OC98ru)c>RFU4+G~GL(y*>@m%7(Qon{PHh47!g97@y0l?#!}f-K4U0@YOkOSHTP8N3OlnO#p2uRC(@x~ZH-yOi6%DHz zdbukaR?`dO?WfgzH42dkFQdk2j<#UGL?hS7U6GE~^n`n^aAR?f{8P8a*#if8H!f_1 z{0057|L3Ix)G}*&=Dpzzc)eOqum>4^=(`?c%p-= z_;IK1c?gZOo;nU0X1`!pAL`TyktNxJbC7=2jfUMlxu0ol~{(hL16NogrP@fFf?g)q^C72^}(>I zvl?c!9JuYM>HpQ*htbvj{}Vd8E*hLOrTRX@s6@KOpt zkNtUEkZZq|> z(#x8od3^A;>plKdD7~@tCt21^7k=sl7eV?N%+^(H@ok4CZJX@do!a|L+K1uOa|$1? zCp~bf5hQ}Ncf)eeDJ$FC7Ty-xt{By0n70xZl2e0bV1IaB7p8qWsocojTE~9&VA>WF z+vrFK>yd<}aNazSUY_;J&qJkn)mLIivz$wP>wWxS)JHO#rvE4 zS>ZLHg+XoqI^7@H|JVD#o*%qjoF?=E#|*P%<1;G87YuVL0iD z)$WO2GgK__xJNF%+Z*X@%}r==?$3@u<`d*(ky~85bnfX~qd#o$l?INr^cG)`O>?Hw zpBHv+@_Xm~PH^$*+%31b`vi}17F!Et*4&E9wb)-Y+exB$E~VxW6xBFqLwHo^#2gtpG*WE{o&gzx@G}e{FPG*><)&d6lDx_nd)`Rd-{b7xsPw7OcN(BQV|4Cpp}*AGO?O}G(X*C5jAk*pIG(9q zOf(L73D0W8LL#D9hNq!QCM$qs%x4OGg`;zblPj91k`56gSd0kE4872wL5{3sk~cWH zVAhUZq-onQlKB}o_I9Hc_Vn{X$P9OpIm^+KWX&(k9)TJ%m~Dvqq}KeR8+*{(;D|4G z#I;>88TrTmlBrVTv263tay;JR~&k0U_2} za58_UOsdp}GYa5Wq3C6_7M!>@3B^2|V1wuXQiziwO@x*{CQpuLGhDsk98KGSCoI%H z*y!1O(2jdXns+rXH<1(igTbGY|%9N4hb=kX5n+{sUcO98&{wP#0Db>0vEOIVt;Tde%xu zH@UREYrAL1{*F!XB;NSBhtyALCu^V39vlRVDk^`{t9@E~Wc!@<+1-p@#sCMjd^#SF zg?A~s^u)Ejcl*5d`R)GgU2M~hVC*o~qFXd!68>6Dn>N_y>d32T`G=SfyOj|Aw-%>X zggGJxgNfT&i_@D{BNpeNjsIm)VxW4G0FV^q=w{`t#mUqVP14tU8fW2ti%u2glk_;40K?|wZn4J8Sc>jj*Y1r`N5MKF3LnwC&pL55x$ z6PI+D@=zH|U_6?CX|0=WwDAUX%4>p?tN1zs+Aw&KJ4eX4~I0fh12~{ z57ErmEYQr*gq4gg>OE=vr^TNZvFhH|<5z2X0sR~ebZQ%ETOujw#r>Z^(xXXz9G3|M zb`R5v^LNNoDWjjwr1&9WLmyl^N;iYJwk4!-BZ1;4mhpb(=NMpAk37gDF~x;sfDZ=l zk@Nrm8>xr|N}x_g8g^niI1XxdB6$uypq1OD7rGL#E7NA%&t;P4 zaaD1o&`xGtPUjcRW{YOQ6iy`P`8<|AwtH+(%O%v8R!nF(_}CEv;)x?)&1u;27@B2v zs$UL0@TLFh_n80N{%;oueOphQ$@37EP#5W!NLjUu^~A}qq97|IN=Ld1CZv7v8W>yg z-tiOkIyjj{6*OORq#W1v-J9)!IWQwDxTc z`Y(&j^rWV=3$Kd;;aNoX*y^#*f>zE)6Rp?84z3=E;#9Y)jg~y>Ah84kuO1` zDK-rOg5ew}KniKn0pbpt8Ve9l0w_-`28ur!0+21D@BspWnjmY^tzmhrZlv|BZavYh z!{4oh zr#tP)M~-~t$wz^F5QP=r?_mBIPSBPA=Ttm8$D>ZbF@JavGyDcj>&0mDV;81<9{G9* zl8IPSC}(j{9GBkJGbdKSG!o|_(gQI-#tBM4gCX-Y2@p;p2#?3qp!=s-n`2iFo_8He4&nX^^|7w{gdF^!sp`HHeQr&Md|VY zKsXM7jD*q0Q?-6S`2K(ek;S_5cAyXlqG-92RYGjLD{yU5td#{<8wUt7gt*ZNaG-eb zb9vzDc8qQw3;H#SUVi-mh*@G$pE_e^#Jv#DN{kX3`3;1&N*16yhvGL@!qPM+5EXdbXul&7dpv3n9eEM%H498-s+0=TUA!tOTxN% z%W1JUE$-IZ2j08t{K+nioCD8+MFSl;2q4kGS}}2kn{d`2PR)^X+C@kt&zx*laSFJ8JH|og4N2)q&_;C>rvVo_ zQ}us~?Jq(c%6isRx!)3j4Wyf8g=L;)vSqAHWtdY_BIAuu$*9u zgauqU*RoxlZ#=7R4UQgzD_K}Df*5(ufY%^)yO`Iu1{5K`!l0B%^sBzfar9vreK-jt zeeqOYe~i}uTmM+>d$IpqEW3%**@-b+Ve-VSU#$LT2ezz>7mEY*yJS!OpW^(cr|#0H zUFGc4fTtb^6)q*@Z^eg*%vStI!aK;I*1}sarTl{z~no zIM-J8eJGP3g8ewh6`c(1<%w)E+89^^OQ)oPUe0rhR7ZFz-4^VLgRPg!pDe&+O3A%m zO!^Y`M*;SVy8;dH$NtRSgS-xeDS)J;bS5dC%jeMkokrCfQn^&) zTs#G{Z|KF|U(O|gvx_kz9ZN_D)O9dFe$0oN%!j#Pf|}F_fO$YG_M9=C$I)}phR1Tm zkRY@_Ocy12IVO1$<8B!L)$(TlpMrnt*FJ=%dlybXMM*159EzR!>Ln0MllKZ~;2P1% z2AsKsybHoeF!ZZeZbF0*PhgAy%Z7)GA)uiS#MX)?Ho&^3nHcY@7k`t}8P`JCjQ+Sx zZT5HkhxiXWqzX6tr`<7sPXmz{)|Nn`j1!q<@XhF*0Y-?5M1b1UT6_G5eqRcCB9JVe z(<171gU!USGSCndz?nnP$&L6@996_c&}9*0;5zz`fc(8K)$G#jO3%-bwyy*2%7Jy3 zDjmI?+xIAh_UY|2*+8+P5h5H>SMy{oV^p9GSjIr&M--nB zKbyDKRsJJm(tESXTU2EOvE;64D^_*Lnin(-vaCSlVOb{S?t0(#fakiF-Li-14v^Oz z`3+kw66kBkss_GhIVV@U-**4D#opz&UF>ghzwQ4m{-=>Y4bs`ehOeDHGZzRuu8CG5 zoSjPJF=6R(4Q5=1r}Mjrorfg09xnd2BYNm>LA&7F;*y{>%~@^0^ORxI^HMoAUcz`qokXZ6|`Byj!1g$$_U||rmDzGxuFlq?4Q z9#e}|dE@eTT^x9qr-4s{xTifuVByB?;=wcwI#`C{V|gs;$WM%3rwzAhJ~BsOEgdaH(-Hq$i*m8xPKpR=5~hm(7)x2w-AqQP|LcS2VD5j8!zp>PVl*-w)j zmflb6kQXGv7q@TI%y0tWnugNr;Y4E;TbVEqfRpYRFKnRKr;4HsXgIhceRxolI#1`J zNg9Vb8xAlzz==uPof8=@SX`iuGb%*g@IWlcO4d8a>(H3Wa0(HmzmxyZGz9Q>E@v+` z?^QgqQ_<@nI1hP5*hh?cC$Co75)!f(;uFNI%RyoYL9`%;R3X+3U}nLVpt*^2l_f@u zHjf0*mXP%KO1Y+cB;I!{Zy4*|aOklUFPA-5JeE5>R;iV?gqi{t0U&l`46?vscd{3w za1S0`DYk@aASjqW8O|S&(lDatYzdcWx+8aU7@hfjY^1%78h@DdtP4l)45oLw!UM~i z4?S~3es~?RlZ_rN4Z~xKg(ndh`64OF!?Z9T1OPJ6JL zFrt~kY9a_LF~B@IZ4lB5o=p_bk_LAMB|W%hn?~1ikQkJbTwm{_AROB?H6O_TEN5|O z^IqtjF+6TvQhvS@{$iJT`6e4>Mpg3WQ>KV)9JMJX1wF*tEGnOnau(tGL#o zypyDLP;0QDP)gCZX46(QN=W+-Fqgy+Jk!V)P58E7`%b&|&3yZ&qzxSoYI~dZ+G$Um z2&^FA9VE#pY!ib*BzW+KsY(NiM;rouWH&H5UB=DctT7TBAaXQh3b=KV=ZH9$(?p9O zRM&D?fCJV!(+~*KfK<*V_92>?@)}+$M|n9bTvk0-b`;GHHr+*YFxxsxN^5ZfjT_fG z63lFyKJnyS4&_b^wpNYV)h9IC!?by`m2*gPJb`e9LBOAiHE-o2O_qL>j@5Va$dO53{p3bLt!|2^v=#~>~NvQ=0a-qH|$C|dc zC8c~f1~<)fPP<%vF^>WYPl`xCQXba^nr*qU=q6}IljsX)Sg|dd^|ljxiwnmbU*6;az}^mj{mz?&DcztrC^8HOxdMNT8DbJ&TkEG zoz}W0(4loe>$*rgo9VcDXn<7Ng>wvQUC|mnNYXk3re(T#a)rnr!g5w%r^DcyE;kN@ zF%P0s1Z<&rMGZ|yvLpRw1<7&e&~9>eCk7x{cXHl~p)b0>kjU(k)+BAS7kuo7zUcD8 z_v)srIHuEfGf1llO8+kp!w z*WkoK<7m=;n6$@`uOMY&OTPL){LRH36FbHW0Ue9culL&?9C~F-(N-K(vOLdfLx>it z&G2?93C-)sAmYyTMzR@#FAlPcs5F8X<%s@B6+Z?ul9Kp-J%=)#n=PfNd0rsf(aqhV zBfvLlY0L5swtY(b0ls4j&FOPa=lvq0J8{s7W#!#IxZBk8r+eb;9&A;q zmp=GqDrl+F6773>;OPm5?uLOquLjd%P@-*V3GJ@s{xsXkvfx$!>?wKs4WVbcI=se7 znzpo*b^*igLUfzS^$2o#8VQW_u%+cxO?d79x~skL+V!>DZ-*+vD<;ciRin?(?XY`2 zSgKR$0_DEiSe+9lAnk0`Bzk`&y+5u)(IJ2B$G-0Sx<6F(ZRv?;R`S5xY-zRaQW~KP zX1amF*A0`CR`Xf05-FXgjY++>Fo^7=LkKrDbm%Jp?|fxONo7nlpip- ztISK%!!1z4IyWlly`JwC_}q*Fs)=BZjbPQnnp~fqVf7mHJSVv2g z^tm^E?twx`@qv_;YAUtmo@oSHPF{2;FM424c+s2t4PBw={O8cK*Af1uD^Nm1^gFRB z5@I<>EIWy153%g!3=I3rIPy9O28W>&1hgW2gvZB+y&puVEBS~lAG=2!z1WwzJCvb| zh}nmjUB%aOiT+Hz2R^UfT|5%FUi3rtAXG`7MB~pmfh&fW)K?kR?wSBbj=-fUVz1^eUov zBG3B6`i|ZB5DXnU6$_@VU^`m(&m0<|>FuiPM>pxl+NI7x;FMcM4Q}+HZiCVkK{uHC zxtRd@9SrPE_h+s^oLP`ny3yjB6x%UhJM&GH1gkyZb)fJ%_;v5s0cuxU!HKGwNL2V+ zJ|qXh5N`;;qX74iB0m=U`DL6g1`Su*nPPYecmWBU+R0W>`s-RQl~>$@N9IfsfD3_k zGRDDF4R$7eWRrICc)tK~17LQxg3F(HIy1)+i=eRJ!xWk^z{*-V%K`2#d)tG@eor-Q??S3~v3WHO!GvMf)_yw2b^7Pk!Hr;De^FBs39cGE0n*4i-^+qM{)pKUE|l zN!S-*q=_SSy-3{vgkMRqc*x?s=Di)$I>Pk_uE?$+_^ljHGbUPj-S*d`UJvG9kHSNi zBxm&MhWFDMs6p9^tE(13&DIxTCG}@R*os+_LWN8l=amCt>_`UchMH&^QMOh@xlwp0 zf-Ly}kBl=)qJ@abB33TJDnWK5RZp@NSGEVkmH~k=ggr5j+!#xm-3S`8Yefv~{A_Y| z3b`a9m!!;d2ybsAxl?FJE-2um`5)a#70*9M`vJizj~r7skf|Jl|3NKR49Nuvg1p=r z43H}nzP=tSJ->=MH;EW{Qsu|erR=$BOiC;csl`F+lUdVBsVRb|h)a+5Bd>?yoKyt& z9Jzal+}*?e6vh6u9@z?j7QSH-xxX0;=bWhYeQpk&W?-=wlqR-Ll=D_ES~mXnltf>y z66b_L=1EMcO0%n$@tXcHG7yz*rFp-`!uZ69SBnpXyDdfK9t~c$(vzLTK6a%LH#7?L zr_oI-xIdQCa$jtsrRQp#z^e$RaW^MQ%8&;@K~enRi?*FK?z_IMX}XZDfZ3K_p(ZMgpwi8!RkDwVbCpNdn)B7Xd4}QzNImAlUU2SFBvkTqp=Hmto3O?V6EiDs@;Gm}o%1Oo@@X)8wE(F)Uaj8itwF*eSClVRa&WXNj?FHc&AtP6>N0aK3u;`(BTBueUl zP;?u_b&TrFAq0eIoI(PG4gybGS>ortoJkZP7P#}{?M_OWlM-|Xkn5vF+u?7pTxMUo zNMo-^_hr+&c&FpcFNUN@nUr7}mJ-HfyGk?d*tA&~n(~ZS``=IE-p|za`D4Y0ppQL2 z259zS_$qQU2B0C{-d0`!=JFp(CXRfLV7AcRkM@(g5boGC++o&G*5HX{+p&~QjDd$M zFQVz=K?E?ZpnLRjvK$x0N)=WA<594fp52-*<6d~P&w4%!c-E7B7KAA~MN8xCb$ju! zC_~#Su9-KB8w$hYfsqO;7~@RL2a7^I7Asy}QTK5gmmEwd>w1yX&ajbFM^5f}q2`4b z6X_*KddcU-$QPmFuS-tG(qB~fx6<^<9T4xiHul;O*v+Za&tSu_?No@P7XL*$Sbe z56u(aPZuyWm6to%_fy`_d_VX70!_3c_s|Wt!Qo@z$6&03s>*Ei0N73^RQG`?aZ-vs zkXa;Ev*W=$_J!r1rk&y{7yoI#RPq3fim*AbDUL2W8LgQ5OS_}h7(n{QA)m56jp8m8{8`&}Y{`C7(Iu_DX(bsnyx+29s zL#x)<>FgP(h%N^*%3K*F%O$*?NK8xYfCuYw;v4SzOv%k5fE~^xv`3&JfJ2HYZYP>8 zEcU2GPv%T4e`_Ll;sEUY8@OA}xCpBW1R(sYi)7C2Mr4Mc8G{&;aOA7)H1w-&a3JG&Muj_DC2zIU)M_!zZvmQ+Q-fxG?Kc9Veg%kBh|4h6XqNzP>=d(K8 zKzrbL%}T^0Acx>HzycM3l8LvAP!8SZ;w`w)5M58A3q~y;)PLLgjQ<(UCx;8C_HxNM zUSp;UM0pqGVMH8F3124!TURF0}w^b(JWKXvR%ls&LbsZOvxC)W(w|fIH`2Q z{)5dLo*b_NV*ry1+{}|yi2E?lEx?K_Sd+NvO8lpzZ8hBy(+&SP8|Fxp0%3oDI`WvAn4_e9)EL z_O-0U!QM^&dO0nNuam#trSZcSe&tl_j$~(-w=3Sxdpn=z&Mfx*PHyM+cG}x$_{b}@ zF9UGd{*Uv;i}5OzHj%s8ZKS1UXEW9VEMa0pR~L9`*Dhz~M8 zhtqt3QETSXP)!7CXnCF_uL~aQ>Y4uzbUHDfs?*0sdf93XoeSN+@ALgcO^Bu^>td$~ zVeLNI(WE6gBZN=gKKXJEQiY=r`krmI8@>X-Fzp zAxye5gw3AEC#@rf02m0$-MWQD7l{G8c7q!B(n;BKS>SaVd8CW&dd9~=MH}DlfOK2Y zrhI2w0funMh1F>+gk|y&ruh=)aGI50 z@-LM1CARCgX!?8_o(!RCmKY~^8$;{~jP%Ck8o$5B5B|IrqK7nd_o-lmpDCthDb>fl zw8PxrOe@|mLfGPuhMEa>1~2G#s2yxK696!Cq|A@Y_F%HzNv1#sOG_qlDLYA75XtL{ zZ3wriVyJhdr|ss6UzDgxN8TKn@Aq^rAp75$5AKQaABKGxsM&zf?o+={y=XMYW&4Sj zxp9Ip@3)f|Yq9a)(pVKV>Zg$FfmzDf=)pA8BVF}2O6RJN(%L_^$4uSIDwh*_X$$#! zBlrq1k6Xt&CSDkSVaj`l_s-mhQ6GkW7(%}epkMcdWny{Vs;Z7f`bE9bMLR#O3u|!Z zblat=0${aUr$5eSjwpHT;G9Gw*2%=MkUG*?87elv3(-X5=vY=qq{kR0`w$H4)*YG( z>F@b<~yyifP3TsK=ao&`P;_%@*=W3(|HHS~FG-cXP%U|zn(%ys z*8S*=fC(qbMr|4 zK6(CLjWbU}h+DE#&@HsJ-%^Q9VqhQt8CA_U$_t~-(I zj@TRWSKH-BV}&dtoUBO9he}+A_mP(EXCOHsK zyWx0FOpBQ(F6!2m&AT?>^S+w$8Q_&--I%=iWQ_-kG^G=bSn7J?HpdOHIIP#&Zpv9CG=NK4WJD9o`yal18x( zRn&`747X{pOvub_Q_iC= z{49Sijgv{@dUK;FapZ^2C)?AnWYC4rxxbkj$TP$R=Sgdb9BJzq5WhGpX!Y^n+2`J< z#Su$pAv}2YsW%T53f+UnsgE1kVmw<+pftc)rgOG4asr}O&DHxPEVg)Vtd9SbQ(Vx0}rFZDkb8aw39K z-CTxhu1YmWt3%UV73~@Bp2%bqSu|yg(p)9Gzk<2flZ7Um*v=-lv59j`A{ht+e0pN(Zp!2Xq)7}H(Ru%$re&eG4dNptPYy_vbUtH|-GZmx?s z3tQU8mbU-D)Kl$uxkFEbIQAmLthx42$Wc$@i!r5^Q`M zP|HTPXktHH;ma)3P7zxs%QAYIW@${lOh>?$86HrFQ1fd2ml|lLOQVpcNa0c%TgqgU z^_tl-5@(h+v!(THDVI`u@6txYR6d&-WlOu+QgP_)0XBP(I#9oKjxF`Fr5^QC2i0Mz z=U+#ZYM0KbmwGk6>t}RJXR$+1S{w@az|{Af+5J=Oew&uQU?01GMsxohyFbA0_x~%U zJ^uS`?0zRz__LDq*!!*2vwQFNY46voeYZBp-|y6G*?n@HMxKPT)hzOdCXMHm->W%9 zu6mExSkKHx(m962QUob~zg^67mRSavrJqt#TzqyE zVbJhhWQci`Ea8b>s%=B$Qk3d%JHu>!v>(SvnORD;U^WUTyPMgHLTrTu3hHJQ!QN6C zi!naS0P@N9|EK=8a7IufTN10$ndFtr?Vv#X#3(^OOH=1AV#^gjJa;!+btjEY6i_VUjXu#k-9>er?tz=l zSuQP}aBOE-YM494HFIOwcqKrqWJzQ+q6$*+sJmz3O1{|RisjnQ2$5+%5}3DO1~|iYn4HzNofe6xM6+fIOT$Em=s+` zPRL`+v5A_ftJQb{*T&2p(@&Izx>|7mbR=z_g)VN>2y*%C(J=1?hHO2B8*^;J6CyFm zqQPU{t8})DSdRgQDV1oP z3RB%P=`H)U)}uV~Mj&%ms;15o$0*ZImZ=j%aTT62pI>3$$@nR3wpQp#|LrD#%tTOR z2RE6p^X`Davq}O_ynJ3WorjGW6Jf8z!;W0G#V`_d&(9ut^(Y?BT6J?Lc8Sfpi70NQ zRu^55VOD?UJjoofd2)@YM1!AqR8@`bN>5*5lxv z%7Eq6_=PS!W8WR-?N)YUROqb{Fqd6BoLycQcuYiwJ5rg4VzcjL z*T~sZG%Wg)suj-(t(tUr4lQ#WU~UzgIl;&#yt#@ALb4ubZWeNFTpz%!IySSGc?iQp zD9;I_jtcWmHeVSi2V;pfP<-m`0Sugfr zB)uZu8g(O5sQ3A|3gMAgyV+!D&@&-;6gz{a#_+sn zK$EIlpqP@`co1V$#hfkl;)UCV$+y$6_4cuFhe~vap3EQ)^Bs8jPD#epUR$p@MTmx( z<5~<~cc+w4VjDBf`6TF-n2+-<_F>%ZU~A*B>Y9PgB(0gPB9fF9uB`I2Ws^r&5?I*` zW3yw}ZOy_{6vk+dCC-`HttNJ>16vA=`D`ogDF*pXZjrODox>xx#%NDa=;RrdU4y&k zvvS9e8l@uY znXQ3QpbB#myVXge_7SXd?8|fd(>}>DWZy3NbQtD>@RlW0Rdg$;E3H$Us)B ziVRX~?{1gwsaH%!VuzbpQmED&st?8^GwET%5IwU6Pm<^K5mI1<#@bbkV)2?OiqZ5y zpg9+u)h1^-)=gK@0+rcE*6>EGwM0 z`nYK_G}zOMBdEeNoR)LEmIvV}(V^l&?#{sJARJKq#mQ$X`Ra)(HZQ?^2D#3}g3D)_ zC^Lu>znOeyDT)-wRNh=>?KN!20yhztGi;)Sx#HH&wzE6?nQOOx<|r2OGa6?bbB8kP zI_3>vO0SQMUO&j@&Z}<}o37MI3jlZZKvYZCF~?!Q*^6wB+y-?rK_A;hJ~4L~oGXmx zgKWA0hEo#GNLSx8Mt+S(Bftgvb< z7py^O;?d<(hvY`CS5jw2Rn}mo!qzI+$T1>LG;T7hlyh2nO!OUOdTv}P&NtCYFcwG7 zWEc2Wl|aK4b^e*b8HCI^E%ZtJAR$KkGa!vcin_prSX~p-3gtXzkjD3-C_Shz(R8H7 zas4(dJcpCpl|lKi9Hw=Q${Acc;4V2gzX7u>gGvA%!xh%BBbE#1TIKX+Gt1%0rFe0( zZ7hRj`=Tg$()QM z-iwM#X+9mG>@i>hedtPYnukQoabl7h;V9&Xrc;z^Zb0xS-QRA4L`ck&VcAYXT$8NA zp3nO!`C>K>H;OvcSWV_2(S;@*sfU_Gg?&AbRPlDl5gg&f;6)wZ&l5y7)+iTDl`-ae z(OPq3SP8M~u~#(n#ykXejIB|IwBn$AI8EL!>IQgDkLZvO2wSHp;|X%CXyij7qKSjK z)*2)COcf(|m>Bhh^riY^iz!mHC^ek)3L%w-hj;GZLQ%rYMWkrDlX54wSwt@EpH42q z9dzld|IEQ6ktJCY)s8i)9bnnaT)m;@IyS9kyuwco(8{&!Y6M$q#fqhqx=Z71TE$!i zMyjKW1Ttb0aelOyMP5_+0j)WoO(wG0GTbL;`q`3<){TDF46FamSgf4hDTgcNIBf04 z(=6b|Mmd$NAkTyl;oBoRa0T#P%2{55t#Vq}<#9=g7s}8~4|R8=Y;5Ae&7xf{W><#r z{Egl0#$N21+bGUiHgoOgPNO75D=U6N8H56pU z(u{TFG}_auUMj#A9N_-9HF(CdjVItx2-%w*^fpH`9gngsa4f$xQ5bb&%ye+G8Lv6@Q_vKHUwzId3SVm+2j>}?w?aMLfQ8CRX==>q z&Mi_uT(m8dn%vSL&1%(i7g>@2!#giMO=gy&B}!ag9VJ@O-*Og%7E*(5oeL66eOSF1 z&@j_+aBg68k^bSGC5k*zVbo4_Rm|qZh^H@L-M_jb2MfYRZ@YMa59b7Mw{?7 z4*225NRlQ`D-Ar}Y_jzpnd+r2t07UF%zNVK5j5$FLXEL*PVvDtlhu|s8m{P!*Tpz{DEEE+p zz7$5I*1x3F1n#rAD2}W7OjdOuF%f#kA?6d$)Yks5?e8VIen7Bq zQHcd-ka_h)0rpG*Ubs@HlA^3t%(Vme&%~!q*K02s@WiD`WoTBDKD`_FS&zit8o|~Z z;{>3}mP7HhJ3!W6KElIkNVG1Mi*D=i8hZz=YqK?X#uH|$$c1Lu<{Lwd5LSazdnk-n zc(4+YFnxqQ9mYsx-S6BXue8uBc%Plkn#eYLgnX2x66bRjias;N1>Indw{)5fbprRy z?T@i-(@Ye~(UT+CF*U@dQ^i0=@YE5ko$bkeE=JT%rsLS>i4S&?9fT9ZA-%&{ z;AxGe?|wwO#;UtdNah*R&L3Ved5nhhA_NChz%({ydON0Zol}0#E;X&u9Rwh!TX4hK-l+$?p z+D4dN4d&($zLoJUWL`X3gYA}@fce$zQVF)rj0anaeIZ?~W8`U@(Td}lF*YGF>vm?) zJ4XB*!&r1bJ8Jd_lLs}TLy~jU_BQoYr+#)lI9rqhH^>F2I*2D-9~Ldw&&#p*Nj+SH zU2cLMVV~=8n5#*%p4~2`6=t9D>IUIzFsDeeh76BmoUP1xoH_R5fvE#2Vw8EhbaxW5 zp1jkKFVrUAI85&2;{0h@aC#;yTvuB0Ue$9WKITzbv{GIyG#w8LD^g!%k;uxHFIbvO*-$CHzC?YhZ3Kc24!!!$gp)!sCx4 z3+lCnc*K(t^GInff;q?ZIigWS1s}#!6B$N#IT56N(bj_j_8d|Fbfr2V z4)uN$20Y@TiOE%>p(ym>y{9O!=-3xDJW5U!362ZBSk2q-j{1qqoBJGl<9Xg%aVXju z&o$p`!ZGnfW_T_Qt1RVsNKCGw8Ry5-EnQ;g^kN{U5d&F#We#2GVygF$d}C<4bE|5u zs6&pz!{TMo&8oHHR|99JlbT#D#XdrJ_a06RQ|5Cwzl`p#q5-0KU%=@A95%;cH}6-v z%s~=g&(-n(8!@k?R=daO?`XRyxxZf%O)<q+&Fj_5IouqKTWHBR%v>i~ruiJ*M{Gq-2W|p6DUp$Ez*8ATIkKmU zD$6NR%_($Mn3?u8&7ris48SPiuHiNEYN58AFb|}Qi(Ds#WrEj zTTfjEOqT#N?c^=?h}Ms^$;SbQ890ja(9ZisPIr9@E20vMC=_NFmB=LQ?pR^}D z8hFXKPe^hUVX5kvB**DNZqWioyP_C7pi(441n3C>Nsc#2e<6`6BFNcv{ty`N6DQ!T*510)_K|7e_IV`D#<`*Zh6EXl#AE} z<}tiT9^8d80-p79DqP*A41+?jYA~y#!BZIo)=eD1Og3&HH>f3L9U&=$Bfy%^{ov97 z4uEwh4#Cw!6bxhol`$K67FeP+lKnV^(y<;TAC6ZWV&Q5Xw!@7m%USRY8{uk;HI~#7 zW*uBkL=pt@V!^Tz4}gQbMtH$J1oF5BEIR?L<5WeZ03@fk!F(p+iM%yYaJgT!!Ax-iSdNho z)%mr)b{;pt9PL?ywn29U+!)x}lroqN4TQNp)?jcJEB)Y(u!q9jacqHWDmfZvGq4-xn&~qf*QzKo z4?$k>G|aA~#ygMbz@5p!ogM&_Td)CU*UD)y*F&+2-7C2oCW}mPEeOZS2+z_5?(MQ4 zTuV~gz}dhzfx8H6z+G$(fNOb+dbn0BI^asIPzJ$Dwg%unDd)kp8l@MeqUpb9Y(sE~div^GKe*myUJ2I+rrxUrl9$bKfno#;0!i>SQM(EG@=AzrKOK-P z)d`mlNK+8W4F`crC=;&++G`>uAN|N5d>^O??u?0~&D>AAqk5X?0Sb`=ruF0db!|+0wsFW50QsDEOMIF2lElcqE?b8Xc zkYG6jpIbqM?}eR?4p=@vuZD%ZF!)@<%qi)G0dchho)7Y@guD4T21_+!6i8pa7w$Dq z4LigZthmbU@<5JmT3hH%PK2_+XwkZcsfOl!OdFwq>J%U z@XTuZtT#_8)vz283QwvRU(K1+jjaf=v% zr#E|h;F+D43vegU-3^O1+#jCa>jb#9*#vi1>ETW`&E{uoeT`lU*TK`Z{_y!2D^+Nl zw-=sn5(DsTLpD5j!qx$|8n8iH$~Lcnds=Yw|Bng`D{I2k;bF9STcU7Uoa-Lf8@-O`l)&Z}R9motUC z9A4fiN0FQ4saAMVS_>~%d-uT0b#e^6Xq+~}%Y8E~@Zv7=kNx64aqA?!c-m}&7e}!d zzLY*S24C7mfxW&M3h<>pH15B+nP%bBlkjC7^~Fn@DG0|)w1*2X z?GW=+X3q<8@P(2l?YnpzzOwIr5PYT1d8r(}JhB$PJSJXig0CddZC}Z5ig@>x7vSG2 zgts34?c`UY;H%NIdid&gQ3YS!HED#e9uef6=2f_Q0A5Y8r^2hNz31T70va{1?zy6c zS9_+8!>fZtDPBFVhF3?$7qj4N`xty}|Fb9HYu(cleC?v}_`%nW8u+?_c-7Zqn@Zk! zMZh;3#WWCNQU(8|vFE@y&l6Mn&lErSFTd~j!+&g^x(NT-FD~`Me^l$>d-~Zx_>Vyv zq~A-R&;9Rb=Ptr)8AM0El{y(FeXo_i=J(oH!)x1A@U3zQzO|Q(cwalMf!B(OLcdl( zBkNmLvKqd3PF(GV*TyFpd^<)3-%e7_!1vcrO7Qv`6}-MN1ioEprA$87!?!Cb_x&0I zmVLXC$o==*=1#&74EA;KI_+V>>jMnF6HFZG^>a83-y!P$gGeE|;Pnw_y7Ub_m*5)# z_uAnH?XFh%&TumP;EbgWzR@Py;TwIy@Qogi34TbpC-`o>IT^m2L^SQYY2-36(;fof zj3i$5-5omkA?XWa;kyTyj>0z&>EXL)%_;ERi%J#zrzFS251Xgy8E1(U|L~lXa>GsV z+u0Z3zXqGs@42o^|J`Y8hyOn736_53=WT%>MK|TVd&LPqFI-N6pVv;Eh5xxxyw(W+ zvtb_KCmMSU{3Jj;Uj;we5CuOeAg1(_LSmagDb~U-Qd|wvFLG>y@QXY$k{J1n8ex`TT!OtR`q449bF!))f~_hTac; zwu2%-zY#Q>2R}P~wGQ4mNL>Go>bqy)=j*r;e!hX6xV&+(sqJ0)S$NZ=fnSe2-3Pyc zaCmp$?TgZH2o(muy+Fdio6(LsczZvwt~X_chmb@a9%xP;WQkQFu?QgWtt#;QexOuOHql3YC7dhK9+zM;W|(0?2s6pW@~P z!|zL7?eO+lKX}hb9N;(kOHJ^b5*55XP7kcK4a1w=A@B~xWrE*SsNfxH-Fwlus^Q&k zngG8tso^&r!hINi6=H<C+@ld-pjy4();z!)$o>qD)P=My8Bmq_3&0i9K7Eo zhTwnII<@fIFuL}BtOW13IZne{>z#q{UZGZcKVE5-el?_pw~93IPNA4chF@KvIq};B zz6#zccO8dchSHpT?*N1M_Qt~d=|tCmzr`K|zmB7Onu#C3)duiRFAcljl}Ac%^~AwD z1ENCu^(GU%bIt_6&k*JC&M?n}UlxmDc3FY}I%75Q#b1{N!*7c<((fwF ze(*MJalvm7TGjB&0Xz)999|1=ufb|~du24dn@0s3L@~U--MkilH$V@5dl!Xt-yIIW zyQr4lFKOa&Z<$|)KdlxYmPvouio-kpunP-9|47jCKWviX{}_e^8~?ao3xC+){*>(1 ztni}yaNbi}2GQo0CUQIQU*OE;=$~z$d$sUbzr+hcb7b*CO zqEYEkNuokZ7NL2R%~+6wO1>%pl`bqaq0fHj!AeMeuvQHZYH*k4K`p2rknr@N1=J5t zQN9aw5BflQFbt*#V<3HC1o(h#4MIN%1N{e?p!r}OM1Me!Rex|;rT(B6v>%*QsXk}} za;62L9}I!?kSz9s9-36}Fi92gFdcLc*MsRHb)xQJxhm{o4QL*oRv8}-sMLQ}(PRFs z2mPOo5cKB=i2HMf??f?#{<#cN|J;BD0e>OWhrfhC;9pj#BL0$1SO2n$PL#shzZ}8> z{f7YYWb35+kbH%Gn1=Ci|P>P^99R-!e>V7VP}n0PYI@`+CUydkMhb`{>bs?}y00k3q~oBCsI)AGr|v4+`+5`o|eC{^K01 z{3i{Ro&Q`%!}gzNB<;u4j--#*f%@YrJOv-u>)_+&AoAsRfcOMjs;zO-BQ33w9z_JH z9!23kc$7p3DU#|@nojp)}xa6{@6swIn?{N`+3S z;ZZ9VNRQg|(xYy@>d^pQ9HNt>AUzt>z+>Xak0~7UV=We`ABU)Pk0Vvm<0Q58I2HUJ zXMps09l+x}@PE7!E8uYn4yqm>qFbs1;qh_0a#9PAo7C#ZtyHp8t$N&z1#yqhfcl9E zRy-kZdeRfR{|Qa?CtEerlN}&E*`B*1^o{XrZCl_gL{D}nc3E7-~q6hUSu`2B+DG>Atbz;yb`E;Tjq)#eT`cJAQ z?I#3I|D+uZpPZ%v`^gZfKc)HpX%GZ_8bQAlEYy9P3;IvDg7oQbP<>iTzcPsZ^dJ`M zKkcT2b99lq2cOc=RC~%#Jfo)%l7=;YX!a+{U?yZ75_49enH;U7d6n;Qs|wIuprLc6 z)Z1t-qp52?NYsF$t4+g0~ zhnOd833uGP=K-gKrj(n*$KxNMzg{OqhMbwh`rYlMOGra|wOm-b|Hn?;slLrkRcI1BBLh zR}k5DSNRU>h;ERF37sBkokeB3e2+NmOK7Mf?VPL7;{#E8^i-M@orQEv&aTlD;yW4R z%fU(bneK~KIIt0CIY2C{XwFS;6}QX6X*{!ZoNOdYi&LaRqba~?(Ax9VDztB+ab@2| zuA1#Tu^JK`5l39tkwTx{v5wY8=qSWP z0q7|9l{`$favTq!l1)?zN2{6&bx>Cjq=S0J(GPh(SFSo=)TM$jw6y`*J(EW+oJt`} zSe(k%sc~upb?Vf1YUosfFSnceffO3`l%6)xyCy zo$Kkvq(}i=x+OJ zEY{;xXtVy|%@@DwYm1nnPykLfkuP*=zg`X>n-$F~3g diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniCNS-UTF8-V.bcmap deleted file mode 100644 index 22a27e4ddbe26664c57f778a864b6872f6c2ba03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 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 Uyk~SGTv&9{NH!N6NOao&1LeutHUIzs diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UCS2-V.bcmap deleted file mode 100644 index 53c534b7fecfd84e465c8943fe3adf500a4444f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY*)9BicPk;tzg!q5^X z$j}nrT*t6SW_C0~i#-EFiybR_iw6T^OAsT&9w{L02E+l)b2AxQoY)v!T$mVIY=JV; k+>9*_j-3Bx_sB55H!Wak%8eoOCt*p0P(FjU;qFB diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF16-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF16-H.bcmap deleted file mode 100644 index b95045b400a77419292cab245f9f66f6298dbb5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44086 zcmXuL2V7KF`ab@ibIaW6^e!EgB4Pmr8&^fe0uCT5A|Qew(xfPe%AR4E!pzWn7X+k; zU^hk+Tgqm$o2F)yY_h4FP1)USV#=oM|FGZR|HJ2V9qwGtJ@?$VJn!>9NBq~sjm0HZ zrAKn}%DtCHMTIY379JkuEoK*I<#;Dmm6hidmU+h&9V#v@DK0%&o|7FW6AKEw|95?v zcWF*pPU-RalSw%_-eF62#BGd?Pl`ndp!Q-7gWiVsVDJ}14MKl~=W2ZDX)h$E!w_P$ z+b|DAE;$ZcxG1kxf^iLSybL%9L<@jp=_kghLB>?zkb+%m%S*5ty96@8`YqtI79bVk z=?_LQ|Kp+9BUKAIrp0vFm4@R9F_#PTYm-e25SH6AHqw(aHy`~P5}?nqQ&hVETb|2H z5F^O26UdMk%P?|azzzfFLjR2d73U;l7{;Cl`AUgg8YlX0s#9(Q#)bvPP67-g!5Ekb z4wxuc#E5n<@vM(-$#CE^kz_9>`w*z<4@sb7Ig_n0a+;J5M@#8%VX%Qf&}n^KrKpBc zGL!f`&-5k{2dJyYJi}rDK?Z6U%rY#CB{G$rhNLWkp$*0u4|k*Md!?jq@nu=}>h1$Q zZX*Y8DM*2QD(*t+4X!!toQrmG^!vfzhK#6h1wNy^I2TOJ7T5m(eLy!AQ<|1{Ah|TqbcO&bLEa>(d-c4rq zlD6$lCHDS2qquUG*e~M$}E~Mou-Ip2p7|BOje4 zV>$0`pHdyurjpP6$%OLV)BRgVqI5~`ttzig{-p3q0pAw!aM7)d$=%waO!Ds|WD$9~ zS=)44xBT&8qv~(Ymg9ePxU^gQyA|3=Ws9PT`C`*YQ3G}_xLNF7U)a6bu;Ia~Pu+>~ zJ>S~R(?@kDrX#-0*01hN`IqKx?ds@Y@E2L~yIfsS_ukQne+Qe8K2s-| zV?_IKCYM?|={W=E{A44kK)P*%Nsk*@LwYsyr?o4%V?N}x%on7?V>wfITG-8GvcRf1Vh<#h*LuM*&{qgr z0c!W)av95nu%r^S71)6xBFjM{*g$O*o*!%hHEkzq$aU*g!2oit%tb_TI`U4A#wA|T z?`KxD1f&~xSaw}sJm>a~(_7qCj+lf;OFIg?+}f0%E51B5WPdSiYP;5d(5@v}qlou4 zA0c%mPop}s{*wHKyhC^k2+1AE@5yU**Vx2|Th5T$UBp;Oj0I1XPZe(#zghIL-?^Z3 zhb@(l^1gShT|T->;~c-SBkUXasrsjrZ`ltV=*WIgcp^1RO>4%Y>XNJ{zt8+f1d(eq zze*!SNr-~fOE2sa74d23DqxHO%PMG!2VE2tu!bPqn$Hie1`(MYWZIP?iq}5Bj~+|^ z#L&s;+Z>*rc~@QQ@}&Ips=lb%W%{LkCw}yO$9>dmva&(awM1m&yUwM{N zcPw<4(7Qc1bkMR?8`oLM#f=@cZ0%h_>I2`h9ba$zbNZJj`j=~@@vpble3wcrKG!^3 zowaV(%E_u>fu8=$Xc4jPuK9=ETkdbU5#!O8(yq;-H2(XhV>D74g3wBp!5{R?fh-XW z^nHr9@t=?SAyWvLLSb+@)9#P-B~a^$SgwoXv`ZvCkzm@1>wFk(I%muTT?RH((nzE&@-}IK|tzBO(=!hRWFq9_Zgy8-dXiU?n6P6e&>NgYZ zskb)1wShElCym>_-}8OS7lmIGd>;Gxrq5$rE9uo6&2hL|20AiVPewr3&ry1AjIeJHP0RWi4xo zXC<79p8MNtkphc=7dRf;i@EwjjbfMd*{tzh=l0CmK2t`T_C6|mR64le%k8B8@GtvB zVV6svJ9Ov3a4LLI4v$XY^K0R^NFWVzjcixI=)SRWfmY0=nLWc{8_CdYOE1DWBG|xY5x{5?_!$Eu@Y|hK`XH4mDp0i zcE&l@<)f>+XlT238m^tf*EmkUSn_N*bQas2()k7zGqO}Z5(!-rwrf6Yv25E))V`Rr zI*E?E;_f>HTQZ<2(wjITg9Oa3_KoRW!%}F<1F{~~h42}SAq87jGL|(GLm9JLsP*R! zN!YT(#u^|hcCCIbhh|ngrQPbivUy;TNqj~Y_Ac!We_JkG zE+RprtKLQ;*4TB&sLW-eOk?vfg;4@0ZC)yCD3>&>Wt&c6fdUSx$ZBj~FGawbawMj5 zjaswbvT8P_&h@W~zb4eVPA;8Gdw(j?x_p?6Js!(GB_oHTje{2$kx<4OBMORDAM@Zq-)|0b!ABF1&ZP;qwa z^wEJ0=A%~oxpnU;K5-tjZHp8Yn%^~rvlbWJd;mIa@ZdqN%LQj5Lm<=O1;$fMQ?b0x zR+MVU=t&@}WqL+16yb&tp&=LJm{=>>i=F@ZRy)*e)ap+mozZV(Qiag%1G^gQkzN| zPm8?f-L^pZr4)Wd*m4vMQMgj$s`+vZ{+#^%g6}=Z?{exQJ}4OrB#j(tWS@jI7XQuV zEBWM>xqd(I%0%ltJe*=sJT&{qTeb)K+72F$@N=reN3# zy#+9_od!9y8V{~w>Zq?JI$bIfaia8%GCP$)DGqYP!$3qBa-Qv>93#vicLaQZ|!@#;efyNnp6%C`oTL22q)~>ETvPw%c1> z?E<-mHPCcOsm*7|8ANtKZ53+p0LwupPLw5Xf0dD1d?kV)Lm-pMRP@O6ES+U?Q zzdJGAdP-YdMh}VV#PjANn00_2S1?OBT?yy{pmv9BJPf*WnUQ_WY(DC!L9Hol z!$~wAK%e;TbL&Jd@%cA3h$86u5TcPMKDxbgy5i4HM7#0BX3SHcraiT}! zCtZ8weU*ZCDRk~*x+E}|1x6?K3S9&@G~vNo!;!uS^o6W;IZVbv!){c&0j{ZV-9bF; z1GPn{BL!Qdnc20>>>63G1hkpZ=pjlHKf1R}WyoYK0l0Sa3WF!ICLn9P$R~dMX0~4# zFG%T+Ql(KQts52knaA;e-2H9X4`n};e!zXeew(B}(^7KP0M>jM_6N&i==Wj*a9<_TA*d~Yb35Te zDr%x`m~`QO6>CUB^;xQBjmRZkek*}mhswc@1&vqI2jh;{3Q3FVqWrBBCVNAkZWA@- zN4puTNXPwNl81<`hQw-J%&|U`CU~D+S)%%OeQ44*3h)$>w=ChtilJo@jFrRCda%TTE+6ZwptF=QhCxFKf3Fx>Lg898 z(r-ZxQq~v;!%0Z*#l4_{J`wt2u$-5&Gz)FSS9ggx`NIcWe05tzS@PpY8xb9!1vd{& z7ljs;;Nq*1?GBz?^EjVaDu|{0d!|n43BG%pbZvc1t$z2)$t@cB?lqH}ALoCQ(^LAm z)^P4;7-#?zqVqcp->;A)Hnf0w-f{CE@lJpi2X50L-kzW2aGXIhYkN zu8}r{ip=hW`yNc~LYZy{{ha)mMnI*4&Y*fSwQtL}JD#YYsEA?T?1moq9-FfPqH4FH z)fHyS;o3o{hU@W+A6kJ0=J^Bgd>ZaXFd(Aqp^^?iI@aVpIogkmM?`ja)8hc8N?}KH zonrUgWa8yz_YeH7@=4W`%HM*1Tl8f2ljOh0{(X}u?0ztr4;`nOj(iD*AUK-~!*DfoW*K)G7_B=O0{ z8>$=2Mf=_VoIJ`YkRLa&6b7;=CX(_TTsexb`=m6XsaEWKW;Ptu1!%)KI# zo^_w>dl3JG`9U`1em&_)!8iLwl(N3jMif$ZOi5@N+3v-)2VymaGcuZ+n3R~u)zGGP zx5zchl*|`OhGO1!f7|VC+v_Qkp>@AjcRT5hG)E8Z(Dsduq72o?)a)YLNOItn~ZZlz+9_LDOl$;Ehv7Ny?W~&Zs4hH&#RM zItH_Sd!R3cuE$qT4r=6kn9j1X9e)n|vh4S6?{Vi=Fk>4oWle~p&mNDd1-Neyqbp<^ zW1!xSRul}(X|P_6uV-=qx3D)(D=rUm;A<8ncY585%bQ84Ic>~#eKAubk~sXGatE5*o(n?E{(54 zETfWM_5!P`q&E?F?1NkW*ai(QfkA)DHBpp@kJJ6 z)KSe0(F))=L#k=9GO(8Ea%8UUWf{c6bB3g<~o)@N0@CPDg_CeI)+-(nQj}QcPSVWI9)UhY+&lQP_q(R zwm@rz-8E14_D1IR21@149#XY!Ri(nRPohq=~kB5B+(q`=a^C>*R^RD@>5dsWB*M zg5m`XjxI8lLZPwQ=X)1jDt~Vy_ughQs3wD|pKA!ypFw)kzg%Jp8jdBMZsd2I=(TS} zUmiAWg5C(w9RTAN^o$1!po>Edj<~TJYJ;F-~-dR8OzLg)x)x{rz6zIAs_1vjpN=4w>SBdtc1?_2#2tx!3ZXE|12 zB{C_Uw1j3`+&I&m0XcgH=U%ut!)b|&gu!03~awG4^S%wc^s+$sWr`Uqu%**U}{U}FF@ zdEkj%=wU3=QYz`(3O#2i8ki2?rk62NZYBfQpM;TY8L)SjO71LUrTBV|w08&edBVg# zm`JB7b8xj?YmGz!m;F_YLNnw^ZQ1Fz)OII;?;&1GKJuF$2Ar zj#)gn2hDBZ6wZQzdYBtVEn9HQW&uR|efL9DV2Ey;@=Gq;f!ThHUl>{y!qb zD_m*kvWUJOoBg}ag?A|4Eq}M-X3#*|_v`+RE<2trANOoKK^D}X{#8L5MNzpw>tYn# zu?5{?xVH=jx8t+Lltn{>$xQ2d7>`G^K7SC$c2VwU|IvG?3ax|4>@WSxnt234?{K=y+;=YNqC2r}BDD+8o$QQ#TJ%GXHEt}2OxqBhq&7@M`x_g5G!FY)XO_Od;{B-i zSN(hOw0tuA;_2a1ede6xTqV(CGR_RGX$eAqGbP% z_4%OP1p}MGNKLW|5Bj6tLv#(E-j)GbNI(4WmnwnPsM6S;1;ns{^hn;@U{U>Px%JGQ z6<5NZ-?{O&`)`YgAwwfebFf4|EV{j#^rVsV8_D?%#85>Hm48|I%05w=<~tDye_sSY zt%WAL`42yDVOu=dnJPR}sZpe@d?D@a<(4xSYF^$j8*4h!nQ7f;@-gGS)gn%dZNV&& zi;}dhT~%NZkTw!&MYWBqfG@FBF3#bvZJjXXyN$Qv4o<%gpT<}88 zj%YF)w=Be+wzB$U*`;W>SHt%n=Xw&*q#fHCgE@{tw3mWjSj}8Xhvqa+Apmd!MKkTr z^loEYp&qR<2$O z)3Nx4c#ehptJ%&}HU&-b@T?DC=O($%!lXSnNxNJ0&E72(73l%@HgXY?Iyc!!9atruy_C$kY`b_JWg)oq&R>_p%6(dh`FXn)RwYeL-MW@;A0+o9PH`Xiwu zoW-&^4v3V$WJllrr39?S?CcH&&9BmW4Qhx2eG=}BU}g`4DFDvJ!NfMO?1ttD&>mn$ zS#Fxrzavy1IWYQCHg<`d5Lq#s*h{+bJkwT?qLAzU&XB-$xW;&KZcL>r|AblF& zEaHxQsP#ha4h*378j;U9^bswY|Ch?==|E-1@A`wysm*p@Ws#u_>vl4;=&PKYJ~zE@ ztghd6Ax{j+Xc}CJ>g;iU5xUDk=Vq8#L-S#qBj4tLx)$QDK57$Wz+j8CB#Ujw1c8xZ82RosgiFf#|^ot zp#T~VIW=T~1T&l89{{2!i=|W7W&4)x~ zW?4%Hwq$T^D%_sRHg9Lmp3J}&UJJ55U(hGwkqCS)4|ODovdojy88jI3oFHJ1cBUDi zJ!+{a$vp9~9S;s}|3~Wzf<~1&b;V)Ay(ju>JJNHM^yGgnc{zk!3;(L-Dz+3pI7~*X zMIrOnbOGFV6?$cG-j2Dp1UeO5&r+rEf?fe7*eZWu(5if7#d3#1ho2d^b~L zoB5e}hgH>lf`pUHYsj^Xmu+5LSevI$*7^NC)w1pNEq!agUO~nWiJqB1b^C%jo1f(P zi%zhZBchBfW5UTnS)Hd2Wk(-0gU0af>g2fM<~}S>G0<}ob6lp;L96a z$0HnF7(L>~g3-)TNoTaZK_y0I{`_JTdzIlDR`CE0t9dCmkPRJ+n5&KyVNr2_aHSjz zyjp(c7)x13j%8Uls!(w9#1If>@1ao~e0l+o9@p-#_q-Q=%kh@O z@Av;c_2Jqpr{_T9l*M21m=b=dA~UN&nF|?8B14JKM?Jsl zzWB|)e9>w_l$}n2ewX#>LKs>K`c2SRLg52$tCDOInXI*! z%Ylj!M4YwZQy1F8kY^q4^6Bs;wWZ|T^64Fe5tf3M-2U9!U4w!s%_=h#;`(j4EgpB+ zV_h{^N*U{Fw%HBZr6S5YGh9ZGr$3FPqcjg4FmGv5ky=ceSD($XdJpB3IvX;(r8Qqv zWev3)23;^10JTV=L4yaDVQ(;=WXE?i`W+0#0%6@oe`!Id>QvBsTJ99biu#yNQ~ zpmEQ-XLTTRbm*kHj9T~Zb$R+D)7ySrLvHOJ@U4p?!+B)pAeqS|<3a5wCl8Wm6{K10 zI&+aZ7g@jAy5O2UeU1-0VsY&WT3P~`#6V2W&|3(U(C9r1mudN)^;N5VqoRL@C63fN zkc;cd#dV~6qb``VJN=k&p-hx#{nD8PU70}1Oyfq>wFivp?4%RAevIunj9UX)!i(sT za4DW1;nQM`;*i_Ox_)~y>_nR4YBhSkS<_Ys z(dgVVMgkWZiZIzbln*$JXCq;>f^FP{Msq~|(7OAYAnj3X0^YLKru`^rb4AIapwC!0 zZ;o|zkRXj1tlpO$LsN%%P5<)j%v%)N_8V z#`e%q+etFwLfVSY<&vApWHOFSZYAS!ZN7S^$q;fq@~0}b-A|=|J0apjm)rKhM4m== z==#X|*0qIL1&r?ls{)PLGBe?l z7Jmv1I}f3;3a-fwh%+XR>})z}j75#1$cdfajiyuJ`6${O18X8>R=GK<0m63=f;NvX zDfDOYLjZjds8@q-P*nw`L3$UU^GTo=_!k9kpbAgfqBqu{=3G3;!63l>V=%|UMO!qs zLDCzB`WdDni)&aW+>xV>UCem20!yZX(3JQ5CH2|T-UJxjfor3wn^AmhUd>&}6>Sf_ zbHB#EKEcz-O6#|K8n?RDQ|%A7Y*d@vnEDKCJ;k;jQRu^DT5q}8iD}72WU1(K=;3F3 zXlX;SoDD4i=XnIRN=3U#a+OpuPkalkR3TN!R2)ya23me9Z8WOvi8cip4}LS^6*L%C zdxqRBAcmF15c!9=`VIG3GQ5}!hicT>H~*IVbH!Zt-wMgx$(NmtUX$XLQy<2W^XvW? z`>HePO?|;uBhUW*om}nFx5~+F_d%8nIQ(4m^BFR*m<)tIqCLm#Cle*myaB$5f!7i= z((Lzpx00^3H{@@~eo_9S_{H`Y8$uhSC~szB{BxR{GhVQmylS8@|o_^byr&fsQ7c#S!%&Z|344J^> zxzk!Vk;}=l?u0Hk+$&{Y^@e+LjWnmE*MVkaGUP~x97uh}m35Cj$+fC4vgpOy=RLu& zlDU15F_pmOgBoQ{(`E6=5^^{1i>NPF-EqC+LT>IMH&e)jBbjh`&;5FY$m9%;P`5I# z1JWU-e{iljrlE}7-axKP$aS7r77|O~-?_80Z#I&f(WK|JVU4&e=cXl<>D|WYDdD+? zYma73rIM~2%;)T~SvN zm}{7`F;KTsM(J9ejJ>cDb=bgw4O_b!H3cbJRH%MC+rL&)8xKv#IVwUaLHcd1DOXC? zpgu=r@!}}0VhMq+M5cZ_YFNOGq%#B6OkXH#I4afeWQ`#(aL}oL71!tNKYEzad)c+o z+EP6aA4k=!DF}C-K|Nt$;h@P^Ql|vsgW4F>ww&+t#*M{HYXKTxiu$&SfjQ4!-o(>N zhEiP=EK*7ag0y9r<0UelkuVB-$~#f!nUM*UfaWNLi6u%TIAR4zzy?bhTZ1EOa9T)v zB+4arWDV!d+KIL~*KhA3GE=ZyU1~6qQ)_kU%HZ@-xV_TFk?7m0lC*4bo6!h>wSOTda; zuK2|vj*@&V?Kx`XxrNlMZYapZxR%hj*K|~C3%}d&-TLp=eYcYS<(b}fFunjarDB~c zI}ps1RU(snYBo#e%uol-J^dx3Vj}vK8d+}ph>A3^t$L5ec8}V zi?veFhQTH}<;$~$v_~(aY8k1BbFX~qNyD5x_wCsn0Y9~&zVl#nR}`^sCKF4^MEFxm zm*jqG3g;WracvqJ-h~E=p~GG_ypGQK@3XnQRN;%2bew;GDavg$>O788t}S-tVbv9z zJ{5ks_~p{4JD#q-5wr_5 zZh3301?Q9dQ=cY3-N!vB>y4ZU9ap!}(3(YFI`AgXJWU~uA*3<*Y1z|KG7wRBnw$$K zH#D_to(t5-^0H>DU)lc3j@c8lr||RKm>p@%dzvF|%{$(AP}aPb(Uw3jV`BkXmj`1! zM)fq%MwKj~h^U~>6B}(6ZOesv9_eCG%MsS<&@56jiT(_ zR!JR|3&k*Fj&7Z&us%gGtwi1q=kvG;AEqVQMH|BE{J92K<~%6-d?X!5eA{g({A=@v{mSLIZTJ5?kK@}fFDVBY<9Hm_mfPdt0x%MNHU}IU)bziM%(PYTfkHb z1810~g|hZ|N$XC=M5RWh$ck`#fVe%cd`^x*zCiB8us$?@c{?bi0*586LP}X(d!^c& zwHL61l2c#~dr+p=5eHx=-Ue)VXX@;BjHiUdA=rUZ|Co9{mP%>y1jvWhZ+5g}j1`oX zQYaUB@?M;SgatLn$XSU3E2T<%8_e6v5v^1y&+RTaAzWD-Z8y&-P`1PlM4!C=dlgZ& ziIN6CNyFwWazwBoSBsORe&s5?w})Xl(x(UL3Y8WcsNZf=!WnW{b1GYF=TOH0sk9|q z?CXwV5NHgyjg`@fXc9K^VEDg%F zB7AlN$nVpEOyoj4?I9nn9kL&h{TfJqf9Tc7UxUfn0MnL{Sn|iPUl)q9qa7p57IYnh z_WfvLuViu$GOl6H9_Q+gp~fYMED=>lyPi$sx>E2=5}t|YW)ff~kw$Nf+iamz$@lw$ z?g-x%#q_3&{L#*TMN$Dc4YYFlz#7@nH_WH!vTmGK-~oYL3Ma3vC$Fs|*OEl}(GQ0c zg&_P%it`6c!W_j+=F0=@h}(g-^j`*<53U>jHb zi6yU8v~D&~<}BuyjlXOlQ*k55MVEqAX9HN19d20-)@9IE#q{tnRfV)_eqaY{T#7n; zn6rD4Whr!2LtQ>JFfhIs*Dm3-zMOVD>Wtv~PcaS7(6L423btMFm2whrwn0FD+xm^Y z(#DOl1avK=1r&fa=GD<+(t{X%RK#dQW*pDTMWMiQVIiK}4wIX(wG^yn>{tbmi-AC{ zEZ5i+3^u693;E=Rl-v-AF?M>p-cRe_8B1P^C&uNsa;%HUwE|*XaxFo0D!AMzV|A-x zLO{9|K$gQq1e~WtOAt$FE$GMi!jL2C-Ym34aK5fW8Y_deaGMbkPp7|!;MrH3X569_q{NqA2JHiapyXKLza&lHi-l%?Zn11oo zH~GYv)0f+@r9H5NKHy#;&z}&Lh4LW}-s;GjJeZac+_IcEd$PJMd|e#v)C%Jf(BlB6 z4A6#%ibD26?0kO}$z%)_mbfyid4d_q8CQ`jRDM$~Q_)@SP;84KxBUMfr*}E7 zA=mpx-aNh6d+6#3^7>w4a(`ywGoi#}M;<#u8Fg>9m9;XaD6&IX}t@km0;7mTNN z;^t#uEMY8^>C9(458yFJsLNw+IB;ioV@nWjasrb*ZV*u2PCVex42Ouguz15gXZbnw)9sKQJc(9O}iv(JC_aA}&Z06E2Xe?s2>sgZ&nfJo*DTV z{m+f$VI~=^x*z@fpo=l$vLdc4i*2z%ohPA%id|CC&E0TwFYa23x*}n$5RWC}t^iE) ze0MIQl+|T9yj;!<#i5~PXh=kZNAdH~=-O(gKN59v0tEsW_6oza4^$+1_81z7#zq&W z!&A;-PJMPU)P*pVs?#ljo2B^q1KeE8o<7rAnD!cJt0p6S@ecO`M!7?CTwH3Re7Wz@e4j9ck<&wg9XQ_ZzTS@g=e zpi6;YmA_LwTTRS)xHT|uYy?RQd&O+z*E;-DD^Zf^fy{b#C)C5u?r6U#bs zY5AKm5B$W1#gQ{=N$);I?_P9vvCMLS(QZHncjnR#=JHX#F(1z5GB2~pmQf%UF_M=O zm>_s5e}1P7Tu4$H#eBh)#erjw{a%{K&t92>om(VJ0o9X_I6@yhR( z(yCcy<1i1!=X1$?86lPV21^xNGw0oIzOL3tOI%*u_iiF-h{B{{#TN&^$b5G>BQ7ZM zn^|N_i37Xm4&mprRiJoQ11~1REn0pq0OJ|f=(9mh-TsqP@!dwl!mBnhym}jU+ zXEigWV5Sq$z+te;;hqc+N%0WPN}{S{;fs4ASW>?Z)o+wH=CX~E;HxmlGPNgg-3qqe zhBNI13h5d=M80I{(?rkE1^xonkJExxS~7Jx>E7wqN>g$DLGlvaI^;*{e91dCqN3!+ zFb#up+*A&&#mw+lXsm&jO>9%4+H@L>F=!~8F;t0M$@R;L6cvF~V5ts;DS77mV3oqg zMWZPBq-8sKv7EeF*mLr-;>ES(RZnt7)9%-}h&;2E%;t!`B|r4LA@c#IZKr%Rh4#*6 zWE<0v115jDF;F@naMm)%mLrJdt6Rc2<00Hrz?0*u)(YOZiY7QVm9@|q(gK=SHepep>GlDTS9@O6Wg)~cYE_) zYw6w-)R(~yU~Jus>uKZgG}oLD%}2Q5!@QMa+YjMRPt+EzYVgB4`gls(8IgfR%b}so zqC?4#-zT^S)9zn9ZPvTYTa$#9t6T%;yY)&t8<(JYyb`XU430)#8qwlsIylD8g&0cy zm3n7A8F!)F*F)i~y~ver>D&&35zIg^T;D+DpvuyeOGk-$)%)@{Bgou3a(_Fyzl~Uw z#G)V%3dw^4^596_dNHW<@TFL|u@N;cV<&jv@hqKW2xD}B+6|l&w5##$0`663c-3j% zs4*xU6_+YtbQ`)80e4o=u2G|i>qJRA4|7x-ln-|qM!%4KkxJOmO$oXwu(veGkj~N- zYIFu2%U|6eRqe8>9D*xgEg;k(XpbmH1Ee%3O0U z&5$u%-n>zJtZfA^5&cSkm^uTqNz4{@&IMs!#$4RZUW`WqJe0$OQ_OS@blbzjGZfiV z%^@x0yUV~727NVfAqMq2;$A0wld4Nn!7QgMebW`rlTA9L=?*4Cpte{Hx~zri>bTYP+?M8-tEL6!#@qd*Caz5$*m&NyLi&+ z8;9@hHHxx|=R>{~K8-T1{72D00>}nK_@`l{cO~hK{4_#bQl=Y>!|h8^_f}*)h)1(% zdHrk>tB+x>InZb~CPj^_@zr&3cLDSlQ2GL{7f`j86a0x||5${ioQ#Ia>4Uh%cb@Ec zaS6N_E>W-o>ZUs>DyhVTVO~4UzK(5XPNVu7h{q%buBWjwn2<;(=%z)!Yq^NZe!Cwd z%FB#DRsC<#S+$))W#h!tlHAFkr8&AhV0IZp+6qY9(fL+xTLoz=Cv8VaTOOgc>HPU) zqO^Q@nSbaslX0wrKb|sb~mE0c5*x5kJz058V z`fQ|qYCP+!u;#MXOlqxYHdK_9*Zk~9H)K-hVOgb9M50Dn{?1F;pYh~fMBWA3u_E1W5i^!uD4S=1SB;t(}hcvIK5q!=NM5 zEy6k<=0PQTP$i-Y#mfOAU;gyxN*Dk6%LJ-a)i_ivI=jf?PVSx|f2nxG|2=#1w@kW$ zZzRW*ayG6toZK%ZABK<*gUKs<+LOqKi%3Jl?+Zm`MXV{FZ%o8pZmgw{rQF(R4D~6Y zT>^S1rsK3!SH_snC`p=VQ?YK=i2^DK74Kq3!J;l-*5oeeocLBBrYRdY<#47wj46d_ za$wAIk*iq$i?7lqAZ&hu8bw88PYt;rN^U5p>E5RTVlMo@_={`Y`t(d-+ z!_caj=jhU0_~j5C>E5*>M)Dp)P_WhrxB#vIxwA`X_Kz=;y0e-3Y$vVsSe`SB-`iaXY(oY0p+1~9U+8?iM*oyTcGAQS_2sxn{ zXJkGDwMs^(R}Ek+&x zM~5%8GwAgKxRZhU6pU#LOuOM*uBiP8?puYg#8BNF(j)XBTuygsvm;BOXA8Pr&amj* zTBtk5OfEuqT)8`La6cBvPIzd8W+RZEs@bDK>x@RcDNMriBJx%b+FOIyGtlelaN8c; zR^S&-K+{G=-C^eSy)aklI z%~Y6v{9nIOS@%5KN`=@o28AOX0!wE&*NuhH+Q;v0&(3s8j9YU>$HLg+&%5Ytj zL|>q6OMvc3)Fc<04zgAcMdwD`;siZ$aDE#eS96n8Ww~7RIPv`zN-;~Q=2F5cRSZup zR)ys>Z`!LA{9FMuw~q!!H4^M6QyD3mOu%Y1$T|-klha*?)V_Gp{=^Ue4Rfb@RSE>C zA96ec4wO`yC#~l*358DHp21Rqr>0*yXx>jg&m*0#q|@d9KRS|52lCIgjO@$<*1hl%#HsV7oT4#%eo#fvQ%6O;TRFcU7y?ysXp8W8FfY zQFc*WD1p|+pe^C*vT*~|6|a`oF9B1UgyMzsHCP`kYm|x+l^0&lW+&Hjlj~q|J@lj_ zt*fF-lu_&oXIBX(fnnIm^>{KAPcBASm|P*5j1ro8wwdD^L)pdk{%Q zr3}_niQpe1$;(?rq3Q+e4s1$5LkiTsiy7uXzlvMP_iqqU)uU?*L|pZILXxPbtExV} z=Jj?0`R88phEF4q`<~?4_2k)gq*F~gRiyKO@8aVnmIP5=^<#4&9@v4-F2#M}vh%Ca z5LH5i31e0G`Wo(1q20J33McV3|9On16e#U#N|d$9a8roLRsBLp8I?CE>|E@q_U7cu zYl}!Hed~p!vw(bEQ=eKzK5-+T*ZdYL@+UWU1lZJDYbaQkqPo-W?eyF4|3*3UWF?_{$iBBF-`kLOiS(Te z^3MX&&WUVwbW;ii*@~9c$Pz3H)k|+2qa)i=`9BW^1sFnDPm!-)MrtGe&nfASDA1^@ z6D*?T_}McJ5#-g)7J-?{@iYKc9VRjP@vKU z!*SH(1sBWt203fVqXY(J@R$Z3vq+c3SqoWfo?N$6R=WiHD)DF;?kd3DZZH@tMpnOm z(^lXq7$5auTLYlEOc-?&Mx7CZMqOm1_8^Cbc+{|+2g#@l(DUYW)V&IiI#V8O)Il*y zx4)!PWdw~-v=Xug3U#~H{gD(*bR1#2!&&VCP@&E^L?W54lhX0!4wyFBC}qvi{|ZFK zGQvD;QDM3r1$xT_T|8LrMVsn3h|bX~aDG3i%FdRSNM4H;twXRVT0vO{TGP^op+1%?IzNBuW1Oh>WJAuO`5RTyP?rs5Q@8YgNfCK^r zic6tIYX1sV+)9gUp-{9qe821W+%q?`V>>%L^UmwLoc$Qjet|wq62!-8A-tBuoap;w z)ne~r>suyMYRHu8QpRMqkaG%qqe1wZp43_?j2D~Z#D<=+D`(qlBu0EO#{=r}X%q1@ znHJT?GJV{POw2)YZR$h$A%>N6DQ||=O&>4f5Kbk{7a0ahi8ac(Y#htz$nzSpj6syq z+mPIb09^&vOImGJH;ClA#*C?yv``c~SaDyzF2Zh3Y$cNxxEU{Cy?6vhdij{3S>+#& zVQ>GoQ`+eC9{CQry6L;1!VYO;vx4%*+G7$w|9S+=sn2XIIgxU}F^^{1gA_>n%p96T zdGpmASQhwDS}pFy@+YzUv7#W9>2;|QD>hTgBAzmxR?cIvMsf`Y4o2w%nTc{+P;P5( z@^FGb2HOJWskCBUO@&LSa5~NeA<}I^))Z+2sL0APhS@3c?QhlXmc*knxqCpc#VuJ? zpuLA@P?U&l^p$EdA2;wk{nmuLuM)OZP3OqZX$~tOJ|F$5IZfiXZEs3 zEbH`RAI$W+p5}FZC?$v`O;9oyi>yW>%cy~6oMK^X=hNC6tRMiJPVoGGYFdAuZf6D6 zn2-3eiu$7;O`tTv^1IXe7?F*a5A*YoJeovQqEy4*eGs|1(##)j+b9f(Pa*MnAiIjqZW-l_RJYWYlcCEUqGOd zUWvJu@Z_pWYKUD~_V4Z)2F1ff0d}$MwM-f6h4bCvvD`N&J~bkL@TzXd$FH@lHGgmV z-YmYKCSTN&yW9K*vzz778>}q7lj3x!c@Fl)boYFo52E7PhOesG&N`qx#B(OH9n%QT zA-uQryqtJs5< z7iJArv#N`t*<5zw=@Wcc&t!XQi!Dt>$~>{9wzhMq!DSbjL0U;oCPO__Im>QqN(1uL zM@W^eo<(vDt)Hsx^kwS+?3b@Q)Dcw8rh&9+5EWH676qA#pzAQwoCK`RDhev|f=~+w zIK=jcV1}tVv(2R;G)GBaXtyn24-u1l=Nip!$)OvlfomQKod7cg1m+c9#r5T_iL$(j zEN_heGj-3@ITck=>C*xBfEATt>WSR~UX5U1Cu(0Wqw}rkd~3F=3pOxYGme)hlFlh< zI?rp${^tfh$3oatwyrPR+TYGs)cK`7+%OqdM8L_62_tYLs|EyzX+@vUhRX6@@_to$ zKT>A3l36X~jS=$3aQSeFU91@XZIHQm5xW%Vu&kKzbzstr47JGGOJ)VUtz8(OGEk<5 zy@gMh6^Z{_#30dK)dZT|<`vF0{nEp}9e%uRjv{}JlUKXQtDWV8nB-}8T2ZiXmcwgB zap??scCP%zSN`H7-}G=+`nmbf@$zLyxns%cZfSM4dB|TC`Km=fhjqm#xr0-d|JqpY zm@9Y8J3pbgo_tsf)yiwg6X9~l0(AM=zC{k(io=;x-I~j$=avS2JIkHka;KMk;`w-_U6CxO>eel1fD_4^gw79xlKA?&@2z{uxAaFyTWBj z)T+k0_8${=3_mwuFL+||X4)vzbdQ`^yN~=~{TTk`eE4huRkpSv%M24d^umfw;yb0H|w8mnG3|M6oSGqmTTrdz!r*BRyZDfCDM=l5NQ|sVVTj| z%~)|*_21G$zUaJaio6P`M_^`UZB@-xjpYxc<%1@hS~_g{ANjqo6OVB{#gysusTTF$ za2rIfos!k*t`~0hVD((F5lBaJUnbA_^K8Z~OdhMosAZ5k(XMJ$FSB6wr)kOTx2)PZq9l3 zob2iLO3oSU>l?~Pv3(PHC1BEu!NfLH;i(Zyrk_|ln#C$!ya#JeUKC`g1YFI=HVslX z#j$O5nXF}3oax`!wqy*lNL9(6jLVf!X#9UH&|z{OkeQ9;v1xl|?U|cBDH{_#R2~~v z(ahe+`SsS}tgeWr1D-r(FoD_TQ1(ZYg>2%>Iqb`YP$&3m5c_Jfh!Go_u?+*k%GiHKg7B{hW?i`SWP`^NhnCWp1=A zYb(oQp?`0WO3L}9vZWw|6@(dVz(fk8L}4vxgtN7+HRzKJDsdwV;PwN&Mnif&3pcP|5RkE|*pE8Khk6qeqex#}^O!B}J#u3+n~8S46( z_Q<5X-(dUH)9iMaHHRln_DY@ZlNHFaDtoxb7y^}~NR!J#&X&9|h!u`BF@ozDSGdp{ zc%-)$CehZMnP|;wsAP<@<&6QyF1@psJf6Ee`O4bL>bY>D0QhB1%9Ysz+|;+1Pe`@! z`VBjJxk*b1A3=$jlNaTLovOpd=dF^0_g6ZckmF=HA{Ok>MjRb(eb*%a?dQEZ)Vgj_ z=(aFLs+tdzeKe;(FR4lEjD`(0*rDpIxEt;EwGT;&{Jb6uB?W998;7Mi9CZ4F@HZPR zqLQXi!BkN&LGuM~(7oV`CL4;DkZLIE%ZrA-as;zz0VD77xD zF!Oa$VqKV$648^nw3Xv(fhn-|(jMzH)AA}5%`6Kifm zmfOf6E78hi?Wq;iQgq zmsvrTEB}cbAlRV)pSL>YRZFVd0lLqk6172d2_ryI5i`EIjw50q>UEI?NnDA zL*8WVNEg~ZRcu(~37zrcFkUv+>RbrJ0VWrVyeM;KHxJmsBsqku0n40XOt8szlx^`T zU#cXJw}+*s9%>ils_Dm}(V*h*6DGDUXL${cS%D(C4$G@fEBkR*Rkvh`!__QvQ}Nq} zv+cu-+ZOU|GmJ1&#-Zh*8cb%pF*Q@>Hw}n1TB|pNmUn>F>Gq)4uhrfjT0$P05CP);<5E)n?A1w-sw z+BjLzP1XFsx%aE=8|JX3eeqSI+zL@`mEzD#%U$#Ij5>NoPD%9T>Dd+U}8d{_p^|`Yfq%`hfFIWVd2_Ay1-p(~Nn3EEfbM$8CO-g}`{-!T`4k zio=|4*t~4-ObPtw|Ml|LMaXsGa-%_R)a1Gvc1rJhK(U9V`+hr_z)DGtp`;od+?UKS z(mRQyC6pPd}Hm-5Q#G#u?@9&;eB59neG(*on_*yW$@j@#kUd|nn=98X&u%LzeYz}< zlj{=gO8TPm1W!4NrB5k9FHB@uPt0U}M`i}o~5pa??Uv(y^ z&R!&g>^yz1Eb{h-JyrU#|4ovcrpnSTvb3|Tm?0~s%hF-8bf_$K$kN{U&!~;w&VM~p zO>X3;*RxyFFMPioS_8o%hQdi>t{K8L95G&)T}{6%i)y>~s|J-khfn&yKk%Hy?D}$j zb6LJzmcvkIf-D^`w?@dV;d1MUw5dtM0<?ue5Wb-@sRQWDyCal zx>+5iW+o{5VsmPkq6f3=0a`YE>U3i%U0L!F(z|)2RTs|XI2Mvro*bxVOy*fbOuD}) zixj29Sh^oMp*`9XBZ3RDgqW^^HSdejto^}5u5T*W*O2S0%WE~aw@It&th{n;ew4$S zv2|_DA#R*wq*yz08%U%u$Kc3w%H zH6p{jVWGn#jv5*FWpM*NZOW>lDZSGg z=MKpooHlJE)EkRE8y5{+<6mq{GM6qXn)d1V{ec;yx4?+6W^wd^wg+N24Ow5w)vj=u zd>$tsh@w{OyB}zg>ajCAdxF_xRCY8q4 zy4`}YZGxq=`+pEH1!1{q{4wt1wXV4`}=A02pP zROXpO?SYwH4$WsdAeXCZsc?1UP_iwd*~_37kHZf_F`+o)SRNcBOaM!qIsKI6T2Q-W zatccu&r&C0RA4)W$>K&+m%y#Kv7n7-NFG*@dC zlrVIvQ(!Z>SgVVXKKQALCpY@qDf6RTS<7L{GP>=j{p9AlvbWqgSZ-@2x3!cNzUlD& zmKE^7HjcookT3nStgn_I7`(l%Ug)9cPe@y`uY1azoiz>`H+QO7x^qhD(9~h2ff-)g zduP`-)(s=hruYf6q)**0A4s>-(eux$fak zqaa=swzo%SO*=GCwRtfskQbKPQDk-ZNDeaQEMS|Ad}9l4ArFFbi=vQ+uLXEMc(6>- zVpzBppo$bj15rmy>nzeb!C(Vs$97xRRJpQq90+mn@PKvTB(_?uZaF?A*?taFcFi=; zgK_enSswM2M?LV*dpmv>2!ItnL!?Ht*;K%S67xtTgao$(p;FR2b0F)y0PSJyR^&9*noF8P(H9InDSEVI{jV(YpJ;a?bIN&}S& zN!l2u$FenT#KvBf-XFrZ>_8@{-LVz&&tCU_w5tc15=_K0ce@W~nRWoLPCuB;Gn7r$Yk+%QgV7^|;O*c-QH z(FTyJ%jC%}YnrTSe5gm7U*QnDDQE7+k$kNeL>2q|***y3sxapr}8 z6ZTU`R_7yq&eY8b)|>s%S)Q!!@XE=}@=x~D3*zL5pt70yYKnL2;L?`sW~`gOdBBDl z`pU6-X`;*9E^;=4D}A~;lSf)QOgYzlIAlIc;)lh`r$0i!t$3xMHV+XxT{TN z%z$0Z`Bs*Mz!eUVLxbY*%(=0)n|vE9FT|^wywF`<=w|q##;U1$lBTZ<{l2rj&{uwF zi#d2%G>DZ9U^%_Smc<+%k9AmEbYM;+&uE3-pY7`8{<46ba-RRX#1WEfD(hZrU2l0| zsJt*pUKl9fMr50dn*I=?ubVI52A)^;_4vM~zK+XnOHTG!+d^NtRDQH?=((|8R=ZWL zzxBKmY4^#kzN@=tWyd1ev2f#>VSHs92JYLwdK>_t%t%m9Ts=$O=Su*9-*x0aOcC4q zvb6zrHMikcttzG0@O5~q@BFzTNvt=b?=LDRg=4na%Tg% zv%dUv`Nkl5F+ktcZFlQ$DsQUI%O>KMDaU59eNjwatc1PRldb9D@XXEmdQ5iM@tX2^ zxL#(`fs&kSBF{CJ_X6d;0C~?>-t&?7g5=C(NR?Oq+EqHoMxJd(J0w_@& zt5^y|JEbP2)PX}Fx2DVPZJ69PRBjt$_sDCp#pt$I;~8}+Pi4@xS-n6> zAEm4@^3DDnS}~b5l#({Iy1(6!*YbxDn;GumROSU?3qb~z*F~-wgm>$mH|a3@&7kM@ z)i*ZMH#U?XLJxOWPt7~E)U9RwZI4s&sjZW$^Z@t1xzOZN2J`r}gN!h|=`>GLoZlqq+2;Kjg6(s{x z%=V6X=YCoUzSOD_Y}H_qHcic5z*bF$hIV33={Nf+~!O@>@`T zN1#k1s~z6jdAT;k+s6hi?0{gu%4TczT9Nh5W}6?5O28V2HGkvJP2}eOa$n8N`f@X@ zWQX|&M%I=UQ1_y6Nr&p{B9c8QyBVO0DG5f0BjDtpOKx^e6Z#b2?0SaW zx`yGD>LFZBK*(^{Xpw2d_axYObH);$JJFQ3h-ADuyBg1q@<@uJta`>Ii;~gZkSYvm z-q35%a_U*6#*#CLFDA@dWOvTg`lJDqh@E5lb1B}KF1 zjua%E-0B=h(oANPtZfKa3Vo?CfGxzBGr)4}D!jST&_FFRh@x0lG>MW%^6bv!B}!Yd zvhhkr12v--)lgT~fU6RVba2_50@bp9R0hxXJ>mISaY4zm4lj&iX^mM{bC#WGE(-$i z_bT{Qmd3lec7AXi<^wXmQgmc3MRAj~Ucm;?oo?;7SUR>7Vcy*zOqYF@T@2c7`jbex9 zxc@KCQa`JYnqTJj_^IQT#I!D3niS9dA3GeBG)6BRZ4WB^bM0`JGfk{%NU5ES>qog= zE5gGy-0|$PiCs&fzCo+1ij-kg)Q2U_2IGse3W4D|Lad6_Y3Fs+&ZUVi>!bxjywH3#4@ZxPFAWiDv1 zxkj604L(*as&Cw8vwIcQIWQGgpB_qk>Itq!Iw4>eVT~H!tc2|2K9~wCUGH5g{R6?OIVeyh<3{`u&(a-vEcL=w4CxU2`h}D+1)5 ziTds(+ZtDNDXmj6d!7F}zt6{Dyf2G-te(EgKW9p5Sn1SV5s*{f8Ln@crT5Vr+kK1G za)WTy0Aq2-5(dUogdw9F+t;2BsB{3k1{QE7Row3A_TzIa%b0BKW@~R8WLJu{ot|z+ z5Z;?sYyjAX*azcw>%BO9i(75#~p< zq^|;=5+$EklRvcjcDbJ3Tt2U{H~3ggdLOhe%$o7Aqx`(Ld|vm<0Xuu^N%iG-hR@-V zuXxLv(d@U0z(x--_NK*O zLY|b=nq|%8(1M0}J~ldBQl+$FJ8RL-<*Gi~XZu2MIxNK~?MKBkl7cTvK@gbPjO#5aqZdo|W6anR2P-RSvEcUQ)aOx@ zK7r+!ML`2f_hY(;nmI=0ykHXXPD4c`R(H zSGItWo>t!1mgVhRu)xSnNez{x7_jj+nw5>7I5%;w8OtlFf=}cV;Bt}a5nA#RwXiGa zz(Xn(eu{(_V6bmx?|_hM{=os&+~)$^mm^k`fJmQUvxmj(@Lc)v z+ivnpER!Z#1d{lhx$?^OMdDpKlPAb$H=ei+5J~}eFx_ZGguZ5%7G%K zBUI5XDGiN!Rj|Yj(#V})Pesk~|?b zc*DqwD(fb>f-ZPn9k(U&^LE=8l+4yA>aH^tbkwt;EVOEE*)q1JDwjiqa|th9T76}rsmMz$if3y&*Ds&eH=Eg; zt=jq}GnUpPJ5TPXGDB_*<<)zdQjZ|%Q6q+s~wn2N!AUT^tWe3h`ea|Jl@s~6`5 zF}XEVgTIuDn^0E5;5dFY##Hgs3 zjk9a3^NXs8jLNKF8Pok(c7jKKu-&$L^TFC$5oamU3@$3t8D%80tj<;-NN{YH)Sl%o zq1@>#AG5o9pWI{*Z;U}+{LyHVhZ@W8hRN@S%5Pi9Z=1_QZRDZW^4O&8=5{KfFN8gO z^}{dQ3Rf?i9--z=hwW>YCrD6$(5z?%-cap^5+*k#*6s|Sq<$V&1C+2Fwvx#|TIJ!n z`uYj0qtm)2MQ?AiZnnNUSU(iBvd@9)pE%HHQNCb@XESI)Wr1ZglYKFQeKFW!Dbb7k z_4VWRt@DnK{d7v^h;O>ezpe6b+b%Y->)AM+pf}sMJ`kn|ot!bUz*&b4I^~hAL5j2JVXt~15Z6;VZ7_e-n0!tAx^7DLa(kmSJ&%lI8SVCszQF>t*;a31>|_sGn;^F=!#QINuJa#2 z0dfKi%V_=Y^f0kjjeWv=!%=STFu8JluizT7z_%kE9;Ly*M0m+BgXNbF_1?U%+Wp$% z*XCc((znjlw@_YRy{MMMT3WYk91?nAPrWcs-d!#}iPH0`=_T{_&BZFIT-qjUJn1t< z(oD)2qO9(!IGg$9#s_Ca`dWOJ`uQ8vrx-z)XHVm4D$lPkT+Nyk_ETKbt*ZwHZ*JmO z*0A1MZ>6xWmKJWq&W4Gxgs`o2<_7b?w85QqlV+f#!BTS$viB>EJ=j5oGKu@au*=eo zYPx_-(@S9G(2m}s7Sp@XYM@8GSV0@%>~6%yQ&KCdsUg6$(*}!TGj!RM3J0rb$16Jd zt{liqM|ot|VY*wb9o&7qe!Umd69A4G@OX;l9cWKYu^T(C6D#ism4xyx*e)CAS~qla za~%vgz0I1MKAa_Y6=}U_2R<045&VO}*##CAXDd6=YQ|+N2p5G~*hMMqYAo-E)dbaP z&gFcOT$RDs*tSNjAl4pL+D>k3hi|<>chvoW2BQ@qL(?Mbghu-YctPrHwYuqJwei!r&>tMXt?#~o(sE9!qV@2z}F6kSdxuQjvf{)F7 zR;`%c(C%}$*fpTOjAhEk`s+NVUG%ATa6+npt3cdbs~;c>;Q1ThZRnFcYS1DnWXX6~ zlq^7ipW{_^?ew|`hB$Wh?o_$Uv9WEEDmxYjRVfbBlu>n9_;BECUM?GHt}ug_D++Pb z&Z=uLtKu5Pf|B@WU1=Jp8GaUAt~aW#@Hr9Vm0ie!ipl0xT9lN@jM#kXmEW$f4< zNu!Gz^O34y4x>a)vluO@*+(C1>*s9dQ7x&poNtmd_4{KqR~tsI-a8V7tDQR$Os;{5 zJ0kQ&=#0<@p*uoX2F8|b&2^0i>SoDFMvtPLt&|!+ipDO4`^ZtGTd5>y6uGL=29HrB zpV7v4qo_|?+Uz|lu+I+K;*rK^OPvcLv}Jx5+Unhjwg!69)`lHvYts(2b+EM2)(P36 zR8a|@8bc7mJa|P_K@~Mrs;Fh4in=wZqBZe~SRxTTH$e$5P+s3K1ZJNYKB5cWZXxGBQv|CN`rtJ+T z()NyeGbpw=yV8z0s3;C~_M-jsUDN23$$AsM&nzd?zG%H4?U`SP_AHcbXs^$B+8YfH z(cZTDMB3ZmllBhQXz#G4eBbb%v@;ry1lDCRLDe*tcFvZwXqPFuDedcmyUe!J4(?QF zPlxKXr>kzFgA?>V^y$zp^y#>s^y!@W^l5cLpVkiHpVkegPn+uk>fm|^eHJWD^!a!h zL5I{fbSMC{z@a`Kbf~`*4>BNt?;dKT-6MTz_joJqo=miRs)2UTRQc{Xf_Bg6w0ogK zyO(%qd%)w`14y|CW}u&soJ5DZ%;ldsWLvRsaU|_Gcc=Zq5wyRGgdKnNFn*}ECmm{> z)|x)|0I%co7*`LzuN8@XvB@K8Umb7S*N|vmW2w;LD2)zBRH4JQy3*lx9(1_99>({M zA=*2h)85ILo#|%2caDsrUGc%RtFK%_hZfhR!@MdTwwm~1Par7=JQO)R~4lGZD{K_<@B6I*^Du%SjvrEIVi*I%p>2L94tIa#;l(hgJJNjs-_uK0q0h!z>9dLW^pu?mc>>o@= z5*yQzMV0wcC6qqx-;R#@byg40fZ7nzuA0puqsYYK$|J(Z#vq|B5`uQFr37* zor1UTQznI<@*+CrE5s>(#Q3oEsSq-ps-hT9MH}fUKbNT-5qs$54Y8*}XS_L` z!Ly$UKsp3bq^Wq7A&o1wfV(stD8fI8hcKO3itvktWHhj@_2&kjTRNFzTxwhEn{Qi-3P zW1_PQz36PBiOzANb5O!NXS6BjJPd|&0Y*9p2yiaKAkI~{(z&{-a<0A)Ki2~FT6@wt zdjLPzMWb`wIX@T2)pPNvKTuQ74Mm$#q@Ei?;v4|px#_4s)6CD!!}UT7od=O{9!!+; z@CtU`B+(Rpu$&iktBdCcee%4RwruJZGdD63BVd^GCTRNIbw_ZzI7*?5W6|e$l`c*q!^J5=T%3zCoVynnBVLNK<$``Eh5rs1^*d1F z-_3}vD*f(7%J2C4((i#N58<}op+@?9Z43S0h%3K0L7kS0@_Q^d{Em6}y$9;`GVspM;txFYA2{It0NVFQ9LnO+zK^E-F$DP| z(FbshKPGU~ACpjj4$2lFe;KDgiRe#!GUiWJp+7Ao{dZMpvVSa?VEBIAAX;*R1UF{*vS9>XRbufvmL&pMF;bgjAjjPw|3A)~x#Pz1cueVgi^){+{y@N{EyW={}z^}(E{Ca|!t`Elb zP%f^I(CGSD6Tdzg`O`_cJ_~&=@Zi_62XBx@H#C)Q;M~4}Z{6MSw(%PQf^GyMud=4z z2uHd)S8qh)8ZhQYLxpZ&?ryX&@EfhsrY+L#Io-e<-sp_b74>?cU!agTdL#6)@*9AG zH*mJy7>u%E2qQVaF&gd1k#b`q0^snC*{XJ99_l0tx`}ss6X(E9ob5MZ!E+PBwVOES zZhD#dP3*~=fk=lS4psThss_3ljq6&dSJ#7XHsXexO*p^VhATILSKRD`vaV)vv!^%R zOc3H`KeQX9@SDSha&r{=ACGpEaj&W9YX%u^;$7TaOzO?0+;EE<=oZe{Te$ZvZ$YH-lW|2HSpU(M!JoCbGr)BZQSQ} zHN=3qw{iB|#@T+mAwpx7-)=_Yc1y0_j|`(#rYi{mF@%>#hoBB z+yOpwr@E2u)JA??lw%LyX^8S>R(_|o(C)PJraK^g@ANYBJADP+8A$xjV6+*Icof1| zO}R4(<N?{zU5@AX6sSbPse-93=<_i)DEn_yG#O+!2vdGpcVVwLVKC;k_4 z!(TXK{<5j`m!~HF0>1c{KPi8K4)`k+ea!cLur}`3!Zn`%eglL?#P8#*xZgt1{Z@!$Q6IS0 z{Z7d5qVW4YRP}yuE8QQ&#r+|uKLP>x#{IDf6O43!3i_I+@%wj|#DgBFm%x<= z{ZKZTvJ5T9nb0S1k~wA>fZwu{x{CNzegh;&-vezN%?!4(egLm z>qAC{hZz4u3-O0I_a1s728?)EiL{5oD2w3quqMiDBj8>Sv1cDPL^<%6hj^xkEme9L zi@2ScKkQ8E!)~Y#yz!xfn;s?@=^^IuA@=M;yvv8<5GD%4!>I=Ta31O|#Pu?+J|a>c z;r%_ba^oW}jUEA4eH2QDM-jvy)fD1U9ZfuHh`5>Hk6IHwYAfiGohy$zAl;SIqwc65 zN7|#_3V$?Ep+`f>{0O@Ej{u(@%|suw5rCgR0*rXHRH1)>v-|_r`ajsG|Ckiz9~<&~ zk@iPkC6rYr?Vm96_$P|ge;RArKdm(NpN=TQdi|#t;@(XB)0dQg1|ki-4iSAS048_D~|`GzY)j>E&F(~;E$&x zo+XsW^A!Ggu@`^B0_h3d6+ST&J@F9y2~6^y_z`~+r0^%926_^Xbfi$8L?K-l=@?E= z8k*=yQ`B#cG(L9wq&3N`PZH360O|}@`IDiDM;PhJ7=@mU_oFA% za6JQk0aiW1oIhEp(vw6|p8zL+s&RU1BzkIA`BR%lPvJ1`X(b~)#o6#Q0--ABPouba zinH)(9n`N!%2TYjr`WSko8!8bsyvPLrl+0J57zlpypN}Gq(1G1cA&GL4nSMrK2L`u zJqB$i2>ukf$U1FqXq|h^k=o#pwXGQ}(vmgL}e+E3|SpbP=LEP{x zl#6FzwmrkTe^!^9pT!_<$!*VCbN&qP;aM+Ip7rL+vwmnZ1lL&S&qfJ)HWuy2o9Njz zg+H5V;LqmS=ox73XE>LhW1l_8x%3?Pz;m-uo`Vtg+y~cyozDY_Kd&srbKrT;Vd(z6 zriGrzpiV zJz;j;!A9(>h_XY6W7ojM}J9!bM z7+%!Slot(A2Yc^DO9bErFYG3I(V6&*u3UT3L(mJrnHT*?yuf~VF%)?tQ3rGXVlv`s z$eY2%i#g~6G{cKUns||@@PA?1{I5p*Uo+?bf=>C@OQnDPi2e=W)_*IR_`fv_^lxoN z{99Lue;bnF-==5-8sgvfR`G8))axnuzr7JBFyp`dxbp9Cq{kT5e18Bhth1NVf?n1o^<@kxFPo5fiGBAH^utTLP+oT6+DqU* zFXNHlN98Z^Y%g&pyc{9K%h9M0TI}T%g}w$FC}p=~b{Wy^2!#E6{(h8e6ni;5NRB<>Hl{_^VDf{;H=UUO70u0qry5u4bUu)p1>m`0M(p1D@RL<_f)Th4MDYYpc;~z|z-X`@imn{5Y?3};psn8n->LzgGn*m&XgZ1-fyp`TeQAcs2Ah<3!!7h~ zET?zl1%EfuMDKvZyqj*Ock@tZfmys;%IQ6PlD`LU>OEl5d!s?Tw2>vyh?0yhd$i$p)c_dBT+tvs~>>7eVEFX z51`jR%u(sXA`^W8z55Xg2p@&2eT01EBlhJ-z@Lv{$P4%2AAxIptRuw77)|{MeDz}s z&Of&DT1@zZlQJp2g(hWyqDUF$E~v_p7v-*3Q<$WzO=c-U zv`YyJQOfoj>UFW;5-(js6B&8^+@%BEmxD=_a;UrBXb*G>xGd!?Jc697;BNs2iLXJT z1H2pwNf`cs8cBEsL&`!Xse>~t^*}s=9&A>m9*)uLQSMTp*AgC3jZ$yGRjIec1L^>0 zQtt%c_j)%o{;(sY-WOxh2PjAlQjs^zT`3*3K;jrdDM zGZzSa>EfhGmx>Nt_&knuc?(6l0^FBin@d-yyPkV!E=WbB3#6}f)xgkPweW1Nx~eK& zjokHGxKnN1U3I_`b%FGhu3p?CUG9bC8fq{|*C=k2F5t7$_l9)+tf$ zY<1G&8#?Mdqsn4bCyp)al=yUBg{z&nK&|sm3Gf~;-p=RFD(igB4Ctz)BQ6~gVB%ZX zv?&A_TGsUmQ>d$+%3Yf5U7ssxLL$1>0IzEUBG82~U|o3EtgA&yd?D7wX4Se_p{?ti zdV*7LDy-{L8O?5~;2|R4^@IU-y`-6&FILRW`z_|K0+hR!KHO87J#NfBbI(!Ue8}!z z$kcT&rI{NajJemqRX5g%@d7`wZ6NO632J=KM-um}xeuxIh?<>%)9yCojS_vIP_ z%_#RxCGRNtfDySLtE1;?`%)wP~>fVl)>c%~2-TUScw3ZNPGIdMmbe~dihN;&5t)teuSvk1cWNOpTxC}=9L zv>u**ww{fQt!Ibwb}~PD_NWDWUjDmVP)<|=<*dM8m_gnRB)g}b8QSwm$yYF-N4m~~ z)nuMZB+*j?01t-)=9vYpJS@BBnFj|wnnxaX+~!#V13ZnBsDks-JYRsCXC344Y=Xp| zZE7KeJUgco?43+yoQUQ*tjfn!a2(a=ISt~T^J2~_1L)g z$phhUVY0V;7Jn;POBHV&wD(H&dF!DX-|Z7LD7lzEyvvw4-WBxWU5%i7*QpBICSLkf zfbneJ7RKx4sE${$)t1eqd0XkodqS1Z(y#YCgYjOfDmO37sd;as54?BP42#penDFMs z_A@VzSL@}E`>eN=WUsVO?_}Wh&Zr>xgaP)>pHAK~n(-YA!CElw6+--jJISrcMsJJS z9)_^JtMfL?q+*2|)9y_Xcb36j0--p4_Z`S4BOR>Ir z^wzfk0DX&?27Sxuqfcu<-zwVnX$|NTR(%|N@w}QUw=ggJc7ssgQOMMHOtA}4x6j2W z``F}I-%Yi+qkegh*7`bX2wp%YKUcfVUy1PhIY==7bXxc^Y0a&ggLq)6O2yDX6Yv6f@-47l^)@n?fNZk>-bD-S0;|A&B@e4!E7%9vQd!`P z^3H)!0MCg9aEbBKx**>~iw5u(S>RDQ|4ICe(*ANP_w(9|_2VA1etam_KMfN1YYz6$ zK^Xd_!uuDZ6#5%gx)RCh|3c09aK!qBTK{Ii_it0M3(oZKQ@x`~egl&IY%Hz+oZwwl za7q1MQS3Tn>%XN~yJGhgh|~QY48Q-S3OMw$paTHGQo0OQ0yKz2i)(VwFNmwh_}frQ z>)~o}0jLEfdO>V#3pOcO?U-!AFCcMn2crz`0kzCnxmw2 zSg4_*!a_^IAhZ%Kz#owiX!Q$ifrud~)zEI$ld&BV{Xz$olzk97rjCv?-q0CDAS9^^ zT~=^afeg8j?55Cd6mp1NkA*rEJXW)(DEJWG84JB(fMIU`^5Qe=U|8%9i``-N?iSX5 zAv{|FE)xD~1EAq~wUjP_Tj53!53fL}hS$K4aI;D`um*%>nTK}@${q}x@Ikr^A5p2$ z4WEP+;Wp)6WU_~G+F1B5$|L-+vdY3QNDh?3oJY)ITx2FIOJpv(FM^}WB1=@|bFhr8swSziHZo(*_is#xg}*5)mARLnBhkoRfUsME{B3fw3#lW>zM-4?J8&y zsNG-?-6JUb7)SJg@{R~VE9B+zCz4WUQ5nHe7jhAmI7PW_WzoA+fhV&nD*1`N0cgxY zX{?OOu?psCtcqd9c;DY*Gmz!jTqb`^yUduD#MpB95tGdsTdR7T7;3BqQ#!Vn2^>2D zM`PMF#W;+x7^mGZPbc5sSnVhM&+{o_MJ|&Lu2a zidZD8VL%eMy(M`T+>-UsIVr4?i`aD~mtvtMzf^JqZIfK3vE)`zOSXVPQqwPqo7R#? z!9FR&ILU1XOSU1@NeNfdr52oySQ3|_C1toLIZU=BUUW-7Q1D2dKNUifwUiTmlfsv7 zscN)usun0InHj0sEJ!I?uBrLh>?tjnsih1dwGx`9WWuM`E7*vXq&Rf6)E-12bpSf2 z@TVH@&Jl3BY^gJ7h7{-gmXaDxU00Vk6>uJCsRzo#qiduhKS+Z~f^@E#N&d|l$SG}rkoT|t%fWO$wy8vNam z!_pr^ob((JPfKN_r83f5!P9(aVrfnuEd7N_H^AhyZ2L4fIxLM_&C2rsPUE{W@rJtf&)6Zdl#zB)zDQiTgn(=42e#9S;!;8$vbe9p6GV?({vrw@mihZVn z6?DQ|;p8o|D7Q{6Hh^w!E1EkeLnU_rOmp1F zvD{H+SneCNOiuGEcMf9bt_aEvRcVLpIU$r2HFA#>JOQEHGXd3BXBZE=4Oc2wL)+nx zpx?3#vmV(kqd2HoNFld5f4 zN@w^E+l%4*0`Lax^V&P)<*&$3aZI)RRJ2=u5e&^YvUSQgsX)^rFC!OJ$G?!5D>VO*5#^s?8{}V-9N|x1Y(xv! zNUf3_$=S#Z2r zCM05%YZ5jp17`FvlpJkUOv4)G9t_VOsPa|R)Mz{Cj*6F~kI?_4Phig&pRd@MgnFzN z#XBamWo#}TjmfnzroF@1vc;6HRzWjs?-&=cY;2=SHv?*nGa4Jy-eydWpt0THJa(Xj z*zvL&8*3BfYiPGI&R%WoJ{%nDaMF=h-0@QK#w%d_copLqmkBUF57frxmmL30rJp~2xzHfF+eveV}ey?jr)6X0>!Icl2m`}Zlg|KvDv0_auaTBW* zlh99ai^V2dl>7=%6MNw`A3!wP#Oa@HcN*Vh61=f{6gfI(+eF#VzusftIULLFyRRKK z$-e7wIhspsuKoU7S6OrVqVbaZWc!0RoG<(WE8>d%Vz$e%zQo?zAHH%qHYoB(uUr)y zOJ>_2zj7S6U(Rq`uwUN9KmGka$9((#RLMj8{;A8c=@G#HT{$`)c z*;4YY{p~}C&9}d6bvbsb(%(ODId_$;vwwKt=&<*VuCiUfS86}hGrk`dI2!DS1ANbK zKiqLScmKB0e!WXge%>5h-= z$19Ep_TwX$gIDU`+HbG9s`r)bv46hiSYsbnLh=u?$v?Qt>r9t(?ZXSlO#ATKxz~PI zrv|@kb2;e$t^Es;gC$SwU)x+|2cPj^;<55J`?u#M)9t4dl~!jz-EcV%O;p&wzp~-| l)c=nvmm{l&|4C#>k^dr+Q{=yi43}7~{f{F4b@snA{|_{wc(?!n diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF16-V.bcmap deleted file mode 100644 index 51f023e0d609798e72d46bf41309e092d72ccb07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 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 M|Id0?+kYqj4{W+_`v3p{ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF32-V.bcmap deleted file mode 100644 index ce9c30a98541e23244876fef9dc67c2639fdd746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 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 W-NpY7&VvC#?^62*GzIJ*TmK)sASzq{ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniGB-UTF8-V.bcmap deleted file mode 100644 index f78020dd4028d56497c44b7afa94985f0d18f8ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl?xY(U;%1@i;UxH|VM5Yq4M+!U_+G%+;v&G<;s5}C8#>Vd diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-H.bcmap deleted file mode 100644 index 7daf56afabf65a4707d7bb06d829f56b247c9e80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25439 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-HW-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-HW-H.bcmap deleted file mode 100644 index ac9975c585ede6958758980ade161f687d40d58b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmZR25agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9BtKtsO>ygO9pkUpY R&cJYlpFy!nMUA0J8303WB^dw! diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-HW-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-HW-V.bcmap deleted file mode 100644 index 3da0a1c62f19f720590b54fc1de7b027af100945..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmZY4T~8B16b9gTW_C-zEKrO{Xki;z^rld0f@uiR4Ix@Y5SLOB2rjVUBlNpUP=hJZ zdv1(>g-o)Woy5N}MSq0Xx}bOFeWi!YTCQwVdLmXyM5o#>UP7ff4B)v+t$V>7V@)mi{{+VJB9MW zeBMkKX3fd;b1MvOy0r&Plg#y)x zX}a?kEYdC`e%><$20DDP28u4w=~n3;YfUN!NqxPZvI05?&-otvW_;5=!}nylUyt%< zl+mDX_+Nh*P#INNtw$dr{1ChXUIIS?FN4>>tKfC;b;>uvHz-@HZAgi;yP{& zWD?FQJ`$vs2>#XphHs|;qU{Wr(w_ML#!@oBh)Y#C<^_Wo0+Cb8kt`GOtNE+q)oMTu zssZYjYJJ(5D(B#;5O*QMkP8rfkc&*df=E%h0uh2pKo%j_;C90e5xD^|3b(hWWz&#b zRBl6zLD~>8BKP4&Aj^y3Hq)$ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UCS2-V.bcmap deleted file mode 100644 index c50b9ddfde9da7ebb2f67eba68d58fa2cdee902a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 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 UUp1g87AoR8lAx!|poMAw7d?}<%>V!Z diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF16-V.bcmap deleted file mode 100644 index 70bf90c0efb66da2a7aa19a820d766cfe3ef3183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 zcmZXOTTc^F5XWcEIeWU@mZfZql}p1S79^z5N>bApgDXKP7qONqiI&*X4WK}=trCdA zkfrgJ7Xyht_z`$)Hfb#%WUGFXdH~!%YTOcem-5?-7jsfZ&dVHA`y+;jYbo? zQ7Gn3J-uJ9nA>GNxwBR*?G{V9idh&}jIAyGYQC(O%(7Yfcv(!FranHgker@*nx6Ti zW_C8`lIcih`Ee{BnKjtpNi`1=Fpvzl?yF}Q1*S5f*3?k}2)KY49L}4IKaqoG`Qku< zr2IqQT9x53c5B3YqmOC9#u%lIM~wufsbJV^KOvOJf`NbW4wool)bNDEc2OJ?65`;c zpP)ef6jJW+L;J(!l8eaH(1-h*q3fqC44xbu@4*4W;1a^M^}xVY#=%>S0%g^S|2rMo zWBMgv;0XDp85sT1o=4jFCtG%qf;F2tH(%3e%$v{Ku(x8K?N{7}7y(CCw>vVo9 z6cU=DzJBn720cg2BSyO~0?>^#LgnI-v}~-6~Uex?ZdBe ztS?FK`WnG{_A@qTSFu5??_F4bl~bcPvGuOHj!xVoIWwF(&yYCF9G%yUIC+ZBhD@9a nq0Syd=MzEakYUSZoypkR&at6$Y_Fabu${D4-0ek>+ADtn7bS_K diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF32-H.bcmap deleted file mode 100644 index 7a83d53ae70ca3d81cda827cc224ec8c5efa4f17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40539 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 TSv}^!0%Bau4|_Jjy$rZ_2%S+!ysBd@ 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF32-V.bcmap deleted file mode 100644 index 7a8713539491f51c52ba3a1525d181efd32c1f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 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 Zk@2$oe=xv)=QA%Cm7k5@(*(V9{{Wi~yy*Y{ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS-UTF8-V.bcmap deleted file mode 100644 index 808a94f0fd9c3b3cb0267e5cfe4dced2e65ecb1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 678 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 E-=u#IHvj+t diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF16-V.bcmap deleted file mode 100644 index 3d5bf6fb4ef94b452ed1ef0df926fc2bee55e973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 zcmZXOTTc^F5XWcEoITxcODS8ha%o(|f`kCAn3~2ITnS3Kh_zHn6k?$pK!IXgB@lxl zOXDjq1`>VnBk)KzX@w86RX<5RfNy5yQNzGM`wl2!b8QOsDDF*H1#8XJF_8ULea zH`gXp87XylFgy1+o*0}kdG}#u2^8RTl(-T{8I&ws6x>*3k}QSDJJNt6yp{mv6cOqJaD7jFxN7$?&gjXDK+OiIXu z7k-$4LIi1V^r7?NV#&i)GL7D@v&hv`Hii#(54K?!p?enL%G%+^WhTI1i2?D-@c*5r zg#-H1YGNPzrJET0(U?m6M(A8WojiSc`a&qGB3Nz1)JIxtN{bFn6wsRVX6RsHQthLu z(MUvUMmoD71Uj_ubDtb-J8y+H3@RNIhg%{b7{-+#YC_?<=vV!H{q~XnJ!)ofBB&Rx&Ty_M)@* zHG$Px#amrwSY7yxXA_H9WA^tJtiH+xV%M?$uCjt|!l$_7g4}1w+&O{nYtGyyLU&bV oZkdt0&C&hD(B0!$_t?iO);Dsz=L8#z$9Zg|?0Iiv29(D9Ur3XRZ2$lO diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF32-H.bcmap deleted file mode 100644 index 09eee10d4fb4b9fe1e70a1ee56825a207ae8034a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40630 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF32-V.bcmap deleted file mode 100644 index 6c546001331cf4f2f68563229f994b55730dfdb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmZXSTTc@~6vxk*GdtZbrIZD%TpAX!R6>9P2GbaWxIrlwF)r063Q^h(pg^&$5{SW& zrSX*)1BpKP5qKn`1s-L7z!8bGc&6%9b|D2f&{eEudws-UEt7}DLB$0>@j>h8& zV=|jtu?=gtP_#D-Msh2Y%WvoMZ;N(zNSoZ)Fs||oM&2&i`A>DHW!uKk@LbZIdTLGm z(NkONGf7KI-5pFVJ{}t#oHjW?&rxXw6yTtkegGp>PH_Sr zg1l$QyhVZDYtFnCLT^oFUXhWv!_oW9(A(!&^*JXhRyQ;9qx7C)ZTTdNwWO2w*XBW~ GrT+p)28xXU diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF8-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF8-H.bcmap deleted file mode 100644 index 1b1a64f50d204b03ef0c5575233687830a1b053a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41779 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 z 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 StUu@Nr1Glp*C4U(!~X!6rxDoz diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJIS2004-UTF8-V.bcmap deleted file mode 100644 index 994aa9ef9f50495a3ac558630b0234680be23c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 682 zcmXwz-%b-j6voe)ncZ&xP+*Hz(8|Ubkr1F5gEq#HZUa&TftD%;Q7LTz1&VEjKn!## z=uIJ*lt3aE-gw`5MK)VT^@u_4q(qZw=&r4_igcOe^qVeVGV=x+(Iywja zzTPLn-aqxB#km20(1^O*9vbVr-`?-VAGzX?%=C|Y+hO2<0VkXF)LuTsC@?z%y0f7~ zfPe{z%;~A`#ZeG^0V(#gN*vo=5JBP^5)md8@17Nw74BHt?5T3U13;5)R)_2tZgHi*Ph2gGDy7G|gsSPOPV z=E20<%{DMJ?9j6*R6T&|J%fh^4-C8pJx)~L2t=JkqP{i=8H^jOD1KDe)4!H6Kg^l) z(**OA=?yIQZ(hd&$^9M0{6yGZP90+D?ZFIc-BwQP<*7D;L>uE#d%=hnrl`#ds3jF2 o)m9j49|&se3`?fmseq-0Fw=K)Sb3Q)N3i1Gy<)Bm0aqFS2j0}QeHI+_hb#t%0 z^sD3GC; zUAp1EhZJd*5WDP|h6FltwGN67(3xiOfz+ImO_Kb2J8i252+IbZ1!e;?0WU)R-Fv-F+$BYGcZ0(sh`VKz#}v0Q zb1)ruSMix3xkT`{1~KwyQW0&XA<3=D|8HzL{fl^1fook!;KLwddO4Djcz>% diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UCS2-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UCS2-V.bcmap deleted file mode 100644 index c148f67f5e9fe4a108519eeaace89e708a51f8f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689 zcmZY4-%b-j6bA5bW_FiuTM!Bnkyf_RMQ;j~CYXj0-H=905X4dtf#3ogfzW^3DnSeh zf!=dtd<`$jB)jQ6$SnF0UgLt^nUi16nQtbO9QO0=Os#(8?tR>C8Bg>1Y-S>x%^TKE zZObuAN6nT~X&S}qcFnEVT)XA$j76=31LO96({P=p<9@ygOO9iVjn5Tl3iGAHukLbn zZ?;&+XyjjiqN$83 ztkG*eBzzyd23`R_0Iz~K!0X^H_!{LK;Omrs054Hq24AB5olVSX$`2QH^9BEO^J^E4 zurMqVeq!sRNpw;`XE^jAlsqHo^j&NcZ$Z_)?eH)U;%(UEF~wEF8pFA)5# zA&lHk8shCNn9?5q|Hf9bzll#(c%^d&@c=|lF2-_9Braz!S1y+|HKJuo$7=?5odWhVG zAA_ty)*%KV8xSeTeMpze7Gx7*n8`y36Y?0o0zX0ISNL5JeMFwXk0YQ6Gz5$UVR+Bh za>oebKoAQ>LpmUov+oh&ty%hY%B!SO;r^-NB>IuS(5Vu$=ykj^N1_(Fz8@6+0LGcP AI{*Lx diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISPro-UTF8-V.bcmap deleted file mode 100644 index 1849d809a679e56414f4e18dce8ca3c41109e84e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmXxgT~8B16b9gTW_Js1`H(_H0)?8W@dl_~pp7wxk}41c(hm@UAPXCT&=0m1f*8^Y zB{3-mlad&NSH?>dZcLhy-E{PKOwsKR;4io!X7Xgtyl3WIjPyG^kW6jr%P*HQzB_?{ zzx%G=AMo`rCRNQB*-U4&c-l9VSV-!rq&}a~7JFR%tE;|?`)Qx9r8Ry1Jd9|Xucvop zXdpBi3H_;$C63r${xUo$uOdTF-gd2JtbyKP`36C@+uU_ zP=XCs_N(z6k~^P(XMem85@^@%6ewyyb6dIiRVlB_L1OJ4p7yB@tC%G$0K)Fs9@-w* z`fZQGtyZzXo=}O_+PW_H+YUvdvZPVf^yT&uQ_6j zDNbX-K8=DHv-Xptw>b3#+p5_kV*;-Ua`R&Z|5h7va~Gupb$LG|Ip6!gm77A>WlNQ- zJKu>(6&R5Z1K^z?qA%>O7IwI&G+df2O*oWV#X-%u-drubS40S=0^S1df*1jBh8UH^ zIQVrcqTo*O4v0yJDVU8gokYxl-+Y&3?q?y^A=2ROlGp&h39$uJhUp>V4a^$wCL*?B)}caCaiAiRiXC249o79G zsMG-!x6Ng90$e^8gT$B)I?ql%8*#7K{tj<$x&zJdplw%n2kF^Kp*%udL2`ETsS^4N DWh&!c diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX0213-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX0213-UTF32-H.bcmap deleted file mode 100644 index a83a677c56df6f1ac395d2ba71e60a08b0985e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40517 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

    ry6~E0z8>XD9~7$zzTJUQY|Ybl zQEm&$r@T#>j>5#v_#DY7uZ`Stu-ZniQR|$L?<86yEHEroO%wV0q7_B&`MB_3F!*R}}ZDRaflm@~mVVH-y zT=b(vkD~5i5sDMbQJmRMdA$KcaBdk|R_`hLU1H&w^>f>F_+o~J4%9D5#OFO2jQSKY z0q4$$zSQTPL2(@KJMW5_XkgP&7%`*`E{yR8_dparSoi#VXaXs1j$mK@~Wk#K+weWi&-F@i`mnS{NiR*a&dP8uJ($nW5cNFqHFO4$}jE7;qX9Zpf|6t;j2*Q?q?il z-{7j~Am!H#7_w{T7!+Q9j9&|I#?=@+cx@c$=UOz{eQgRB(zR*Gh{msFz))~)6>7M) z8!x)HFB?TcDvDDOocMKTj@qvKVw$dpV5qN0?nW^Ur)^x12;>-ojtQWWjyN>GV;)BrJ2KJej^%ME)|gO04B;J{`54AK z_TwcThe3`V1;vq+cZOjWJ0n1Jos$K@BgPiRLRS=vI95dGYD`V%dVU<`em(_XoIzJ_ z8aepDO>fNuWdx@5<^;UvW;B?`%_);n#By(xi_nUji^V-lFuXU@w=#Zng&^gdXE5en zIvW;c*EIB}YZltymADo~3WqM#wL(J+yC8V;u0tHP!3NKW6%NJ96D|7*h zNPiR)1tYw*zzTkQ>xhPzb?Z)`5ZtNT8^hA=ix+l>S@ja{UVy5*7jckm_bNfX-Mg$f z(BZZbI}^X{i{ZXKW^ze4XBotFL%>L~RjN$ENvr(*Ck7CCLJacdnyB?j#o!FzW2oDs3 zr0<;)#Tf|jyw?}q>J3KKz2SJMHxjhc8*N>LG97f>yBsX4cMYbhH#-i+mN^XBzKd|R zcLR!}i73vXhCV4Bh4T@3HGY~wN7mDkt#o7~9oa)iAWh~-BfIFo;M}>*Iq+=!tfw}J zlO?cC7N1dkOT1Lyk{C5!OI|>2sX1^!{JfcdnPdIe$-W{Af5tKtg~P5=>(Z;svFEV!WbF6r!{jK!IXgX&?qe zj>cDB3?%yCpWq|8q)kcqH?HbmQm5dX*?e|3Gqc~Boh<+T+|2Fn=Qr0kibgzcFf zVhLj=n_IIDYrjymw+lvcCzH$X=JIcgc6Lmi+1fI$@(V`ZF4+0Krqi-*V{CjeY0f^i zX8(kjcQ)sfRysBjpB!CIJ(`>toihbM-${85BoH8(3V;!*q(B4(aA*1`3k-a~Oio#s zwGwb(Rv4iFTfI0qB5n-@ZgdMxua0nDeOOI!Zs`C60rxTEOd)#z**mhtnc!v%MF-p* z6(b=k*xbiC@Gu95F^DiAH0t~TVTGPgUG!`ssWRhQK=kw<;&tJ%rBFU_}ZEEE0s7mb`wDO?Z zs;2R9lJZL$m-Fq1t@&KTlAnp?PiF?Eh zF|DKfPGRl}GWQL!Or(jDAKk;RQ&?G&{FMyD%F1V~&8=dUIp5o{@+uRg$KS;I`|>(^ zQ!SD=D|7D|GA|{g_gXM-jia}rFt5nCR}$!bV(1+TtoxiZ1?$@x`YQcDv9WrV#YWOe L`x{R{YNY=HNrj7y diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX02132004-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniJISX02132004-UTF32-H.bcmap deleted file mode 100644 index e1a988dc9e80be9a0803e22d021b1e81fdcc5b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40608 zcmYIw2V7KHn(uecx%XBEs>nG?Fo1xV#ZY1vP|Sg#A|MKgm@qKsl8P#F&P4`M5mDRj zmg*kupe-{yGdsIGZ+3dZZufiBt8Lq1XJ>Y2-`n?H_WgdZX{&BH_ug~Q`NIGEf8Qzk zhrQ;)qN~MuIk_c4v8z@sT@tr+>8hZOrwUJG2c=!TP?CM_LeTbtlZC}ag~eGV*{7nl z8_%8%ns0w0s5tvVcJU?UU|M!|P;|_$?dGK9v?N9V|NH2_%0lNi0*P6~{bN~y6m*~s z=3CSBxIdDAJkcvI+@-hmNlcX~WX>I@nKJ(Ch zQR21H$;-<_`{~WF=O?{9y`D?YRbLu(X$EZI!TSr8qhIXz_###N9KsibMVZxjBJ8hG zpoLFQ!>23Y%V6+;qo7L*!V}TF|3XNF{A8p2Bt-i3hW5D>vgY|Jujk7{Uidma-=vnG ztkLoxuKPS+9P<2}&vTQGPr7qamllK9rvBBc{(YKcW_YvaJm7yy zjn<{P;LcA!i}NsgxO%vI@X0eTj4#wLG%vI-bT6bAs`oG+5j~O)Td@glOUoKERkrEjxf|c(Qgkt-dPqi#)MrbwG8J+OqcaRuFF1cuPqk zp?tqJq|&ekn2P{Rt^CvBwJJ)11)g=k0BlttVG&$Q8DWh9j}DNkTvC?@4MC7BR78{2 ztbHfQ5Y(GZZHx7lr=-fGy2b?7vjYZPN$Yh|l|s6U>Bw<&G(gZ1#}Uf-qN-?oN<|E< zTCc6T;$42ptl6Rstk{DxOF>ly<&oLT3_z)x2`XS-*q#6XXDVOsrqeK0xrF(?SK{ zdJ4cp2@fIpzzk;z3YP{%ISMD9;kLw&!vV6L=z*VD8me7M7O3>#&h+3$La81EyoV<> zfgv;^v$E*j>y`PmD$|KAsmwoKwI#OpxF;CI!19HO<+1D5DBUJ5U?fHo1nW?9tCFEA zN31$cs&tYs&h>t%+5uGtbrkljDjk-HRoh{&N))vO$5P{M*aN%3lu#8QqPPiF>%FVA zhvWpFVA-&bl^b^QRaeT`-t}!V#F$QXuek(l7qqn_p2i0D#6FM$;t*lSrduvOav?g`qwc1M+#}w6# z@fb|&_ioLtNmT1=3_T~uid$pq&!=%eJQdm>-mt#fP;MSQVt1BL4h2xt*vavIlP9mq zdF3l+!f7~FPp9$EDDQNqLxrPG_gGaV&$zR!{bDt1yW9`$VZGkH1rLndf9*XZs$L({UBwYF=OOZoj&UY9nS z!6RE)*MXfy&Bm&Y{F6icm&dCQ4P-VfsVQmOYCZVEZFtG8>^mX7Mn|$E#c^dyv>7Y1 z*Ej5JKeMv(ctuRL#}l=@@|~?s`{gZl?C-TNy{odS)eX57k&mN=U;4KkFWH`EhQpk1r3d zINTc2Qkd|If*{2>$2_e~=K41J@!FrS`1y|avUpoDf5%+4^6&hFk1jX+)|T2NGaBWX zU-sXOd5{5r-e&kWR6I5Jgs<1)oK~YA@XbG5hJ|wcpEAv;RZExtezlfo5$=*j73;oq z?f=)n^|6z)#XGJ$G?v^l7r_&ouXRkVs6et1{x93A&r9*LzzsMOeFlrdt zJd!Z7cw`-i;W(xpER)G_y3#NnJ}6SWVBD<_kDzi=kkF>Pfh(xYsK#+azqkfW5s`TI z!I>w;?;U;bh$N~-iGHM0x|56&2E9(iw#XcZZQP!OK(!u30-_u91vRZI0|Tx0fog+T zEs%ClSBV7)qT6RR>^B18(lKqWa5XJoW_^S=K{)eE0QZT`znHD&x*iG1JATX zmg_6yJjx5g_#U^)4Ix!~s!p1n@lx?GzMP)j8(QnhqFt(T3@PgJl~SQl?hNu3fBBpX zKO<}ttgAfDJOW!wyz0mTY2D(8r6JY%Qgx}&SR^*)bKh-RX+F49h)@Nk`=7ATE2NoZAlC4sJ=@Y6L0=5=hP!al!cW5-<4 z_)5mnHJk=|NMU8WKc@kND1P^k{J6 zek+~SiCgq;rXioW!Mp^Y1tGeoFjbTPQjb-QIWR*52g*boO&`6BmTyY;Y09C^KTW zN73evt=!AQ%cSZETQKdd=~AEGz)L%?F7G~Nk~Hctft#XlMsJc&nPqdmeQA!L1bNj}sa%)AqAMWgdCCfjm1$o8nnh9E^Cg5ic^n8`>gC%?ju_ zq_}OUjUinZ#jZ;v8`?C`vsb)*3`TvSGY2|P!|gzZj;mY`eL=Lg)X5f4tU7H^9^psG z*crT7RuR4m8m~d?YUtBIqn^~>q<0R2^%P-X+e7c_ff2he)ZY-suRzryGMEOo%P^ix z2Hb_VWT@8?*+c0D>nIb;1ED+sIt7AS3S--8)dsL`C6ilFt1JmZ+fMwpxGT66;^lep4RPtAR7cRD5f#R{cXO|lN1kLbsC;rA^q`297GC=$fU&ckyCPOl-wFATQBp! zDdqn&|2OJCY~_wi`hx%Vo60Q_avo8o6N{HIR*7h?GtY8UN7)d~JV(bz@>g{R~VM2U*h+}=Zm zUBI$bkYI?>@?*@JM{l{!cf0g$(R|aBd?X)cHDYxF+P{xhBM8Mmm}R6d5&G6E!9j{; zV1ZoY#y`#fI9Rr6<*|eE*a5l5TdwhvYmCqQ_@~AE(?Z2WrnC=46K6W+Pb@}iae>Ns z%}f}nJql>(I?szWUeIn*SH{rZ1ZX%5?dJK8bU$6I1R5zFZ!eHnROsIg{ku%FI-zeZ z>E9*1Qb~79Vb*QFBQN;KP5ykrZv**P3uis}bN0-e+Xdc#L*zfX-lyaD$`lbx`Bl3! zv~D3d0L0=jb@v*16(;syg?`k9tI(G~?_Psf;q+AmeHG3??7yMuzb*)5 zb_JPT&g>%0ErC}{h1mqSdqa4&6kf%Wxk!A|zBQ6sqN>@|N@PUsuFw}nL6}mJDJ`ik zq#p;tY^>0?O8oU%MXOW)iB}tDm!Uw)H7;_EC-2|IALh$Ha+_N;KL>9HGAQrg(YW{h zeWUKxXSj_$-7eSY6?sYh_kk0n#$B*Gvx+3)POiF7L;744{6Nl=5}_xF^lVmFuF_Yo zrb=WokGc26&0aF2cBcLZA6>-k{=%pcPmY@KWw4VVVIOB#l2=K%^J{%;G(Nh9e7qeGeY{0_l>t*~adsbko1uHCg}wmcrw7T?M0$IhFq?+Eic#EC zGjMYtlz*Mde-c0FEKlO#68m!d3QMRZ#EksMo{pA1q&!}#T|_1~)2eGwb%|Inu*w|P zc$%tUpb!R1peh#RGh+E>sY?Z267(LXy@yCk3^aH_?NN2pO@SN9_#!&K5G>9@YXVg7 zC9Or!5KkN86uY~p@99pdM)a-`{CSo$&oq1Bu})s?rJiypQ*Ij2_IcnC&&ASLnW)MC z7%04dhK%B*_~ConqZRR4A~vmsrgd~Qf_|K;ew8!-YTpie-tm+l7R~ON^5lIN$1lj! zyX4NKeq&>)c^^LFe|IN9-4@b#gVq?JTTQI%pza1VZ^Wo{@(iVP%$JUN&~mfbWt19L zL%AEVQc`ghDy}dfjeBTgD(#Ab>h(~u9Y&*Jz!T&psz!k3O|*RtweF!cVWcAyL2ivk z=sHe^GKJAqP$57|B&)~3T0o$SL1IrL+|GjAd(k3w#H%`162|U$vZ` zrfSS1jk$0;28Nd^3cuI=Y4X;Zti+m34XEWqF7jbx%T{wNo)CFkp}sE^rd;WiiOeQz zfZ1c`V`TI%YI_)am7|+-BNiQee1zB|NZ%qln+o;_m_wf|;+ejM>b^zl*<>=i8!^dj zvS1HIls~s!nDQgDshZgoJVp>O=p_k5ZStCssW4&*rXQEW+Z=eHrL#xK$2Sz++54NP zd-)4Dc{Hjw*XnF_<6m8p<*csE@j`iep=?=qJ6?WJVBcuppwNPQzpocy>^cVT{nuD! zEcBKT6IgcA$`fG4Fhii^|3%Vi@HEYgmVNKnd^C%_Ho)9AYTtx1G@HXLp{mhMtjR;D zUo6;@h<&r-k<#1;cTWY6T#=g&$hR&IZjvoaKXK;2(a8f|_MLL&1zVaTzG6}d6e#ML7WQ=i{Fw!OG*4yUN$vZHeLwAsQv6EV%E7eSYu)E8h4OoP`~JB-e9F1; zO204vmwo)por*p1C}j2~%lwDp{hWdb_cD8>uv6w*_v1(INrIkaU*`tvlh~4it*ft90~= zaBHJfT>yirLX9&SI1WQAp|K3C0FC>_WO5C>2w$t$J4&`A{jqRCd|;kQmk;M^(J!LOmDAM0h!c6 z{Rz^r5NsvrkkK}et|k=+S(TAkZa~v<;0M@n32ibOnmp9@7-AIdn-JF2M39;QZ~+}d z!S+@n0?Q?aVr)j?*cb3dudZ6At4Y!M8ETfQDs(OtS^>36v6}mQ_!yIbIz+TkeIbH9 zo!B#ssM8K~vV#3MwI6c==1>ubL{V0$LuayVC7oe^CSuPuv0CYn~sbks%Lf{<5SmfPdxup@~nF z;y3@xhR+RC%lXR$g(}#0pSR=4+Eie3SJ2VE$GmzMe|dxVZkk%DT&KIg?*2;N8^?cU z91W{m%3l`om)Fc;*z)<19try41gGH*>ig^9{w~St$*kzdS<5+9O953$_l=}30ICC2 zy*r?VuofUQg`N)pBO20ngY>UPMCB@U64Hqw&?4xFgMPH1(bRH|+1IHj7J^oEo$upU zvz{I{eR{30IRc;i>9=w0^=A4SC2^n8UZAlTl0M8+C?iH4l8C$Z0?A&8eyPt}m`al7 zjw$g0%wH|g39O()?dnG9FmUtqYu3kk1fpgLgjF4} zwDX|$-c7WW{e{qcncmMe+&iqm=KWPqGoox6=Eb;a`F1s$ySXEz57C+l?8RWeK<&jS zH};F_F^w>$*7q5SgAzOpw9gec!NE|{spUFGihW4+lRhIjD05&RXdmJx1x=xku%8j_ z`J~Sort-+^6V!f=_BpF(OQp{jsO&+k&r6Zb12IGU`OB63EC0Vu<$t?bt~T>O9^!vI z%zKXUo}>Ja`^>)BD0yfX0qxy<_1#PCP8zv$0M$-V)y1;PP$I7t8@*67rt<03SwRq( z4)OJ2+H_2fu@qsVfTl_WL9ti|Ha$6_;eJy2iKL2r1*IQY!^;=Kr+S#ZMyB#$Di>z2 zVEfrJGL?_AFn5W}T^8mpX>b707v`b0oH|XWa>UoC;B$lFb3G0b?bFfOn|O(ODhEln zsZ&t10LB)gxxtZ~y@7k=(;)G67EGPMZH8y;CFI)#;lXl6Dh|9D%Hch`{+P#qxy^pL zPsLxx^FOY%m&nyIip@Xp%b_##qx7qx{PGO`+Js(G_LV1hyw2uxtN4HT@&9d*yWPxY zZ2Cn9)pqP9qp_r(L3@yhXm~uE%1&hT08-?&H=y<=Q_Q_WnN6h78c(=?isAq^v=``#ld!!HkXP0mxv@b@1%nwj4Y=O9xnYE zig`YG_-UpNwjgDQIDHGg%9r1!vZ+(^qQsE1q;nU^T!~;WVXyO5b62Rn2!1fa4=(Wf zoQPBAkcj;%4%XZ?=hsF0*XM8=1qapR)Yvh^0f$KY^my7{f}1c^2(OF9Pq&j#w}Bl4 z9Szhd+o<~XYwEc&)$1!DkpbjfN);iWx=LS{;?$$Wi{KE10Z}toCVWku9E{c+6vy_G zJ|?2-&z7Oppr4*3qf21!CK(Xe*CM?qC^LNU&rR9<>nr^8z@8NT=d=8+k-v4Bz4SHV z6GNJ=ldS6mhB1`3M~R&)#PSpvxk;Nc#L63V)P>eBfU0Qq z#7UUmCH7!gxQVnengGk7{1{YjXZ2ZZbb~Y_lHO>c?Eulxev$Q?gh8WV%^|lh8S2tl z?FFHHGwlF%?QUATi>ihC{X%^zYBEYM9SfzM0;>-qohh`_pES+8&qFcq$B7k-7l~`F ziLRhTl7|={%YxafZ1xI#&FI$x3^*GGoanqOhp#o_+$HEO6lZS=Uu&d$7_HpY%-%q| z)2k3B1DLnd47dto$7xLw%w87;T(tux_O+4DU5B|FFn3)wmPJ3s=^_$FoTX&IQ|QfB zqqF)D$r4g}z!!)z(0l<@mrsG=o@e*SGP@4m`^Y~nxm)#$w6c0O6AKabWhx?*5jK zU8T=OcrKtcO85MI?_mIaUHm!_?u8(FpS?~7VhGYV12HgnnSC85eZ2s_4x=D`w}w4j zNgVi|h#GVbK^j;m46Ic|`d+L8Mi1u5@8~qO~gUVMUa<499bDDtP;(Ty;=iQaODTW)0JGSmdHnk*>KAidkz5XO5YFzEvKgX#Ss(sNws zIR?ojMR9xx=g{UH9(h{e4h2>sFSdf&8xOqv_Ph#_j#IV4v)V-kPS$fO>)BA$Is>{g z7YIbChYSQP#w{-_mr!AvW?AKWu`V_hRzSG!=Gs@%bk_WILa zKhoC}NF7f84bdx;7Dv8Y*wFnq6S=B`p%vVN4hUBfDV8leXM|ZUHJpGT;X7 zv0zhx%8(cBk6`5!)-tG&o-ON6^=tmcS%JD_>8#ep>&>P~>12c0o+7rm<)rZ$l~ z`J_D)`U**1CXBhE05YtZ=(wz|NTQZiw0Z|LnJ2V5{Y#@k^XVCFn9C!oFT!5Kklqf|`G>lP6YIF^53_!+&65C~BE7rK{ z2O{V|BAv))6WA@CVniA1xCkBF*h;-dK;1@B7N`|zlLAobBzhkKj|Yl0dRD|X_5`Th zIWH9dKLSvFgOXj_i11NqUTzvAtsYS1-=#WgHYluLsd9g0I*2%*@2HD+ML zu%~8FV%?)Z<>Q+P1S0hHRE!k9q{82ZK@iG25_S0JhPMd8GK^46x?=hlr;#x|CLMhQ zE$%4}OVM!UYAqBIjk zN{M^Z%Ny21bsRFKv>{%I6_L@}N1Jj;rw?l`5HWSwXl8N_X*Q|)MQF){szT^X*IM=q z?G$5d2p3SM8GW#mKG=mJ*KiIDpT)P$3g4_Jg7t)}dm@CPo$z}k&*DQiUzCZ6_gLN4-N z8Nt{WK`rULEOwUCKx7qyU@De%Q`)u$+73Z=3RIUs%PERbusM%Bc0vDCpQq3T8Oxqg z7aknUgB0!0h~^VIoZB}`SnWEfT}wtbkr$`o%_8;&IW3LY6F}$8Y-9r)*+}0+B92C4 zU^*Bqfto*U!)?)l>a8e6#`W$J{)=6<6Z}Q&J4;$K2e+`P6^+XkGn7${EV76MYn?OL zm$2%+Fp>*h*HMdt$#Z1#l9Qt3#`$MHekO>u2|=~X6rL*M z(N`;Jvx^Ssv=2Bu;7vT4_Hm!~h3O#CVS+aaFt?ZtNw^`rSq2VQ>M-GezgeZ7TS$lW z^s{-X$uxByknMh-8TqVttH^H`jV$D|5xk?6cU-77_qv;x0b~ZXCqREVyB`WjfDDPy z<_?dw@MsY{ieuAhWO|2Mi&U5it)z-!ebx$6yOK`lkcy?W8mY)c@JH@Dn1-W`>kFlI zg<#tV?utPH-ZR^2JB#K-t}3=qpl2 zA@le%DMB%(2-!0O`9wH%c%$=ic!+P-kda93XD-rbM)=G{@!ma5aCp%nPyJjJ{Cbm6 z@2eT|LS1>2MBi-wZ*(-zLOGUD$712LDEKT=na<21KCwc6&%ozazS%3!UVD6+KTqes z&loJ5KRf+h%5(_-?cuhNBT}PLZgY|=ofTp)bGGv&bcd@(*2735bh&D3OG&L>F?pGP z|4cjI;tB5vrrl-C5lx0rGs@_6gnA@IQQyq}F@8v(l@Q)<^UK0Q9X^ZRFdck2SRHOxtLmL#UgYv%vt6C2cy6$osn zqu85cFtkn>T8r~Cw4MwlGRGRRyA*~JiDM0&UO=Y9m}8}CXd{e^;%7LdFl44fo4~PN zqKaY8+C1haSDbOI;m@~El*v;dSKP42)Mei}J3 zC?%a)H~Y7;Y@soLN^BsFv;fqlQWa65w^D0b_fV`fY0DzhexSp&?Y$MuvXQ+jut!9A zSc;bXP6FJCo_Dc&94Zri=c?(QQp$9Fd8DrZv7|fPTSxAt5(yNytpZ8Y>P%V{aUQ=+ zDqNuDFf1gGP2|aZ1a!!;y}7KJjuRZ4U?_#4fWEmT zIFjgeJb818I+C>A#W0Q;Q*p%IG`&p1tVQ>EaBP7$W#r9Gz~C2g=m8iy2t!!fEjrS4 zj=eZOLs=9Ib1{nfJK@t>G`v`@K(>$cu9^;&A0Ck_R`K^&*M^zb?`$Vc8!>wccftf5OIrZ7?xq72trJFWnBH!S zqGJYOG?Mao+OZZDcLQc858R;6$92Qba)?h?j+Uc zRR3^O_?raiEEd}KFv~S&T}Ya*!+Q+6^@3fX_6uM?g?G~7KaC4u?f1yl(`nK;rw92vxsF1}Qemy+PX5mHl9i_T@S z)Lj7G7m4GTX(&(Kecq|NNIP^^5|o<26F(Wt>(a=5A#z33LRpthoCJKCcRKsMvbab3ghc(?ONC+bT3Bj6sj)6t+jM~D;ZyjZ`gH#b)6zJI$Cj6 z(W8^=W>0u;_2H`d&c5OkS1|S-x~7_of$6nKhB$J?Z=&FvNb*e-onA{FXXsEFnOj7w zP8$BCg`qM!bW?ETqjq%XQmjV!b)+k^&>4RZGVz*|A6L>8Sbpc z2)_F~<10j-1bwJiq(da-yP?^gb$Us|G2~qV<0ecdU{tI@bTjNM466xejH`)G?M3f0 zxN}K(6iXki#u`gEg5~r`3E&(jk?{?JWJ1mzc8jSP%58*AxYXc|zjSByyajsCNNP;9 zTY`oQqAir(*J9;Jr!(pEWRHTdL3bJSPSn%v-aEWN#yI9AY_5UAfKj&8%83D|Op zZ5338OXG2*-JOo)L46Rrla6LmfTjd!iWWvL!U*cSI~{ft-bo?vq+%ZaofO)=60m~1 z}UV|1Cp(E-i1fEFJ^ct96PVc!xm7dQ(xBjJlM>%}EEhdW8r=ZHB(~ z#3H;Djm$jd;tpc%c~)Db!O+bBVYQcaARyfcdg=qt82e%YU!6`}r!^wY;(@^)R`7$V z&eN@KzK~F%ZnO}F^Q_n_a{xZ*74O&)A&Bz_L_DbwlqNKPZWsyrB9dB#eO!o*op2F{ z2fhWxl_$!>mC}1BP(qPYg}gsfUa?dOh)+J{xAcmiQYIu2FIb?g{lGtk0V7BSY0y9_ zm!dM_BNQ$y6tRR+!u1VG;3;5^0Uz#C-FMt!vk1{iDPm)uRBlRd!ZW( zCKj_XGm%fS>U~lRa*{;|jov>A?;k-N%IKs{umnNRHE^6pH#2aaHJlQ9_t5seVmfP& z107X(5EWI^K7Z2ZrdQL+V3-UdEtr#Wraf^YPAf)6kKCaenWGJGpDMKT=?l+77R<|@ z9?V!Bbovap?t%ME^OjxA*s;_p_F=2G_7gr0x+s4#p)noDAHo7HnkbZ#@e^(Ak86s&am&l66Q5tXUG7Wlaj zHJwKpFREqyUy~KN&S3*Pg%ON`!brI*F0&w=YlW%9P*3fm=w$`B9!Kw1g?1DaYwqKI=2!NiY>=Q{(CRE`{?cJu>qOkCs3?5SlV^(rs+1V#e84-dv0+Tp zl@Z5H>L>%pO|=6VohalV?uUcpx`LM!c$o9e#Bz7ulFJ_z%A+1~M|S4|*`>tVBP#FP_FI36I<-+=lA` z6sl-`%zpN4>F+PST`qSg$lc3iIfe2T7v7@t<{w|@U*#xePr1KGwr4;9Ut(eg>DG3* zb%ahVktV|7y=)O{-J3Qms+jxL_t64435vbVeZ?pBFyaqg8`WJKU<5ga!`ZYpIC1QJWaG{^_|XQ*Fw@2A&rE=#5!T8PL9&ILX71ksa>pX3Ich3 zFxKN$=)AFju)08O6iMqTRlg1_IUvVr8Zc_nK;0sj^3{57ln#=vWdEL>(BWce*uQz; zn42}!*RsiL(m-o)5nBMUU{IW;GhGf{+G#v%wu5avw+ z5U2%-E9hcIJ#>PWx?;KrnQyfOzEnW-uHXd~9yd7$;W}Ezn52@t=}K5f!XzU_XNp?q zB&nE)U{uhk!K8LVP~b&GK_}sALn>0epe0%nF#{MRck0B#!B-orT1oUecZ&3qi>O9j z*BL~rb5o0yNm@bHF&Q*|7+-MA=AA(|r4nOs%_%dWM`oA_(h9g%MTI3BS*la$=c%Vc zl?zDHV|oB_3pzGTn_-BPcVhOCXp0N3J*?rS$mvBlGNHoD-Ig0^3k|b{=xtZkw$dZyfeb*@q!dKq&FUY78Ef{0i|2fF6%w0WCr^@YIdOA3&QYdxx~J)*TxgMx9efd&QC z$##g?a5+N+9#g>%NsF%vr?OpB*-DiZcitvmp=I^UX#E-=LBMZxmS>r+jLQYiS>?`QQ#@SV|H7{OiTqE^@E=<9P? zeV$l<#)xe+NTI7~pw>WjYSv)D#Y_!)AAE{p?eaW%C%%yaY&5V5Z^zKd>EMt;yy1~` zu+6$xYfV{!#}y(p4;KuZd@yII#y+|UM%?m1j6`7tI(%F-itiprJ-}P=5mtzL7&Sg3rI+QQwCP?=~kzW@F z%h(e&c9S{Zj;D3VTa<}|hp;9RGx}f)*7d9<%|w_!L}oo{c@phUhk;A*@EkM%89ggH z5od9H4;@dJ9!JpfGI$c8;HUh5c(yJVhuK7_Wvi0h$aiqt8JO`mSYoN|yy|ffZ3vQP zLdn}qEs|6-5#q}tRO9iBv>}{y?t<})Y`g@Nii>3YBr}W1+jNC;*N^0rks{$OX82$x zT;VM{!D-|Ij1&{cM&j5&M=oLl>E%^26R8Vf4nI69HN=yltK{t&z;iDzE7N+GPa0Gm zg#TmuOw=EC^Pex1N6YwEYZdEywzex4hl@HXIN)sar0Lyw{-4s!68`gxa(Ph08ve&~ z4>nNV6sJ_ppB?NIq4uP@E{JyF(k1etuP~Gf6+zG$3HNd3(K5KJi06+ZNYys_-ZoIP zNnCH_M|im6D9%oPvt1F0vvxjtOpgim&LrwsjmBu?s-ZK9HLQ_-a%sM|KjV{`ZwucR zjNIU#`|_r6erE;0vz#|Yn3v<#zn%=n)lE9q;|`Szpqr8QO-doc=vfR;lnS}!PR1!U5XbVOiI4Td7cQIYlJfNe88ij?lo{C{E^pmP}kD14UxxSvu|tP1oU0rcO<#yjj~Z(ix}tz_b7O zY*Q4Rp`OgV5cfXkwUo^)k=~vmj`cX$GmF^U)94_7Dhdr-kQx=gOs8-2@xVjqXDFq*=XyHN!6E0r zJw(6Bq4FB~R6-qT&tcbujfJ?VG|@x-i) z9){dtXpv$Z&Q0=)C}_x>kLfy1*cCdnjm&IkGdsx4PUUlazi7S8TKB-?#W?2;XEZZA z70o&Km`@gn^U)i28{yfxZzgxjKT00;mMuGf>-2lGJnbg;mGM6u;(yV6xogQ<0{L3^6p}`5bni-#Z?iy0?%)@C;+Me_~b=4Ukh8{ zKbg)y((;eIpSZV|@Q0^)<9?Tq()fn&ip@yd6hv89ksmLITdpv16Yb-p%j$PL;NBs) zmrd^Fl6%(#z0{pVyAwfDJ&qxkR9bC&rM2G=jgUp=M&zwaM+vu)pbR#q8wKGM~aT;gx3v2u;&84cUl&>zI9F(~e%!BlqjtcB)}@g8 zT%l=?uZ3s^u4p^V#(FoSTHqH|wMT?Wf6erDv1=#PY?Uf8){;EyZ-iEy)7mni1uHSG zfyJn93&DkXnyLln9PIe%+fI@*Q3;zFuFW7WOsTWcGFKHcInHV{Z^(zM4WgtrFug&k z84ys-odv#8#W!KCE+dPiIEAB7A^pcBB1%s9`yZHSBovEzkf$M* zI6z4#{vZWnG6jF&0$0UFW3`4W{+5Rl;}lw+?O6<%5NOYEYEOq+4b-X)w*Be^RTQaR z8e=O9<<9Cl{Q_{74{nnWX<1O+H7|LGz*iY+bAv2}z7<6g6?84^uGN_%@OC$T&?-Wu zkV~v?0jUe~6+*FdK32c=R$mI9)ETuv!OgBnJ_TWI(n7@4F8I%#df{hKO@U|4IfZJ9 zLLYCy4lAsjvcjwICa;J$;AOt}9u#@3;}DL&YqB0zQ9ZtqQZC_#4~;{>mI}(xi4^AY zTI`aD5Lm>6PO61^6AG#ZpW=boS|P!_abG}K>a2iKMDt$Aula~d-HHM@LukaoDg|Ha6ajgKF;=*d)8Sjo4tML~yOn{Z;wM&<5547cZ0(TS6!bUWDMrmJ%l{rzF*t>1vM}$|EItJ89TJtT~1X6Rp={ zL6Nq(h&5$`P32$h#N-3ohFGXLM%&$0cB-E66l?_`C;Q7Q5u_Wj#LIq@3>_v_>$Fvu zOyxTDSeWyz^{U!4v~HovrqWmpw9Cb%-J`b!1vKP|!vW0h>ulc^Y{w$0XkuAuK8UYWayuUbACznXgB7JT zM$rTbtCA2=U;u-pAbz_^gtitj(m(nB`vrAgRdjNC-bHVQ_Ds)}u}%DC}zSmPCU$O7{! zY+d)mnn08TUHby5JuDs;3us_$t~#435~T@=Y{5k$HJP*~ONo_eLkej~R%A?DvrVYk zu1JvraXo4_(3*9M;Oj9C`|lnqJhl_|Sow686c!pgiu;&$!aqg%7`RvuDs*je53ktH zbu<#iZVhlXa>9x(uEe&17%+K)0ve02@H%{BCkR9%vR zJTKVF!_=tKO7*&uSQYVc$}kzl#i(icNR>tk#jb1SwQoM9ryRwe`{3P8;6xRVU5phf z+nn$ro59nzkJqOgVw9MK(VMUrHG&cUvM01)IMTIuz&g+Z#pj6clZY z!Hx!CYY{&w1YxkQG*^t7GE&NK$#~&8MemgIOQq|8-@dRx2*NhXYxtu%L-C>tXKq9T zt(!+#7X$9>xObd?cc6XYKN9|E3IBJHtB%VPi9Lecqmp~1*?j)bF#}7L^ybB-orz#u z3%JC?a)ecBq4g$dDTA&g_-LC76qI!_=4r74<}NPhckp52SQ4}c)7evs6}Y(NP8$C| z>9e@nrHol!-&1|$#_JF9zh5U?PVxU0!T(pdg3m7Q>rSWg&<-X1yLh<&YR@up@_c2m zY*{$AO&&JL!+LozMe*|&PvO#!o+KCyh1t_YgyDlQd<1yMX8f0=`1^~6&o2J3M7HEI z{zLx#o4ouKFF!Z7WGs@`Z+;N1EH1cMR=a`zc!Q*j)-cxEMWDlL+E0J%qSUR_1L(FW+~33Q?}A5V>`@6S?@&HzRMDC16jhGAgNw;>Xj2GG;G!^3I_brF zJ)zfx71Gj_54)Wr-cCmE3@W|ylMF^GsHsN%f17#_uqv-~e{`+&m0j3udPkaofDIcK z6ct3O*syo8fW2V>m8@^G>B8P@x(XVjQba{jP#_vp#yzQKGBcSoN#@Ks|9fW6IWuQc zG$uKjxyhw1HLjKKJGh88)iLNToRJC0UyBUZ*U7d?sX9O}3be&b5@U1#7 zBtbDnM0i1=mESO^!+HAQ?b5ZC?Ai)tIFB}&U7B10rx@NyFBHp_!gJqbP@43#Gl0~a z(KAgd#H=QR)TCFM6wrt!Mw=w}`Y{3`+eBDn38@d4Izw>4h8K|Gd9n+TY09-^#D`-z zho|c?2O1B`Nd3`xR2rT|hNrRNsYpp7H5QP@d}CvQG(1VUmL_+OH`FH!@$>jAy@C9e z%q>fMW_BIau5ZrorgmAW1;@l@WR^k-D2MZj~y6B>QIRiXXYS z%wRn!xdBoxSvDzUlyRf34w(qX5bIRWsvJ^(2;Ml_v<~eGv+hS4Csv-G+K@t8)+^N| z<0^KkhuFDov<%94u~Z*N9d1$`GgrEKSjG`cuA9x9*x)dkXY5!(tz#8!n`}=TQ?7Sy zHbIJK{1j_WFgHz6>^qd!VyR=9U^9pnY)^12Po%Z;+#O@pnrw4@ykF@e_4-1O2EC~? zOr#w-UfnweWDO)f0F%*Gn4ut8DdkbLJo*sLBtgkIG`nn zUYg@u5k3PFmYDoLqo;+%OU(P@7kTMsfw%BOGd$2Be^A7&(D%Ja7TM0?ND^QlOXVP3 zgUty7-|sM8n2to~$Fec_oamSNcwG1XKU2r`RqE9FYB!C!@ zVtwTR5K=$c1I*h%gq(D|m$w{oLybK^v<2@Ha^EksSKxgGhZS^M@F_pR`|v^Fa8O(E z*ALQDBxI)mJn1&tKm&M`ClMyC;~o5lf4Cs`%m){t!NGhd*q z@Rs@&AvBy?#BZzJ$jvre%Gve(zLcgNAX~B zFIvP~$Fs(nWH=qnbvO%BD*lm6Oun#y4yOwJZL}t5ZpQI{2J+9x@%tw26*vB0JNP%T z74!LDr*^IvhQ^|bo8u{eyq*jviAh*wi& z;m$chUOh$-LP{iOn(WLRea)rk%c0p4VL2{p=QoO7hZpJ_5vVj)f?C`-R!AI0Z&v5N zy+GnM$-HJB|5yEm)BK;h4iEmP&HV9F-fQB$u0pISdiJJ)JTj2R0}!z_56^D&)U2!cXUD~CD4upR6G%VChO%6SR+DQ7 zDPIDUfEd2wDbLp%F6B~3vSd>F$Blk8p7#Q%BV?oEtaB@#s0yz!^Zs$2=9_yh@w_L8 z_pIdqeVqU3GkSN~g-~+EM_7xBH{C4Ig$w67Ow}%mhkG>DQ7G?X>KAW)zDeqjfsD~V zo_v|hzFb8wWwT35NPjeK-$N@8(nduw$iuS)S){|`N&iF<7hc@Z7F*`2bxhR;4MUUM zUHIcj{y5gqxwdl+|80cUwnaF)i@TeO*$27OuePzyL(=)px({cNyV*j{EWY)8yXd{* ztGw5&UY~{qd_A7w?Za`3DB&m^?Yy_z^7vol`Qw20WBl_KTF)u|kH!3P6idm$vmf3( z;Mx(){tyJ`4C$E!%Y#m8pQyCYg^aJ$8=w&AB|p;UMcP8ZGu>4{OWO|9w~Oi9M}#Cz zWEX%c3+3y_=~XXsHIV7_66ps_16X2MIZRZCsX1AiBvc0V>M45lq|2K@^vys8sM5NL zv_6nsiKmxlu*$KtGL=*yE6g~_F^;|$2db)&caGA!1Tv5e`x=y=QQjme5Dv&a9lfVQ z7?tG5iBiojk+!M$_s{bvG;rubqvT&6#lyIQgdt4nT*`uT$q)eJaNj4q4yV9H8uDpF z0r+0SED+I;vp_;Jl7_=Flow1ga1E&eu1&-UA5c3B zrOsod^0YKwu3V|>JOL**h*@K2}lfg)ZV%Bw@16NF*#^k=umQHYZ@ zlL@lbJPMXCP0?MNDwsI_4HeR%W8{e!(^4p>^zGI3)jV<`i#&>vRB{DD>QpR?)1N;- zuJ2Em`!fvvneeY+E}i~Q-aAEr`p&rV-l^JaLE3A9!{hq1_*-Kh==qOKyT7+I!xCSS z*Dhbng=@P%UA*W_SYrl(qpt;t_@2hGFAoUfcP5VaCTN4wIaTW};y+54LNCta|7qeq z)9!B(Zh(&hN zB$PgxfF657l{b#b?(ES@cJY|V_VPYsZxz$Gj(|b*dJ$xY)6u7UNdsdw>!dewU375B z>Xaw5k)V{^$tQQGu)FEx+DUpH!!PvGGfQ}Dj^YfZb{ENRB>lM}YT{D3sXrGIWB(et ze=TcBB5-tc77=FfN*a;{4LY-&_s)V)i7|lN5<~1w1Vr^r zH?K?JkCr}MS?}`RGPC;V=mkB0xm~lQ-kQoEI$y>^QB@1^})F=-gRcZamu?sNbyB(OqEQimq|4UDt+cLubV|1G7Oi-NX`(o0cm9oA8e!l?oS$K z%l%jkh{Pni{(RD3fECfdYjlwRjrXPrb04x@8U#T(8`L&MyEb*$hySnN(0X3Aj90BQ zx}_B0N_2gW+@NQUV)js&@C-1W3YpNA&LH=uvFaS!9SAe(Jr{EB1g-Fw|2&s|v65K) zN&hjdYQ|b-$t}x?nF0zAtRo!>W$jD#Z|)hzaf{_XvY(7>S6|JguVw%WbSswJ3IPUF z<)Ke0eG0GzguZJg(>1Ja#>{&5$cL0JXZBoLwu9CMv08V^i%9o$;#i`0WTX48gp(`5 zLO!Hd(&&|R+8wTRhbf~92D`eQUfn|8nlIHR5WAQBE5zDC^aSmPGwA*K5>L>-=Si<* zDJ>J}&`DU226bc*_FAmNrX6tjH|2q_Ttm({CiuhIv=?SlvoxS4N7%gtbWtUIJgVyf z?R6r$T#zhulbkXZH;?0W$)sU})Ucj4Ob~)KX_yk*5U(^$VgGOG-!Pts3Bk4@nlwZ~ z#BPWX;;yb?jMNYuAj=J*iY$UQ8jVVWud%_;2S^8(MlW5XC-8^RAsS;5X5uU zo8EP!ca5;43nSpbayqaKqlb0X1ytTNgs(t_K?l4N!dnk0PLXw@A2Na57z$$71z4gR zbh`f2!To1&UM$2{#_--{$G&JFiUOm5I_Fi4P_5%GnPxM9Pa- zPTgJ(j&iwxT+Rn|68goB*_1D*HIbxhsd{5NdzdH;t=%WVlAJ-3wTP6iXAWPfC4*du zq}OwC`VIJPeyIUw$^H^Ok)8Nkl_3GeF%v&6K3 zFS2frslfZR&YzF_-kNDWyisBxCJSmx|+RhtAX->}EMk>ld=lJ@mW><4FoHA=R^V=M~Y@ z+;Dq`2Q0S=EV%-5BP$AgGA?1}AVoGd9U)Eo(Tj#r)x%5;M!*!X;E+TMtBS!pqeDjv z*$b+#kocjbVbGUaphI2CHfLKfi;n?C5Z#|{E zewGfq7#fVSIFRTtlZK%o;bV>>xk0B6t7NEHH-s=hSRgue`mXup*&^LgiPV@vyJpdf zJ+xx4)G50T6_cSN+`u|j+No1e4xM3+W2jaq0435;iN0}((wHr{a*_Nji*zkuoqDy? zAhHKEE|nT{6vuJqC{%}zBXKBm98x;9gG*K%*={TfSF1H%A`x~{_Hr1~Y%R&o( zF^}AfSMV)7M_{yga+35)v^Q9+4sGg-BwjI-S0wP)Csweg!*6XIIH6VM2)#f{Yw-xuXWk`;h-f%3vwg~C@bU<99=d}fWkqD{;-4y0Q5M-uTO%QCbXF+RnN)&FG z%WeKD1e4Cuz?FM5*u8iP9Q{|3MrmxlHzodChDk#FSD zpBB-f0wJ&w$7g|!ed}NPSZQ#F6=*Sc@wf1)P z78gqZ`2cZ;e#E{PnK|fx%|Km8CS7M5?}BD@kqetn8u&m`}!BASeV zTLfgkGf($UvhplZeYRe1IVtoH?Z0@NzaX8&u~KQ$k&Y#_Bip4(Zw9%Ro7_fg@^^kS zYMNe%ahCCYx%~SH&kCO%AFdZULf_5OMkWlq-CN}h zaV+F7JVY%lC#u#-YXqdxvi;2f_gAs1RULcvka9&w%|J=G!s3?5ri(UN*8fkDejwlU zD^=GCI=7rXLwqX!eYHxgdNE3tmKRIE%HiM7=OfF8_6_aVD)zq{=q>PymRI{WD86(I zxw%xSSRh>s*2PI4(!(wE^Qr7_Cn(RSPvhhd!kHb4`F80^2D1TjlB4h5OS@M~A0QZY zGieDUz40`FzPbxhT9PLXMPKyIWPM4j2}xc76h|!3T=HzJ{7i2Ogjw*`cycR&ddu&v zliu6Nq9i@JwnTqzBYhQ&Xr8=7UwcY=x;_OlPL}K3I)ip(h2GntGzF2SK++V%ngU^U zY8oRo1k)rQP3+|}=dzpXlHaKR` zY}WH@JNWNs2wkbPu;KvyI1>8_+*qi)F`c@oBRW|#NIXSu@nxlJSnmYt?lMt+4{#cH zvBXP{a_c;XTHY%fHK;XBbL~o&9ByjU3|-T7dLK4%>NJaqQ+kZw%+y2v1%3r1Tsr93 zI=r4=+s?0T7=)8!t;3Cv1n_ciUT)y!dNGitZ#9ph_l~gZlgV{o^8SAM{&7(Lu0**j z3Fr}-woh=YI7%O`QLe`5Oz;3dUZ*_vHgyG%u3cC{&%ESkX6i~EXW7%0O8?6`c{N3!DZjQ2GO2*h zd~lpz-eNGKK|vzeqx3i2w#5r3Q?%{A8@X==HLWkAPFHYWTZ-YGWvnU9)Rc)mG@zt* zqAaQk||!N4l{o(}*25nnu&l0iX#ny!1VOb43(h=>~_EK&ik>i4Ob4 zMk(@!7)Y=xhR|BtHi7?qtbQjSF7e>s9pT>{=HDIqI904OYjc%1ZC@r9u+?^F4*d4u zmB{M_n}N0N#Wv}Fj9kB6u7^@ghPKm>Q-v|e`WnD&-xVQ3OS`M`?@l--d{|uL(s6{} zTFh_F9}cMv6h;B-gF8t?QAGrsNxD9pUY~?yf7jYm#oIkXz9v#{v;Yp(hW< zu?G>-d}#rBP{JM@fiWJDqWfVzuJ?uq_WBxnF^p6t2#+86m4TKf%AJ`q!pE=dps!9Q z&TL4T_m?X7b9BhkbUD^+N!Ne4oxbVg`ldJOo2T}zkYJ8f3~&z<^2QAMMgkp3q4sg4 zEI|2CmOpf*A9@S~Awr^C~FF3as)rjX0G!SyV#3D#k5J1tzWq-n2L(*fc1SDTLNn~vz4 zj*_M$ZcPVC(*d<4%fBP9Y~?&mi_G%*WQVd587Y&{9aLn15)j$8;l!W!Wb z;W}1SSnvb`t_uGw^j|zDmgp}5_T@-Xt64T*ju<-1hxha0eJBC0v7Q!`rQE;SSE@;x zU|UBUV*mJk+oiY(Ox!ySbP`=u=2`8od zdG!8v$jw9fm_tLb2+Q@d)U_R2_}8n*{eAj+JWY+w(@4iWa{n0KWk*5^+Lh0S^61cZ z>FZ7M(__?rhS^U`^*Xg)WnDX@uQ%xL18iSJ?WfeCjihTQ!O5X5>dz%#wETd~HH z{vx^Fo4gS#%r+Il-|7SwwZfmb%_UtYaevnt)^*x2v|qL#AohcFXb&CQ%ZB#IT_x1M zU&c>(W~pr7OY8uxvTi1%g^E?YE#>J6{@XmQCZ7+_<{w0Bm&3Jp!?Z!yN87n|($^=o zNArK>{Yeo2L%Nt175V2U>&}&^){{ENWc?my+iqOxjqEzjr&x_*s6!U!9n9fofD4fO zsg^aY#Xv6{^JrQlH-*WLZ6r}&yHSr&X<8AgNWs@)RZWdPE#v) z5L*$lE1HmGr*XW#t|Wxdb1!E0;{lb0w0@D|Se25AdhESBO$F)$G*4hiOh%(X(S!VY zft@o0W+cpz0S0exRWBQX%7QhbW0KSX6u2T$p!J2XPk%m=oOdHWu=5*X1XL8@X^9bb z%ks_o3V&T)p$PL7|Al-jMno*RUmPUDbSE5^!YeLJgTR(UBM~?uEZI>ENkz-IF7WHs z>ZDq@r1d~MgsCF^(_A7uHmr247fv@9;?|g^G%jY2QzG80qJZ0%%Jx0PUJwue8d_z~ zCtVv@^ASXu*>^y$w(pFz=eu-mV_jRRy?{2K0uyOIDfA(C`&JMF`!>COD>P2rz7tl= z7RA^iEB38MJ3O^`LX`f5+4JB9gw4f6ZNX|ziNu!=^INd=2vQe<_65?p4T^2Iu+0m~RyCR5I;9M|>4wdS*`~v0ETdr$ z+A@}Q?UC#mWMHgdu2suyld5+OEfW^G!NR(=T329qhCM?#A*(j@8`;}1QM=Gj63Dx0 ztSk_tf8hY>oQ3Au;_06xat&*3EJ2*^pE6ndY^btGt4V+DiWID@bpz0nQvVV9I&y3z zu-YWrb3}3$(rTH!z5{d8S;+qCN!lk$uZNO~>8!MXwuBojXX)RA$?s>g2Z2cT_Ap8+ z%_8>6y7sts?bUbfAx{sgPY)RES&BW=>$4@&uTSgj zImEt%K2zNOZJF8y%)}AJzI61_jo4cNkRbR_g=I$!q~IDNE>+lh#Pk(hXS8enr9agB z!8ENbjK6oZU2S(WyQM(ItNK4M?GO5qK~KcX+!#+_O z63Nwrgd?DE0=vHv>(Q1=ZA&CS3WUz+us{DcTIdH=f8%X=Qg^=GU7*@mvf(+(@JwRQ zmh8(3^3Ef*z8%`Ls7`f2?bdhwoi1AGB>r=WHazv40&dycvn^#2u0{9HpzwGT+YZ&X zUwMC~{Qg`(zhEzbQZGpt^V!9n^z9V-_9C>hFN^i%sPB!F--{4nH1gpR0?XcmAo|8) z_Ukm|*Nd@^-#MZ7nrLf2`r@r1<*g7NHk8JOGJ$T9!f@4Gvwy zM(FS)+IPM3qNln)-hyovk*gT9$hGW z&Fd4=J-=?7&7Xhk-ec58PQ0_0zlX&98Cw5}lyKbiL1P^DzoVAzx`w@E2Q4+yb1}53 zP-;CUIktF|>Rf8#nImPbeG;{n$mjgzMzd6%&e~&Lo80B||BNXJUMopoH-`xsP=8S|7(vuQ^f7=Jj*tt7 z@fVQQ|Hn;qVY~4{o*xN=%@P4iKskunhQXF47_mWEWp@}qjDdWi*}e!A zL5FV`29_g)hjqte7XgEPu56!;HPUiMKnrR<f&Bu;MrapErT`bA0OO$30pel;`COaJ>!+y0t4U7~#6kOf)tM^j5ID>`cOnbb^^O>Z5y=(U(p@xoS&Io2tqxQw5M}%DuZ<2;L$~}I9kkoeZ z^QczZlT}Yv^LLY-8N)jW*`) zx9N0XBY6s6zI73*r3`OWWW#gla=PaWTzbaHJrQ_g&lu7Z4EFjwjkM<~t=NKNm)tX! z*i&7H_mJmHi8EU1UMc_fwBWFHQT%*3e>arB8`2Y_^)9Un;r}tmp5DFYw`aBCLeb#5 zY4=w0Z!>$wJ10M1t6kl6%N_UfcgKnaT$glj?adARuhGND`L`MT-C(U_<|p2I{;sdU zv({zYTMv=y;Rf<>vxp*K?=GaJy4f|+)QddzL~A=YK?TQFQPtQNFq^z?Al5v9 z)8&D!?5;wdW|DtB!9LAqJcU~0$S0xt>XnSoWEcIFyTCW#<<)!GTVu)KEOP%0Ev59~ zY4T3E^iBl3y^!4AC=X9zS{C7Mw9G^wY$P93`D1tB@%_m|iCEIeNVJ%?b(y?=fojiT z-CIcaW@cXwOon|0an5%g*dyTf^qo!goy}q zhFw(4fqBNE8tdIyg+eT0N@Jp-v4~kSY5h`mX)EcX^s13uag{G@hrJznZH#<9s|=(a z3y?-lDqTm)52}1MEiJ+{g2ddD%PNB8i~CKlMR-)MWMzw_#>uWV*nMJyzUHLVk?(nB zqIy0-zEq&Qx|LpDr!-B-;#ElgRAriI))4))p@CpV4-O%lTH zxmB>$y`EKX zpfx)fmLOhh7W(vPR$1GGZ&w534DuxigGe3{f!lpi%CJcNqUj?E8i-dcWLBW30W%Y0 zZkx!hXA2-~3$cA1plK9w1~L*_iiKdC%+JT`?DGxH>uK{ky?qXRX7+iW_PIjMcCpX< zWlt7JQ1&^HRPFO%khRZ3(i+u1Ym}rDdjh-?(028*9UCuAmVhLLH{On&O`-%uPql}6 z*uzC%pf~NlCP?i8g4+2S?S8TyxIu(wKw1~rNPD1YDaZ*7Q?~iM&m#gCMG%57i3U)E z8QkOuK~6_yIaQHIT3Q%;Bp!oK`@%l4t_!xQNM%ojU_L=mBiN0_}$$F4`GC&#hq0R}c zXFKAzdkSRdj+krCKMbD}1qd5KVPtYgHh$qw2 zI}#G8l93{!Gqy41voyn#94h&sO)`DIki1_6fe5-iX5XL3vp)yZ)?(7XoV|8bzQPcE zBqP%IugH!!8T;yxzieTD*$%2!H%*V^vTtRf3*X9tz$*-fOTR60Co5W(np<*$<;V+J z`U{!BiciIrCA@EmegvBcc%l?SIT`VEQOOMtb^}_OG!g)+gV0`VL18D-4R3kGPsr@J z2_X_A0TOg%qyQNKpA#%ux*`0cm>bB4f<(JP@(tt!@H33~>M^&3JAEW%lw%TgBvd~V z0)=!Wmf4Prd;yMN-iPqwAmu-j`8)IfbfgWS;cvtEXR&`9%RfHA2Lkv%vPUAdM`_6N z2DQsE*#^P-q(9ax->LH1D&Hx*MUF}LHy{8W?a+Hjjlr&s*q@Ogm(@;4HC|bA1RJGL@!Od=sTM}v_NY#Om(pCPAZdz0` zqI>2ryH3GANU!=y+8SD#PbFb|cAUPy)6b|>#~EtVU0ToRk-mmO^l#k>GnNQKY0X!V zbP^F>Zmma*ty@Ga1m-%zQdD#eRf))aq5>1f#+<+?|38 z!9Y2>{Gdc=LcRgdZ=FC}CqiFEM26!icSO;qV1pHOLb2_nHdsG)LjE31WrK^DD{ULE zw7Vi3r!!J=q-4uhdd8%{ zBI!8B```~1)6)$N5ylQ-k3~>FEGA+;DhPNIh$f_f17Q`EMqqP=J}ICD-k6zyg(GJw zXl-K$FALxo&u}MPa^rYP#mUC0{6XN)C#0WGimZ2yy#pcgzbsV$Wf3GnVak!E&t|aC zCP9!wxSgm29nO%3(?KG!*b)Xp<$*A;mG@`rT9Wn1F@R{n^D=#6rUS9+zyy5#LmmB4 zB_EX-VIjM}2$jMs*dGs*#_2?xLeAxp-(^b=7t)8x(jN=y9}kg7K&j`GnkYn6kUlSZ z$%}O)=`P12x|d!)L+vU-{=;*TqJi80T*mtKrfzEFP2az=r*-w z5nHAh0(?|$m!x)?_V|x3z|WNF^;=bEgwD27wyi+RY)gqPM{>q`I%81k2UmOAmI=x) z7V|1%%O%b!vNK-Dsf`c$o#>F!OGzlb{koQYT)K`@&ds;7VI&z~OQPme16{jH5D zTA9vT^snhDvAB4tGL`itNXU7o9i`dIV4+*B&`xB-2XOT*YAtPejCh|_S(w9N1GGy#H0T+H*mfVm|U(1qu zA_-qe`%cr>$ICTS#Nuyy?PUZ(nzxH*&=A?SQm7f;gL%pzoVTEQg9QkuL*BNFg~FlH z)WPq}Qps3MonHj6X7)1H8O@(A$L8?-#qwVnex?68lHV#2+2EU92UcL_VQIl`0)d>p znL?XpD1SK4`e(5I>5$@(d-iFvJOC4{KW&LnTLMUnKWPEaMfW1m*njlki%_Y4I;)?- z-abnoq|yhANNEBY+=MLnqnAHDOg}wBe-*CQWXZqT2fq>!HmrOrvg`=Y2>pDG@jpV4 z@?ZMhH1@j$7>guU?&eqSn-Yl%dUMA{)t0QYrO39$;J>ys5j&{1ol$S^qm75z;6XBY zKsR_$0voi=mj(~A*1Z%-1)On0VDjln#gt~YBuoNn@DNN(%sIv2j3=c>$nAN?o^;Za zA)VK=^9CWyGzaoK$RII+xsnL1Rbgxt`1oI<;G5qWr2Iu7e-XqlWPX|>{thg&&FwXg zKKYv(-@x;-+&)jo_e$kE=*2l0Xi{gO3yJkK)wYU}Y5r^wV15`qu@nV!Z~lniSwThw z5_%+^jAW3(Q}p5<`e`otb|H06BDUE$Z|wD;I2b&oe7ndnvV_?Z&;mi;TTFu{K9D_l z>Zf&g=fCE0k!d@TR7jA47QcpM(ilxIXL(#Slk&Z4dz5-5jFf@s`RK4cmz6LpWi65H z94yIG7PQ7sAx*6lJQ`D8uPa8L9`B$0JeY_rc2YouFcflK`? zuS%UqV;JL+ITw9oODL&Y#M*+*DN4r)@7MN(^m<8G4+%eL%V)P|dz_nJn(S)8cAQ6X zB7D#dDM~BT)yg#Jim(F1po~306gS#y}&43_UDjL@K!FhLlw5npxY;_A6-Gom)U^(rJZ%wL5C z`atXi91?IrL-ihy>YYIM>ml6;f~wOQNmI5|HK?6Es{}h+jg49L0(? z#e>N;jl&0pxpOqwMp(N&P*ZR?*<^CZ6GoBho&+==!sI56`&=9Mx-?><@2ARW*UbLM zG#*_xbG*fs7XxL2EWs@yFM*BLfrbSlP&#Y$W$<~C^)RN3SdZn1J(&e`tO$`7;{F)M zBOtp6lNEq^36FNmYF-uxME@be;|R8*7rKKENrDjA52v{f>`BDOq-?~UzT8m=FRm>H zs-$gv2w8-iQD<8;vqc%P%tELwRP3@Nc$Z!_+uRkKhu#L}8)T!B4H@K%vE1uUDs`un zx|47z)D3*| z2%0fEAV8Q4LY4mIpEwpv|NJ%HuLs+BLrZl(|~&pYd)JZk5f zY@w#AGk#Wg*126wlkP=@XdsXWWuL~w=jV@NL+~NtN>G`RIdyu*vwDK5fohV;Dqc1%zm(5ZJjpV`-TAPuw z9aWh00GwnoDV2aVELR-`K{6f;Jw`2#SGV%G`c3EoO|25$y0FGvLbdtqvT z(dm%=L{KC^IMvb>Qt1Y@VVBgf4jUHGhAle13Hy4w!}*53bdh4&R0T*~5oe5naie-X zCQFvB)Uwkw3Wm^wHU>3Jl^Z6n7UNlJB&ERnVJV7y4G=)YC<|#@wVWh;2ea<?VPZeiZE70j{$=^2E1=!w=LgcO&>D*45~6^41l z#ni_B5gn(-cAQj+5W6ny%tV?uv@ANqjlk? zx-e1~ZZ^_7Z(0XGH$IMp_p}ac$xsIvu}t>j9SBusA+;xI?LlMh0aNXM0h!U&=Id*B z>S}={+UAXlh_oG8YKXBG2w`-8ZMFdBnroN9w8+e4Q*An_&5*$~e291LVpDBuIFoA^ z2p zM652RQ0QnK0pGb&r?3uVjp<~kk-_p!$irC}?uUtZ_~9%OQ9&QhBM;}&+C{83#rP0O zu#(YpwR1@=PNxYQ3Mzi#fO^9uJw3yoo;H7eSl5`1Uezm&66L|l=ZksYL?_T#+|ahc z%Q}-*?b81lgJSycl9)>3Ub)+|I>*;tr%bFm;i8MK*dc`4jzE6*j0~?YIuKJsq^S^a z42Bt{0^Rou2;&Fy8|%HR(*7glU-Cj2A57u{TPBFyK0gG#sZ(WlZ~kN>f3nWq%-bV) zd#IdX3V}(O{4n9ov&4TTh{O-^e_cFrmSIcIALjodGG&K6<9_u0gKW`vv%d4&5;0-h z?@#>xZ15%d<<3uo=j(h9EcBSMe)gQuW$$Ode`d1K?0?wwKPRM`l8oSK5zE3m_FYQb zll8j|pPj9kRp}#~aXF5?Unm@t*=l*7*|V!E<=NEb)z!<==u1d>mj|_nR61U1PQ7 zf6Y%U^-tm-`)mGsd2@*=Hit*(`BC?IQ?>P?GC#RL9t~~!Ujj54ru*0Iw*}L);pT$` z@;A4$rT$SoogcO?EDyGN^W}VnuU2f`S?O9>>B+ZPQ?)sp{dmeb#j@{Bvv$mWSc{)u z=2CsodZZz$bbkFF9#XMJn^v1?S(;Y9y&{!Qvxb$srj_U17-L!ISZZBV=_cEDmrXvG zr5RcS%T~8-v2HN(xF{a$Q94z&#!f0{ffarWD|h@{Vm0VW$0+=mRJvX*b9LcKo>Sel zSw?ftGKLv>Ic|&&(+c z1SB78JKFHw%Jav@mnJ4!EEz7AgZyBM24@nf^!r>-$^Nw$zc9^9O)Db2IFSuRVRr0ot~YUFvU7URiX{kO=+VHdH?om8HiY*NU% ziSg$qXs07KnJ8kNsR=ZT$u2w5LPhe@pPgDrX8TUAopH2w1%c~?FN$&Vil|*T7AXYx zac1_DB8~p~()GTUUH+T|yOzgH0e;X^jskhKNI9Bc@IF0H_MItP=Eaom^DH)MS+-&x zX^*rdOxN`O{)|WKEhmy=)T#O~*^=aKMDH=K>c`4{(kyu*vuyL-QeTi+e|&oVVeaox zEgAJEW;z1Fd)ypeZjJ=a>`q|r<_m(kzq>yG&5r%t)Sw@SeBn&lX!60{40FgVcEaQ$ z1)AI?qd8sXCQl2C_90raZ)tG^4+*r)$F@aWR`;_7@@#dQ8YibUp3q{;=4RN`0(WhD zQ&eQrTy0WFo;xpYTIJt#e7tN8gWWvBGNiCfk!q56@ zlY))NmBSAi`EK(;N}BWVWzF1e{3xARaeN{*kZ<0jn;922$kI&rX{&+VZkwSf~pmU zS;j|{<;TzVoW>SNv)z5ot~$O0@omXQZ)Ju1af$n0q?Y1~Q+XV-%=UF>e6k8>DX-ACZ9d$~s^b&1 z1a09P8J5!($1JIyIFLm6Nsf~V#q>}f)LqH$UVfCS6|&B~!UcbW7b_KGNhr|q0To$@T`ALR2dH(M#Sb2@)>Rk{ z#*j+UV2xwc8aaMNS*DI!!IrG9Y*qOfm0Df$K`2t%IsJP^SxpVABYc|47f z@U4a+KSCcP9R3k9Cq3SiP9Gn)Y-5j(Q1<8mpXxP)&3+%jjQjdomw-p{nOP5KhSSGD zH$6^u)jf`Op^s-|)5r6JrN@5$^l`AZR{wZ&xyl~9Rha1IC4gYg;lcEQef<>P!NeKqhPVAI$> z@YP}-K(DxKX2ECcJn%>-K-A!*5PNcWRwiK#LZyWh! zcH528+n%oUwx5pP4%k3%PhL)MCuv#q_OX++&oh7`12^sS-%a}_y3oEUJcRbG0*>g; z80`qXvo4t4S%Z7;hH?~(z3APHW%TYkj)PM{^zLa)^L~GhV8Tp=_AlW_X#W-j?&dG1 z{YUh){}|sv@3{rjd){93o}ZS&?rlMX?;XmO?w!^4)BDpR=$ngl^vz_I-k-+_eRG92 zjovSaq4)P&7Et&Lyy?IcPU%3ZLI*O@{DJMu=)lPcI&hZHVS~OH*1@-NFXgY-f1LiSJ}MIU-g?4h55J`7w97?n&P#_;|)IzqY3-b7NAH;c=6(vhVhbR;(q z@@Cjn>NG7-oDr(Q8N*>#4^<^+kmYV9b-Ibw7`|G5Z+0H^xXAkfALWsNk20v?W3RUH zh7ZkCrH|w=!?R69d6w@^pB;BIf24Px^lV}tB%$yo`lktm{wc0hqF)@6=@%!hDfEkE z$0Yj2wgC1;wl#}>w%tYf?64|*cAB!!VNm=WxlKMdOZ0PZJ^MV2NuQ6E>E|(wejbOv z)6m7AZ4wpwVFUeZlsK4FL;q&T+e!%ij{a~opZ@4_n*JCl$^W}|68#Yt$RBa#e~$;y zAC>!z{%{zr{vJ~DcPAPB-fcGhZX5m@RQe;bKz;9Hq~GnswL|#7htcnj7}$4blj#rp zW9fItn*-_B+k)8t6uzE9|FJff{$ryX60&NE^dE;YzW+F3DWP9_X*&94a2cat&f7-6 zOq)%=%;F0Daur`dzuauuN54E~37}sYtlspiv8(7;G0W*!6E@PXrdp1%uU3{$q+jjP zis)CTEkX2aSIbKJ^;n)nzmDgw^y@jR=-2a4(y!CA*w;%-v*_3Rt#jx%?tD7^Ch!>j zCc;AKH?y$VzgbX1ze)FF-(;Pl->mmy-)vdQzS*xC>2rcwKG)%0&k?yqpO4|$^mz=Q zLZ44PMW4^rHq+<1r7raOk$LR-N!IUEywA%`?X;D?U~Aa`f>^nqA%z2&Gcm|`r&2v5&Ci^ zSLw@jr|HYh{NZ@^U2dKklP`__>Fyh4t^;gWC^D^&b6PGG#k zeH@PbKx=r#L?~Mo@!L_%!Ib6|8Cnd=EtbWUS1P5bVCB4>lsEhH(~MWHKxHadTkyup zLl(TF%H=SwrAOi@zz0RJ3w~yS?D6JxQ}8>^5{hyK5^q~hdE(^$QWwUnT~WDek69>! zMa8RUB%_!Q0>xY0#^HKy5Q_DvT#I))j`pJest8XOmLe7t4R7|PEvjz*pH3d8ReQ*jhxS%Pv2UU_acI`G_P)cD+v zIVcWsBjvR)CsSU!dmiPjx@GtsBu1fj>ID2A!^h%qk+v0Ofrg%FU7%yUH5oOl^Aa_w zi{uG7yB0thUYEu{jKgeh$i^gT$l|Pqlm&ZxH<`+zd8kL;p#MGOygH`U>dl(3U9c&2cN&Xe?5xA3>0S|AMtCh z9B;c8fZo0qjvl)fy9dQI?9p*8fx}aOEm_=@ivGQpscl2K-w!7bBNfWE(>Qrug4DvV zM`&29*Joh}uP35Mug{N0u~@wS`f|MV`bKo<^&OZy*Yib#uAk)VDDO0+q4309?F_`M z?Ht3=C!OOl*qw=}e&;-nCU!1Gr8}1=qF7@>0nvkZZsDPfcOJk;I*(vhbrzP!Qr;Db z!RU&?-07Mu=55z}tjMl~9w-)ZOzf`J=;5vn{3OZ)dnT#TV`=MNfT68ZK_hh1byR)}3-n~N1$nFyKd5_MDwbe5X?dh3?`uC)) zMUl>-`}C~PP{SU`*SzO2M|nfX=c069j=~o&yb*vQy%DhhMQjj?34)g0SYQFkym3^+ z$9i?APzWN^>xXXX4ZsI`BQ1J~_b$Mzdlzxcyxvt}687%4VE>1kMsOs4GXULvGxPw8 zXteNV%tRDZG>rbu9Q5JMWwTMN+JIu`Mm%$9364%-THJ!Xz;8+T{4H1T6@DuuRpPfI zp}p{13&AG%tsJ!CR<0PVTlu?D97ez1I)O)TW6xlITUx{TZ66D&aC@RVig-|u+taku zC|6@}Zm*9-v3V?tZSzs&W9HmGEbciLkKznke7l5aFy3d z^jTj*0E$EmR9}*~X`zbSQ!vJTi&3k-3{3_7xbj%=eNo9M`1Is#ELPa4@x{|y`1ZOMZT`e!}0LY6FpNwTy=2`KYb z1IpsnBrR9m1`>VnPwCrjD|}zz59a zl=btX1RR*v0Wk2jR*Vjd8?nH(9--;gVa}@$s!7f*9bhovK4P3HMBhJqOO`kj+-#xf zpqry&Bt!)p`xpn_!NKxV?7sVI@aEm z*U_77k-Qn1dry&hOEP+|1oPH7dK(J!ii~?Df!;@k-l4#n&pA`Dwwx#=cn5J41Bf})6m4T_?OD2NGA!~iBx41lT5>C?HJoP&TM znA7!MZ_e-YT)k$!-uw6e<^41@HDBh-J5y8j*3>)OXG*$hyPDH$@3Z$>>lZfp?>mZ{ zTiVYw9c?_Dkd>F0nUS5DnU`QY)O_%8LS=jF*~2GW6G~4tG@of{K2v}8@S&wT+ldni z|MmISgfoX*51%>z`OV71hZB}AD=RJDP+qwK34r~<)o%FdY9a!}W4#U%>Tm(b6$IpJ z{)h%Rj^Ky^kTV&`I{upgI=9$N@I>B-yKyVYrv>41Y&_Vv$(kSl29!U{z-$TdjdL?7 z+fWVz2}DWG(1N5B_+@g%a4nGx0<(sP$T=V{*YfMGOJw7Gm0v#1UE4Wu1gT_rV!~~h~Q3oYQvKV&4_0R zo+T)squ8Vcc{if0mq3nL1j_5wQm)*_Tn&<(|FWN0OgE&T|zYcyp+Pv83cZdx4>^A!{2xazvm0^Tlh-+c^SaZ zs{nsqT~88Lz#pdo{y1SXBo4?I_+$y6A7Qeyicb>-4G2;Kg?dc<9sk=pn~T#S$g zSPM0@777T^T%?)}guosQv*{CG{@#L=|6w^owh~E-2#8twV3KOnB>wmRJOcdlK#1o5 z|6MOENXFmIJm_^i_(J|D;IDISngvVcNz1PU!+r|He?=t@6r~}#A1hQIy zGLL}PWAYo6kJvORf*c1_l2d>h2tuN4Lu#YR|J&~yHA-yZ8XHN8{X;~kk4!m$avhK9 zAdjtR|HN`l{a9)jQV>cz}B{NtEh1Am;c8-+i1@_kW7;Xm4f;6F8| zO*w8<4-tn*)B{YtLewpwZquqesk$B2qtsz04!u@w64W+yuUlqZbAREubI5QmU z51jsACv2GWk0RQnoY!gt93VgmV`6Rw>neH83##L>glpF)))94I5+Cg@#=_AERBu`s+G$Fjg1 zM{X@6z3YfOg>*N={nhy03iz%9#zJwtfLw&1lHtK-nAs-TchVWF;I)Bw9SNKuU+yAG z6u8#ny)sdRzGX1I6avvOm;~w(+IaU3jJpcUF(FAWe_+=h7*bRAe~R8%1P+GimnQrSqx7X;?0eCuLQrU z1n+X}EyCUf=-$pon{Y0UJU)##>w-qs!eb(MmchOKnuj{_-4=Kn2ZOClT?m1NR6b2S zHk?m_pDM`pG}4(zoNcIdz&szrR)ew=To&xTjNJ$D=3X*)6#ZAEz)|YiN^X_o(@-3^ zL=`=_o9UO;MAgA?Df-sqSBdbX5f9?@cDRv?PqxF|Bk-6<6aj-P;Z6 zACxw@RV4H+5R@|JZ$>3g^U!AcHU>Pk;JS!?2c@rbSYNrM?4c!Nk*4N7&xZ?`T`E`ruI$H za~51@Nmn7xSjc|OZJnVj3H{47BQ26Mh)r)NY7>qFRo3%thVph8+6^v#N5Y{m3T_s| z@E%m^;LCKlZGqd_bkw39OcT^%a^oP*Cd1rWxLyep%b|BYe2d^Ofk#)!j~i)U8FVcI zWh>lnqxT!AbGa}PMtduWdk-6rCiys6pqV|+I@hsybS7zs&cmQhXcTX)Li+|Xw-aX% z!gUI2vWaKWu~RUzmpoWxx)%e#9cTY-JqF^TTYz3GapaOG$I0|1(jN`{8s2D}KSu}R z$h}j-7lp#@I#Er5xins+fv=^(i|9Ne%$WKiITaoz68kRdCNOdU z+y}t1n|xhJe4F`Jz*-z>6Ygf=aEIs(wzA-SuE&RleE5bj&?@db9>WC~|}!T2PT zjn+f=5%wepzCIz2{o3TG$^d;cvQW#rIy^DpO66j;_Bm*rL_d0KZT1^zRV{!#)@<6-VR&g=u{YIvLi z{2T8s09B*?widm+aV!RULAY_0Y{q#e4PRu}PJk~M`IdWl9w*xANVqVQjrTW*->eFA z=ksRd;brVugM(CS1`L_ayPG zg|Sqk8mMv+di3GyIeOOH*$Tg8Q-6}=Xw%l>OgM~Q5oa%;^s1l`wb&;LT5fs8p-|jbR1!7Q^Z&$^e>d$tH=)*b*?Zn zm>I5=kbVuiQ*b0JX0jsW8!h>fY3^w)ck1FMV?|#+&b0_*t&+!NoNXrG*HC}HX4JxC zAh!qAsNLBEJbkA>NHi(i!p;~Rwj?c^zMb}|h8 z8*y$U%pQz)ZlI1h@TGsw(Y}r#S2p;snkS>^z){j)z~>M;jR;iUk7_3Itc36O;t$Di zmw@|l@W4Sbok&K@h<^*2i)OcUV7EbF1sT%7OcryWG%HJBdL5lJ;HY#r>&Iatd%&u+6(Q@kFtR2{(nJYj?EcjD3_l)3{*n?B-dXv~` z09OHd&_sq!w7VK7wus*a5r+-OgYnui@^~Bgl35&hH?#gLqNf3RFA-Uzl_R0Q4Q^aU zyUsFsi9OAO{v+VaCH%e*+Hf>P=-$KJHoV7|cs9(2V>f_$oXC-acY!zn!gwW_;5}Cg zbnak1p>Veax=z3^iDa-GZbqSMA@(&wcQg((G5>lp5Ch#CfVX2k^PCLWD0mG*3?By%zK=#jZ=}sMn4jCax;F8SQ#h)*1u5#GXVlaR{y% z$@n_3=dp6yv&e8OU9cCj`Hk$}YBG=&G!`V?DyFhF&6y+d#$*sQ?&C3hJ59%-_W<)9 zA- zvSF|VALr4obCAt=R-LvnITZqD=|C%)kHY>^bXqhct$a;@=OoxG(0&=*Rb)m>dpmG; zH@HKfCkq~g!h;<=AA*Os{sqEa3gd@>FI4w#7+xpbsKlX4ym^rHtcEcOT){9Ej5Ei; zc}j4X!cZ8xYQeD$u1CWS6ATwZS0d}ZM4c<~UNsD6fUA@YCyA~)xUm<%2#2S;v7bZR zRN&3?a4X!`!9X~=PQze6`f_3RfZ$jT*Awx&6(_Z#Qc9Ffq@OqCb>P?u?$yv;i$hx= z75X9&*k}+L->(a-r+xc0Hw+^0u)IsbZ-6f?;3DW<4&Gw0Z)c85kk6w144KxU;{xB{ z_Ga39NEiuaenhnh?CMB=L(=UvVL$AHxfJvLJQzY55jIs%b zwqoEQI7`fqC5-n(Jsmow85AQKJ&N)|+F2#|Y}i|%RaY}5lX?$_EY^BL1oZ+cF`Ax> z*xkn57sYOo1d@$vj@}UhzQYzdnFJbbF*X0=`<0@<9RulMuA_VHIVa^Epyo*Nl5&Z9 zj$?NbvFr5m1&ynUdA2h9e!}}V6+`X$`oVPQ+s6XSMMsp?eVp1wvymxvL^)EAb(io_ zhHY8hmB~|@o+U)dW<|QuojAx_wp^imJ9Dqqjg-Uq9^H6|7{~|NEV!D9yq5UZYwRtw z3pJihW56s9E+nq~Cig|!d&<&P8RR)`2IMJHIWD>KLc5tx&5-OxLg!+^k97~KV) zb&MwtPXVaw#Xzveo51Xa8c%eH(r#N)r+#4$YDBrntgIK5L@Cfp9Ge8i8ttwCdk%A+ zvC1W+Z!!1|gm>96jdXW_BT=wXN2VpvPQ3-ma=XsOG0X`JoI*z^Q;$K9QEC>I1K^1e zx(|o-?j@buHL6}WaD*zNcHpwsTc`2og1XNZQuoJq>m%hw5zZi!(_&Q58#xY^4I%bW zy3Wt>4CyUFOjKzlVp zXFd2AM%WX;e;LkN91?Y%(0bMh@^Qf%9;)i7-A1~qjlCD3CyIJFjX=z96OJ6U4xI?= zUrRa{qC3*!(hBY%aB4-l#1^^#zkj3G$tH^{Jwn~7l~1O-GMRn5S><>-3cUG5Et8xf zG0sp?El1}*gX0o-TFqxPN>i{;qp=F-%+4&q9m3pK>#<&gkFsq-ef-#J$&qbVw~3&a zGi|iqIH$=~f5YU&SyIFcv(<6rsTLcQE-r8ITY0r;)qA( z2(|B#oG}(9VXYD#=dPqqkdz8oVw4+A4uQzL2%Z-`CnMBm!3`;n`o-QDTX6ls+2T!h z9k~z#1(0O71vyIERlz7zr6)m18ZwgI3pSa9EZ*;tW1c9%g}m2?oxAx_7CXEOH2IuSBP2fwNR9C9+7oDMZ;~ zv9AYr#$p!{yon)QQK8Q5LA5%CWhvPqG%R2Pr7TQ7LO(|mWK`p`+Idm(t_qc}68kCQ-j0qd!D_xGN`NGJC6(KBYAEeqqT{#N*`Ya>=-3zH)rYt{ zK;2Dz@x*-$U2Bt<>3WK+a!pQGv(DLK@Mvh~$w+5|7NVHZ9)L1E0*pa&u!vy~p|c(OFiR{_(DAV7k;+Ti+C zK|YMPN_eJ1yBVk3O}z(b_h!D<1aG`f5 zuLn9u5g9AN-ix%q8Yc_szz%R;Xci)s8>r1K2egQ>4x>sk)|QADl|n#^G%yNRnD zlw#7u@qGv#xI{R(mXmGl(Es>hLoUR~QEND%d-#9ioZdzc|G(1*HSS`aYO;kN{$CHW zBnNNSY-D;9&eozcoA^_~U8vx5bNSoOwb)i1{dK>3!O6a4p!(q z&uIl4JEHr6FrMo7Mmb~a@klZLaMTujq-l18&{Zj^XUy(Glebayl#s5&#%`UV$4tCB zNil)FHp0K zu|{+)hBj>>wO^E_tfLjIGk*?#U4$$!K}OEcd?qWLagyC4bcX9)N6C0K^IkN5CVqoq zaIe|j1OtiSTfjLO$+Mpf(>~GNx8a1PQyXV2R1bQ(O4=&OxZ>IDBLm^}P>Zv4B2!NrDv z7JCz>#I}}`Lr0)uK<n0h5=Y*J9H)UHINutcC{_mB}q~q8zeX7Au&j zo?Dr2(>2}rp-B$epDCwi#>!OACgwPt5cEAdbVe|F8_wpE;f+KQV4@9v%YZLa zq(@tDwt~ooWZ*15IZ6EsXzzC7JOkY|yoH0&V3=g6aQ0Ay(Zev%MjveD6NLs&1c0jr zj;hglr>pA2$A%WH8ZZMR>{1q~|I9%qaoidL}aMqx_3OQ4> zQ@oXp-ee5a!j1J(*CNsv4YQZikF2oIGQ8|4w1o4#C`?7 z~1s2M}^5Ea;r)6buOoONY54+D!{I4=q-@O1lrv}{D+|{ zj`Uh!I#}#X4ef0dydccx0B;WhgpAgZ{#G`q<@3k)5)NsYe+!+AmV6yJy%}bk>7ybX zj0c`zJZA~Vul`|;=N7O_5B$`G#Ok+Cko)J zNYbT2S2g8)^8Fe*yN&q5@!>HT$pc3TOdN+9PJ>W-U8Ii|gGL;@Bsn*WlkGr=GVm3yHTX=OA;0bO>*232~QbvOu&l+Z~Z0~k@0e(YLH`APP06!;NmFs zF2nI~5@awU+%Zy3N~VfN@m}Tata1^qua<=pLU1fPr%-GQ9f=|V{mW}Oz46} zw&>&wrW+N+o<-DlTuSV#U|<*Zl@PZDxJ1-lFZ3R?%<%el>GL-1;>wGelk#?c@kTta zaT|;a!FMr1Z8mr>1v%nq-&w7HrOq#!yP8a0W@=9|j-&>0lBa7Sueg%;9Q7tbPZ5l3 zZPwF2ev`FG%@LJDM&D*;zbq(u$#R~_wMOr3g*+M~s25Yz%nT1pwQo&5&Dn+sXL3EZ z=HjD5o7~)5@Ix((0WJ+~?ZRjdyQ+t9O5%_hra81H%A>=DP>EWut2KefPCJy`Z zp|c*{33z~bas}sRd|V7Obug_L{Rt9huI%S%pq}|QfPI(nRknDSYZx2E!4%-5o;eSm z?f8_6juvv1{*nS;2je^;eevM2z(5%ETRGne-2$U%$Da2)^Ya`#Dt4Lf2m2f}k(+GXpn$f(#&VD!x|-oOY7q z@kTPc8v!GwFqnh$%V8o>3>0bmYjD7bQ%&#u zc#_%cO-_l*4BQ+gZ^AB$QzeFpR{BL0K1hV#cKo6S?4sIoblHrR28VDyh zBXPz6gBm)%h+f1FP!^(h4e2T7i-2;<+hK$|C*k@gI@}KPDJUBZx3@5LE4gtD-7$FM zDtLD=M>yW70Ch9W+1Q-|@@PLi?Vt~kO`HMOPBvHqUvEWa5xOgxdxz+*geNAVHiEN= zOzq^pfxr=ck6s!J7jA?JBL=8|pZ4MX0y47;?yMrW*1`Ce3Jp*75Ht7csJ7MOhRWJ-Uea17zgX=be$nu?`RU-N1(e1Hp2B-+Lf zTHDu%v&Hmo5$!M5%`PC`#cb9>y4O)}D!SW*`+DNFg8M{0p1+LqXbV5@96KwiM^Mpk zP-+EVoah%86{oq%(;RW3iJoHFJLMB8YHNsdb)qND zw)Ff@H-gFFLFijVlrtE}w7PSsuYoD&i8D!56X-?3vzI#SIkQR>o=Gd2d?rk84KJhJ zriJz_<}Z!tTV?5|202u8l!%@(=rLz-S-!JC@2p_HB$Hw>%b}6(Z43IVqX+iTf!zjw zp_!{^{biu$5yv*6GtSHxo|D<)&Z}QEkp2k0To`39);lcbfFSjS=zES5SGqML*x3>4 z+@|yG2#^-y z{9&Wb+V=fyjz+Cu&K1;u0ecUIt9sfMNt~+%&qiS|J*w+W@K7>@fh)r3U-)^@0KHi@ zZ2RSLgN?TR`Bb+;Ibh(Zvwb5@X>1Yg`^NQgu1m~WhORB?t~g>()7$x`jM6DNqGMyO zdLg)HRh-K8s!&j^xC)jCT^-8;8^~u1m*`FjbDS1Uw#fF1hb2bWVss_*YO`2P#Gbt& zY7=$kXk1~O6B0eUxa1_+OZCc90w&L?SVu;tZ+*BuP2=3IwQmP+fmkOhSHo3}ZE<_) zSJ?(750q6z$wS@}yR&raX6D}?-xCHsJ0tqng()Wuo-}cf!MTOGThP%;(k-4eHnLpT z&vVWW(bq(}!_b`pjz(rb2>w_j&*`axGs)s;q`u_XzD*kWvZm`KIt!S*(YS&0@Tl&p z$BtY0V5eujNq->&dqfy% zrb@MW=$O@!Z1e>g?Xk3%i#WRF-A%-2(N6BQc1MF(q`qY_N|0Vo7wuJM$5LUZ#&wz4 z4{E)lsb?{_-USx(CM;$kSn5p2kz_G&BG?y7)NGV1=-4K7EVZR}{QfjraGWza<3x7` zag>L~gVT`U%^?0AMsI#(AV}!k&pdUYlu%BZxx%TOq;ths9T!C39_DxATO08ed)2z+GzCvItlTXQaMX+ZzpQF;5(>y?58~o zwaPZLf19DZMZ?*q-c{((8kFRC?_uW5($WA%LF;Z37WIVx9;9e|rAv!@yQ z*RorCnYSM1TgCet7?OA^&nC-Y-YE6&8A2=Vgc*S zA=6FpErV~l=*8uiRO-DV2GVu2t>SbE^;e>!2wf%)3~>BB@t+VJob6)5!!)>k3?5Rv zQ6=8kiIdqdwHtpnBFCM|PA2cxjID>EeB>g?R0KXTYkn?*+Z$n{W^NtKorAmUa8@s> z^~}E+{Y4f>jm}50ZMIaALFo@BH|ua@ zk1&=7zpf$QSqSfZXJcS+`)9M|)G@rbmQF4O?jX2cijQ}|+y&?=NAFpSJrUGpIJgceB=G(a+?=_X)&%6sGolc3lnUKz|*TR~oMbjV&PK zX6iVL?hrCt1Vc&O7l4xqU~d)Gd~u53ZhmvQTAz=5U??TwX#@R2N4pA*lgV%`i1xKg z!_7FQ6C8)=NR4>Q2wolZ9ISKes>9eUJQYB z@MNQhSE?x56)KE|z=L2x?m*s=-Qo09QWQtQH*M^Tz2eAGcCA!D5@YnNqYrJuPnq~Q ziCimULuaAyB=Ob?6Y=cc-q8MCRIXs1NyH7zu{P-D4#Cqvx;Z16N;qPj*~R60oUg!% zEaJD~%~qVwq|Qo>dd1>8jh<$qw@B&<4^htIRnB}8&iM7N#LiW8G@8uw7PA4pE#jCK z0!z`urJqbrmg7_w`ZdD!7WO2A&7Km5W3ghSt--PVlTY zbnPJ58eqDE-ft$?>*!DebR8h>8og2q+?V5AW$n(eB$>Xvgq&6Xu^FC8ov^=^^);z-X~(aEsiLOS<}_BD}x+&vb=n{=c1B)hYOjW@FgmxKUv&5#t_BB@;hp%?a+tfy`VyeOQs29Y^;`90C$Wd?;YWmt z{bY7?)c9#$A$b{=x|SQ%JmhT5wP+Gp3O8El_baKRg8DK^SBh?`Q1Yh3gBIxtmD~-a zvy6DC#jz#mmrFsjrF3H5=gj8k4nHFsG~?u6oH~on9Oh0ZW#HKZU*wTV?ytUz_N{c{ zGeG5Ahq!9!40i@4;?y$wbUDaPA;VYc5chk92s{h+Z$}@mhEcX9PJ=m;A=B{!L7$y=vhHJIT8&< z?zp{kjyoVp=UKSc0=^44Lg7vo%;kJ`x?T(7gb5k6!Gmr1s7!Pm!LdD}cR%`eAXiZM zNr^i#@E{B3f^c#pomfq7Zx`)nL{9?ro`k^^apb>DJ)I}Hx`v8KMmQF?lCH~JdqnKN z$mTRGU?JR})pLM!3&w|atn-4&ovn49VGTOxRdFK!zMPfYg^!6wejg5{o_V%yFnWlnpYAx}ktm=<|$#BurMjmG4+*+pUICBBljzK^R zlac1hHsVUs@b-oK2Lop<+%xm29L9oiI))4+BIh3aGI4A-^>h%W1t#iYv=v-&_)RWM zZpU#>isj*C(`UmJcTGPjCXU_U;q*=d&Tyl3$Y(!orv%;HfYb)^8W>;1wQSw(I?kg3 z?@aGsAal!UPaF0%kV!rCZDO8vMD76IL-$>RZz+Dqf%6Xhddp{7erg9FG4X7Je%ohj zdnb3)RpP{2;r=1290Pk9+}4ttN62ZkAA!;1*lESF%g`m^k0mge$F(Q8UjkEGV5Wi$ zp8UME9W~4wkCRKOx`htx(>x4}u4n!Gr5l^2iK}cV(>$ah&O>zWsxc5R+%U2Eonh0f!5IN=&ib{&&_$RyM#0Rx z%sKA+I*xr2npqB2T48>J$*~$ouArQSu6Wk3*N%0V0$V^?j$W?n?ZvzMxZ($$`MTK< zu`dYyT;HqY7!_tXFT558v%oHb>$EV)UDpM4L<`rC2=1-av5<7`)OCvCcS4D83w*yG zrcbl(2ywPP)Kw-7?`EC_@W{wypg*@5f4WR(xs$b;4p8KVz%c^dEs>7nBybS#73+IK zurG#mmtr7`-dh+p5=*99VYmh56l>33($zw4ZMCSIgy~bpACc~ox?=RVJ0w8waoWk_ zTL$w>;Z``;MsWTrKQV>A7UEe=xB&abx`=KI4s)`88M=0hLz&|6Y3uYF@piNL?Gbc` z8y~ew^X0rXp`)iXt`_=B6Z>@&_%9H*&FZK&Di;mT%VZu&pvp40%Gj9_+!Jo#SfVdZ z>pDQ}WqQ}edgS?kY@i*n{8I+H?bb zV`;2J*UsFj>6~lLXi*ofQz`^`CD-(AK?D7B)*!hUAbEwOniG+PkDvj~9Z*5kUtE4c-pQ z@j7Q9?J34;9k<)_ReyaMaAtY1h6K3EyP9*XdS@{4G*Yig7%P?>I>A$jvrHO|C(c;X zxen|}^*A_>cg}Je_CF_bY;^GHOxzNFAy=)o+hKl9hS2e@rXsS8mS z>Adk|s6#gxD^8w;<3b2^#R;Q18vnVC!>iNeecb6me3{4#``|MD4EK08up!>lHgKaq z8*dUPm!msf^m5Bxt`s;Y^%-M6!=g|wu@4@i{rh3EgRf4TE63!{68VPfD-i8RnZHOH z&NKT~a6_cndqPl_SUTg)ffP|`wq*_e&nFQ&*$S$tRoe}nMR9?oU}rgVp#X-i1f3ES zCPyc#NfD0i23JuU=ac30pO1HSZ6}>;EOseE&D5xet=>IGd84k^AoLn(cg-qgtwvd9 zRpJOuwilc2F?wa8=%q%dCBqq{^MVbiT&YtI2zG(kBXL8FE8O7PYgUg~{L%F|YQm`~ z+rH7X@fhZ75qm>4{$0!;Yi?pnJIsWML-~Z;@Ejp)y=#|@A7B%D!}U{|?hR?)IzxA5 z2$!Z60lORF#OJdX7lgiokb%l&{UQ2mS~8p(<=+z($e?okqAAY3hsSqiYX*VWI<>uF;8=luI;)+=)S)@`da!^GmMl(DNV_~XrZ%>xj-jZhW4!_&Qvy7C_2~KjAL03kH@wYI1Ng*d}W1u zW3~N&EGj4;QV%UVlb;TDErFl{Tl8q;w?|{_4Fo}$TY(-1bx?9TaQnagbrwZYY zv*qft^^V$Hd7=PsbT z0RK1#?sfRb1?sl3KiVbt2KeI&b8p2zu7Z09dB#tfR*KIUx~t%sp17-pX9jfd!DpQN z-bbE=fV)QfEF9dm@GKGBb;7d+;NDN3af8nR@+=M9_10%g(R~n~*}#1WpA{q5yPs_U z_fht&1l^7BYzyVKt!HJ_eTqCQ2lpBBY&*DH#b;H>ogmM+RCZo?Rzr9yd&a#&m+)Bw zx-W~*4x{@jJUhW%DCF5m;4R}bZfFq5voqik$+L6dk)&rF-)i7FfJZAmNA&3MxfVPI ze6B~25uO{tV}|G4M<0aG&4epJ&n?{81kbJL31!cN(G!l(Bft|$o=1Tv3ZBP;Cz?Hv zLr)AmPXbRIJYNW&c;R_6Kkh`Hr*S(4dA<}p3#8{+pS}6d^U$+Uc%F}*6nt(2Pbzs{ z44%c}^Ahwdf#+MnlMc_z!IL38-v*wgx8myzeZHOZ8o@8f9&o;Pp|EEZlvw`c z%db%{^W6PxBkiF+<|}c z1XqQB@_2Tlr&{>4mIG|~lLxjJ{yYSpeZrrI!BZ3UC+`ev@r4MU{rEzIo&)eg2cCoM z1)u5$coD>zF?eA?&k^#%3Z6!I5lTEw@FEO6C&-KN&p!4Se3DPG7yPtEGrUM3p3~$- zB6!Z?i-qVphcCDb_yT#63Z6FcMH+hA;YBv_Tohj9d^RV(;8+-zz9=MKgcqm4%gBpn z@CxFKGw2oJMLY3ogclv?)#FP5uTl4saO{jPIUiz%mu4=<3onDfYauVgz-uKhBf%R? zUdD(o6_%Z=cTf|uN}6AdqU>&rjMAyq8A+yUNrc*)6y z1p2ayV_MR#sEs;b*P5d+=jo4yj}s`-LbD% zp?43yt_JTu@|usgMtr>wxt;3uLGbQ}*F2H~!s|nXQ-!aOaWsOjk8?*mdwml5;n3G- znD;omZsq4m;q_VKJ&mu=f%hzVeF41Z#Mk_morgC_ylui8?)|@rZ}^N|CU11W3Bx!1 z_FbiKxcMC--$Y1nveAd|W;OaKd6N%50p1j#Po!@O(Wiko#l)v$Z`Ko^5#R96C5XJ) z0zQlQrW}1%c(apm*!iZKR}Oqr1HMS|rVe~j;v25AMdKS@QDX7UG2jN%HypYrkT=cX zOALE+2D!)XtrmO>$y+_QTftisa7)-*Gx`?6TOQbAcpD17CG>3=KVC%MMuBfBc^eD9 zWxBTs;LBX_mY+GwB5!$5lTF@k2Vai(whDdA;q5+tzD9amgT9sc_7M2;$XkBmX0`OT z34HnR_B8m`z}qw6TZ?a7>DzPYE5Nty;9G}pFLIZq`1UgTis2mtE`q-kz*i!?6T!F9 z`i`63Hi_@z!B-mfE(Ls>$vYePwvc!0x#voJw-J3?weR?ZY!lw?2H$q^T^+}{RrANGNNIew@C{|fS< z4*a>~19$bWw0<}Q{#E3|1@ngv@aKtt>A=65{AB@uKKUyI{Adwn_M_f}1U@e^rBjv-npN__qZA z)dK!9;Ufe8R`QX5OF8+-hrdnw7zF+b_{ayo9X>{ae~0if3jCGiBR_6XMLs5hf2a5{ zg)^h{V+Qzl2_HG@x*I>Pe4&?gF-$?vt z+24e4;rMTU2Rq2$TJT>K|2Cli68s%Z{8!fg9l~`H{CfukDEYez0u27%g}hDsdp8Co z_?v?mE&IEc1Pu81K?s=1--jR&B>v6$E(`p9iUfj%zndWtX8rpd1j4QVXw3gaV;}R)vbSVI2Q4uLfCuS=YM7yoq?0~zF#2!UmZ zpS0WvfS>sHX5%OBG|Le`EyKVH_>>EQmC~n`5LiV%6+$47eBv>z7C&)8Dqs7l3<7J( zr)mfkkWYIcP$+(?!N5BB)Bu4Z_{0ZWEPOhQf%W+5ICsgBPbVR;QT)_`flct~0u5{? zpW0}k96w!zzz*{1G6X8ce{*@Z3jQsTK(+914RVLrzfBO>XZ&{%1Zv>laS*6Y{C7MC z>i)k9zU!-s?cH*IYws!~2nveIQ4j?|Oelt9PAKNA92Efr0w&Cg0Z-}CV`Ar2`{jDU zzJ0sz{dJFVM?dsKj~@4>{|d>$BO6rq-UK-y^yGoDMpeyK>-*MPV*&NeIpq_jjOFUn zPSl^*Kkc5>JAFEc`b$z@Vf}PS)mO@=hEix?xMa{eR_oYNAaH+*kd&D>;IFOrZ}m8Dox3# zf2NvdkOHSS%@UiSDIGQonlfOsYEAQD(^L}$iF#7gVt)FW)5NOj6us#IyrEu7x6%$91gl}ju2+80#oRM;+} zbsB7!tgX|#CJYc|&i_6k82ibCvCu*2lWA^TUxim_9U%!r`VpNwNz}+RBIXRg4PSLD{Cu-vlg^g!LFgT z8g^Z4y}}Q2s+BU;DT%FjNDs_xQ?SRYwk+5aR9g=0Q)All$OA*$D%g|IRsj1nt!*{z z(^cCB*ppS;X4q3=+P1+y18sX?pBdA(SJ_k1b`)0>XA)3DD+8yRDn zs_iW73(!_7_JyjA5oW74Mz|=Zjf~SAw2|1J8`E|J_Qh#!_hHXd?bBgjqS|M`zBIXg z7VOJZJEK~z+Lyt;LT}H9Jzv^M*jpLXz8>~fs(m}`1**Le_SJfO5$tQE{SfSH7q%Y} z`#NbSac#Y{^UX|QBibLrzRB8NEB4K3ucILY+MmI`108^Ur*w$bUML+Ft9`GfLlgTU zbi~4b1RZgc-w!(CVLv7vX-+6iFC{t`#I@Y z0DD<{2dB3@yCYxh=cVHm>=&iuH=$8S2PfyUwS!dHN_3RNUX70PV!vYTxFGgx(oqTf z4e6*BdyU?4RqVIWaa-B%XdPU*`_fSh`$N_781~wjjyl*Mp;K4($Eq_1_B!cgw9iy$ z0vt%~Oi~U(=OQ?)sxya{4XQKG(z#3=IyzUvF$JBg;E2^a3*d-To$KLI9BLgPvFRxZVMbM(XElEt99$*D3ETZyhe2= z!m(EGo-U4c=$;M7`i0$d#IZrTIm#y0y>;^YZTAj1wphD&ieoFf_rS3o-FuZ|hoyU; zICe?*AvlUu_YpYup!+x+d#&9k#IXhMUuMElH}6a8#xETAS<082a6;>`!YQhU z)pMnKSg*0@J=4T#&F+~cEamiUhI5MQAwMKm@7W>FIP~m=GXXvOs3_HXSfEQp&rxws zlb&N1XR@{DgpmBzb6PoPtDZA({vtipY0QR0{#lWh$hzkfTB@Z>`Wn32^3HLMar3YoS?I z=PC)!6X!aFGQ_#w5}Hq?GeTL)x!DrRhI1Q2i^aKJLV0lRRH3DC7V4oD;@pMMTIDR# zLhHo2PeRP}fC@3wgL;UW9zuu}+#_0unI2c6Ba|wr&~ftG;zOt4Jf(#wFfT@^3j7ow zs)q9{Lf7Cdv4&WmJ%l^Bl0A1tdYRExy*C5S>#BDVoHtbOVmNE`-lgKaiQWP@Z^!hm7Uv!5-9+|| z>fJ)8BfWRKP{Ya-|+=z59f^>R!hGRC{<_Z(bS z^p=WCLvI;eG0DBLVpuhy?I%C$khCcw2>eWhR27X2$dhPKMr z+4O=*`zMh7w2wyord#qp2iEFQXy&$gr+Sf~P9aLYhz;#G{ zrBlq|RbOwybtLuMLUA3HZ_MSmd}A&r@NElRr>x(YQL*|~$nWXeH|BCiz8!?CME`a; z<{QNq=k#x-aFr&1tAMLa|Mn2Ba`laqd|rK5a9z;9Gx&?K-x+pA+V@lv5#>84uu6UB z1XkSwf1RDTgj66xOuS6y8HQK9`)KV6hW^^+u{ z^nS`VE$FX;TSI>}+`86(Mcgsce^a?*(SKXH6D<9AlsgIi4-_rR`dMY1iGJEE&655n zARn*4j^0LkScIaS@Dy^=v~aAr=S!H6FXZo_FL4kP>v$g2s@ zg?ll=8Dur7FgXHCRhY$_+$q+(laWsB-T?xESvJD*PMhrW7Ut?4TuF zVsW!XdR&FeE$)*ld=c)`DtsC4GkUmM+-DKKDeiN6_?A%W6@Cc!c@=)7+!qjj3U`Hs z>y-O4B7nOZ5rO*(B8qAsON6woYZ8fp`-Y0d!d;_B62yHIkrd^=twmT3yeAP(!h^U7 z(|;(D9Jp%{Sq%3hEs`hh#}c6#*i#i*1$UhuVL9L#BAeh5L^i{tvfD!827w&d`g+8aYS)3?dicNkQZyJTtV&CGpIZ z$Q5{IsmL{WX6um}@ywCPeewLFMIMT0o4$xu=fc#0*;WKSb{LwU|1 zN}}L7YxJggN)f$h@swMmO#hNZAJaodMW4b`sSnTuq6z~s%5y~bLd;8OpQBviEiNLAj)+7GT*UCIxx)HChJO4|1%|5yi~ zEcmfcd`f<>N^4a=YT(oKAGgJ)<3}yUFZl5Y6!-mj3}2k(2djed+6dsA8aJZDm#B|S zhc78^WOmHRLincXBTL|$u0~kuO;#go;7id*eih%0^pUMpENdgB;+rKS6oSuDBbVVz z(?_bs_lp|23Ew@IxQGJkT(uB)FM=!W{4 z4PTA^Ggo{!@pA=yxA8Nd4vgAQZi%~zKe;9D#r@nZzWeg?D0~mqPmW%z|2!qWNBDV; z+%Wtsh3~2Mvkbnvfv!qKxl?f0`OEf`7U`zEAwg z7^eZ^42&Oxe`e-5OWmn5eh>cHGX6mM=V;@#;-8CghLMg5z@MQ_i1_ErL=5~3)I==V z#QH>n__HvPLh>*sX274LO;GBVD--l6%u^Hd;9sIo%oqPsOyrOds7>UGe`WFn<1EOW z*e?FnGI0_9wK7pbR-ZmmDgO1CxS{+TwTT*`a(068Y*P~t;NPxKJQ5n`8NUm8vurpq zyENl>3;es4@jIg_Vv_*>9^LpoN&I^WNmc&+gv^5fP@3`kJnX!J)Ork-i|2C1e@ZaG(p9rba#&Zr!2F7zM z{0}taxd#73WzfLWU&|&D{ztm;d^(w0amMr6;(sE>^M&x&@mV(f&-g4?0`wYrz5)T2 zX*^#g0Sh4~5TL=t^HT`ugq)T@3`ZzOAePN}1mZZ*1qs9xS%ttYHJ zR3MpGcO@{BkVgp2BIF4Iv-z@T5|{(yg{}hBxV(r#AYC_JOieIe%s?O`(;(wLFkg%p zH04~Nj2F8QSV;691hTBgi@g%a=G7q;$YI~Z638R+Bmzr`EJk1%-*iR-%L!qS`D`vA zu#(7&2&^KcniTm&P$`bh)fi=qbLm{v>)%Zh`z&aWU&qZK8Z>A%#K{u%23ec76 zk6Z+3wf)Cp1h!a=Kk_Dh&5S>m(+-VD&f9i&UxmPqG=q}pz)s%0gg_y?SMuiu0=tO5 zhrn*l_~SkTMT9+(z#f_$&q83IGG5L>V83p>oGXC?FkUW1fDECRSqL1~jF;I697#4_ zE)^sRK^&u7-to|mopHkX0rf+ zE4uM2TLM>OjaN%0aGl-P(r%Q`ekFsB&o)Zn7Q645G<7pxaVhU|yh0VY$E$q^aD%?u z4=O&5SBDUI#PPV4R0WZE8hFZQCt=buiuxf_*qniB;mr~f%J}LsF*PDDD>H`gtQ0eD zjq&Qbmp(OzuTe&Q0#cKYt~Eo{)`Vaxeb5 z1LiMmcEX%XWFg1}H2&NNGo8&rm>EPK5tF;}&tfqb5ONx37H^ip%#Jb0M>Q9*I|<%7 zys8m1m&gY&^Vq!><`N>GPzVR(wFM?O=W8p>6`Ju{gPEUVypD&tGShgS0h4?5^>&yA zsm5ytv6@$BVRDbYE`_-^#&~@m<~nw-hWRV6u86r_jMr2YZDezojthKtA12j&uSrJc z9)0};^yx5OKZUu2K9(6@6yPauON2=laVyiFJSuNrT;Y9(wI!91rKZ*#;fC2|?eaw1nu zx^fzCSHa}T`gX0DlpDY08gh@4(qLX@2a-)I`HTs0kG|!Ka*w{TmyqW=%d-NR*VjpS7yHqhB zv%_4N+@tT(Vb8LLZ7be0EiWG&g1)JUEv(YY?2rm)%A%oyaE$W^mZ2667|1Z$WUuRO7vd zAP?8~DF|k1#`_r(%;vK+1ap+Z(seL5#(1BB;9^2@Cf!90nlA-u-SnPm^2B95I=GAt z^IJ~j8U$Am!o>1+Nm zyzkE-xPc9m-l!Wa`35(!AJg1S2=m**ezy?h!TbIWg4^Sb_xBOx-mX^?+$l!=6a=}c z>*EmItsC`IC0GQ5F1l?a~T%>qmCByX;k;AviMK=3S^ji7UfQNIbnb3|@Mu#{KZ5iDa!OOgP8bSV!s4tNq|0<}zIB6$h)L$aOo5+fzQ%CS&#;fc9tK@&D z{J-V@NkPOZd2#O5fftuvthtpoGF5Mwg@5F#hIFlAfojN`WY{(oNW)saVZAi$q^2H? z8Pb@kHD;^ErCMXYYFsCcn^og>H14LUfQ3|WIt@3LTNGSJmo%y(` zV2XEl{UP_A7yJKp_rD}<_^;}p4!J7!aQzGY*5Q$Rs$s8c zIH+im-B2tIXYgSw8cNVmCJpD&P@y$cqM-&Kwh2WcAGWK8yZEp}8Xlm5oZwn%cq|Qd z_>UFRDERLuK%a>ZJMn?>X{s>>jq&(Uq#CE<|5T!JIvP_fjWf}hrW)tsAIz!VJLspEX9_^AqP|Cu9TdZ*UXy={b&D27i$y S(T;EjMeP+lDW8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl9jqJb9BicPktn1f%($8{>XnCWig|Kv4m1*8PIg4Ex1_ WYzZKilxEs5#lWzyu91adzbpV2cs2|G diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF16-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF16-H.bcmap deleted file mode 100644 index fd4e66e81f3507b190fb2986a26a45c1c380e302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26327 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF16-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF16-V.bcmap deleted file mode 100644 index 075efb7054901b1022af68e723647769cbe1d556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;$~>3>*2_)AhxfT zk9~fwLi5~Q1}+vx1|1$o21W)s^F|h%M0N#X#(mZEa~StkuyXEaWMbS`-#oX7aX+sB L>wZCNru|X?)N3(k diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF32-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF32-H.bcmap deleted file mode 100644 index 769d2142c03b10680800b3b6ae883e27fe04c5a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26451 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 diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF32-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF32-V.bcmap deleted file mode 100644 index bdab208b69d287128195eccbd084c8cf4ca658c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T8=9Bt9jqG~;%025>*37Jz@Q+u zua=K}ey&3E+*}4O7Dfgg9!3U6208Oa7Mo;tpu8~SzUuiojQc8BIrlR%G488xo?FDY OpI3l&zo0eKeklND@-b-u diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-H.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-H.bcmap deleted file mode 100644 index 6ff8674af772af896d7d33c7addc37c57822f8a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27790 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

      UjdU>!C<8eSfmt; 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 XDie!M@tP=Qo=5R?GKGx`n-c&3T8mO+ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/UniKS-UTF8-V.bcmap deleted file mode 100644 index 8dfa76a58eb720dd1992c2cc9abf1dd4b39c5a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T6PlOl9jqG~;%1@i;l%x@VcNc0 zKKADSxe6P;=Q41yFf!=yFfuSQG{%{?u-GKAKWdoFxUahTe-7im3Rcejj7*IC>Nk8Z RV%*Owz`9?sv6^YW6ad@#ITio_ diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/V.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/V.bcmap deleted file mode 100644 index fdec9906621904180f42bd5c91f377397fd6cf95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmZR65agU+P+63jo>8J;XlZGnYh++xso>knU|bjRFGekSdyBe z$K{xlqX1T4tWcC%oLW={5)4jFRnXJ-@pN|e3wC|T=#j{(sKmI}pOXoN*Dkx{jjaUT-^bqy(L diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/WP-Symbol.bcmap b/services/web/public/js/libs/pdfjs-1.6.210p1/bcmaps/WP-Symbol.bcmap deleted file mode 100644 index 46729bbf30f3b2f176492d907fb8ca3f6a1e3026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmW;C-wMG{90&04*(h8{xuKNv0%qLpa><2~3lnNLW=^QFb+%;wBoDUVIgjE|#O#wbv3o&3S`2gr-Jo93r6xVAssnXnw1B!ZT0%WQ!k{%%Po}{NAH@>d0EGtm W&}LiN6j32_>FyT<6+0XN diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/compatibility.js b/services/web/public/js/libs/pdfjs-1.6.210p1/compatibility.js deleted file mode 100644 index 2874bcb12e..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/compatibility.js +++ /dev/null @@ -1,596 +0,0 @@ -/* Copyright 2012 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. - */ -/* globals VBArray, PDFJS */ - -(function compatibilityWrapper() { - 'use strict'; - -// Initializing PDFJS global object here, it case if we need to change/disable -// some PDF.js features, e.g. range requests -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -// Checking if the typed arrays are supported -// Support: iOS<6.0 (subarray), IE<10, Android<4.0 -(function checkTypedArrayCompatibility() { - if (typeof Uint8Array !== 'undefined') { - // Support: iOS<6.0 - if (typeof Uint8Array.prototype.subarray === 'undefined') { - Uint8Array.prototype.subarray = function subarray(start, end) { - return new Uint8Array(this.slice(start, end)); - }; - Float32Array.prototype.subarray = function subarray(start, end) { - return new Float32Array(this.slice(start, end)); - }; - } - - // Support: Android<4.1 - if (typeof Float64Array === 'undefined') { - window.Float64Array = Float32Array; - } - return; - } - - function subarray(start, end) { - return new TypedArray(this.slice(start, end)); - } - - function setArrayOffset(array, offset) { - if (arguments.length < 2) { - offset = 0; - } - for (var i = 0, n = array.length; i < n; ++i, ++offset) { - this[offset] = array[i] & 0xFF; - } - } - - function TypedArray(arg1) { - var result, i, n; - if (typeof arg1 === 'number') { - result = []; - for (i = 0; i < arg1; ++i) { - result[i] = 0; - } - } else if ('slice' in arg1) { - result = arg1.slice(0); - } else { - result = []; - for (i = 0, n = arg1.length; i < n; ++i) { - result[i] = arg1[i]; - } - } - - result.subarray = subarray; - result.buffer = result; - result.byteLength = result.length; - result.set = setArrayOffset; - - if (typeof arg1 === 'object' && arg1.buffer) { - result.buffer = arg1.buffer; - } - return result; - } - - window.Uint8Array = TypedArray; - window.Int8Array = TypedArray; - - // we don't need support for set, byteLength for 32-bit array - // so we can use the TypedArray as well - window.Uint32Array = TypedArray; - window.Int32Array = TypedArray; - window.Uint16Array = TypedArray; - window.Float32Array = TypedArray; - window.Float64Array = TypedArray; -})(); - -// URL = URL || webkitURL -// Support: Safari<7, Android 4.2+ -(function normalizeURLObject() { - if (!window.URL) { - window.URL = window.webkitURL; - } -})(); - -// Object.defineProperty()? -// Support: Android<4.0, Safari<5.1 -(function checkObjectDefinePropertyCompatibility() { - if (typeof Object.defineProperty !== 'undefined') { - var definePropertyPossible = true; - try { - // some browsers (e.g. safari) cannot use defineProperty() on DOM objects - // and thus the native version is not sufficient - Object.defineProperty(new Image(), 'id', { value: 'test' }); - // ... another test for android gb browser for non-DOM objects - var Test = function Test() {}; - Test.prototype = { get id() { } }; - Object.defineProperty(new Test(), 'id', - { value: '', configurable: true, enumerable: true, writable: false }); - } catch (e) { - definePropertyPossible = false; - } - if (definePropertyPossible) { - return; - } - } - - Object.defineProperty = function objectDefineProperty(obj, name, def) { - delete obj[name]; - if ('get' in def) { - obj.__defineGetter__(name, def['get']); - } - if ('set' in def) { - obj.__defineSetter__(name, def['set']); - } - if ('value' in def) { - obj.__defineSetter__(name, function objectDefinePropertySetter(value) { - this.__defineGetter__(name, function objectDefinePropertyGetter() { - return value; - }); - return value; - }); - obj[name] = def.value; - } - }; -})(); - - -// No XMLHttpRequest#response? -// Support: IE<11, Android <4.0 -(function checkXMLHttpRequestResponseCompatibility() { - var xhrPrototype = XMLHttpRequest.prototype; - var xhr = new XMLHttpRequest(); - if (!('overrideMimeType' in xhr)) { - // IE10 might have response, but not overrideMimeType - // Support: IE10 - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - if ('responseType' in xhr) { - return; - } - - // The worker will be using XHR, so we can save time and disable worker. - PDFJS.disableWorker = true; - - Object.defineProperty(xhrPrototype, 'responseType', { - get: function xmlHttpRequestGetResponseType() { - return this._responseType || 'text'; - }, - set: function xmlHttpRequestSetResponseType(value) { - if (value === 'text' || value === 'arraybuffer') { - this._responseType = value; - if (value === 'arraybuffer' && - typeof this.overrideMimeType === 'function') { - this.overrideMimeType('text/plain; charset=x-user-defined'); - } - } - } - }); - - // Support: IE9 - if (typeof VBArray !== 'undefined') { - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType === 'arraybuffer') { - return new Uint8Array(new VBArray(this.responseBody).toArray()); - } else { - return this.responseText; - } - } - }); - return; - } - - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType !== 'arraybuffer') { - return this.responseText; - } - var text = this.responseText; - var i, n = text.length; - var result = new Uint8Array(n); - for (i = 0; i < n; ++i) { - result[i] = text.charCodeAt(i) & 0xFF; - } - return result.buffer; - } - }); -})(); - -// window.btoa (base64 encode function) ? -// Support: IE<10 -(function checkWindowBtoaCompatibility() { - if ('btoa' in window) { - return; - } - - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - window.btoa = function windowBtoa(chars) { - var buffer = ''; - var i, n; - for (i = 0, n = chars.length; i < n; i += 3) { - var b1 = chars.charCodeAt(i) & 0xFF; - var b2 = chars.charCodeAt(i + 1) & 0xFF; - var b3 = chars.charCodeAt(i + 2) & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < n ? (b3 & 0x3F) : 64; - buffer += (digits.charAt(d1) + digits.charAt(d2) + - digits.charAt(d3) + digits.charAt(d4)); - } - return buffer; - }; -})(); - -// window.atob (base64 encode function)? -// Support: IE<10 -(function checkWindowAtobCompatibility() { - if ('atob' in window) { - return; - } - - // https://github.com/davidchambers/Base64.js - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - window.atob = function (input) { - input = input.replace(/=+$/, ''); - if (input.length % 4 === 1) { - throw new Error('bad atob input'); - } - for ( - // initialize result and counters - var bc = 0, bs, buffer, idx = 0, output = ''; - // get next character - buffer = input.charAt(idx++); - // character found in table? - // initialize bit storage and add its ascii value - ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, - // and if not first of each 4 characters, - // convert the first 8 bits to one ascii character - bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 - ) { - // try to find character in table (0-63, not found => -1) - buffer = digits.indexOf(buffer); - } - return output; - }; -})(); - -// Function.prototype.bind? -// Support: Android<4.0, iOS<6.0 -(function checkFunctionPrototypeBindCompatibility() { - if (typeof Function.prototype.bind !== 'undefined') { - return; - } - - Function.prototype.bind = function functionPrototypeBind(obj) { - var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); - var bound = function functionPrototypeBindBound() { - var args = headArgs.concat(Array.prototype.slice.call(arguments)); - return fn.apply(obj, args); - }; - return bound; - }; -})(); - -// HTMLElement dataset property -// Support: IE<11, Safari<5.1, Android<4.0 -(function checkDatasetProperty() { - var div = document.createElement('div'); - if ('dataset' in div) { - return; // dataset property exists - } - - Object.defineProperty(HTMLElement.prototype, 'dataset', { - get: function() { - if (this._dataset) { - return this._dataset; - } - - var dataset = {}; - for (var j = 0, jj = this.attributes.length; j < jj; j++) { - var attribute = this.attributes[j]; - if (attribute.name.substring(0, 5) !== 'data-') { - continue; - } - var key = attribute.name.substring(5).replace(/\-([a-z])/g, - function(all, ch) { - return ch.toUpperCase(); - }); - dataset[key] = attribute.value; - } - - Object.defineProperty(this, '_dataset', { - value: dataset, - writable: false, - enumerable: false - }); - return dataset; - }, - enumerable: true - }); -})(); - -// HTMLElement classList property -// Support: IE<10, Android<4.0, iOS<5.0 -(function checkClassListProperty() { - var div = document.createElement('div'); - if ('classList' in div) { - return; // classList property exists - } - - function changeList(element, itemName, add, remove) { - var s = element.className || ''; - var list = s.split(/\s+/g); - if (list[0] === '') { - list.shift(); - } - var index = list.indexOf(itemName); - if (index < 0 && add) { - list.push(itemName); - } - if (index >= 0 && remove) { - list.splice(index, 1); - } - element.className = list.join(' '); - return (index >= 0); - } - - var classListPrototype = { - add: function(name) { - changeList(this.element, name, true, false); - }, - contains: function(name) { - return changeList(this.element, name, false, false); - }, - remove: function(name) { - changeList(this.element, name, false, true); - }, - toggle: function(name) { - changeList(this.element, name, true, true); - } - }; - - Object.defineProperty(HTMLElement.prototype, 'classList', { - get: function() { - if (this._classList) { - return this._classList; - } - - var classList = Object.create(classListPrototype, { - element: { - value: this, - writable: false, - enumerable: true - } - }); - Object.defineProperty(this, '_classList', { - value: classList, - writable: false, - enumerable: false - }); - return classList; - }, - enumerable: true - }); -})(); - -// Check console compatibility -// In older IE versions the console object is not available -// unless console is open. -// Support: IE<10 -(function checkConsoleCompatibility() { - if (!('console' in window)) { - window.console = { - log: function() {}, - error: function() {}, - warn: function() {} - }; - } else if (!('bind' in console.log)) { - // native functions in IE9 might not have bind - console.log = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.log); - console.error = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.error); - console.warn = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.warn); - } -})(); - -// Check onclick compatibility in Opera -// Support: Opera<15 -(function checkOnClickCompatibility() { - // workaround for reported Opera bug DSK-354448: - // onclick fires on disabled buttons with opaque content - function ignoreIfTargetDisabled(event) { - if (isDisabled(event.target)) { - event.stopPropagation(); - } - } - function isDisabled(node) { - return node.disabled || (node.parentNode && isDisabled(node.parentNode)); - } - if (navigator.userAgent.indexOf('Opera') !== -1) { - // use browser detection since we cannot feature-check this bug - document.addEventListener('click', ignoreIfTargetDisabled, true); - } -})(); - -// Checks if possible to use URL.createObjectURL() -// Support: IE -(function checkOnBlobSupport() { - // sometimes IE loosing the data created with createObjectURL(), see #3977 - if (navigator.userAgent.indexOf('Trident') >= 0) { - PDFJS.disableCreateObjectURL = true; - } -})(); - -// Checks if navigator.language is supported -(function checkNavigatorLanguage() { - if ('language' in navigator) { - return; - } - PDFJS.locale = navigator.userLanguage || 'en-US'; -})(); - -(function checkRangeRequests() { - // Safari has issues with cached range requests see: - // https://github.com/mozilla/pdf.js/issues/3260 - // Last tested with version 6.0.4. - // Support: Safari 6.0+ - var isSafari = Object.prototype.toString.call( - window.HTMLElement).indexOf('Constructor') > 0; - - // Older versions of Android (pre 3.0) has issues with range requests, see: - // https://github.com/mozilla/pdf.js/issues/3381. - // Make sure that we only match webkit-based Android browsers, - // since Firefox/Fennec works as expected. - // Support: Android<3.0 - var regex = /Android\s[0-2][^\d]/; - var isOldAndroid = regex.test(navigator.userAgent); - - // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 - var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); - - if (isSafari || isOldAndroid || isChromeWithRangeBug) { - PDFJS.disableRange = true; - PDFJS.disableStream = true; - } -})(); - -// Check if the browser supports manipulation of the history. -// Support: IE<10, Android<4.2 -(function checkHistoryManipulation() { - // Android 2.x has so buggy pushState support that it was removed in - // Android 3.0 and restored as late as in Android 4.2. - // Support: Android 2.x - if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { - PDFJS.disableHistory = true; - } -})(); - -// Support: IE<11, Chrome<21, Android<4.4, Safari<6 -(function checkSetPresenceInImageData() { - // IE < 11 will use window.CanvasPixelArray which lacks set function. - if (window.CanvasPixelArray) { - if (typeof window.CanvasPixelArray.prototype.set !== 'function') { - window.CanvasPixelArray.prototype.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - } - } else { - // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. - // Because we cannot feature detect it, we rely on user agent parsing. - var polyfill = false, versionMatch; - if (navigator.userAgent.indexOf('Chrom') >= 0) { - versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - // Chrome < 21 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[2]) < 21; - } else if (navigator.userAgent.indexOf('Android') >= 0) { - // Android < 4.4 lacks the set function. - // Android >= 4.4 will contain Chrome in the user agent, - // thus pass the Chrome check above and not reach this block. - polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); - } else if (navigator.userAgent.indexOf('Safari') >= 0) { - versionMatch = navigator.userAgent. - match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); - // Safari < 6 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[1]) < 6; - } - - if (polyfill) { - var contextPrototype = window.CanvasRenderingContext2D.prototype; - var createImageData = contextPrototype.createImageData; - contextPrototype.createImageData = function(w, h) { - var imageData = createImageData.call(this, w, h); - imageData.data.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - return imageData; - }; - // this closure will be kept referenced, so clear its vars - contextPrototype = null; - } - } -})(); - -// Support: IE<10, Android<4.0, iOS -(function checkRequestAnimationFrame() { - function fakeRequestAnimationFrame(callback) { - window.setTimeout(callback, 20); - } - - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - if (isIOS) { - // requestAnimationFrame on iOS is broken, replacing with fake one. - window.requestAnimationFrame = fakeRequestAnimationFrame; - return; - } - if ('requestAnimationFrame' in window) { - return; - } - window.requestAnimationFrame = - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - fakeRequestAnimationFrame; -})(); - -(function checkCanvasSizeLimitation() { - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - var isAndroid = /Android/g.test(navigator.userAgent); - if (isIOS || isAndroid) { - // 5MP - PDFJS.maxCanvasPixels = 5242880; - } -})(); - -// Disable fullscreen support for certain problematic configurations. -// Support: IE11+ (when embedded). -(function checkFullscreenSupport() { - var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && - window.parent !== window); - if (isEmbeddedIE) { - PDFJS.disableFullscreen = true; - } -})(); - -// Provides document.currentScript support -// Support: IE, Chrome<29. -(function checkCurrentScript() { - if ('currentScript' in document) { - return; - } - Object.defineProperty(document, 'currentScript', { - get: function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - }, - enumerable: true, - configurable: true - }); -})(); - -}).call((typeof window === 'undefined') ? this : window); diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/pdf.js b/services/web/public/js/libs/pdfjs-1.6.210p1/pdf.js deleted file mode 100644 index 2d3c3c83bc..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/pdf.js +++ /dev/null @@ -1,11515 +0,0 @@ -/* Copyright 2012 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 globalstrict: false */ -/* umdutils ignore */ - -(function (root, factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { -define('pdfjs-dist/build/pdf', ['exports'], factory); - } else if (typeof exports !== 'undefined') { - factory(exports); - } else { -factory((root.pdfjsDistBuildPdf = {})); - } -}(this, function (exports) { - // Use strict in our context only - users might not want it - 'use strict'; - -var pdfjsVersion = '1.6.210'; -var pdfjsBuild = '4ce2356'; - - var pdfjsFilePath = - typeof document !== 'undefined' && document.currentScript ? - document.currentScript.src : null; - - var pdfjsLibs = {}; - - (function pdfjsWrapper() { - - - -(function (root, factory) { - { - factory((root.pdfjsSharedUtil = {})); - } -}(this, function (exports) { - -var globalScope = (typeof window !== 'undefined') ? window : - (typeof global !== 'undefined') ? global : - (typeof self !== 'undefined') ? self : this; - -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 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationFieldFlag = { - READONLY: 0x0000001, - REQUIRED: 0x0000002, - NOEXPORT: 0x0000004, - MULTILINE: 0x0001000, - PASSWORD: 0x0002000, - NOTOGGLETOOFF: 0x0004000, - RADIO: 0x0008000, - PUSHBUTTON: 0x0010000, - COMBO: 0x0020000, - EDIT: 0x0040000, - SORT: 0x0080000, - FILESELECT: 0x0100000, - MULTISELECT: 0x0200000, - DONOTSPELLCHECK: 0x0400000, - DONOTSCROLL: 0x0800000, - COMB: 0x1000000, - RICHTEXT: 0x2000000, - RADIOSINUNISON: 0x2000000, - COMMITONSELCHANGE: 0x4000000, -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -var VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -var verbosity = VERBOSITY_LEVELS.warnings; - -function setVerbosityLevel(level) { - verbosity = level; -} - -function getVerbosityLevel() { - return verbosity; -} - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (verbosity >= VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (verbosity >= VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- display regardless of the PDFJS.verbosity setting. -function deprecated(details) { - console.log('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (verbosity >= VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Checks if URLs have the same origin. For non-HTTP based URLs, returns false. -function isSameOrigin(baseUrl, otherUrl) { - try { - var base = new URL(baseUrl); - if (!base.origin || base.origin === 'null') { - return false; // non-HTTP url - } - } catch (e) { - return false; - } - - var other = new URL(otherUrl, base); - return base.origin === other.origin; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url || typeof url !== 'string') { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} - -function getLookupTableFactory(initializer) { - var lookup; - return function () { - if (initializer) { - lookup = Object.create(null); - initializer(lookup); - initializer = null; - } - return lookup; - }; -} - -var PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - -var NullCharactersRegExp = /\x00/g; - -function removeNullCharacters(str) { - if (typeof str !== 'string') { - warn('The argument for removeNullCharacters must be a string.'); - return str; - } - return str.replace(NullCharactersRegExp, ''); -} - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -/** - * Gets length of the array (Array, Uint8Array, or string) in bytes. - * @param {Array|Uint8Array|string} arr - * @returns {number} - */ -function arrayByteLength(arr) { - if (arr.length !== undefined) { - return arr.length; - } - assert(arr.byteLength !== undefined); - return arr.byteLength; -} - -/** - * Combines array items (arrays) into single Uint8Array object. - * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string). - * @returns {Uint8Array} - */ -function arraysToBytes(arr) { - // Shortcut: if first and only item is Uint8Array, return it. - if (arr.length === 1 && (arr[0] instanceof Uint8Array)) { - return arr[0]; - } - var resultLength = 0; - var i, ii = arr.length; - var item, itemLength ; - for (i = 0; i < ii; i++) { - item = arr[i]; - itemLength = arrayByteLength(item); - resultLength += itemLength; - } - var pos = 0; - var data = new Uint8Array(resultLength); - for (i = 0; i < ii; i++) { - item = arr[i]; - if (!(item instanceof Uint8Array)) { - if (typeof item === 'string') { - item = stringToBytes(item); - } else { - item = new Uint8Array(item); - } - } - itemLength = item.byteLength; - data.set(item, pos); - pos += itemLength; - } - return data; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -// Checks if it's possible to eval JS expressions. -function isEvalSupported() { - try { - /* jshint evil: true */ - new Function(''); - return true; - } catch (e) { - return false; - } -} - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -exports.Uint32ArrayView = Uint32ArrayView; - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - var ROMAN_NUMBER_MAP = [ - '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', - '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', - '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' - ]; - /** - * Converts positive integers to (upper case) Roman numerals. - * @param {integer} number - The number that should be converted. - * @param {boolean} lowerCase - Indicates if the result should be converted - * to lower case letters. The default is false. - * @return {string} The resulting Roman number. - */ - Util.toRoman = function Util_toRoman(number, lowerCase) { - assert(isInt(number) && number > 0, - 'The number should be a positive integer.'); - var pos, romanBuf = []; - // Thousands - while (number >= 1000) { - number -= 1000; - romanBuf.push('M'); - } - // Hundreds - pos = (number / 100) | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - // Tens - pos = (number / 10) | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - // Ones - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - - var romanStr = romanBuf.join(''); - return (lowerCase ? romanStr.toLowerCase() : romanStr); - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - 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; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PageViewport - */ -var PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isArray(v) { - return v instanceof Array; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -// Checks if ch is one of the following characters: SPACE, TAB, CR or LF. -function isSpace(ch) { - return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fulfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libraries are: - * - There currently isn't a separate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} promises array of data and/or promises to wait for. - * @return {Promise} New dependent promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -(function WeakMapClosure() { - if (globalScope.WeakMap) { - return; - } - - var id = 0; - function WeakMap() { - this.id = '$weakmap' + (id++); - } - WeakMap.prototype = { - has: function(obj) { - return !!Object.getOwnPropertyDescriptor(obj, this.id); - }, - get: function(obj, defaultValue) { - return this.has(obj) ? obj[this.id] : defaultValue; - }, - set: function(obj, value) { - Object.defineProperty(obj, this.id, { - value: value, - enumerable: false, - configurable: true - }); - }, - delete: function(obj) { - delete obj[this.id]; - } - }; - - globalScope.WeakMap = WeakMap; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = Object.create(null); - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -var createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - return new Blob([data], { type: contentType }); - } - warn('The "Blob" constructor is not supported.'); -}; - -var createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType, forceDataSchema) { - if (!forceDataSchema && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = Object.create(null); - var ah = this.actionHandler = Object.create(null); - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - // feature detect for URL constructor - var hasWorkingUrl = false; - try { - if (typeof URL === 'function' && - typeof URL.prototype === 'object' && - ('origin' in URL.prototype)) { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } - } catch(e) { } - - if (hasWorkingUrl) { - return; - } - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' === h) { - invalid.call(this); - } - // XXX - return h.toLowerCase(); - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF, ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message); - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] !== EOF || cursor === 0) && - !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' === c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' === this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && - base._scheme === this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF === c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c); - break loop; - } - break; - - case 'scheme data': - if ('?' === c) { - this._query = '?'; - state = 'query'; - } else if ('#' === c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' === c && '/' === input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue; - } - break; - - case 'relative': - this._isRelative = true; - if ('file' !== this._scheme) { - this._scheme = base._scheme; - } - if (EOF === c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' === c || '\\' === c) { - if ('\\' === c) { - err('\\ is an invalid code point.'); - } - state = 'relative slash'; - } else if ('?' === c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' === c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1]; - var nextNextC = input[cursor+2]; - if ('file' !== this._scheme || !ALPHA.test(c) || - (nextC !== ':' && nextC !== '|') || - (EOF !== nextNextC && '/' !== nextNextC && '\\' !== nextNextC && - '?' !== nextNextC && '#' !== nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' === c || '\\' === c) { - if ('\\' === c) { - err('\\ is an invalid code point.'); - } - if ('file' === this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' !== this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' === c) { - state = 'authority second slash'; - } else { - err('Expected \'/\', got: ' + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' !== c) { - err('Expected \'/\', got: ' + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' !== c && '\\' !== c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' === c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' === cp || '\n' === cp || '\r' === cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' === cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - if (null !== this._password) { - this._password += tempC; - } else { - this._username += tempC; - } - } - buffer = ''; - } else if (EOF === c || '/' === c || '\\' === c || - '?' === c || '#' === c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF === c || '/' === c || '\\' === c || '?' === c || '#' === c) { - if (buffer.length === 2 && ALPHA.test(buffer[0]) && - (buffer[1] === ':' || buffer[1] === '|')) { - state = 'relative path'; - } else if (buffer.length === 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' === c || '\n' === c || '\r' === c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' === c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' === stateOverride) { - break loop; - } - } else if (EOF === c || '/' === c || - '\\' === c || '?' === c || '#' === c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' !== c && '\n' !== c && '\r' !== c) { - if ('[' === c) { - seenBracket = true; - } else if (']' === c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF === c || '/' === c || '\\' === c || - '?' === c || '#' === c || stateOverride) { - if ('' !== buffer) { - var temp = parseInt(buffer, 10); - if (temp !== relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' === c || '\n' === c || '\r' === c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' === c) { - err('\'\\\' not allowed in path.'); - } - state = 'relative path'; - if ('/' !== c && '\\' !== c) { - continue; - } - break; - - case 'relative path': - if (EOF === c || '/' === c || '\\' === c || - (!stateOverride && ('?' === c || '#' === c))) { - if ('\\' === c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' === buffer) { - this._path.pop(); - if ('/' !== c && '\\' !== c) { - this._path.push(''); - } - } else if ('.' === buffer && '/' !== c && '\\' !== c) { - this._path.push(''); - } else if ('.' !== buffer) { - if ('file' === this._scheme && this._path.length === 0 && - buffer.length === 2 && ALPHA.test(buffer[0]) && - buffer[1] === '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' === c) { - this._query = '?'; - state = 'query'; - } else if ('#' === c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' !== c && '\n' !== c && '\r' !== c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' === c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function JURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof JURL)) { - base = new JURL(String(base)); - } - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - JURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) { - return this._url; - } - var authority = ''; - if ('' !== this._username || null !== this._password) { - authority = this._username + - (null !== this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) { - return; - } - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) { - return; - } - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) { - return; - } - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) { - return; - } - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) { - return; - } - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' === this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) { - return; - } - this._query = '?'; - if ('?' === search[0]) { - search = search.slice(1); - } - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' === this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) { - return; - } - this._fragment = '#'; - if ('#' === hash[0]) { - hash = hash.slice(1); - } - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - JURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - JURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = JURL; -})(globalScope); - -exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; -exports.IDENTITY_MATRIX = IDENTITY_MATRIX; -exports.OPS = OPS; -exports.VERBOSITY_LEVELS = VERBOSITY_LEVELS; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; -exports.AnnotationBorderStyleType = AnnotationBorderStyleType; -exports.AnnotationFieldFlag = AnnotationFieldFlag; -exports.AnnotationFlag = AnnotationFlag; -exports.AnnotationType = AnnotationType; -exports.FontType = FontType; -exports.ImageKind = ImageKind; -exports.InvalidPDFException = InvalidPDFException; -exports.MessageHandler = MessageHandler; -exports.MissingDataException = MissingDataException; -exports.MissingPDFException = MissingPDFException; -exports.NotImplementedException = NotImplementedException; -exports.PageViewport = PageViewport; -exports.PasswordException = PasswordException; -exports.PasswordResponses = PasswordResponses; -exports.StatTimer = StatTimer; -exports.StreamType = StreamType; -exports.TextRenderingMode = TextRenderingMode; -exports.UnexpectedResponseException = UnexpectedResponseException; -exports.UnknownErrorException = UnknownErrorException; -exports.Util = Util; -exports.XRefParseException = XRefParseException; -exports.arrayByteLength = arrayByteLength; -exports.arraysToBytes = arraysToBytes; -exports.assert = assert; -exports.bytesToString = bytesToString; -exports.createBlob = createBlob; -exports.createPromiseCapability = createPromiseCapability; -exports.createObjectURL = createObjectURL; -exports.deprecated = deprecated; -exports.error = error; -exports.getLookupTableFactory = getLookupTableFactory; -exports.getVerbosityLevel = getVerbosityLevel; -exports.globalScope = globalScope; -exports.info = info; -exports.isArray = isArray; -exports.isArrayBuffer = isArrayBuffer; -exports.isBool = isBool; -exports.isEmptyObj = isEmptyObj; -exports.isInt = isInt; -exports.isNum = isNum; -exports.isString = isString; -exports.isSpace = isSpace; -exports.isSameOrigin = isSameOrigin; -exports.isValidUrl = isValidUrl; -exports.isLittleEndian = isLittleEndian; -exports.isEvalSupported = isEvalSupported; -exports.loadJpegStream = loadJpegStream; -exports.log2 = log2; -exports.readInt8 = readInt8; -exports.readUint16 = readUint16; -exports.readUint32 = readUint32; -exports.removeNullCharacters = removeNullCharacters; -exports.setVerbosityLevel = setVerbosityLevel; -exports.shadow = shadow; -exports.string32 = string32; -exports.stringToBytes = stringToBytes; -exports.stringToPDFString = stringToPDFString; -exports.stringToUTF8String = stringToUTF8String; -exports.utf8StringToString = utf8StringToString; -exports.warn = warn; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayDOMUtils = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var removeNullCharacters = sharedUtil.removeNullCharacters; -var warn = sharedUtil.warn; - -/** - * Optimised CSS custom property getter/setter. - * @class - */ -var CustomStyle = (function CustomStyleClosure() { - - // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ - // animate-css-transforms-firefox-webkit.html - // in some versions of IE9 it is critical that ms appear in this list - // before Moz - var prefixes = ['ms', 'Moz', 'Webkit', 'O']; - var _cache = Object.create(null); - - function CustomStyle() {} - - CustomStyle.getProp = function get(propName, element) { - // check cache only when no element is given - if (arguments.length === 1 && typeof _cache[propName] === 'string') { - return _cache[propName]; - } - - element = element || document.documentElement; - var style = element.style, prefixed, uPropName; - - // test standard property first - if (typeof style[propName] === 'string') { - return (_cache[propName] = propName); - } - - // capitalize - uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); - - // test vendor specific properties - for (var i = 0, l = prefixes.length; i < l; i++) { - prefixed = prefixes[i] + uPropName; - if (typeof style[prefixed] === 'string') { - return (_cache[propName] = prefixed); - } - } - - //if all fails then set to undefined - return (_cache[propName] = 'undefined'); - }; - - CustomStyle.setProp = function set(propName, element, str) { - var prop = this.getProp(propName); - if (prop !== 'undefined') { - element.style[prop] = str; - } - }; - - return CustomStyle; -})(); - -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -var LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; - -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -/** - * @typedef ExternalLinkParameters - * @typedef {Object} ExternalLinkParameters - * @property {string} url - An absolute URL. - * @property {LinkTarget} target - The link target. - * @property {string} rel - The link relationship. - */ - -/** - * Adds various attributes (href, title, target, rel) to hyperlinks. - * @param {HTMLLinkElement} link - The link element. - * @param {ExternalLinkParameters} params - */ -function addLinkAttributes(link, params) { - var url = params && params.url; - link.href = link.title = (url ? removeNullCharacters(url) : ''); - - if (url) { - var target = params.target; - if (typeof target === 'undefined') { - target = getDefaultSetting('externalLinkTarget'); - } - link.target = LinkTargetStringMap[target]; - - var rel = params.rel; - if (typeof rel === 'undefined') { - rel = getDefaultSetting('externalLinkRel'); - } - link.rel = rel; - } -} - -// Gets the file name from a given URL. -function getFilenameFromUrl(url) { - var anchor = url.indexOf('#'); - var query = url.indexOf('?'); - var end = Math.min( - anchor > 0 ? anchor : url.length, - query > 0 ? query : url.length); - return url.substring(url.lastIndexOf('/', end) + 1, end); -} - -function getDefaultSetting(id) { - // The list of the settings and their default is maintained for backward - // compatibility and shall not be extended or modified. See also global.js. - var globalSettings = sharedUtil.globalScope.PDFJS; - switch (id) { - case 'pdfBug': - return globalSettings ? globalSettings.pdfBug : false; - case 'disableAutoFetch': - return globalSettings ? globalSettings.disableAutoFetch : false; - case 'disableStream': - return globalSettings ? globalSettings.disableStream : false; - case 'disableRange': - return globalSettings ? globalSettings.disableRange : false; - case 'disableFontFace': - return globalSettings ? globalSettings.disableFontFace : false; - case 'disableCreateObjectURL': - return globalSettings ? globalSettings.disableCreateObjectURL : false; - case 'disableWebGL': - return globalSettings ? globalSettings.disableWebGL : true; - case 'cMapUrl': - return globalSettings ? globalSettings.cMapUrl : null; - case 'cMapPacked': - return globalSettings ? globalSettings.cMapPacked : false; - case 'postMessageTransfers': - return globalSettings ? globalSettings.postMessageTransfers : true; - case 'workerSrc': - return globalSettings ? globalSettings.workerSrc : null; - case 'disableWorker': - return globalSettings ? globalSettings.disableWorker : false; - case 'maxImageSize': - return globalSettings ? globalSettings.maxImageSize : -1; - case 'imageResourcesPath': - return globalSettings ? globalSettings.imageResourcesPath : ''; - case 'isEvalSupported': - return globalSettings ? globalSettings.isEvalSupported : true; - case 'externalLinkTarget': - if (!globalSettings) { - return LinkTarget.NONE; - } - switch (globalSettings.externalLinkTarget) { - case LinkTarget.NONE: - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return globalSettings.externalLinkTarget; - } - warn('PDFJS.externalLinkTarget is invalid: ' + - globalSettings.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - globalSettings.externalLinkTarget = LinkTarget.NONE; - return LinkTarget.NONE; - case 'externalLinkRel': - return globalSettings ? globalSettings.externalLinkRel : 'noreferrer'; - case 'enableStats': - return !!(globalSettings && globalSettings.enableStats); - default: - throw new Error('Unknown default setting: ' + id); - } -} - -function isExternalLinkTargetSet() { - var externalLinkTarget = getDefaultSetting('externalLinkTarget'); - switch (externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } -} - -exports.CustomStyle = CustomStyle; -exports.addLinkAttributes = addLinkAttributes; -exports.isExternalLinkTargetSet = isExternalLinkTargetSet; -exports.getFilenameFromUrl = getFilenameFromUrl; -exports.LinkTarget = LinkTarget; -exports.hasCanvasTypedArrays = hasCanvasTypedArrays; -exports.getDefaultSetting = getDefaultSetting; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayFontLoader = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var string32 = sharedUtil.string32; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; - -function FontLoader(docId) { - this.docId = docId; - this.styleElement = null; - this.nativeFontFaces = []; - this.loadTestFontId = 0; - this.loadingContext = { - requests: [], - nextRequestId: 0 - }; -} -FontLoader.prototype = { - insertRule: function fontLoaderInsertRule(rule) { - var styleElement = this.styleElement; - if (!styleElement) { - styleElement = this.styleElement = document.createElement('style'); - styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; - document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); - } - - var styleSheet = styleElement.sheet; - styleSheet.insertRule(rule, styleSheet.cssRules.length); - }, - - clear: function fontLoaderClear() { - var styleElement = this.styleElement; - if (styleElement) { - styleElement.parentNode.removeChild(styleElement); - styleElement = this.styleElement = null; - } - this.nativeFontFaces.forEach(function(nativeFontFace) { - document.fonts.delete(nativeFontFace); - }); - this.nativeFontFaces.length = 0; - }, - get loadTestFont() { - // This is a CFF font with 1 glyph for '.' that fills its entire width and - // height. - return shadow(this, 'loadTestFont', atob( - 'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + - 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + - 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + - 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + - 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + - 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + - 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + - 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + - 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + - 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + - 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + - 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + - 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + - 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + - 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + - 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + - 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + - 'ABAAAAAAAAAAAD6AAAAAAAAA==' - )); - }, - - addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) { - this.nativeFontFaces.push(nativeFontFace); - document.fonts.add(nativeFontFace); - }, - - bind: function fontLoaderBind(fonts, callback) { - var rules = []; - var fontsToLoad = []; - var fontLoadPromises = []; - var getNativeFontPromise = function(nativeFontFace) { - // Return a promise that is always fulfilled, even when the font fails to - // load. - return nativeFontFace.loaded.catch(function(e) { - warn('Failed to load font "' + nativeFontFace.family + '": ' + e); - }); - }; - for (var i = 0, ii = fonts.length; i < ii; i++) { - var font = fonts[i]; - - // Add the font to the DOM only once or skip if the font - // is already loaded. - if (font.attached || font.loading === false) { - continue; - } - font.attached = true; - - if (FontLoader.isFontLoadingAPISupported) { - var nativeFontFace = font.createNativeFontFace(); - if (nativeFontFace) { - this.addNativeFontFace(nativeFontFace); - fontLoadPromises.push(getNativeFontPromise(nativeFontFace)); - } - } else { - var rule = font.createFontFaceRule(); - if (rule) { - this.insertRule(rule); - rules.push(rule); - fontsToLoad.push(font); - } - } - } - - var request = this.queueLoadingCallback(callback); - if (FontLoader.isFontLoadingAPISupported) { - Promise.all(fontLoadPromises).then(function() { - request.complete(); - }); - } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) { - this.prepareFontLoadEvent(rules, fontsToLoad, request); - } else { - request.complete(); - } - }, - - queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) { - function LoadLoader_completeRequest() { - assert(!request.end, 'completeRequest() cannot be called twice'); - request.end = Date.now(); - - // sending all completed requests in order how they were queued - while (context.requests.length > 0 && context.requests[0].end) { - var otherRequest = context.requests.shift(); - setTimeout(otherRequest.callback, 0); - } - } - - var context = this.loadingContext; - var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++); - var request = { - id: requestId, - complete: LoadLoader_completeRequest, - callback: callback, - started: Date.now() - }; - context.requests.push(request); - return request; - }, - - prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, - fonts, - request) { - /** Hack begin */ - // There's currently no event when a font has finished downloading so the - // following code is a dirty hack to 'guess' when a font is - // ready. It's assumed fonts are loaded in order, so add a known test - // font after the desired fonts and then test for the loading of that - // test font. - - function int32(data, offset) { - return (data.charCodeAt(offset) << 24) | - (data.charCodeAt(offset + 1) << 16) | - (data.charCodeAt(offset + 2) << 8) | - (data.charCodeAt(offset + 3) & 0xff); - } - - function spliceString(s, offset, remove, insert) { - var chunk1 = s.substr(0, offset); - var chunk2 = s.substr(offset + remove); - return chunk1 + insert + chunk2; - } - - var i, ii; - - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - - var called = 0; - function isFontReady(name, callback) { - called++; - // With setTimeout clamping this gives the font ~100ms to load. - if(called > 30) { - warn('Load test font never loaded.'); - callback(); - return; - } - ctx.font = '30px ' + name; - ctx.fillText('.', 0, 20); - var imageData = ctx.getImageData(0, 0, 1, 1); - if (imageData.data[3] > 0) { - callback(); - return; - } - setTimeout(isFontReady.bind(null, name, callback)); - } - - var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++; - // Chromium seems to cache fonts based on a hash of the actual font data, - // so the font must be modified for each load test else it will appear to - // be loaded already. - // TODO: This could maybe be made faster by avoiding the btoa of the full - // font by splitting it in chunks before hand and padding the font id. - var data = this.loadTestFont; - var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum) - data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, - loadTestFontId); - // CFF checksum is important for IE, adjusting it - var CFF_CHECKSUM_OFFSET = 16; - var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X' - var checksum = int32(data, CFF_CHECKSUM_OFFSET); - for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { - checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0; - } - if (i < loadTestFontId.length) { // align to 4 bytes boundary - checksum = (checksum - XXXX_VALUE + - int32(loadTestFontId + 'XXX', i)) | 0; - } - data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); - - var url = 'url(data:font/opentype;base64,' + btoa(data) + ');'; - var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' + - url + '}'; - this.insertRule(rule); - - var names = []; - for (i = 0, ii = fonts.length; i < ii; i++) { - names.push(fonts[i].loadedName); - } - names.push(loadTestFontId); - - var div = document.createElement('div'); - div.setAttribute('style', - 'visibility: hidden;' + - 'width: 10px; height: 10px;' + - 'position: absolute; top: 0px; left: 0px;'); - for (i = 0, ii = names.length; i < ii; ++i) { - var span = document.createElement('span'); - span.textContent = 'Hi'; - span.style.fontFamily = names[i]; - div.appendChild(span); - } - document.body.appendChild(div); - - isFontReady(loadTestFontId, function() { - document.body.removeChild(div); - request.complete(); - }); - /** Hack end */ - } -}; -FontLoader.isFontLoadingAPISupported = typeof document !== 'undefined' && - !!document.fonts; -Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { - get: function () { - if (typeof navigator === 'undefined') { - // node.js - we can pretend sync font loading is supported. - return shadow(FontLoader, 'isSyncFontLoadingSupported', true); - } - - var supported = false; - - // User agent string sniffing is bad, but there is no reliable way to tell - // if font is fully loaded and ready to be used with canvas. - var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent); - if (m && m[1] >= 14) { - supported = true; - } - // TODO other browsers - return shadow(FontLoader, 'isSyncFontLoadingSupported', supported); - }, - enumerable: true, - configurable: true -}); - -var IsEvalSupportedCached = { - get value() { - return shadow(this, 'value', sharedUtil.isEvalSupported()); - } -}; - -var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData, options) { - this.compiledGlyphs = Object.create(null); - // importing translated data - for (var i in translatedData) { - this[i] = translatedData[i]; - } - this.options = options; - } - FontFaceObject.prototype = { - createNativeFontFace: function FontFaceObject_createNativeFontFace() { - if (!this.data) { - return null; - } - - if (this.options.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var nativeFontFace = new FontFace(this.loadedName, this.data, {}); - - if (this.options.fontRegistry) { - this.options.fontRegistry.registerFont(this); - } - return nativeFontFace; - }, - - createFontFaceRule: function FontFaceObject_createFontFaceRule() { - if (!this.data) { - return null; - } - - if (this.options.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var data = bytesToString(new Uint8Array(this.data)); - var fontName = this.loadedName; - - // Add the font-face rule to the document - var url = ('url(data:' + this.mimetype + ';base64,' + btoa(data) + ');'); - var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - - if (this.options.fontRegistry) { - this.options.fontRegistry.registerFont(this, url); - } - - return rule; - }, - - getPathGenerator: - function FontFaceObject_getPathGenerator(objs, character) { - if (!(character in this.compiledGlyphs)) { - var cmds = objs.get(this.loadedName + '_path_' + character); - var current, i, len; - - // If we can, compile cmds into JS for MAXIMUM SPEED - if (this.options.isEvalSupported && IsEvalSupportedCached.value) { - var args, js = ''; - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.args !== undefined) { - args = current.args.join(','); - } else { - args = ''; - } - - js += 'c.' + current.cmd + '(' + args + ');\n'; - } - /* jshint -W054 */ - this.compiledGlyphs[character] = new Function('c', 'size', js); - } else { - // But fall back on using Function.prototype.apply() if we're - // blocked from using eval() for whatever reason (like CSP policies) - this.compiledGlyphs[character] = function(c, size) { - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.cmd === 'scale') { - current.args = [size, -size]; - } - - c[current.cmd].apply(c, current.args); - } - }; - } - } - return this.compiledGlyphs[character]; - } - }; - return FontFaceObject; -})(); - -exports.FontFaceObject = FontFaceObject; -exports.FontLoader = FontLoader; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayMetadata = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var error = sharedUtil.error; - - function fixMetadata(meta) { - return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { - var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, - function(code, d1, d2, d3) { - return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }); - var chars = ''; - for (var i = 0; i < bytes.length; i += 2) { - var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); - chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && - code !== 38 && false ? String.fromCharCode(code) : - '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; - } - return '>' + chars; - }); - } - - function Metadata(meta) { - if (typeof meta === 'string') { - // Ghostscript produces invalid metadata - meta = fixMetadata(meta); - - var parser = new DOMParser(); - meta = parser.parseFromString(meta, 'application/xml'); - } else if (!(meta instanceof Document)) { - error('Metadata: Invalid metadata object'); - } - - this.metaDocument = meta; - this.metadata = Object.create(null); - this.parse(); - } - - Metadata.prototype = { - parse: function Metadata_parse() { - var doc = this.metaDocument; - var rdf = doc.documentElement; - - if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in - rdf = rdf.firstChild; - while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') { - rdf = rdf.nextSibling; - } - } - - var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null; - if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) { - return; - } - - var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength; - for (i = 0, length = children.length; i < length; i++) { - desc = children[i]; - if (desc.nodeName.toLowerCase() !== 'rdf:description') { - continue; - } - - for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { - if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') { - entry = desc.childNodes[ii]; - name = entry.nodeName.toLowerCase(); - this.metadata[name] = entry.textContent.trim(); - } - } - } - }, - - get: function Metadata_get(name) { - return this.metadata[name] || null; - }, - - has: function Metadata_has(name) { - return typeof this.metadata[name] !== 'undefined'; - } - }; - -exports.Metadata = Metadata; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var Util = sharedUtil.Util; -var isNum = sharedUtil.isNum; -var isArray = sharedUtil.isArray; -var warn = sharedUtil.warn; -var createObjectURL = sharedUtil.createObjectURL; - -var SVG_DEFAULTS = { - fontStyle: 'normal', - fontWeight: 'normal', - fillColor: '#000000' -}; - -var convertImgDataToPng = (function convertImgDataToPngClosure() { - var PNG_HEADER = - new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); - - var CHUNK_WRAPPER_SIZE = 12; - - var crcTable = new Int32Array(256); - for (var i = 0; i < 256; i++) { - var c = i; - for (var h = 0; h < 8; h++) { - if (c & 1) { - c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff); - } else { - c = (c >> 1) & 0x7fffffff; - } - } - crcTable[i] = c; - } - - function crc32(data, start, end) { - var crc = -1; - for (var i = start; i < end; i++) { - var a = (crc ^ data[i]) & 0xff; - var b = crcTable[a]; - crc = (crc >>> 8) ^ b; - } - return crc ^ -1; - } - - function writePngChunk(type, body, data, offset) { - var p = offset; - var len = body.length; - - data[p] = len >> 24 & 0xff; - data[p + 1] = len >> 16 & 0xff; - data[p + 2] = len >> 8 & 0xff; - data[p + 3] = len & 0xff; - p += 4; - - data[p] = type.charCodeAt(0) & 0xff; - data[p + 1] = type.charCodeAt(1) & 0xff; - data[p + 2] = type.charCodeAt(2) & 0xff; - data[p + 3] = type.charCodeAt(3) & 0xff; - p += 4; - - data.set(body, p); - p += body.length; - - var crc = crc32(data, offset + 4, p); - - data[p] = crc >> 24 & 0xff; - data[p + 1] = crc >> 16 & 0xff; - data[p + 2] = crc >> 8 & 0xff; - data[p + 3] = crc & 0xff; - } - - function adler32(data, start, end) { - var a = 1; - var b = 0; - for (var i = start; i < end; ++i) { - a = (a + (data[i] & 0xff)) % 65521; - b = (b + a) % 65521; - } - return (b << 16) | a; - } - - function encode(imgData, kind, forceDataSchema) { - var width = imgData.width; - var height = imgData.height; - var bitDepth, colorType, lineSize; - var bytes = imgData.data; - - switch (kind) { - case ImageKind.GRAYSCALE_1BPP: - colorType = 0; - bitDepth = 1; - lineSize = (width + 7) >> 3; - break; - case ImageKind.RGB_24BPP: - colorType = 2; - bitDepth = 8; - lineSize = width * 3; - break; - case ImageKind.RGBA_32BPP: - colorType = 6; - bitDepth = 8; - lineSize = width * 4; - break; - default: - throw new Error('invalid format'); - } - - // prefix every row with predictor 0 - var literals = new Uint8Array((1 + lineSize) * height); - var offsetLiterals = 0, offsetBytes = 0; - var y, i; - for (y = 0; y < height; ++y) { - literals[offsetLiterals++] = 0; // no prediction - literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), - offsetLiterals); - offsetBytes += lineSize; - offsetLiterals += lineSize; - } - - if (kind === ImageKind.GRAYSCALE_1BPP) { - // inverting for B/W - offsetLiterals = 0; - for (y = 0; y < height; y++) { - offsetLiterals++; // skipping predictor - for (i = 0; i < lineSize; i++) { - literals[offsetLiterals++] ^= 0xFF; - } - } - } - - var ihdr = new Uint8Array([ - width >> 24 & 0xff, - width >> 16 & 0xff, - width >> 8 & 0xff, - width & 0xff, - height >> 24 & 0xff, - height >> 16 & 0xff, - height >> 8 & 0xff, - height & 0xff, - bitDepth, // bit depth - colorType, // color type - 0x00, // compression method - 0x00, // filter method - 0x00 // interlace method - ]); - - var len = literals.length; - var maxBlockLength = 0xFFFF; - - var deflateBlocks = Math.ceil(len / maxBlockLength); - var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); - var pi = 0; - idat[pi++] = 0x78; // compression method and flags - idat[pi++] = 0x9c; // flags - - var pos = 0; - while (len > maxBlockLength) { - // writing non-final DEFLATE blocks type 0 and length of 65535 - idat[pi++] = 0x00; - idat[pi++] = 0xff; - idat[pi++] = 0xff; - idat[pi++] = 0x00; - idat[pi++] = 0x00; - idat.set(literals.subarray(pos, pos + maxBlockLength), pi); - pi += maxBlockLength; - pos += maxBlockLength; - len -= maxBlockLength; - } - - // writing non-final DEFLATE blocks type 0 - idat[pi++] = 0x01; - idat[pi++] = len & 0xff; - idat[pi++] = len >> 8 & 0xff; - idat[pi++] = (~len & 0xffff) & 0xff; - idat[pi++] = (~len & 0xffff) >> 8 & 0xff; - idat.set(literals.subarray(pos), pi); - pi += literals.length - pos; - - var adler = adler32(literals, 0, literals.length); // checksum - idat[pi++] = adler >> 24 & 0xff; - idat[pi++] = adler >> 16 & 0xff; - idat[pi++] = adler >> 8 & 0xff; - idat[pi++] = adler & 0xff; - - // PNG will consists: header, IHDR+data, IDAT+data, and IEND. - var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) + - ihdr.length + idat.length; - var data = new Uint8Array(pngLength); - var offset = 0; - data.set(PNG_HEADER, offset); - offset += PNG_HEADER.length; - writePngChunk('IHDR', ihdr, data, offset); - offset += CHUNK_WRAPPER_SIZE + ihdr.length; - writePngChunk('IDATA', idat, data, offset); - offset += CHUNK_WRAPPER_SIZE + idat.length; - writePngChunk('IEND', new Uint8Array(0), data, offset); - - return createObjectURL(data, 'image/png', forceDataSchema); - } - - return function convertImgDataToPng(imgData, forceDataSchema) { - var kind = (imgData.kind === undefined ? - ImageKind.GRAYSCALE_1BPP : imgData.kind); - return encode(imgData, kind, forceDataSchema); - }; -})(); - -var SVGExtraState = (function SVGExtraStateClosure() { - function SVGExtraState() { - this.fontSizeScale = 1; - this.fontWeight = SVG_DEFAULTS.fontWeight; - this.fontSize = 0; - - 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.textRise = 0; - - // Default foreground and background colors - this.fillColor = SVG_DEFAULTS.fillColor; - this.strokeColor = '#000000'; - - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.lineJoin = ''; - this.lineCap = ''; - this.miterLimit = 0; - - this.dashArray = []; - this.dashPhase = 0; - - this.dependencies = []; - - // Clipping - this.clipId = ''; - this.pendingClip = false; - - this.maskId = ''; - } - - SVGExtraState.prototype = { - clone: function SVGExtraState_clone() { - return Object.create(this); - }, - setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - }; - return SVGExtraState; -})(); - -var SVGGraphics = (function SVGGraphicsClosure() { - function createScratchSVG(width, height) { - var NS = 'http://www.w3.org/2000/svg'; - var svg = document.createElementNS(NS, 'svg:svg'); - svg.setAttributeNS(null, 'version', '1.1'); - svg.setAttributeNS(null, 'width', width + 'px'); - svg.setAttributeNS(null, 'height', height + 'px'); - svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height); - return svg; - } - - function opListToTree(opList) { - var opTree = []; - var tmp = []; - var opListLen = opList.length; - - for (var x = 0; x < opListLen; x++) { - if (opList[x].fn === 'save') { - opTree.push({'fnId': 92, 'fn': 'group', 'items': []}); - tmp.push(opTree); - opTree = opTree[opTree.length - 1].items; - continue; - } - - if(opList[x].fn === 'restore') { - opTree = tmp.pop(); - } else { - opTree.push(opList[x]); - } - } - return opTree; - } - - /** - * Formats float number. - * @param value {number} number to format. - * @returns {string} - */ - function pf(value) { - if (value === (value | 0)) { // integer number - return value.toString(); - } - var s = value.toFixed(10); - var i = s.length - 1; - if (s[i] !== '0') { - return s; - } - // removing trailing zeros - do { - i--; - } while (s[i] === '0'); - return s.substr(0, s[i] === '.' ? i : i + 1); - } - - /** - * Formats transform matrix. The standard rotation, scale and translate - * matrices are replaced by their shorter forms, and for identity matrix - * returns empty string to save the memory. - * @param m {Array} matrix to format. - * @returns {string} - */ - function pm(m) { - if (m[4] === 0 && m[5] === 0) { - if (m[1] === 0 && m[2] === 0) { - if (m[0] === 1 && m[3] === 1) { - return ''; - } - return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; - } - if (m[0] === m[3] && m[1] === -m[2]) { - var a = Math.acos(m[0]) * 180 / Math.PI; - return 'rotate(' + pf(a) + ')'; - } - } else { - if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { - return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - } - return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + - pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - - function SVGGraphics(commonObjs, objs, forceDataSchema) { - this.current = new SVGExtraState(); - this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix - this.transformStack = []; - this.extraStack = []; - this.commonObjs = commonObjs; - this.objs = objs; - this.pendingEOFill = false; - - this.embedFonts = false; - this.embeddedFonts = Object.create(null); - this.cssStyle = null; - this.forceDataSchema = !!forceDataSchema; - } - - var NS = 'http://www.w3.org/2000/svg'; - var XML_NS = 'http://www.w3.org/XML/1998/namespace'; - var XLINK_NS = 'http://www.w3.org/1999/xlink'; - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var clipCount = 0; - var maskCount = 0; - - SVGGraphics.prototype = { - save: function SVGGraphics_save() { - this.transformStack.push(this.transformMatrix); - var old = this.current; - this.extraStack.push(old); - this.current = old.clone(); - }, - - restore: function SVGGraphics_restore() { - this.transformMatrix = this.transformStack.pop(); - this.current = this.extraStack.pop(); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.pgrp.appendChild(this.tgrp); - }, - - group: function SVGGraphics_group(items) { - this.save(); - this.executeOpTree(items); - this.restore(); - }, - - loadDependencies: function SVGGraphics_loadDependencies(operatorList) { - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var argsArray = operatorList.argsArray; - - var self = this; - for (var i = 0; i < fnArrayLen; i++) { - if (OPS.dependency === fnArray[i]) { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var obj = deps[n]; - var common = obj.substring(0, 2) === 'g_'; - var promise; - if (common) { - promise = new Promise(function(resolve) { - self.commonObjs.get(obj, resolve); - }); - } else { - promise = new Promise(function(resolve) { - self.objs.get(obj, resolve); - }); - } - this.current.dependencies.push(promise); - } - } - } - return Promise.all(this.current.dependencies); - }, - - transform: function SVGGraphics_transform(a, b, c, d, e, f) { - var transformMatrix = [a, b, c, d, e, f]; - this.transformMatrix = Util.transform(this.transformMatrix, - transformMatrix); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - getSVG: function SVGGraphics_getSVG(operatorList, viewport) { - this.svg = createScratchSVG(viewport.width, viewport.height); - this.viewport = viewport; - - return this.loadDependencies(operatorList).then(function () { - this.transformMatrix = IDENTITY_MATRIX; - this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group - this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform)); - this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.defs = document.createElementNS(NS, 'svg:defs'); - this.pgrp.appendChild(this.defs); - this.pgrp.appendChild(this.tgrp); - this.svg.appendChild(this.pgrp); - var opTree = this.convertOpList(operatorList); - this.executeOpTree(opTree); - return this.svg; - }.bind(this)); - }, - - convertOpList: function SVGGraphics_convertOpList(operatorList) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var REVOPS = []; - var opList = []; - - for (var op in OPS) { - REVOPS[OPS[op]] = op; - } - - for (var x = 0; x < fnArrayLen; x++) { - var fnId = fnArray[x]; - opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]}); - } - return opListToTree(opList); - }, - - executeOpTree: function SVGGraphics_executeOpTree(opTree) { - var opTreeLen = opTree.length; - for(var x = 0; x < opTreeLen; x++) { - var fn = opTree[x].fn; - var fnId = opTree[x].fnId; - var args = opTree[x].args; - - switch (fnId | 0) { - case OPS.beginText: - this.beginText(); - break; - case OPS.setLeading: - this.setLeading(args); - break; - case OPS.setLeadingMoveText: - this.setLeadingMoveText(args[0], args[1]); - break; - case OPS.setFont: - this.setFont(args); - break; - case OPS.showText: - this.showText(args[0]); - break; - case OPS.showSpacedText: - this.showText(args[0]); - break; - case OPS.endText: - this.endText(); - break; - case OPS.moveText: - this.moveText(args[0], args[1]); - break; - case OPS.setCharSpacing: - this.setCharSpacing(args[0]); - break; - case OPS.setWordSpacing: - this.setWordSpacing(args[0]); - break; - case OPS.setHScale: - this.setHScale(args[0]); - break; - case OPS.setTextMatrix: - this.setTextMatrix(args[0], args[1], args[2], - args[3], args[4], args[5]); - break; - case OPS.setLineWidth: - this.setLineWidth(args[0]); - break; - case OPS.setLineJoin: - this.setLineJoin(args[0]); - break; - case OPS.setLineCap: - this.setLineCap(args[0]); - break; - case OPS.setMiterLimit: - this.setMiterLimit(args[0]); - break; - case OPS.setFillRGBColor: - this.setFillRGBColor(args[0], args[1], args[2]); - break; - case OPS.setStrokeRGBColor: - this.setStrokeRGBColor(args[0], args[1], args[2]); - break; - case OPS.setDash: - this.setDash(args[0], args[1]); - break; - case OPS.setGState: - this.setGState(args[0]); - break; - case OPS.fill: - this.fill(); - break; - case OPS.eoFill: - this.eoFill(); - break; - case OPS.stroke: - this.stroke(); - break; - case OPS.fillStroke: - this.fillStroke(); - break; - case OPS.eoFillStroke: - this.eoFillStroke(); - break; - case OPS.clip: - this.clip('nonzero'); - break; - case OPS.eoClip: - this.clip('evenodd'); - break; - case OPS.paintSolidColorImageMask: - this.paintSolidColorImageMask(); - break; - case OPS.paintJpegXObject: - this.paintJpegXObject(args[0], args[1], args[2]); - break; - case OPS.paintImageXObject: - this.paintImageXObject(args[0]); - break; - case OPS.paintInlineImageXObject: - this.paintInlineImageXObject(args[0]); - break; - case OPS.paintImageMaskXObject: - this.paintImageMaskXObject(args[0]); - break; - case OPS.paintFormXObjectBegin: - this.paintFormXObjectBegin(args[0], args[1]); - break; - case OPS.paintFormXObjectEnd: - this.paintFormXObjectEnd(); - break; - case OPS.closePath: - this.closePath(); - break; - case OPS.closeStroke: - this.closeStroke(); - break; - case OPS.closeFillStroke: - this.closeFillStroke(); - break; - case OPS.nextLine: - this.nextLine(); - break; - case OPS.transform: - this.transform(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.constructPath: - this.constructPath(args[0], args[1]); - break; - case OPS.endPath: - this.endPath(); - break; - case 92: - this.group(opTree[x].items); - break; - default: - warn('Unimplemented method '+ fn); - break; - } - } - }, - - setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { - this.current.wordSpacing = wordSpacing; - }, - - setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { - this.current.charSpacing = charSpacing; - }, - - nextLine: function SVGGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { - var current = this.current; - this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f]; - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - - current.txtElement = document.createElementNS(NS, 'svg:text'); - current.txtElement.appendChild(current.tspan); - }, - - beginText: function SVGGraphics_beginText() { - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - this.current.textMatrix = IDENTITY_MATRIX; - this.current.lineMatrix = IDENTITY_MATRIX; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.txtElement = document.createElementNS(NS, 'svg:text'); - this.current.txtgrp = document.createElementNS(NS, 'svg:g'); - this.current.xcoords = []; - }, - - moveText: function SVGGraphics_moveText(x, y) { - var current = this.current; - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - }, - - showText: function SVGGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - - if (fontSize === 0) { - return; - } - - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += fontDirection * wordSpacing; - continue; - } else if (isNum(glyph)) { - x += -glyph * fontSize * 0.001; - continue; - } - current.xcoords.push(current.x + x * textHScale); - - var width = glyph.width; - var character = glyph.fontChar; - var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; - x += charWidth; - - current.tspan.textContent += character; - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - - current.tspan.setAttributeNS(null, 'x', - current.xcoords.map(pf).join(' ')); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { - current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); - } - if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { - current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight); - } - if (current.fillColor !== SVG_DEFAULTS.fillColor) { - current.tspan.setAttributeNS(null, 'fill', current.fillColor); - } - - current.txtElement.setAttributeNS(null, 'transform', - pm(current.textMatrix) + - ' scale(1, -1)' ); - current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); - current.txtElement.appendChild(current.tspan); - current.txtgrp.appendChild(current.txtElement); - - this.tgrp.appendChild(current.txtElement); - - }, - - setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - }, - - addFontStyle: function SVGGraphics_addFontStyle(fontObj) { - if (!this.cssStyle) { - this.cssStyle = document.createElementNS(NS, 'svg:style'); - this.cssStyle.setAttributeNS(null, 'type', 'text/css'); - this.defs.appendChild(this.cssStyle); - } - - var url = createObjectURL(fontObj.data, fontObj.mimetype, - this.forceDataSchema); - this.cssStyle.textContent += - '@font-face { font-family: "' + fontObj.loadedName + '";' + - ' src: url(' + url + '); }\n'; - }, - - setFont: function SVGGraphics_setFont(details) { - var current = this.current; - var fontObj = this.commonObjs.get(details[0]); - var size = details[1]; - this.current.font = fontObj; - - if (this.embedFonts && fontObj.data && - !this.embeddedFonts[fontObj.loadedName]) { - this.addFontStyle(fontObj); - this.embeddedFonts[fontObj.loadedName] = fontObj; - } - - current.fontMatrix = (fontObj.fontMatrix ? - fontObj.fontMatrix : FONT_IDENTITY_MATRIX); - - var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - var italic = fontObj.italic ? 'italic' : 'normal'; - - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - current.fontSize = size; - current.fontFamily = fontObj.loadedName; - current.fontWeight = bold; - current.fontStyle = italic; - - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.xcoords = []; - }, - - endText: function SVGGraphics_endText() { - if (this.current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - // Path properties - setLineWidth: function SVGGraphics_setLineWidth(width) { - this.current.lineWidth = width; - }, - setLineCap: function SVGGraphics_setLineCap(style) { - this.current.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function SVGGraphics_setLineJoin(style) { - this.current.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function SVGGraphics_setMiterLimit(limit) { - this.current.miterLimit = limit; - }, - setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.strokeColor = color; - }, - setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.fillColor = color; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.xcoords = []; - }, - setDash: function SVGGraphics_setDash(dashArray, dashPhase) { - this.current.dashArray = dashArray; - this.current.dashPhase = dashPhase; - }, - - constructPath: function SVGGraphics_constructPath(ops, args) { - var current = this.current; - var x = current.x, y = current.y; - current.path = document.createElementNS(NS, 'svg:path'); - var d = []; - var opLength = ops.length; - - for (var i = 0, j = 0; i < opLength; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - var xw = x + width; - var yh = y + height; - d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh), - 'L', pf(x), pf(yh), 'Z'); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - d.push('M', pf(x), pf(y)); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - d.push('L', pf(x) , pf(y)); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), - pf(args[j + 3]), pf(x), pf(y)); - j += 6; - break; - case OPS.curveTo2: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), - pf(args[j + 2]), pf(args[j + 3])); - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), - pf(x), pf(y)); - j += 4; - break; - case OPS.closePath: - d.push('Z'); - break; - } - } - current.path.setAttributeNS(null, 'd', d.join(' ')); - current.path.setAttributeNS(null, 'stroke-miterlimit', - pf(current.miterLimit)); - current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap); - current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); - current.path.setAttributeNS(null, 'stroke-width', - pf(current.lineWidth) + 'px'); - current.path.setAttributeNS(null, 'stroke-dasharray', - current.dashArray.map(pf).join(' ')); - current.path.setAttributeNS(null, 'stroke-dashoffset', - pf(current.dashPhase) + 'px'); - current.path.setAttributeNS(null, 'fill', 'none'); - - this.tgrp.appendChild(current.path); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - // Saving a reference in current.element so that it can be addressed - // in 'fill' and 'stroke' - current.element = current.path; - current.setCurrentPoint(x, y); - }, - - endPath: function SVGGraphics_endPath() { - var current = this.current; - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - clip: function SVGGraphics_clip(type) { - var current = this.current; - // Add current path to clipping path - current.clipId = 'clippath' + clipCount; - clipCount++; - this.clippath = document.createElementNS(NS, 'svg:clipPath'); - this.clippath.setAttributeNS(null, 'id', current.clipId); - var clipElement = current.element.cloneNode(); - if (type === 'evenodd') { - clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); - } else { - clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); - } - this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.clippath.appendChild(clipElement); - this.defs.appendChild(this.clippath); - - // Create a new group with that attribute - current.pendingClip = true; - this.cgrp = document.createElementNS(NS, 'svg:g'); - this.cgrp.setAttributeNS(null, 'clip-path', - 'url(#' + current.clipId + ')'); - this.pgrp.appendChild(this.cgrp); - }, - - closePath: function SVGGraphics_closePath() { - var current = this.current; - var d = current.path.getAttributeNS(null, 'd'); - d += 'Z'; - current.path.setAttributeNS(null, 'd', d); - }, - - setLeading: function SVGGraphics_setLeading(leading) { - this.current.leading = -leading; - }, - - setTextRise: function SVGGraphics_setTextRise(textRise) { - this.current.textRise = textRise; - }, - - setHScale: function SVGGraphics_setHScale(scale) { - this.current.textHScale = scale / 100; - }, - - setGState: function SVGGraphics_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': - break; - case 'FL': - break; - case 'Font': - this.setFont(value); - break; - case 'CA': - break; - case 'ca': - break; - case 'BM': - break; - case 'SMask': - break; - } - } - }, - - fill: function SVGGraphics_fill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - }, - - stroke: function SVGGraphics_stroke() { - var current = this.current; - current.element.setAttributeNS(null, 'stroke', current.strokeColor); - current.element.setAttributeNS(null, 'fill', 'none'); - }, - - eoFill: function SVGGraphics_eoFill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - }, - - fillStroke: function SVGGraphics_fillStroke() { - // Order is important since stroke wants fill to be none. - // First stroke, then if fill needed, it will be overwritten. - this.stroke(); - this.fill(); - }, - - eoFillStroke: function SVGGraphics_eoFillStroke() { - this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - this.fillStroke(); - }, - - closeStroke: function SVGGraphics_closeStroke() { - this.closePath(); - this.stroke(); - }, - - closeFillStroke: function SVGGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - - paintSolidColorImageMask: - function SVGGraphics_paintSolidColorImageMask() { - var current = this.current; - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', '1px'); - rect.setAttributeNS(null, 'height', '1px'); - rect.setAttributeNS(null, 'fill', current.fillColor); - this.tgrp.appendChild(rect); - }, - - paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { - var current = this.current; - var imgObj = this.objs.get(objId); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); - imgEl.setAttributeNS(null, 'width', imgObj.width + 'px'); - imgEl.setAttributeNS(null, 'height', imgObj.height + 'px'); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-h)); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); - - this.tgrp.appendChild(imgEl); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageXObject: function SVGGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - this.paintInlineImageXObject(imgData); - }, - - paintInlineImageXObject: - function SVGGraphics_paintInlineImageXObject(imgData, mask) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - - var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema); - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', '0'); - cliprect.setAttributeNS(null, 'y', '0'); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - current.element = cliprect; - this.clip('nonzero'); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-height)); - imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); - imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / width) + ' ' + - pf(-1 / height) + ')'); - if (mask) { - mask.appendChild(imgEl); - } else { - this.tgrp.appendChild(imgEl); - } - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageMaskXObject: - function SVGGraphics_paintImageMaskXObject(imgData) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - var fillColor = current.fillColor; - - current.maskId = 'mask' + maskCount++; - var mask = document.createElementNS(NS, 'svg:mask'); - mask.setAttributeNS(null, 'id', current.maskId); - - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', pf(width)); - rect.setAttributeNS(null, 'height', pf(height)); - rect.setAttributeNS(null, 'fill', fillColor); - rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')'); - this.defs.appendChild(mask); - this.tgrp.appendChild(rect); - - this.paintInlineImageXObject(imgData, mask); - }, - - paintFormXObjectBegin: - function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { - this.save(); - - if (isArray(matrix) && matrix.length === 6) { - this.transform(matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); - } - - if (isArray(bbox) && bbox.length === 4) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', bbox[0]); - cliprect.setAttributeNS(null, 'y', bbox[1]); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - this.current.element = cliprect; - this.clip('nonzero'); - this.endPath(); - } - }, - - paintFormXObjectEnd: - function SVGGraphics_paintFormXObjectEnd() { - this.restore(); - } - }; - return SVGGraphics; -})(); - -exports.SVGGraphics = SVGGraphics; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayAnnotationLayer = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils); - } -}(this, function (exports, sharedUtil, displayDOMUtils) { - -var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; -var AnnotationType = sharedUtil.AnnotationType; -var Util = sharedUtil.Util; -var addLinkAttributes = displayDOMUtils.addLinkAttributes; -var LinkTarget = displayDOMUtils.LinkTarget; -var getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; -var warn = sharedUtil.warn; -var CustomStyle = displayDOMUtils.CustomStyle; -var getDefaultSetting = displayDOMUtils.getDefaultSetting; - -/** - * @typedef {Object} AnnotationElementParameters - * @property {Object} data - * @property {HTMLDivElement} layer - * @property {PDFPage} page - * @property {PageViewport} viewport - * @property {IPDFLinkService} linkService - * @property {DownloadManager} downloadManager - * @property {string} imageResourcesPath - * @property {boolean} renderInteractiveForms - */ - -/** - * @class - * @alias AnnotationElementFactory - */ -function AnnotationElementFactory() {} -AnnotationElementFactory.prototype = - /** @lends AnnotationElementFactory.prototype */ { - /** - * @param {AnnotationElementParameters} parameters - * @returns {AnnotationElement} - */ - create: function AnnotationElementFactory_create(parameters) { - var subtype = parameters.data.annotationType; - - switch (subtype) { - case AnnotationType.LINK: - return new LinkAnnotationElement(parameters); - - case AnnotationType.TEXT: - return new TextAnnotationElement(parameters); - - case AnnotationType.WIDGET: - var fieldType = parameters.data.fieldType; - - switch (fieldType) { - case 'Tx': - return new TextWidgetAnnotationElement(parameters); - } - return new WidgetAnnotationElement(parameters); - - case AnnotationType.POPUP: - return new PopupAnnotationElement(parameters); - - case AnnotationType.HIGHLIGHT: - return new HighlightAnnotationElement(parameters); - - case AnnotationType.UNDERLINE: - return new UnderlineAnnotationElement(parameters); - - case AnnotationType.SQUIGGLY: - return new SquigglyAnnotationElement(parameters); - - case AnnotationType.STRIKEOUT: - return new StrikeOutAnnotationElement(parameters); - - case AnnotationType.FILEATTACHMENT: - return new FileAttachmentAnnotationElement(parameters); - - default: - return new AnnotationElement(parameters); - } - } -}; - -/** - * @class - * @alias AnnotationElement - */ -var AnnotationElement = (function AnnotationElementClosure() { - function AnnotationElement(parameters, isRenderable) { - this.isRenderable = isRenderable || false; - this.data = parameters.data; - this.layer = parameters.layer; - this.page = parameters.page; - this.viewport = parameters.viewport; - this.linkService = parameters.linkService; - this.downloadManager = parameters.downloadManager; - this.imageResourcesPath = parameters.imageResourcesPath; - this.renderInteractiveForms = parameters.renderInteractiveForms; - - if (isRenderable) { - this.container = this._createContainer(); - } - } - - AnnotationElement.prototype = /** @lends AnnotationElement.prototype */ { - /** - * Create an empty container for the annotation's HTML element. - * - * @private - * @memberof AnnotationElement - * @returns {HTMLSectionElement} - */ - _createContainer: function AnnotationElement_createContainer() { - var data = this.data, page = this.page, viewport = this.viewport; - var container = document.createElement('section'); - var width = data.rect[2] - data.rect[0]; - var height = data.rect[3] - data.rect[1]; - - container.setAttribute('data-annotation-id', data.id); - - // Do *not* modify `data.rect`, since that will corrupt the annotation - // position on subsequent calls to `_createContainer` (see issue 6804). - var rect = Util.normalizeRect([ - data.rect[0], - page.view[3] - data.rect[1] + page.view[1], - data.rect[2], - page.view[3] - data.rect[3] + page.view[1] - ]); - - CustomStyle.setProp('transform', container, - 'matrix(' + viewport.transform.join(',') + ')'); - CustomStyle.setProp('transformOrigin', container, - -rect[0] + 'px ' + -rect[1] + 'px'); - - if (data.borderStyle.width > 0) { - container.style.borderWidth = data.borderStyle.width + 'px'; - if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { - // Underline styles only have a bottom border, so we do not need - // to adjust for all borders. This yields a similar result as - // Adobe Acrobat/Reader. - width = width - 2 * data.borderStyle.width; - height = height - 2 * data.borderStyle.width; - } - - var horizontalRadius = data.borderStyle.horizontalCornerRadius; - var verticalRadius = data.borderStyle.verticalCornerRadius; - if (horizontalRadius > 0 || verticalRadius > 0) { - var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; - CustomStyle.setProp('borderRadius', container, radius); - } - - switch (data.borderStyle.style) { - case AnnotationBorderStyleType.SOLID: - container.style.borderStyle = 'solid'; - break; - - case AnnotationBorderStyleType.DASHED: - container.style.borderStyle = 'dashed'; - break; - - case AnnotationBorderStyleType.BEVELED: - warn('Unimplemented border style: beveled'); - break; - - case AnnotationBorderStyleType.INSET: - warn('Unimplemented border style: inset'); - break; - - case AnnotationBorderStyleType.UNDERLINE: - container.style.borderBottomStyle = 'solid'; - break; - - default: - break; - } - - if (data.color) { - container.style.borderColor = - Util.makeCssRgb(data.color[0] | 0, - data.color[1] | 0, - data.color[2] | 0); - } else { - // Transparent (invisible) border, so do not draw it at all. - container.style.borderWidth = 0; - } - } - - container.style.left = rect[0] + 'px'; - container.style.top = rect[1] + 'px'; - - container.style.width = width + 'px'; - container.style.height = height + 'px'; - - return container; - }, - - /** - * Create a popup for the annotation's HTML element. This is used for - * annotations that do not have a Popup entry in the dictionary, but - * are of a type that works with popups (such as Highlight annotations). - * - * @private - * @param {HTMLSectionElement} container - * @param {HTMLDivElement|HTMLImageElement|null} trigger - * @param {Object} data - * @memberof AnnotationElement - */ - _createPopup: - function AnnotationElement_createPopup(container, trigger, data) { - // If no trigger element is specified, create it. - if (!trigger) { - trigger = document.createElement('div'); - trigger.style.height = container.style.height; - trigger.style.width = container.style.width; - container.appendChild(trigger); - } - - var popupElement = new PopupElement({ - container: container, - trigger: trigger, - color: data.color, - title: data.title, - contents: data.contents, - hideWrapper: true - }); - var popup = popupElement.render(); - - // Position the popup next to the annotation's container. - popup.style.left = container.style.width; - - container.appendChild(popup); - }, - - /** - * Render the annotation's HTML element in the empty container. - * - * @public - * @memberof AnnotationElement - */ - render: function AnnotationElement_render() { - throw new Error('Abstract method AnnotationElement.render called'); - } - }; - - return AnnotationElement; -})(); - -/** - * @class - * @alias LinkAnnotationElement - */ -var LinkAnnotationElement = (function LinkAnnotationElementClosure() { - function LinkAnnotationElement(parameters) { - AnnotationElement.call(this, parameters, true); - } - - Util.inherit(LinkAnnotationElement, AnnotationElement, { - /** - * Render the link annotation's HTML element in the empty container. - * - * @public - * @memberof LinkAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function LinkAnnotationElement_render() { - this.container.className = 'linkAnnotation'; - - var link = document.createElement('a'); - addLinkAttributes(link, { - url: this.data.url, - target: (this.data.newWindow ? LinkTarget.BLANK : undefined), - }); - - if (!this.data.url) { - if (this.data.action) { - this._bindNamedAction(link, this.data.action); - } else { - this._bindLink(link, (this.data.dest || null)); - } - } - - this.container.appendChild(link); - return this.container; - }, - - /** - * Bind internal links to the link element. - * - * @private - * @param {Object} link - * @param {Object} destination - * @memberof LinkAnnotationElement - */ - _bindLink: function LinkAnnotationElement_bindLink(link, destination) { - var self = this; - - link.href = this.linkService.getDestinationHash(destination); - link.onclick = function() { - if (destination) { - self.linkService.navigateTo(destination); - } - return false; - }; - if (destination) { - link.className = 'internalLink'; - } - }, - - /** - * Bind named actions to the link element. - * - * @private - * @param {Object} link - * @param {Object} action - * @memberof LinkAnnotationElement - */ - _bindNamedAction: - function LinkAnnotationElement_bindNamedAction(link, action) { - var self = this; - - link.href = this.linkService.getAnchorUrl(''); - link.onclick = function() { - self.linkService.executeNamedAction(action); - return false; - }; - link.className = 'internalLink'; - } - }); - - return LinkAnnotationElement; -})(); - -/** - * @class - * @alias TextAnnotationElement - */ -var TextAnnotationElement = (function TextAnnotationElementClosure() { - function TextAnnotationElement(parameters) { - var isRenderable = !!(parameters.data.hasPopup || - parameters.data.title || parameters.data.contents); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(TextAnnotationElement, AnnotationElement, { - /** - * Render the text annotation's HTML element in the empty container. - * - * @public - * @memberof TextAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function TextAnnotationElement_render() { - this.container.className = 'textAnnotation'; - - var image = document.createElement('img'); - image.style.height = this.container.style.height; - image.style.width = this.container.style.width; - image.src = this.imageResourcesPath + 'annotation-' + - this.data.name.toLowerCase() + '.svg'; - image.alt = '[{{type}} Annotation]'; - image.dataset.l10nId = 'text_annotation_type'; - image.dataset.l10nArgs = JSON.stringify({type: this.data.name}); - - if (!this.data.hasPopup) { - this._createPopup(this.container, image, this.data); - } - - this.container.appendChild(image); - return this.container; - } - }); - - return TextAnnotationElement; -})(); - -/** - * @class - * @alias WidgetAnnotationElement - */ -var WidgetAnnotationElement = (function WidgetAnnotationElementClosure() { - function WidgetAnnotationElement(parameters) { - var isRenderable = parameters.renderInteractiveForms || - (!parameters.data.hasAppearance && !!parameters.data.fieldValue); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(WidgetAnnotationElement, AnnotationElement, { - /** - * Render the widget annotation's HTML element in the empty container. - * - * @public - * @memberof WidgetAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function WidgetAnnotationElement_render() { - // Show only the container for unsupported field types. - return this.container; - } - }); - - return WidgetAnnotationElement; -})(); - -/** - * @class - * @alias TextWidgetAnnotationElement - */ -var TextWidgetAnnotationElement = ( - function TextWidgetAnnotationElementClosure() { - var TEXT_ALIGNMENT = ['left', 'center', 'right']; - - function TextWidgetAnnotationElement(parameters) { - WidgetAnnotationElement.call(this, parameters); - } - - Util.inherit(TextWidgetAnnotationElement, WidgetAnnotationElement, { - /** - * Render the text widget annotation's HTML element in the empty container. - * - * @public - * @memberof TextWidgetAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function TextWidgetAnnotationElement_render() { - this.container.className = 'textWidgetAnnotation'; - - var element = null; - if (this.renderInteractiveForms) { - // NOTE: We cannot set the values using `element.value` below, since it - // prevents the AnnotationLayer rasterizer in `test/driver.js` - // from parsing the elements correctly for the reference tests. - if (this.data.multiLine) { - element = document.createElement('textarea'); - element.textContent = this.data.fieldValue; - } else { - element = document.createElement('input'); - element.type = 'text'; - element.setAttribute('value', this.data.fieldValue); - } - - element.disabled = this.data.readOnly; - - if (this.data.maxLen !== null) { - element.maxLength = this.data.maxLen; - } - - if (this.data.comb) { - var fieldWidth = this.data.rect[2] - this.data.rect[0]; - var combWidth = fieldWidth / this.data.maxLen; - - element.classList.add('comb'); - element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)'; - } - } else { - element = document.createElement('div'); - element.textContent = this.data.fieldValue; - element.style.verticalAlign = 'middle'; - element.style.display = 'table-cell'; - - var font = null; - if (this.data.fontRefName) { - font = this.page.commonObjs.getData(this.data.fontRefName); - } - this._setTextStyle(element, font); - } - - if (this.data.textAlignment !== null) { - element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; - } - - this.container.appendChild(element); - return this.container; - }, - - /** - * Apply text styles to the text in the element. - * - * @private - * @param {HTMLDivElement} element - * @param {Object} font - * @memberof TextWidgetAnnotationElement - */ - _setTextStyle: - function TextWidgetAnnotationElement_setTextStyle(element, font) { - // TODO: This duplicates some of the logic in CanvasGraphics.setFont(). - var style = element.style; - style.fontSize = this.data.fontSize + 'px'; - style.direction = (this.data.fontDirection < 0 ? 'rtl': 'ltr'); - - if (!font) { - return; - } - - style.fontWeight = (font.black ? - (font.bold ? '900' : 'bold') : - (font.bold ? 'bold' : 'normal')); - style.fontStyle = (font.italic ? 'italic' : 'normal'); - - // Use a reasonable default font if the font doesn't specify a fallback. - var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : ''; - var fallbackName = font.fallbackName || 'Helvetica, sans-serif'; - style.fontFamily = fontFamily + fallbackName; - } - }); - - return TextWidgetAnnotationElement; -})(); - -/** - * @class - * @alias PopupAnnotationElement - */ -var PopupAnnotationElement = (function PopupAnnotationElementClosure() { - function PopupAnnotationElement(parameters) { - var isRenderable = !!(parameters.data.title || parameters.data.contents); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(PopupAnnotationElement, AnnotationElement, { - /** - * Render the popup annotation's HTML element in the empty container. - * - * @public - * @memberof PopupAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function PopupAnnotationElement_render() { - this.container.className = 'popupAnnotation'; - - var selector = '[data-annotation-id="' + this.data.parentId + '"]'; - var parentElement = this.layer.querySelector(selector); - if (!parentElement) { - return this.container; - } - - var popup = new PopupElement({ - container: this.container, - trigger: parentElement, - color: this.data.color, - title: this.data.title, - contents: this.data.contents - }); - - // Position the popup next to the parent annotation's container. - // PDF viewers ignore a popup annotation's rectangle. - var parentLeft = parseFloat(parentElement.style.left); - var parentWidth = parseFloat(parentElement.style.width); - CustomStyle.setProp('transformOrigin', this.container, - -(parentLeft + parentWidth) + 'px -' + - parentElement.style.top); - this.container.style.left = (parentLeft + parentWidth) + 'px'; - - this.container.appendChild(popup.render()); - return this.container; - } - }); - - return PopupAnnotationElement; -})(); - -/** - * @class - * @alias PopupElement - */ -var PopupElement = (function PopupElementClosure() { - var BACKGROUND_ENLIGHT = 0.7; - - function PopupElement(parameters) { - this.container = parameters.container; - this.trigger = parameters.trigger; - this.color = parameters.color; - this.title = parameters.title; - this.contents = parameters.contents; - this.hideWrapper = parameters.hideWrapper || false; - - this.pinned = false; - } - - PopupElement.prototype = /** @lends PopupElement.prototype */ { - /** - * Render the popup's HTML element. - * - * @public - * @memberof PopupElement - * @returns {HTMLSectionElement} - */ - render: function PopupElement_render() { - var wrapper = document.createElement('div'); - wrapper.className = 'popupWrapper'; - - // For Popup annotations we hide the entire section because it contains - // only the popup. However, for Text annotations without a separate Popup - // annotation, we cannot hide the entire container as the image would - // disappear too. In that special case, hiding the wrapper suffices. - this.hideElement = (this.hideWrapper ? wrapper : this.container); - this.hideElement.setAttribute('hidden', true); - - var popup = document.createElement('div'); - popup.className = 'popup'; - - var color = this.color; - if (color) { - // Enlighten the color. - var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; - var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; - var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; - popup.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0); - } - - var contents = this._formatContents(this.contents); - var title = document.createElement('h1'); - title.textContent = this.title; - - // Attach the event listeners to the trigger element. - this.trigger.addEventListener('click', this._toggle.bind(this)); - this.trigger.addEventListener('mouseover', this._show.bind(this, false)); - this.trigger.addEventListener('mouseout', this._hide.bind(this, false)); - popup.addEventListener('click', this._hide.bind(this, true)); - - popup.appendChild(title); - popup.appendChild(contents); - wrapper.appendChild(popup); - return wrapper; - }, - - /** - * Format the contents of the popup by adding newlines where necessary. - * - * @private - * @param {string} contents - * @memberof PopupElement - * @returns {HTMLParagraphElement} - */ - _formatContents: function PopupElement_formatContents(contents) { - var p = document.createElement('p'); - var lines = contents.split(/(?:\r\n?|\n)/); - for (var i = 0, ii = lines.length; i < ii; ++i) { - var line = lines[i]; - p.appendChild(document.createTextNode(line)); - if (i < (ii - 1)) { - p.appendChild(document.createElement('br')); - } - } - return p; - }, - - /** - * Toggle the visibility of the popup. - * - * @private - * @memberof PopupElement - */ - _toggle: function PopupElement_toggle() { - if (this.pinned) { - this._hide(true); - } else { - this._show(true); - } - }, - - /** - * Show the popup. - * - * @private - * @param {boolean} pin - * @memberof PopupElement - */ - _show: function PopupElement_show(pin) { - if (pin) { - this.pinned = true; - } - if (this.hideElement.hasAttribute('hidden')) { - this.hideElement.removeAttribute('hidden'); - this.container.style.zIndex += 1; - } - }, - - /** - * Hide the popup. - * - * @private - * @param {boolean} unpin - * @memberof PopupElement - */ - _hide: function PopupElement_hide(unpin) { - if (unpin) { - this.pinned = false; - } - if (!this.hideElement.hasAttribute('hidden') && !this.pinned) { - this.hideElement.setAttribute('hidden', true); - this.container.style.zIndex -= 1; - } - } - }; - - return PopupElement; -})(); - -/** - * @class - * @alias HighlightAnnotationElement - */ -var HighlightAnnotationElement = ( - function HighlightAnnotationElementClosure() { - function HighlightAnnotationElement(parameters) { - var isRenderable = !!(parameters.data.hasPopup || - parameters.data.title || parameters.data.contents); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(HighlightAnnotationElement, AnnotationElement, { - /** - * Render the highlight annotation's HTML element in the empty container. - * - * @public - * @memberof HighlightAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function HighlightAnnotationElement_render() { - this.container.className = 'highlightAnnotation'; - - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); - } - - return this.container; - } - }); - - return HighlightAnnotationElement; -})(); - -/** - * @class - * @alias UnderlineAnnotationElement - */ -var UnderlineAnnotationElement = ( - function UnderlineAnnotationElementClosure() { - function UnderlineAnnotationElement(parameters) { - var isRenderable = !!(parameters.data.hasPopup || - parameters.data.title || parameters.data.contents); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(UnderlineAnnotationElement, AnnotationElement, { - /** - * Render the underline annotation's HTML element in the empty container. - * - * @public - * @memberof UnderlineAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function UnderlineAnnotationElement_render() { - this.container.className = 'underlineAnnotation'; - - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); - } - - return this.container; - } - }); - - return UnderlineAnnotationElement; -})(); - -/** - * @class - * @alias SquigglyAnnotationElement - */ -var SquigglyAnnotationElement = (function SquigglyAnnotationElementClosure() { - function SquigglyAnnotationElement(parameters) { - var isRenderable = !!(parameters.data.hasPopup || - parameters.data.title || parameters.data.contents); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(SquigglyAnnotationElement, AnnotationElement, { - /** - * Render the squiggly annotation's HTML element in the empty container. - * - * @public - * @memberof SquigglyAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function SquigglyAnnotationElement_render() { - this.container.className = 'squigglyAnnotation'; - - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); - } - - return this.container; - } - }); - - return SquigglyAnnotationElement; -})(); - -/** - * @class - * @alias StrikeOutAnnotationElement - */ -var StrikeOutAnnotationElement = ( - function StrikeOutAnnotationElementClosure() { - function StrikeOutAnnotationElement(parameters) { - var isRenderable = !!(parameters.data.hasPopup || - parameters.data.title || parameters.data.contents); - AnnotationElement.call(this, parameters, isRenderable); - } - - Util.inherit(StrikeOutAnnotationElement, AnnotationElement, { - /** - * Render the strikeout annotation's HTML element in the empty container. - * - * @public - * @memberof StrikeOutAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function StrikeOutAnnotationElement_render() { - this.container.className = 'strikeoutAnnotation'; - - if (!this.data.hasPopup) { - this._createPopup(this.container, null, this.data); - } - - return this.container; - } - }); - - return StrikeOutAnnotationElement; -})(); - -/** - * @class - * @alias FileAttachmentAnnotationElement - */ -var FileAttachmentAnnotationElement = ( - function FileAttachmentAnnotationElementClosure() { - function FileAttachmentAnnotationElement(parameters) { - AnnotationElement.call(this, parameters, true); - - this.filename = getFilenameFromUrl(parameters.data.file.filename); - this.content = parameters.data.file.content; - } - - Util.inherit(FileAttachmentAnnotationElement, AnnotationElement, { - /** - * Render the file attachment annotation's HTML element in the empty - * container. - * - * @public - * @memberof FileAttachmentAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function FileAttachmentAnnotationElement_render() { - this.container.className = 'fileAttachmentAnnotation'; - - var trigger = document.createElement('div'); - trigger.style.height = this.container.style.height; - trigger.style.width = this.container.style.width; - trigger.addEventListener('dblclick', this._download.bind(this)); - - if (!this.data.hasPopup && (this.data.title || this.data.contents)) { - this._createPopup(this.container, trigger, this.data); - } - - this.container.appendChild(trigger); - return this.container; - }, - - /** - * Download the file attachment associated with this annotation. - * - * @private - * @memberof FileAttachmentAnnotationElement - */ - _download: function FileAttachmentAnnotationElement_download() { - if (!this.downloadManager) { - warn('Download cannot be started due to unavailable download manager'); - return; - } - this.downloadManager.downloadData(this.content, this.filename, ''); - } - }); - - return FileAttachmentAnnotationElement; -})(); - -/** - * @typedef {Object} AnnotationLayerParameters - * @property {PageViewport} viewport - * @property {HTMLDivElement} div - * @property {Array} annotations - * @property {PDFPage} page - * @property {IPDFLinkService} linkService - * @property {string} imageResourcesPath - * @property {boolean} renderInteractiveForms - */ - -/** - * @class - * @alias AnnotationLayer - */ -var AnnotationLayer = (function AnnotationLayerClosure() { - return { - /** - * Render a new annotation layer with all annotation elements. - * - * @public - * @param {AnnotationLayerParameters} parameters - * @memberof AnnotationLayer - */ - render: function AnnotationLayer_render(parameters) { - var annotationElementFactory = new AnnotationElementFactory(); - - for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { - var data = parameters.annotations[i]; - if (!data) { - continue; - } - - var properties = { - data: data, - layer: parameters.div, - page: parameters.page, - viewport: parameters.viewport, - linkService: parameters.linkService, - downloadManager: parameters.downloadManager, - imageResourcesPath: parameters.imageResourcesPath || - getDefaultSetting('imageResourcesPath'), - renderInteractiveForms: parameters.renderInteractiveForms || false, - }; - var element = annotationElementFactory.create(properties); - if (element.isRenderable) { - parameters.div.appendChild(element.render()); - } - } - }, - - /** - * Update the annotation elements on existing annotation layer. - * - * @public - * @param {AnnotationLayerParameters} parameters - * @memberof AnnotationLayer - */ - update: function AnnotationLayer_update(parameters) { - for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { - var data = parameters.annotations[i]; - var element = parameters.div.querySelector( - '[data-annotation-id="' + data.id + '"]'); - if (element) { - CustomStyle.setProp('transform', element, - 'matrix(' + parameters.viewport.transform.join(',') + ')'); - } - } - parameters.div.removeAttribute('hidden'); - } - }; -})(); - -exports.AnnotationLayer = AnnotationLayer; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils); - } -}(this, function (exports, sharedUtil, displayDOMUtils) { - -var Util = sharedUtil.Util; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var CustomStyle = displayDOMUtils.CustomStyle; -var getDefaultSetting = displayDOMUtils.getDefaultSetting; - -/** - * Text layer render parameters. - * - * @typedef {Object} TextLayerRenderParameters - * @property {TextContent} textContent - Text content to render (the object is - * returned by the page's getTextContent() method). - * @property {HTMLElement} container - HTML element that will contain text runs. - * @property {PageViewport} viewport - The target viewport to properly - * layout the text runs. - * @property {Array} textDivs - (optional) HTML elements that are correspond - * the text items of the textContent input. This is output and shall be - * initially be set to empty array. - * @property {number} timeout - (optional) Delay in milliseconds before - * rendering of the text runs occurs. - * @property {boolean} enhanceTextSelection - (optional) Whether to turn on the - * text selection enhancement. - */ -var renderTextLayer = (function renderTextLayerClosure() { - var MAX_TEXT_DIVS_TO_RENDER = 100000; - - var NonWhitespaceRegexp = /\S/; - - function isAllWhitespace(str) { - return !NonWhitespaceRegexp.test(str); - } - - // Text layers may contain many thousand div's, and using `styleBuf` avoids - // creating many intermediate strings when building their 'style' properties. - var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0, - 'px; font-family: ', '', ';']; - - function appendText(task, geom, styles) { - // Initialize all used properties to keep the caches monomorphic. - var textDiv = document.createElement('div'); - var textDivProperties = { - style: null, - angle: 0, - canvasWidth: 0, - isWhitespace: false, - originalTransform: null, - paddingBottom: 0, - paddingLeft: 0, - paddingRight: 0, - paddingTop: 0, - scale: 1, - }; - - task._textDivs.push(textDiv); - if (isAllWhitespace(geom.str)) { - textDivProperties.isWhitespace = true; - task._textDivProperties.set(textDiv, textDivProperties); - return; - } - - var tx = Util.transform(task._viewport.transform, geom.transform); - var angle = Math.atan2(tx[1], tx[0]); - var style = styles[geom.fontName]; - if (style.vertical) { - angle += Math.PI / 2; - } - var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3])); - var fontAscent = fontHeight; - if (style.ascent) { - fontAscent = style.ascent * fontAscent; - } else if (style.descent) { - fontAscent = (1 + style.descent) * fontAscent; - } - - var left; - var top; - if (angle === 0) { - left = tx[4]; - top = tx[5] - fontAscent; - } else { - left = tx[4] + (fontAscent * Math.sin(angle)); - top = tx[5] - (fontAscent * Math.cos(angle)); - } - styleBuf[1] = left; - styleBuf[3] = top; - styleBuf[5] = fontHeight; - styleBuf[7] = style.fontFamily; - textDivProperties.style = styleBuf.join(''); - textDiv.setAttribute('style', textDivProperties.style); - - textDiv.textContent = geom.str; - // |fontName| is only used by the Font Inspector. This test will succeed - // when e.g. the Font Inspector is off but the Stepper is on, but it's - // not worth the effort to do a more accurate test. We only use `dataset` - // here to make the font name available for the debugger. - if (getDefaultSetting('pdfBug')) { - textDiv.dataset.fontName = geom.fontName; - } - if (angle !== 0) { - textDivProperties.angle = angle * (180 / Math.PI); - } - // We don't bother scaling single-char text divs, because it has very - // little effect on text highlighting. This makes scrolling on docs with - // lots of such divs a lot faster. - if (geom.str.length > 1) { - if (style.vertical) { - textDivProperties.canvasWidth = geom.height * task._viewport.scale; - } else { - textDivProperties.canvasWidth = geom.width * task._viewport.scale; - } - } - task._textDivProperties.set(textDiv, textDivProperties); - - if (task._enhanceTextSelection) { - var angleCos = 1, angleSin = 0; - if (angle !== 0) { - angleCos = Math.cos(angle); - angleSin = Math.sin(angle); - } - var divWidth = (style.vertical ? geom.height : geom.width) * - task._viewport.scale; - var divHeight = fontHeight; - - var m, b; - if (angle !== 0) { - m = [angleCos, angleSin, -angleSin, angleCos, left, top]; - b = Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m); - } else { - b = [left, top, left + divWidth, top + divHeight]; - } - - task._bounds.push({ - left: b[0], - top: b[1], - right: b[2], - bottom: b[3], - div: textDiv, - size: [divWidth, divHeight], - m: m - }); - } - } - - function render(task) { - if (task._canceled) { - return; - } - var textLayerFrag = task._container; - var textDivs = task._textDivs; - var capability = task._capability; - var textDivsLength = textDivs.length; - - // No point in rendering many divs as it would make the browser - // unusable even after the divs are rendered. - if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { - task._renderingDone = true; - capability.resolve(); - return; - } - - var canvas = document.createElement('canvas'); - canvas.mozOpaque = true; - var ctx = canvas.getContext('2d', {alpha: false}); - - var lastFontSize; - var lastFontFamily; - for (var i = 0; i < textDivsLength; i++) { - var textDiv = textDivs[i]; - var textDivProperties = task._textDivProperties.get(textDiv); - if (textDivProperties.isWhitespace) { - continue; - } - - var fontSize = textDiv.style.fontSize; - var fontFamily = textDiv.style.fontFamily; - - // Only build font string and set to context if different from last. - if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { - ctx.font = fontSize + ' ' + fontFamily; - lastFontSize = fontSize; - lastFontFamily = fontFamily; - } - - var width = ctx.measureText(textDiv.textContent).width; - textLayerFrag.appendChild(textDiv); - - var transform = ''; - if (textDivProperties.canvasWidth !== 0 && width > 0) { - textDivProperties.scale = textDivProperties.canvasWidth / width; - transform = 'scaleX(' + textDivProperties.scale + ')'; - } - if (textDivProperties.angle !== 0) { - transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform; - } - if (transform !== '') { - textDivProperties.originalTransform = transform; - CustomStyle.setProp('transform', textDiv, transform); - } - task._textDivProperties.set(textDiv, textDivProperties); - } - task._renderingDone = true; - capability.resolve(); - } - - function expand(task) { - var bounds = task._bounds; - var viewport = task._viewport; - - var expanded = expandBounds(viewport.width, viewport.height, bounds); - for (var i = 0; i < expanded.length; i++) { - var div = bounds[i].div; - var divProperties = task._textDivProperties.get(div); - if (divProperties.angle === 0) { - divProperties.paddingLeft = bounds[i].left - expanded[i].left; - divProperties.paddingTop = bounds[i].top - expanded[i].top; - divProperties.paddingRight = expanded[i].right - bounds[i].right; - divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom; - task._textDivProperties.set(div, divProperties); - continue; - } - // Box is rotated -- trying to find padding so rotated div will not - // exceed its expanded bounds. - var e = expanded[i], b = bounds[i]; - var m = b.m, c = m[0], s = m[1]; - // Finding intersections with expanded box. - var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size]; - var ts = new Float64Array(64); - points.forEach(function (p, i) { - var t = Util.applyTransform(p, m); - ts[i + 0] = c && (e.left - t[0]) / c; - ts[i + 4] = s && (e.top - t[1]) / s; - ts[i + 8] = c && (e.right - t[0]) / c; - ts[i + 12] = s && (e.bottom - t[1]) / s; - - ts[i + 16] = s && (e.left - t[0]) / -s; - ts[i + 20] = c && (e.top - t[1]) / c; - ts[i + 24] = s && (e.right - t[0]) / -s; - ts[i + 28] = c && (e.bottom - t[1]) / c; - - ts[i + 32] = c && (e.left - t[0]) / -c; - ts[i + 36] = s && (e.top - t[1]) / -s; - ts[i + 40] = c && (e.right - t[0]) / -c; - ts[i + 44] = s && (e.bottom - t[1]) / -s; - - ts[i + 48] = s && (e.left - t[0]) / s; - ts[i + 52] = c && (e.top - t[1]) / -c; - ts[i + 56] = s && (e.right - t[0]) / s; - ts[i + 60] = c && (e.bottom - t[1]) / -c; - }); - var findPositiveMin = function (ts, offset, count) { - var result = 0; - for (var i = 0; i < count; i++) { - var t = ts[offset++]; - if (t > 0) { - result = result ? Math.min(t, result) : t; - } - } - return result; - }; - // Not based on math, but to simplify calculations, using cos and sin - // absolute values to not exceed the box (it can but insignificantly). - var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s)); - divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale; - divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale; - divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale; - divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale; - task._textDivProperties.set(div, divProperties); - } - } - - function expandBounds(width, height, boxes) { - var bounds = boxes.map(function (box, i) { - return { - x1: box.left, - y1: box.top, - x2: box.right, - y2: box.bottom, - index: i, - x1New: undefined, - x2New: undefined - }; - }); - expandBoundsLTR(width, bounds); - var expanded = new Array(boxes.length); - bounds.forEach(function (b) { - var i = b.index; - expanded[i] = { - left: b.x1New, - top: 0, - right: b.x2New, - bottom: 0 - }; - }); - - // Rotating on 90 degrees and extending extended boxes. Reusing the bounds - // array and objects. - boxes.map(function (box, i) { - var e = expanded[i], b = bounds[i]; - b.x1 = box.top; - b.y1 = width - e.right; - b.x2 = box.bottom; - b.y2 = width - e.left; - b.index = i; - b.x1New = undefined; - b.x2New = undefined; - }); - expandBoundsLTR(height, bounds); - - bounds.forEach(function (b) { - var i = b.index; - expanded[i].top = b.x1New; - expanded[i].bottom = b.x2New; - }); - return expanded; - } - - function expandBoundsLTR(width, bounds) { - // Sorting by x1 coordinate and walk by the bounds in the same order. - bounds.sort(function (a, b) { return a.x1 - b.x1 || a.index - b.index; }); - - // First we see on the horizon is a fake boundary. - var fakeBoundary = { - x1: -Infinity, - y1: -Infinity, - x2: 0, - y2: Infinity, - index: -1, - x1New: 0, - x2New: 0 - }; - var horizon = [{ - start: -Infinity, - end: Infinity, - boundary: fakeBoundary - }]; - - bounds.forEach(function (boundary) { - // Searching for the affected part of horizon. - // TODO red-black tree or simple binary search - var i = 0; - while (i < horizon.length && horizon[i].end <= boundary.y1) { - i++; - } - var j = horizon.length - 1; - while(j >= 0 && horizon[j].start >= boundary.y2) { - j--; - } - - var horizonPart, affectedBoundary; - var q, k, maxXNew = -Infinity; - for (q = i; q <= j; q++) { - horizonPart = horizon[q]; - affectedBoundary = horizonPart.boundary; - var xNew; - if (affectedBoundary.x2 > boundary.x1) { - // In the middle of the previous element, new x shall be at the - // boundary start. Extending if further if the affected bondary - // placed on top of the current one. - xNew = affectedBoundary.index > boundary.index ? - affectedBoundary.x1New : boundary.x1; - } else if (affectedBoundary.x2New === undefined) { - // We have some space in between, new x in middle will be a fair - // choice. - xNew = (affectedBoundary.x2 + boundary.x1) / 2; - } else { - // Affected boundary has x2new set, using it as new x. - xNew = affectedBoundary.x2New; - } - if (xNew > maxXNew) { - maxXNew = xNew; - } - } - - // Set new x1 for current boundary. - boundary.x1New = maxXNew; - - // Adjusts new x2 for the affected boundaries. - for (q = i; q <= j; q++) { - horizonPart = horizon[q]; - affectedBoundary = horizonPart.boundary; - if (affectedBoundary.x2New === undefined) { - // Was not set yet, choosing new x if possible. - if (affectedBoundary.x2 > boundary.x1) { - // Current and affected boundaries intersect. If affected boundary - // is placed on top of the current, shrinking the affected. - if (affectedBoundary.index > boundary.index) { - affectedBoundary.x2New = affectedBoundary.x2; - } - } else { - affectedBoundary.x2New = maxXNew; - } - } else if (affectedBoundary.x2New > maxXNew) { - // Affected boundary is touching new x, pushing it back. - affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2); - } - } - - // Fixing the horizon. - var changedHorizon = [], lastBoundary = null; - for (q = i; q <= j; q++) { - horizonPart = horizon[q]; - affectedBoundary = horizonPart.boundary; - // Checking which boundary will be visible. - var useBoundary = affectedBoundary.x2 > boundary.x2 ? - affectedBoundary : boundary; - if (lastBoundary === useBoundary) { - // Merging with previous. - changedHorizon[changedHorizon.length - 1].end = horizonPart.end; - } else { - changedHorizon.push({ - start: horizonPart.start, - end: horizonPart.end, - boundary: useBoundary - }); - lastBoundary = useBoundary; - } - } - if (horizon[i].start < boundary.y1) { - changedHorizon[0].start = boundary.y1; - changedHorizon.unshift({ - start: horizon[i].start, - end: boundary.y1, - boundary: horizon[i].boundary - }); - } - if (boundary.y2 < horizon[j].end) { - changedHorizon[changedHorizon.length - 1].end = boundary.y2; - changedHorizon.push({ - start: boundary.y2, - end: horizon[j].end, - boundary: horizon[j].boundary - }); - } - - // Set x2 new of boundary that is no longer visible (see overlapping case - // above). - // TODO more efficient, e.g. via reference counting. - for (q = i; q <= j; q++) { - horizonPart = horizon[q]; - affectedBoundary = horizonPart.boundary; - if (affectedBoundary.x2New !== undefined) { - continue; - } - var used = false; - for (k = i - 1; !used && k >= 0 && - horizon[k].start >= affectedBoundary.y1; k--) { - used = horizon[k].boundary === affectedBoundary; - } - for (k = j + 1; !used && k < horizon.length && - horizon[k].end <= affectedBoundary.y2; k++) { - used = horizon[k].boundary === affectedBoundary; - } - for (k = 0; !used && k < changedHorizon.length; k++) { - used = changedHorizon[k].boundary === affectedBoundary; - } - if (!used) { - affectedBoundary.x2New = maxXNew; - } - } - - Array.prototype.splice.apply(horizon, - [i, j - i + 1].concat(changedHorizon)); - }); - - // Set new x2 for all unset boundaries. - horizon.forEach(function (horizonPart) { - var affectedBoundary = horizonPart.boundary; - if (affectedBoundary.x2New === undefined) { - affectedBoundary.x2New = Math.max(width, affectedBoundary.x2); - } - }); - } - - /** - * Text layer rendering task. - * - * @param {TextContent} textContent - * @param {HTMLElement} container - * @param {PageViewport} viewport - * @param {Array} textDivs - * @param {boolean} enhanceTextSelection - * @private - */ - function TextLayerRenderTask(textContent, container, viewport, textDivs, - enhanceTextSelection) { - this._textContent = textContent; - this._container = container; - this._viewport = viewport; - this._textDivs = textDivs || []; - this._textDivProperties = new WeakMap(); - this._renderingDone = false; - this._canceled = false; - this._capability = createPromiseCapability(); - this._renderTimer = null; - this._bounds = []; - this._enhanceTextSelection = !!enhanceTextSelection; - } - TextLayerRenderTask.prototype = { - get promise() { - return this._capability.promise; - }, - - cancel: function TextLayer_cancel() { - this._canceled = true; - if (this._renderTimer !== null) { - clearTimeout(this._renderTimer); - this._renderTimer = null; - } - this._capability.reject('canceled'); - }, - - _render: function TextLayer_render(timeout) { - var textItems = this._textContent.items; - var textStyles = this._textContent.styles; - for (var i = 0, len = textItems.length; i < len; i++) { - appendText(this, textItems[i], textStyles); - } - - if (!timeout) { // Render right away - render(this); - } else { // Schedule - var self = this; - this._renderTimer = setTimeout(function() { - render(self); - self._renderTimer = null; - }, timeout); - } - }, - - expandTextDivs: function TextLayer_expandTextDivs(expandDivs) { - if (!this._enhanceTextSelection || !this._renderingDone) { - return; - } - if (this._bounds !== null) { - expand(this); - this._bounds = null; - } - - for (var i = 0, ii = this._textDivs.length; i < ii; i++) { - var div = this._textDivs[i]; - var divProperties = this._textDivProperties.get(div); - - if (divProperties.isWhitespace) { - continue; - } - if (expandDivs) { - var transform = '', padding = ''; - - if (divProperties.scale !== 1) { - transform = 'scaleX(' + divProperties.scale + ')'; - } - if (divProperties.angle !== 0) { - transform = 'rotate(' + divProperties.angle + 'deg) ' + transform; - } - if (divProperties.paddingLeft !== 0) { - padding += ' padding-left: ' + - (divProperties.paddingLeft / divProperties.scale) + 'px;'; - transform += ' translateX(' + - (-divProperties.paddingLeft / divProperties.scale) + 'px)'; - } - if (divProperties.paddingTop !== 0) { - padding += ' padding-top: ' + divProperties.paddingTop + 'px;'; - transform += ' translateY(' + (-divProperties.paddingTop) + 'px)'; - } - if (divProperties.paddingRight !== 0) { - padding += ' padding-right: ' + - (divProperties.paddingRight / divProperties.scale) + 'px;'; - } - if (divProperties.paddingBottom !== 0) { - padding += ' padding-bottom: ' + - divProperties.paddingBottom + 'px;'; - } - - if (padding !== '') { - div.setAttribute('style', divProperties.style + padding); - } - if (transform !== '') { - CustomStyle.setProp('transform', div, transform); - } - } else { - div.style.padding = 0; - CustomStyle.setProp('transform', div, - divProperties.originalTransform || ''); - } - } - }, - }; - - /** - * Starts rendering of the text layer. - * - * @param {TextLayerRenderParameters} renderParameters - * @returns {TextLayerRenderTask} - */ - function renderTextLayer(renderParameters) { - var task = new TextLayerRenderTask(renderParameters.textContent, - renderParameters.container, - renderParameters.viewport, - renderParameters.textDivs, - renderParameters.enhanceTextSelection); - task._render(renderParameters.timeout); - return task; - } - - return renderTextLayer; -})(); - -exports.renderTextLayer = renderTextLayer; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils); - } -}(this, function (exports, sharedUtil, displayDOMUtils) { - -var shadow = sharedUtil.shadow; -var getDefaultSetting = displayDOMUtils.getDefaultSetting; - -var WebGLUtils = (function WebGLUtilsClosure() { - function loadShader(gl, code, shaderType) { - var shader = gl.createShader(shaderType); - gl.shaderSource(shader, code); - gl.compileShader(shader); - var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); - if (!compiled) { - var errorMsg = gl.getShaderInfoLog(shader); - throw new Error('Error during shader compilation: ' + errorMsg); - } - return shader; - } - function createVertexShader(gl, code) { - return loadShader(gl, code, gl.VERTEX_SHADER); - } - function createFragmentShader(gl, code) { - return loadShader(gl, code, gl.FRAGMENT_SHADER); - } - function createProgram(gl, shaders) { - var program = gl.createProgram(); - for (var i = 0, ii = shaders.length; i < ii; ++i) { - gl.attachShader(program, shaders[i]); - } - gl.linkProgram(program); - var linked = gl.getProgramParameter(program, gl.LINK_STATUS); - if (!linked) { - var errorMsg = gl.getProgramInfoLog(program); - throw new Error('Error during program linking: ' + errorMsg); - } - return program; - } - function createTexture(gl, image, textureId) { - gl.activeTexture(textureId); - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - - // Set the parameters so we can render any size image. - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - - // Upload the image into the texture. - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); - return texture; - } - - var currentGL, currentCanvas; - function generateGL() { - if (currentGL) { - return; - } - currentCanvas = document.createElement('canvas'); - currentGL = currentCanvas.getContext('webgl', - { premultipliedalpha: false }); - } - - var smaskVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec2 a_texCoord; \ - \ - uniform vec2 u_resolution; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_texCoord = a_texCoord; \ - } '; - - var smaskFragmentShaderCode = '\ - precision mediump float; \ - \ - uniform vec4 u_backdrop; \ - uniform int u_subtype; \ - uniform sampler2D u_image; \ - uniform sampler2D u_mask; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec4 imageColor = texture2D(u_image, v_texCoord); \ - vec4 maskColor = texture2D(u_mask, v_texCoord); \ - if (u_backdrop.a > 0.0) { \ - maskColor.rgb = maskColor.rgb * maskColor.a + \ - u_backdrop.rgb * (1.0 - maskColor.a); \ - } \ - float lum; \ - if (u_subtype == 0) { \ - lum = maskColor.a; \ - } else { \ - lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \ - maskColor.b * 0.11; \ - } \ - imageColor.a *= lum; \ - imageColor.rgb *= imageColor.a; \ - gl_FragColor = imageColor; \ - } '; - - var smaskCache = null; - - function initSmaskGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, smaskVertexShaderCode); - var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop'); - cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype'); - - var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord'); - var texLayerLocation = gl.getUniformLocation(program, 'u_image'); - var texMaskLocation = gl.getUniformLocation(program, 'u_mask'); - - // provide texture coordinates for the rectangle. - var texCoordBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 0.0, 1.0, - 1.0, 0.0, - 1.0, 1.0]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(texCoordLocation); - gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); - - gl.uniform1i(texLayerLocation, 0); - gl.uniform1i(texMaskLocation, 1); - - smaskCache = cache; - } - - function composeSMask(layer, mask, properties) { - var width = layer.width, height = layer.height; - - if (!smaskCache) { - initSmaskGL(); - } - var cache = smaskCache,canvas = cache.canvas, gl = cache.gl; - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - if (properties.backdrop) { - gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], - properties.backdrop[1], properties.backdrop[2], 1); - } else { - gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0); - } - gl.uniform1i(cache.subtypeLocation, - properties.subtype === 'Luminosity' ? 1 : 0); - - // Create a textures - var texture = createTexture(gl, layer, gl.TEXTURE0); - var maskTexture = createTexture(gl, mask, gl.TEXTURE1); - - - // Create a buffer and put a single clipspace rectangle in - // it (2 triangles) - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0, 0, - width, 0, - 0, height, - 0, height, - width, 0, - width, height]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - // draw - gl.clearColor(0, 0, 0, 0); - gl.enable(gl.BLEND); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.clear(gl.COLOR_BUFFER_BIT); - - gl.drawArrays(gl.TRIANGLES, 0, 6); - - gl.flush(); - - gl.deleteTexture(texture); - gl.deleteTexture(maskTexture); - gl.deleteBuffer(buffer); - - return canvas; - } - - var figuresVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec3 a_color; \ - \ - uniform vec2 u_resolution; \ - uniform vec2 u_scale; \ - uniform vec2 u_offset; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - vec2 position = (a_position + u_offset) * u_scale; \ - vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_color = vec4(a_color / 255.0, 1.0); \ - } '; - - var figuresFragmentShaderCode = '\ - precision mediump float; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - gl_FragColor = v_color; \ - } '; - - var figuresCache = null; - - function initFiguresGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, figuresVertexShaderCode); - var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.scaleLocation = gl.getUniformLocation(program, 'u_scale'); - cache.offsetLocation = gl.getUniformLocation(program, 'u_offset'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.colorLocation = gl.getAttribLocation(program, 'a_color'); - - figuresCache = cache; - } - - function drawFigures(width, height, backgroundColor, figures, context) { - if (!figuresCache) { - initFiguresGL(); - } - var cache = figuresCache, canvas = cache.canvas, gl = cache.gl; - - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - // count triangle points - var count = 0; - var i, ii, rows; - for (i = 0, ii = figures.length; i < ii; i++) { - switch (figures[i].type) { - case 'lattice': - rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0; - count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; - break; - case 'triangles': - count += figures[i].coords.length; - break; - } - } - // transfer data - var coords = new Float32Array(count * 2); - var colors = new Uint8Array(count * 3); - var coordsMap = context.coords, colorsMap = context.colors; - var pIndex = 0, cIndex = 0; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - switch (figure.type) { - case 'lattice': - var cols = figure.verticesPerRow; - rows = (ps.length / cols) | 0; - for (var row = 1; row < rows; row++) { - var offset = row * cols + 1; - for (var col = 1; col < cols; col++, offset++) { - coords[pIndex] = coordsMap[ps[offset - cols - 1]]; - coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; - coords[pIndex + 2] = coordsMap[ps[offset - cols]]; - coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1]; - coords[pIndex + 4] = coordsMap[ps[offset - 1]]; - coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1]; - colors[cIndex] = colorsMap[cs[offset - cols - 1]]; - colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1]; - colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2]; - colors[cIndex + 3] = colorsMap[cs[offset - cols]]; - colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1]; - colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2]; - colors[cIndex + 6] = colorsMap[cs[offset - 1]]; - colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1]; - colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2]; - - coords[pIndex + 6] = coords[pIndex + 2]; - coords[pIndex + 7] = coords[pIndex + 3]; - coords[pIndex + 8] = coords[pIndex + 4]; - coords[pIndex + 9] = coords[pIndex + 5]; - coords[pIndex + 10] = coordsMap[ps[offset]]; - coords[pIndex + 11] = coordsMap[ps[offset] + 1]; - colors[cIndex + 9] = colors[cIndex + 3]; - colors[cIndex + 10] = colors[cIndex + 4]; - colors[cIndex + 11] = colors[cIndex + 5]; - colors[cIndex + 12] = colors[cIndex + 6]; - colors[cIndex + 13] = colors[cIndex + 7]; - colors[cIndex + 14] = colors[cIndex + 8]; - colors[cIndex + 15] = colorsMap[cs[offset]]; - colors[cIndex + 16] = colorsMap[cs[offset] + 1]; - colors[cIndex + 17] = colorsMap[cs[offset] + 2]; - pIndex += 12; - cIndex += 18; - } - } - break; - case 'triangles': - for (var j = 0, jj = ps.length; j < jj; j++) { - coords[pIndex] = coordsMap[ps[j]]; - coords[pIndex + 1] = coordsMap[ps[j] + 1]; - colors[cIndex] = colorsMap[cs[j]]; - colors[cIndex + 1] = colorsMap[cs[j] + 1]; - colors[cIndex + 2] = colorsMap[cs[j] + 2]; - pIndex += 2; - cIndex += 3; - } - break; - } - } - - // draw - if (backgroundColor) { - gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, - backgroundColor[2] / 255, 1.0); - } else { - gl.clearColor(0, 0, 0, 0); - } - gl.clear(gl.COLOR_BUFFER_BIT); - - var coordsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - var colorsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.colorLocation); - gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, - 0, 0); - - gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY); - gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY); - - gl.drawArrays(gl.TRIANGLES, 0, count); - - gl.flush(); - - gl.deleteBuffer(coordsBuffer); - gl.deleteBuffer(colorsBuffer); - - return canvas; - } - - function cleanup() { - if (smaskCache && smaskCache.canvas) { - smaskCache.canvas.width = 0; - smaskCache.canvas.height = 0; - } - if (figuresCache && figuresCache.canvas) { - figuresCache.canvas.width = 0; - figuresCache.canvas.height = 0; - } - smaskCache = null; - figuresCache = null; - } - - return { - get isEnabled() { - if (getDefaultSetting('disableWebGL')) { - return false; - } - var enabled = false; - try { - generateGL(); - enabled = !!currentGL; - } catch (e) { } - return shadow(this, 'isEnabled', enabled); - }, - composeSMask: composeSMask, - drawFigures: drawFigures, - clear: cleanup - }; -})(); - -exports.WebGLUtils = WebGLUtils; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayPatternHelper = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayWebGL); - } -}(this, function (exports, sharedUtil, displayWebGL) { - -var Util = sharedUtil.Util; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var error = sharedUtil.error; -var WebGLUtils = displayWebGL.WebGLUtils; - -var ShadingIRs = {}; - -ShadingIRs.RadialAxial = { - fromIR: function RadialAxial_fromIR(raw) { - var type = raw[1]; - var colorStops = raw[2]; - var p0 = raw[3]; - var p1 = raw[4]; - var r0 = raw[5]; - var r1 = raw[6]; - return { - type: 'Pattern', - getPattern: function RadialAxial_getPattern(ctx) { - var grad; - if (type === 'axial') { - grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); - } else if (type === 'radial') { - grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); - } - - for (var i = 0, ii = colorStops.length; i < ii; ++i) { - var c = colorStops[i]; - grad.addColorStop(c[0], c[1]); - } - return grad; - } - }; - } -}; - -var createMeshCanvas = (function createMeshCanvasClosure() { - function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { - // Very basic Gouraud-shaded triangle rasterization algorithm. - var coords = context.coords, colors = context.colors; - var bytes = data.data, rowSize = data.width * 4; - var tmp; - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - if (coords[p2 + 1] > coords[p3 + 1]) { - tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp; - } - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - var x1 = (coords[p1] + context.offsetX) * context.scaleX; - var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - var x2 = (coords[p2] + context.offsetX) * context.scaleX; - var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - var x3 = (coords[p3] + context.offsetX) * context.scaleX; - var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; - if (y1 >= y3) { - return; - } - var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2]; - var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2]; - var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2]; - - var minY = Math.round(y1), maxY = Math.round(y3); - var xa, car, cag, cab; - var xb, cbr, cbg, cbb; - var k; - for (var y = minY; y <= maxY; y++) { - if (y < y2) { - k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2); - xa = x1 - (x1 - x2) * k; - car = c1r - (c1r - c2r) * k; - cag = c1g - (c1g - c2g) * k; - cab = c1b - (c1b - c2b) * k; - } else { - k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3); - xa = x2 - (x2 - x3) * k; - car = c2r - (c2r - c3r) * k; - cag = c2g - (c2g - c3g) * k; - cab = c2b - (c2b - c3b) * k; - } - k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3); - xb = x1 - (x1 - x3) * k; - cbr = c1r - (c1r - c3r) * k; - cbg = c1g - (c1g - c3g) * k; - cbb = c1b - (c1b - c3b) * k; - var x1_ = Math.round(Math.min(xa, xb)); - var x2_ = Math.round(Math.max(xa, xb)); - var j = rowSize * y + x1_ * 4; - for (var x = x1_; x <= x2_; x++) { - k = (xa - x) / (xa - xb); - k = k < 0 ? 0 : k > 1 ? 1 : k; - bytes[j++] = (car - (car - cbr) * k) | 0; - bytes[j++] = (cag - (cag - cbg) * k) | 0; - bytes[j++] = (cab - (cab - cbb) * k) | 0; - bytes[j++] = 255; - } - } - } - - function drawFigure(data, figure, context) { - var ps = figure.coords; - var cs = figure.colors; - var i, ii; - switch (figure.type) { - case 'lattice': - var verticesPerRow = figure.verticesPerRow; - var rows = Math.floor(ps.length / verticesPerRow) - 1; - var cols = verticesPerRow - 1; - for (i = 0; i < rows; i++) { - var q = i * verticesPerRow; - for (var j = 0; j < cols; j++, q++) { - drawTriangle(data, context, - ps[q], ps[q + 1], ps[q + verticesPerRow], - cs[q], cs[q + 1], cs[q + verticesPerRow]); - drawTriangle(data, context, - ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], - cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); - } - } - break; - case 'triangles': - for (i = 0, ii = ps.length; i < ii; i += 3) { - drawTriangle(data, context, - ps[i], ps[i + 1], ps[i + 2], - cs[i], cs[i + 1], cs[i + 2]); - } - break; - default: - error('illigal figure'); - break; - } - } - - function createMeshCanvas(bounds, combinesScale, coords, colors, figures, - backgroundColor, cachedCanvases) { - // we will increase scale on some weird factor to let antialiasing take - // care of "rough" edges - var EXPECTED_SCALE = 1.1; - // MAX_PATTERN_SIZE is used to avoid OOM situation. - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - // We need to keep transparent border around our pattern for fill(): - // createPattern with 'no-repeat' will bleed edges across entire area. - var BORDER_SIZE = 2; - - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var boundsWidth = Math.ceil(bounds[2]) - offsetX; - var boundsHeight = Math.ceil(bounds[3]) - offsetY; - - var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var scaleX = boundsWidth / width; - var scaleY = boundsHeight / height; - - var context = { - coords: coords, - colors: colors, - offsetX: -offsetX, - offsetY: -offsetY, - scaleX: 1 / scaleX, - scaleY: 1 / scaleY - }; - - var paddedWidth = width + BORDER_SIZE * 2; - var paddedHeight = height + BORDER_SIZE * 2; - - var canvas, tmpCanvas, i, ii; - if (WebGLUtils.isEnabled) { - canvas = WebGLUtils.drawFigures(width, height, backgroundColor, - figures, context); - - // https://bugzilla.mozilla.org/show_bug.cgi?id=972126 - tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, - false); - tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE); - canvas = tmpCanvas.canvas; - } else { - tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, - false); - var tmpCtx = tmpCanvas.context; - - var data = tmpCtx.createImageData(width, height); - if (backgroundColor) { - var bytes = data.data; - for (i = 0, ii = bytes.length; i < ii; i += 4) { - bytes[i] = backgroundColor[0]; - bytes[i + 1] = backgroundColor[1]; - bytes[i + 2] = backgroundColor[2]; - bytes[i + 3] = 255; - } - } - for (i = 0; i < figures.length; i++) { - drawFigure(data, figures[i], context); - } - tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); - canvas = tmpCanvas.canvas; - } - - return {canvas: canvas, - offsetX: offsetX - BORDER_SIZE * scaleX, - offsetY: offsetY - BORDER_SIZE * scaleY, - scaleX: scaleX, scaleY: scaleY}; - } - return createMeshCanvas; -})(); - -ShadingIRs.Mesh = { - fromIR: function Mesh_fromIR(raw) { - //var type = raw[1]; - var coords = raw[2]; - var colors = raw[3]; - var figures = raw[4]; - var bounds = raw[5]; - var matrix = raw[6]; - //var bbox = raw[7]; - var background = raw[8]; - return { - type: 'Pattern', - getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { - var scale; - if (shadingFill) { - scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); - } else { - // Obtain scale from matrix and current transformation matrix. - scale = Util.singularValueDecompose2dScale(owner.baseTransform); - if (matrix) { - var matrixScale = Util.singularValueDecompose2dScale(matrix); - scale = [scale[0] * matrixScale[0], - scale[1] * matrixScale[1]]; - } - } - - - // Rasterizing on the main thread since sending/queue large canvases - // might cause OOM. - var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, - colors, figures, shadingFill ? null : background, - owner.cachedCanvases); - - if (!shadingFill) { - ctx.setTransform.apply(ctx, owner.baseTransform); - if (matrix) { - ctx.transform.apply(ctx, matrix); - } - } - - ctx.translate(temporaryPatternCanvas.offsetX, - temporaryPatternCanvas.offsetY); - ctx.scale(temporaryPatternCanvas.scaleX, - temporaryPatternCanvas.scaleY); - - return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat'); - } - }; - } -}; - -ShadingIRs.Dummy = { - fromIR: function Dummy_fromIR() { - return { - type: 'Pattern', - getPattern: function Dummy_fromIR_getPattern() { - return 'hotpink'; - } - }; - } -}; - -function getShadingPatternFromIR(raw) { - var shadingIR = ShadingIRs[raw[0]]; - if (!shadingIR) { - error('Unknown IR type: ' + raw[0]); - } - return shadingIR.fromIR(raw); -} - -var TilingPattern = (function TilingPatternClosure() { - var PaintType = { - COLORED: 1, - UNCOLORED: 2 - }; - - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) { - this.operatorList = IR[2]; - this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; - this.bbox = IR[4]; - this.xstep = IR[5]; - this.ystep = IR[6]; - this.paintType = IR[7]; - this.tilingType = IR[8]; - this.color = color; - this.canvasGraphicsFactory = canvasGraphicsFactory; - this.baseTransform = baseTransform; - this.type = 'Pattern'; - this.ctx = ctx; - } - - TilingPattern.prototype = { - createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { - var operatorList = this.operatorList; - var bbox = this.bbox; - var xstep = this.xstep; - var ystep = this.ystep; - var paintType = this.paintType; - var tilingType = this.tilingType; - var color = this.color; - var canvasGraphicsFactory = this.canvasGraphicsFactory; - - info('TilingType: ' + tilingType); - - var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; - - var topLeft = [x0, y0]; - // we want the canvas to be as large as the step size - var botRight = [x0 + xstep, y0 + ystep]; - - var width = botRight[0] - topLeft[0]; - var height = botRight[1] - topLeft[1]; - - // Obtain scale from matrix and current transformation matrix. - var matrixScale = Util.singularValueDecompose2dScale(this.matrix); - var curMatrixScale = Util.singularValueDecompose2dScale( - this.baseTransform); - var combinedScale = [matrixScale[0] * curMatrixScale[0], - matrixScale[1] * curMatrixScale[1]]; - - // MAX_PATTERN_SIZE is used to avoid OOM situation. - // Use width and height values that are as close as possible to the end - // result when the pattern is used. Too low value makes the pattern look - // blurry. Too large value makes it look too crispy. - width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), - MAX_PATTERN_SIZE); - - height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), - MAX_PATTERN_SIZE); - - var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', - width, height, true); - var tmpCtx = tmpCanvas.context; - var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); - graphics.groupLevel = owner.groupLevel; - - this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color); - - this.setScale(width, height, xstep, ystep); - this.transformToScale(graphics); - - // transform coordinates to pattern space - var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; - graphics.transform.apply(graphics, tmpTranslate); - - this.clipBbox(graphics, bbox, x0, y0, x1, y1); - - graphics.executeOperatorList(operatorList); - return tmpCanvas.canvas; - }, - - setScale: function TilingPattern_setScale(width, height, xstep, ystep) { - this.scale = [width / xstep, height / ystep]; - }, - - transformToScale: function TilingPattern_transformToScale(graphics) { - var scale = this.scale; - var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; - graphics.transform.apply(graphics, tmpScale); - }, - - scaleToContext: function TilingPattern_scaleToContext() { - var scale = this.scale; - this.ctx.scale(1 / scale[0], 1 / scale[1]); - }, - - clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { - if (bbox && isArray(bbox) && bbox.length === 4) { - var bboxWidth = x1 - x0; - var bboxHeight = y1 - y0; - graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); - graphics.clip(); - graphics.endPath(); - } - }, - - setFillAndStrokeStyleToContext: - function setFillAndStrokeStyleToContext(context, paintType, color) { - switch (paintType) { - case PaintType.COLORED: - var ctx = this.ctx; - context.fillStyle = ctx.fillStyle; - context.strokeStyle = ctx.strokeStyle; - break; - case PaintType.UNCOLORED: - var cssColor = Util.makeCssRgb(color[0], color[1], color[2]); - context.fillStyle = cssColor; - context.strokeStyle = cssColor; - break; - default: - error('Unsupported paint type: ' + paintType); - } - }, - - getPattern: function TilingPattern_getPattern(ctx, owner) { - var temporaryPatternCanvas = this.createPatternCanvas(owner); - - ctx = this.ctx; - ctx.setTransform.apply(ctx, this.baseTransform); - ctx.transform.apply(ctx, this.matrix); - this.scaleToContext(); - - return ctx.createPattern(temporaryPatternCanvas, 'repeat'); - } - }; - - return TilingPattern; -})(); - -exports.getShadingPatternFromIR = getShadingPatternFromIR; -exports.TilingPattern = TilingPattern; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayCanvas = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils, root.pdfjsDisplayPatternHelper, - root.pdfjsDisplayWebGL); - } -}(this, function (exports, sharedUtil, displayDOMUtils, displayPatternHelper, - displayWebGL) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var TextRenderingMode = sharedUtil.TextRenderingMode; -var Uint32ArrayView = sharedUtil.Uint32ArrayView; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var info = sharedUtil.info; -var isNum = sharedUtil.isNum; -var isArray = sharedUtil.isArray; -var isLittleEndian = sharedUtil.isLittleEndian; -var error = sharedUtil.error; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; -var TilingPattern = displayPatternHelper.TilingPattern; -var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR; -var WebGLUtils = displayWebGL.WebGLUtils; -var hasCanvasTypedArrays = displayDOMUtils.hasCanvasTypedArrays; - -// contexts store most of the state we need natively. -// However, PDF needs a bit more state, which we store here. - -// Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 16; -// Maximum font size that would be used during canvas fillText operations. -var MAX_FONT_SIZE = 100; -var MAX_GROUP_SIZE = 4096; - -// Heuristic value used when enforcing minimum line widths. -var MIN_WIDTH_FACTOR = 0.65; - -var COMPILE_TYPE3_GLYPHS = true; -var MAX_SIZE_TO_COMPILE = 1000; - -var FULL_CHUNK_HEIGHT = 16; - -var HasCanvasTypedArraysCached = { - get value() { - return shadow(HasCanvasTypedArraysCached, 'value', hasCanvasTypedArrays()); - } -}; - -var IsLittleEndianCached = { - get value() { - return shadow(IsLittleEndianCached, 'value', isLittleEndian()); - } -}; - -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 one. - if (!ctx.mozCurrentTransform) { - 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._transformMatrix || [1, 0, 0, 1, 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() { - function CachedCanvases() { - this.cache = Object.create(null); - } - CachedCanvases.prototype = { - getCanvas: function CachedCanvases_getCanvas(id, width, height, - trackTransform) { - var canvasEntry; - if (this.cache[id] !== undefined) { - canvasEntry = this.cache[id]; - canvasEntry.canvas.width = width; - canvasEntry.canvas.height = height; - // reset canvas transform for emulated mozCurrentTransform, if needed - canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0); - } else { - var canvas = createScratchCanvas(width, height); - var ctx = canvas.getContext('2d'); - if (trackTransform) { - addContextCurrentTransform(ctx); - } - this.cache[id] = canvasEntry = {canvas: canvas, context: ctx}; - } - return canvasEntry; - }, - clear: function () { - for (var id in this.cache) { - var canvasEntry = this.cache[id]; - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - canvasEntry.canvas.width = 0; - canvasEntry.canvas.height = 0; - delete this.cache[id]; - } - } - }; - return CachedCanvases; -})(); - -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]); - - // decodes bit-packed mask data - var lineSize = (width + 7) & ~7, data0 = imgData.data; - var data = new Uint8Array(lineSize * height), pos = 0, ii; - for (i = 0, ii = data0.length; i < ii; i++) { - var mask = 128, elem = data0[i]; - while (mask > 0) { - data[pos++] = (elem & mask) ? 0 : 255; - mask >>= 1; - } - } - - // 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 count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - 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 + 1] ? 4 : 0) + - (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - 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.textMatrixScale = 1; - 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; - // Default fore and background colors - this.fillColor = '#000000'; - this.strokeColor = '#000000'; - this.patternFill = false; - // Note: fill alpha applies to all non-stroking operations - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.activeSMask = null; - this.resumeSMaskCtx = null; // nonclonable field (see the save method below) - - 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; - // Defines the number of steps before checking the execution time - var EXECUTION_STEPS = 10; - - function CanvasGraphics(canvasCtx, commonObjs, objs, 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.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 = []; - this.groupLevel = 0; - this.smaskStack = []; - this.smaskCounter = 0; - this.tempSMask = null; - this.cachedCanvases = new CachedCanvases(); - if (canvasCtx) { - // NOTE: if mozCurrentTransform is polyfilled, then the current state of - // the transformation must already be set in canvasCtx._transformMatrix. - addContextCurrentTransform(canvasCtx); - } - this.cachedGetSinglePixelWidth = null; - } - - function putBinaryImageData(ctx, imgData) { - if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) { - ctx.putImageData(imgData, 0, 0); - return; - } - - // Put the image data to the canvas in chunks, rather than putting the - // whole image at once. This saves JS memory, because the ImageData object - // is smaller. It also possibly saves C++ memory within the implementation - // of putImageData(). (E.g. in Firefox we make two short-lived copies of - // the data passed to putImageData()). |n| shouldn't be too small, however, - // because too many putImageData() calls will slow things down. - // - // Note: as written, if the last chunk is partial, the putImageData() call - // will (conceptually) put pixels past the bounds of the canvas. But - // that's ok; any such pixels are ignored. - - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0, destPos; - var src = imgData.data; - var dest = chunkImgData.data; - var i, j, thisChunkHeight, elemsInThisChunk; - - // There are multiple forms in which the pixel data can be passed, and - // imgData.kind tells us which one this is. - if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { - // Grayscale, 1 bit per pixel (i.e. black-and-white). - var srcLength = src.byteLength; - var dest32 = HasCanvasTypedArraysCached.value ? - new Uint32Array(dest.buffer) : new Uint32ArrayView(dest); - var dest32DataLength = dest32.length; - var fullSrcDiff = (width + 7) >> 3; - var white = 0xFFFFFFFF; - var black = (IsLittleEndianCached.value || - !HasCanvasTypedArraysCached.value) ? 0xFF000000 : 0x000000FF; - for (i = 0; i < totalChunks; i++) { - thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - destPos = 0; - for (j = 0; j < thisChunkHeight; j++) { - var srcDiff = srcLength - srcPos; - var k = 0; - var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7; - var kEndUnrolled = kEnd & ~7; - var mask = 0; - var srcByte = 0; - for (; k < kEndUnrolled; k += 8) { - srcByte = src[srcPos++]; - dest32[destPos++] = (srcByte & 128) ? white : black; - dest32[destPos++] = (srcByte & 64) ? white : black; - dest32[destPos++] = (srcByte & 32) ? white : black; - dest32[destPos++] = (srcByte & 16) ? white : black; - dest32[destPos++] = (srcByte & 8) ? white : black; - dest32[destPos++] = (srcByte & 4) ? white : black; - dest32[destPos++] = (srcByte & 2) ? white : black; - dest32[destPos++] = (srcByte & 1) ? white : black; - } - for (; k < kEnd; k++) { - if (mask === 0) { - srcByte = src[srcPos++]; - mask = 128; - } - - dest32[destPos++] = (srcByte & mask) ? white : black; - mask >>= 1; - } - } - // We ran out of input. Make all remaining pixels transparent. - while (destPos < dest32DataLength) { - dest32[destPos++] = 0; - } - - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else if (imgData.kind === ImageKind.RGBA_32BPP) { - // RGBA, 32-bits per pixel. - - j = 0; - elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; - for (i = 0; i < fullChunks; i++) { - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - srcPos += elemsInThisChunk; - - ctx.putImageData(chunkImgData, 0, j); - j += FULL_CHUNK_HEIGHT; - } - if (i < totalChunks) { - elemsInThisChunk = width * partialChunkHeight * 4; - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - ctx.putImageData(chunkImgData, 0, j); - } - - } else if (imgData.kind === ImageKind.RGB_24BPP) { - // RGB, 24-bits per pixel. - thisChunkHeight = FULL_CHUNK_HEIGHT; - elemsInThisChunk = width * thisChunkHeight; - for (i = 0; i < totalChunks; i++) { - if (i >= fullChunks) { - thisChunkHeight = partialChunkHeight; - elemsInThisChunk = width * thisChunkHeight; - } - - destPos = 0; - for (j = elemsInThisChunk; j--;) { - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = 255; - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else { - error('bad image kind: ' + imgData.kind); - } - } - - function putBinaryImageMask(ctx, imgData) { - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0; - var src = imgData.data; - var dest = chunkImgData.data; - - for (var i = 0; i < totalChunks; i++) { - var thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - - // Expand the mask so it can be used by the canvas. Any required - // inversion has already been handled. - var destPos = 3; // alpha component offset - for (var j = 0; j < thisChunkHeight; j++) { - var mask = 0; - for (var k = 0; k < width; k++) { - if (!mask) { - var elem = src[srcPos++]; - mask = 128; - } - dest[destPos] = (elem & mask) ? 0 : 255; - destPos += 4; - mask >>= 1; - } - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } - - 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 (sourceCtx[property] !== undefined) { - destCtx[property] = sourceCtx[property]; - } - } - if (sourceCtx.setLineDash !== undefined) { - destCtx.setLineDash(sourceCtx.getLineDash()); - destCtx.lineDashOffset = sourceCtx.lineDashOffset; - } - } - - function composeSMaskBackdrop(bytes, r0, g0, b0) { - var length = bytes.length; - for (var i = 3; i < length; i += 4) { - var alpha = bytes[i]; - if (alpha === 0) { - bytes[i - 3] = r0; - bytes[i - 2] = g0; - bytes[i - 1] = b0; - } else if (alpha < 255) { - var alpha_ = 255 - alpha; - bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8; - bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8; - bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8; - } - } - } - - function composeSMaskAlpha(maskData, layerData, transferMap) { - var length = maskData.length; - var scale = 1 / 255; - for (var i = 3; i < length; i += 4) { - var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; - layerData[i] = (layerData[i] * alpha * scale) | 0; - } - } - - function composeSMaskLuminosity(maskData, layerData, transferMap) { - var length = maskData.length; - for (var i = 3; i < length; i += 4) { - var y = (maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000 - (maskData[i - 2] * 152) + // * 0.59 .... - (maskData[i - 1] * 28); // * 0.11 .... - layerData[i] = transferMap ? - (layerData[i] * transferMap[y >> 8]) >> 8 : - (layerData[i] * y) >> 16; - } - } - - function genericComposeSMask(maskCtx, layerCtx, width, height, - subtype, backdrop, transferMap) { - var hasBackdrop = !!backdrop; - var r0 = hasBackdrop ? backdrop[0] : 0; - var g0 = hasBackdrop ? backdrop[1] : 0; - var b0 = hasBackdrop ? backdrop[2] : 0; - - var composeFn; - if (subtype === 'Luminosity') { - composeFn = composeSMaskLuminosity; - } else { - composeFn = composeSMaskAlpha; - } - - // processing image in chunks to save memory - var PIXELS_TO_PROCESS = 1048576; - var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (var row = 0; row < height; row += chunkSize) { - var chunkHeight = Math.min(chunkSize, height - row); - var maskData = maskCtx.getImageData(0, row, width, chunkHeight); - var layerData = layerCtx.getImageData(0, row, width, chunkHeight); - - if (hasBackdrop) { - composeSMaskBackdrop(maskData.data, r0, g0, b0); - } - composeFn(maskData.data, layerData.data, transferMap); - - maskCtx.putImageData(layerData, 0, row); - } - } - - function composeSMask(ctx, smask, layerCtx) { - var mask = smask.canvas; - var maskCtx = smask.context; - - ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, - smask.offsetX, smask.offsetY); - - var backdrop = smask.backdrop || null; - if (!smask.transferMap && WebGLUtils.isEnabled) { - var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask, - {subtype: smask.subtype, backdrop: backdrop}); - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(composed, smask.offsetX, smask.offsetY); - return; - } - genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, - smask.subtype, backdrop, smask.transferMap); - ctx.drawImage(mask, 0, 0); - } - - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; - - CanvasGraphics.prototype = { - - beginDrawing: function CanvasGraphics_beginDrawing(transform, 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, creating temporary - // transparent canvas when we have blend modes. - var width = this.ctx.canvas.width; - var height = this.ctx.canvas.height; - - this.ctx.save(); - this.ctx.fillStyle = 'rgb(255, 255, 255)'; - this.ctx.fillRect(0, 0, width, height); - this.ctx.restore(); - - if (transparency) { - var transparentCanvas = this.cachedCanvases.getCanvas( - 'transparent', width, height, true); - this.compositeCtx = this.ctx; - this.transparentCanvas = transparentCanvas.canvas; - this.ctx = transparentCanvas.context; - this.ctx.save(); - // The transform can be applied before rendering, transferring it to - // the new canvas. - this.ctx.transform.apply(this.ctx, - this.compositeCtx.mozCurrentTransform); - } - - this.ctx.save(); - if (transform) { - this.ctx.transform.apply(this.ctx, transform); - } - this.ctx.transform.apply(this.ctx, viewport.transform); - - this.baseTransform = this.ctx.mozCurrentTransform.slice(); - - 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 chunkOperations = (argsArrayLen - i > EXECUTION_STEPS && - typeof continueCallback === 'function'); - var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; - var steps = 0; - - var commonObjs = this.commonObjs; - var objs = this.objs; - var fnId; - - while (true) { - if (stepper !== undefined && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - - fnId = fnArray[i]; - - if (fnId !== OPS.dependency) { - this[fnId].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[0] === 'g' && depObjId[1] === '_'; - var objsPool = common ? commonObjs : objs; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objsPool.isResolved(depObjId)) { - objsPool.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 and - // `continueCallback` is specified, interrupt the execution. - if (chunkOperations && ++steps > EXECUTION_STEPS) { - if (Date.now() > endTime) { - continueCallback(); - return i; - } - steps = 0; - } - - // If the operatorList isn't executed completely yet OR the execution - // time was short enough, do another execution round. - } - }, - - endDrawing: function CanvasGraphics_endDrawing() { - // Finishing all opened operations such as SMask group painting. - if (this.current.activeSMask !== null) { - this.endSMaskGroup(); - } - - this.ctx.restore(); - - if (this.transparentCanvas) { - this.ctx = this.compositeCtx; - this.ctx.save(); - this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice - this.ctx.drawImage(this.transparentCanvas, 0, 0); - this.ctx.restore(); - this.transparentCanvas = null; - } - - this.cachedCanvases.clear(); - WebGLUtils.clear(); - - 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 (ctx.setLineDash !== undefined) { - ctx.setLineDash(dashArray); - ctx.lineDashOffset = 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; - case 'SMask': - if (this.current.activeSMask) { - // If SMask is currrenly used, it needs to be suspended or - // finished. Suspend only makes sense when at least one save() - // was performed and state needs to be reverted on restore(). - if (this.stateStack.length > 0 && - (this.stateStack[this.stateStack.length - 1].activeSMask === - this.current.activeSMask)) { - this.suspendSMaskGroup(); - } else { - this.endSMaskGroup(); - } - } - this.current.activeSMask = value ? this.tempSMask : null; - if (this.current.activeSMask) { - this.beginSMaskGroup(); - } - this.tempSMask = null; - break; - } - } - }, - beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { - - var activeSMask = this.current.activeSMask; - var drawnWidth = activeSMask.canvas.width; - var drawnHeight = activeSMask.canvas.height; - var cacheId = 'smaskGroupAt' + this.groupLevel; - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - - var currentCtx = this.ctx; - var currentTransform = currentCtx.mozCurrentTransform; - this.ctx.save(); - - var groupCtx = scratchCanvas.context; - groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); - groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse; - - copyCtxState(currentCtx, groupCtx); - this.ctx = groupCtx; - this.setGState([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() { - // Similar to endSMaskGroup, the intermediate canvas has to be composed - // and future ctx state restored. - var groupCtx = this.ctx; - this.groupLevel--; - this.ctx = this.groupStack.pop(); - - composeSMask(this.ctx, this.current.activeSMask, groupCtx); - this.ctx.restore(); - this.ctx.save(); // save is needed since SMask will be resumed. - copyCtxState(groupCtx, this.ctx); - - // Saving state for resuming. - this.current.resumeSMaskCtx = groupCtx; - // Transform was changed in the SMask canvas, reflecting this change on - // this.ctx. - var deltaTransform = Util.transform( - this.current.activeSMask.startTransformInverse, - groupCtx.mozCurrentTransform); - this.ctx.transform.apply(this.ctx, deltaTransform); - - // SMask was composed, the results at the groupCtx can be cleared. - groupCtx.save(); - groupCtx.setTransform(1, 0, 0, 1, 0, 0); - groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height); - groupCtx.restore(); - }, - resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() { - // Resuming state saved by suspendSMaskGroup. We don't need to restore - // any groupCtx state since restore() command (the only caller) will do - // that for us. See also beginSMaskGroup. - var groupCtx = this.current.resumeSMaskCtx; - var currentCtx = this.ctx; - this.ctx = groupCtx; - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - endSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.ctx; - this.groupLevel--; - this.ctx = this.groupStack.pop(); - - composeSMask(this.ctx, this.current.activeSMask, groupCtx); - this.ctx.restore(); - copyCtxState(groupCtx, this.ctx); - // Transform was changed in the SMask canvas, reflecting this change on - // this.ctx. - var deltaTransform = Util.transform( - this.current.activeSMask.startTransformInverse, - groupCtx.mozCurrentTransform); - this.ctx.transform.apply(this.ctx, deltaTransform); - }, - save: function CanvasGraphics_save() { - this.ctx.save(); - var old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - this.current.resumeSMaskCtx = null; - }, - restore: function CanvasGraphics_restore() { - // SMask was suspended, we just need to resume it. - if (this.current.resumeSMaskCtx) { - this.resumeSMaskGroup(); - } - // SMask has to be finished once there is no states that are using the - // same SMask. - if (this.current.activeSMask !== null && (this.stateStack.length === 0 || - this.stateStack[this.stateStack.length - 1].activeSMask !== - this.current.activeSMask)) { - this.endSMaskGroup(); - } - - if (this.stateStack.length !== 0) { - this.current = this.stateStack.pop(); - this.ctx.restore(); - - // Ensure that the clipping path is reset (fixes issue6413.pdf). - this.pendingClip = null; - - this.cachedGetSinglePixelWidth = null; - } - }, - transform: function CanvasGraphics_transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - - this.cachedGetSinglePixelWidth = null; - }, - - // Path - constructPath: function CanvasGraphics_constructPath(ops, args) { - var ctx = this.ctx; - var current = this.current; - var x = current.x, y = current.y; - for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - if (width === 0) { - width = this.getSinglePixelWidth(); - } - if (height === 0) { - height = this.getSinglePixelWidth(); - } - var xw = x + width; - var yh = y + height; - this.ctx.moveTo(x, y); - this.ctx.lineTo(xw, y); - this.ctx.lineTo(xw, yh); - this.ctx.lineTo(x, yh); - this.ctx.lineTo(x, y); - this.ctx.closePath(); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - ctx.moveTo(x, y); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - ctx.lineTo(x, y); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], - x, y); - j += 6; - break; - case OPS.curveTo2: - ctx.bezierCurveTo(x, y, args[j], args[j + 1], - args[j + 2], args[j + 3]); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); - j += 4; - break; - case OPS.closePath: - ctx.closePath(); - break; - } - } - current.setCurrentPoint(x, y); - }, - closePath: function CanvasGraphics_closePath() { - this.ctx.closePath(); - }, - stroke: function CanvasGraphics_stroke(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; - // Prevent drawing too thin lines by enforcing a minimum line width. - ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, - this.current.lineWidth); - // 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, this); - 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 isPatternFill = this.current.patternFill; - var needRestore = false; - - if (isPatternFill) { - ctx.save(); - if (this.baseTransform) { - ctx.setTransform.apply(ctx, this.baseTransform); - } - ctx.fillStyle = fillColor.getPattern(ctx, this); - needRestore = true; - } - - if (this.pendingEOFill) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.fill(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.fill('evenodd'); - } - this.pendingEOFill = false; - } else { - 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.textMatrixScale = 1; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - endText: function CanvasGraphics_endText() { - var paths = this.pendingTextPaths; - var ctx = this.ctx; - if (paths === undefined) { - ctx.beginPath(); - return; - } - - 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.isType3Font) { - return; // we don't need ctx.font for Type3 fonts - } - - var name = fontObj.loadedName || 'sans-serif'; - var bold = fontObj.black ? (fontObj.bold ? '900' : '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 ? MIN_FONT_SIZE : - size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size; - this.current.fontSizeScale = size / browserFontSize; - - 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.textMatrixScale = Math.sqrt(a * a + b * b); - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - nextLine: function CanvasGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - paintChar: function CanvasGraphics_paintChar(character, x, y) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var textRenderingMode = current.textRenderingMode; - var fontSize = current.fontSize / current.fontSizeScale; - var fillStrokeMode = textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - var isAddToPathSet = !!(textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - - var addToPath; - if (font.disableFontFace || isAddToPathSet) { - addToPath = font.getPathGenerator(this.commonObjs, 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 - }); - } - }, - - get isFontSubpixelAAEnabled() { - // Checks if anti-aliasing is enabled when scaled text is painted. - // On Windows GDI scaled fonts looks bad. - var ctx = document.createElement('canvas').getContext('2d'); - ctx.scale(1.5, 1); - ctx.fillText('I', 0, 10); - var data = ctx.getImageData(0, 0, 10, 10).data; - var enabled = false; - for (var i = 3; i < data.length; i += 4) { - if (data[i] > 0 && data[i] < 255) { - enabled = true; - break; - } - } - return shadow(this, 'isFontSubpixelAAEnabled', enabled); - }, - - showText: function CanvasGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - if (font.isType3Font) { - return this.showType3Text(glyphs); - } - - var fontSize = current.fontSize; - if (fontSize === 0) { - return; - } - - var ctx = this.ctx; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var spacingDir = vertical ? 1 : -1; - var defaultVMetrics = font.defaultVMetrics; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var simpleFillText = - current.textRenderingMode === TextRenderingMode.FILL && - !font.disableFontFace; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - - if (current.patternFill) { - // TODO: Some shading patterns are not applied correctly to text, - // e.g. issues 3988 and 5432, and ShowText-ShadingPattern.pdf. - ctx.fillStyle = current.fillColor.getPattern(ctx, this); - } - - if (fontDirection > 0) { - ctx.scale(textHScale, -1); - } else { - ctx.scale(textHScale, 1); - } - - var lineWidth = current.lineWidth; - var scale = current.textMatrixScale; - if (scale === 0 || lineWidth === 0) { - var fillStrokeMode = current.textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - this.cachedGetSinglePixelWidth = null; - lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; - } - } else { - lineWidth /= scale; - } - - if (fontSizeScale !== 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - - ctx.lineWidth = lineWidth; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (isNum(glyph)) { - x += spacingDir * glyph * fontSize / 1000; - continue; - } - - var restoreNeeded = false; - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var character = glyph.fontChar; - var accent = glyph.accent; - var scaledX, scaledY, scaledAccentX, scaledAccentY; - var width = glyph.width; - if (vertical) { - var vmetric, vx, vy; - vmetric = glyph.vmetric || defaultVMetrics; - vx = glyph.vmetric ? vmetric[1] : width * 0.5; - vx = -vx * widthAdvanceScale; - vy = vmetric[2] * widthAdvanceScale; - - width = vmetric ? -vmetric[0] : width; - 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: rescale per - // character if measured width is greater than expected glyph width - // and subpixel-aa is enabled, otherwise just center the glyph. - var measuredWidth = ctx.measureText(character).width * 1000 / - fontSize * fontSizeScale; - if (width < measuredWidth && this.isFontSubpixelAAEnabled) { - var characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - } else if (width !== measuredWidth) { - scaledX += (width - measuredWidth) / 2000 * - fontSize / fontSizeScale; - } - } - - // Only attempt to draw the glyph if it is actually in the embedded font - // file or if there isn't a font file so the fallback font is shown. - if (glyph.isInFont || font.missingFile) { - if (simpleFillText && !accent) { - // common case - ctx.fillText(character, scaledX, scaledY); - } else { - 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); - } - } - } - - var charWidth = width * widthAdvanceScale + spacing * fontDirection; - x += charWidth; - - if (restoreNeeded) { - ctx.restore(); - } - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - ctx.restore(); - }, - - showType3Text: function CanvasGraphics_showType3Text(glyphs) { - // Type3 fonts - each glyph is a "mini-PDF" - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var fontDirection = current.fontDirection; - var spacingDir = font.vertical ? 1 : -1; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * fontDirection; - var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; - var glyphsLength = glyphs.length; - var isTextInvisible = - current.textRenderingMode === TextRenderingMode.INVISIBLE; - var i, glyph, width, spacingLength; - - if (isTextInvisible || fontSize === 0) { - return; - } - this.cachedGetSinglePixelWidth = null; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); - - ctx.scale(textHScale, fontDirection); - - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (isNum(glyph)) { - spacingLength = spacingDir * glyph * fontSize / 1000; - this.ctx.translate(spacingLength, 0); - current.x += spacingLength * textHScale; - continue; - } - - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var operatorList = font.charProcOperatorList[glyph.operatorListId]; - if (!operatorList) { - warn('Type3 character \"' + glyph.operatorListId + - '\" is not available'); - continue; - } - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - this.executeOperatorList(operatorList); - this.restore(); - - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + spacing; - - ctx.translate(width, 0); - current.x += width * textHScale; - } - ctx.restore(); - this.processingType3 = null; - }, - - // 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.ctx.rect(llx, lly, urx - llx, ury - lly); - this.clip(); - this.endPath(); - }, - - // Color - getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { - var pattern; - if (IR[0] === 'TilingPattern') { - var color = IR[1]; - var baseTransform = this.baseTransform || - this.ctx.mozCurrentTransform.slice(); - var self = this; - var canvasGraphicsFactory = { - createCanvasGraphics: function (ctx) { - return new CanvasGraphics(ctx, self.commonObjs, self.objs); - } - }; - pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, - baseTransform); - } else { - pattern = getShadingPatternFromIR(IR); - } - return pattern; - }, - setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { - this.current.strokeColor = this.getColorN_Pattern(arguments); - }, - setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { - this.current.fillColor = this.getColorN_Pattern(arguments); - this.current.patternFill = true; - }, - setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - this.current.patternFill = false; - }, - - shadingFill: function CanvasGraphics_shadingFill(patternIR) { - var ctx = this.ctx; - - this.save(); - var pattern = getShadingPatternFromIR(patternIR); - ctx.fillStyle = pattern.getPattern(ctx, this, true); - - 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); - } 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.baseTransformStack.push(this.baseTransform); - - if (isArray(matrix) && 6 === matrix.length) { - this.transform.apply(this, matrix); - } - - this.baseTransform = this.ctx.mozCurrentTransform; - - if (isArray(bbox) && 4 === bbox.length) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - this.ctx.rect(bbox[0], bbox[1], width, height); - this.clip(); - this.endPath(); - } - }, - - paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { - this.restore(); - 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 implementing: - // - 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) { - warn('Knockout groups not supported.'); - } - - 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); - // Clip the bounding box to the current canvas. - var canvasBounds = [0, - 0, - currentCtx.canvas.width, - currentCtx.canvas.height]; - bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; - // 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 offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - var scaleX = 1, scaleY = 1; - if (drawnWidth > MAX_GROUP_SIZE) { - scaleX = drawnWidth / MAX_GROUP_SIZE; - drawnWidth = MAX_GROUP_SIZE; - } - if (drawnHeight > MAX_GROUP_SIZE) { - scaleY = drawnHeight / MAX_GROUP_SIZE; - drawnHeight = MAX_GROUP_SIZE; - } - - var cacheId = 'groupAt' + this.groupLevel; - if (group.smask) { - // Using two cache entries is case if masks are used one after another. - cacheId += '_smask_' + ((this.smaskCounter++) % 2); - } - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - var groupCtx = scratchCanvas.context; - - // Since we created a new canvas that is just the size of the bounding box - // we have to translate the group ctx. - groupCtx.scale(1 / scaleX, 1 / scaleY); - groupCtx.translate(-offsetX, -offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - if (group.smask) { - // Saving state and cached mask to be used in setGState. - this.smaskStack.push({ - canvas: scratchCanvas.canvas, - context: groupCtx, - offsetX: offsetX, - offsetY: offsetY, - scaleX: scaleX, - scaleY: scaleY, - subtype: group.smask.subtype, - backdrop: group.smask.backdrop, - transferMap: group.smask.transferMap || null, - startTransformInverse: null, // used during suspend operation - }); - } else { - // Setup the current ctx so when the group is popped we draw it at the - // right location. - currentCtx.setTransform(1, 0, 0, 1, 0, 0); - currentCtx.translate(offsetX, offsetY); - currentCtx.scale(scaleX, scaleY); - } - // 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([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - - // Reseting mask state, masks will be applied on restore of the group. - this.current.activeSMask = null; - }, - - endGroup: function CanvasGraphics_endGroup(group) { - this.groupLevel--; - 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 (this.ctx.imageSmoothingEnabled !== undefined) { - this.ctx.imageSmoothingEnabled = false; - } else { - this.ctx.mozImageSmoothingEnabled = false; - } - if (group.smask) { - this.tempSMask = this.smaskStack.pop(); - } else { - this.ctx.drawImage(groupCtx.canvas, 0, 0); - } - this.restore(); - }, - - beginAnnotations: function CanvasGraphics_beginAnnotations() { - this.save(); - this.current = new CanvasExtraState(); - - if (this.baseTransform) { - this.ctx.setTransform.apply(this.ctx, this.baseTransform); - } - }, - - endAnnotations: function CanvasGraphics_endAnnotations() { - this.restore(); - }, - - beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, - matrix) { - this.save(); - - if (isArray(rect) && 4 === rect.length) { - var width = rect[2] - rect[0]; - var height = rect[3] - rect[1]; - this.ctx.rect(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) { - warn('Dependent image isn\'t ready yet'); - return; - } - - 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 fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var glyph = this.processingType3; - - if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { - 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 = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, img); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - this.paintInlineImageXObject(maskCanvas.canvas); - }, - - paintImageMaskXObjectRepeat: - function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, - scaleY, positions) { - var width = imgData.width; - var height = imgData.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, imgData); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - var ctx = this.ctx; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - ctx.save(); - ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageMaskXObjectGroup: - function CanvasGraphics_paintImageMaskXObjectGroup(images) { - var ctx = this.ctx; - - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - for (var i = 0, ii = images.length; i < ii; i++) { - var image = images[i]; - var width = image.width, height = image.height; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, image); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - ctx.save(); - ctx.transform.apply(ctx, image.transform); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - this.paintInlineImageXObject(imgData); - }, - - paintImageXObjectRepeat: - function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, - positions) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - var width = imgData.width; - var height = imgData.height; - var map = []; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - map.push({transform: [scaleX, 0, 0, scaleY, positions[i], - positions[i + 1]], x: 0, y: 0, w: width, h: height}); - } - this.paintInlineImageXObjectGroup(imgData, map); - }, - - 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, tmpCanvas; - // instanceof HTMLElement does not work in jsdom node.js module - if (imgData instanceof HTMLElement || !imgData.data) { - imgToPaint = imgData; - } else { - tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', - width, height); - var tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - imgToPaint = tmpCanvas.canvas; - } - - 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; - } - tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, - newWidth, newHeight); - tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, newWidth, newHeight); - tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, - 0, 0, newWidth, newHeight); - imgToPaint = tmpCanvas.canvas; - 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 = this.cachedCanvases.getCanvas('inlineImage', w, h); - var tmpCtx = tmpCanvas.context; - 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.canvas, 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(); - } - }, - - paintSolidColorImageMask: - function CanvasGraphics_paintSolidColorImageMask() { - this.ctx.fillRect(0, 0, 1, 1); - }, - - paintXObject: function CanvasGraphics_paintXObject() { - warn('Unsupported \'paintXObject\' command.'); - }, - - // 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() { - var ctx = this.ctx; - if (this.pendingClip) { - if (this.pendingClip === EO_CLIP) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.clip(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.clip('evenodd'); - } - } else { - ctx.clip(); - } - this.pendingClip = null; - } - ctx.beginPath(); - }, - getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { - if (this.cachedGetSinglePixelWidth === null) { - // NOTE: The `save` and `restore` commands used below is a workaround - // that is necessary in order to prevent `mozCurrentTransformInverse` - // from intermittently returning incorrect values in Firefox, see: - // https://github.com/mozilla/pdf.js/issues/7188. - this.ctx.save(); - var inverse = this.ctx.mozCurrentTransformInverse; - this.ctx.restore(); - // max of the current horizontal and vertical scale - this.cachedGetSinglePixelWidth = Math.sqrt(Math.max( - (inverse[0] * inverse[0] + inverse[1] * inverse[1]), - (inverse[2] * inverse[2] + inverse[3] * inverse[3]))); - } - return this.cachedGetSinglePixelWidth; - }, - 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] - ]; - } - }; - - for (var op in OPS) { - CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; - } - - return CanvasGraphics; -})(); - -exports.CanvasGraphics = CanvasGraphics; -exports.createScratchCanvas = createScratchCanvas; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas, - root.pdfjsDisplayMetadata, root.pdfjsDisplayDOMUtils); - } -}(this, function (exports, sharedUtil, displayFontLoader, displayCanvas, - displayMetadata, displayDOMUtils, amdRequire) { - -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MessageHandler = sharedUtil.MessageHandler; -var MissingPDFException = sharedUtil.MissingPDFException; -var PageViewport = sharedUtil.PageViewport; -var PasswordResponses = sharedUtil.PasswordResponses; -var PasswordException = sharedUtil.PasswordException; -var StatTimer = sharedUtil.StatTimer; -var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; -var UnknownErrorException = sharedUtil.UnknownErrorException; -var Util = sharedUtil.Util; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var deprecated = sharedUtil.deprecated; -var getVerbosityLevel = sharedUtil.getVerbosityLevel; -var info = sharedUtil.info; -var isInt = sharedUtil.isInt; -var isArray = sharedUtil.isArray; -var isArrayBuffer = sharedUtil.isArrayBuffer; -var isSameOrigin = sharedUtil.isSameOrigin; -var loadJpegStream = sharedUtil.loadJpegStream; -var stringToBytes = sharedUtil.stringToBytes; -var globalScope = sharedUtil.globalScope; -var warn = sharedUtil.warn; -var FontFaceObject = displayFontLoader.FontFaceObject; -var FontLoader = displayFontLoader.FontLoader; -var CanvasGraphics = displayCanvas.CanvasGraphics; -var createScratchCanvas = displayCanvas.createScratchCanvas; -var Metadata = displayMetadata.Metadata; -var getDefaultSetting = displayDOMUtils.getDefaultSetting; - -var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 - -var isWorkerDisabled = false; -var workerSrc; -var isPostMessageTransfersDisabled = false; - - -var useRequireEnsure = false; -if (typeof window === 'undefined') { - // node.js - disable worker and set require.ensure. - isWorkerDisabled = true; - if (typeof require.ensure === 'undefined') { - require.ensure = require('node-ensure'); - } - useRequireEnsure = true; -} -if (typeof __webpack_require__ !== 'undefined') { - useRequireEnsure = true; -} -if (typeof requirejs !== 'undefined' && requirejs.toUrl) { - workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); -} -var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load; -var fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) { - require.ensure([], function () { - var worker = require('./pdf.worker.js'); - callback(worker.WorkerMessageHandler); - }); -}) : dynamicLoaderSupported ? (function (callback) { - requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) { - callback(worker.WorkerMessageHandler); - }); -}) : null; - - -/** - * Document initialization / loading parameters object. - * - * @typedef {Object} DocumentInitParameters - * @property {string} url - The URL of the PDF. - * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays - * (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded, - * use atob() to convert it to a binary string first. - * @property {Object} httpHeaders - Basic authentication headers. - * @property {boolean} withCredentials - Indicates whether or not cross-site - * Access-Control requests should be made using credentials such as cookies - * or authorization headers. The default is false. - * @property {string} password - For decrypting password-protected PDFs. - * @property {TypedArray} initialData - A typed array with the first portion or - * all of the pdf data. Used by the extension since some data is already - * loaded before the switch to range requests. - * @property {number} length - The PDF file length. It's used for progress - * reports and range requests operations. - * @property {PDFDataRangeTransport} range - * @property {number} rangeChunkSize - Optional parameter to specify - * maximum number of bytes fetched per range request. The default value is - * 2^16 = 65536. - * @property {PDFWorker} worker - The worker that will be used for the loading - * and parsing of the PDF data. - */ - -/** - * @typedef {Object} PDFDocumentStats - * @property {Array} streamTypes - Used stream types in the document (an item - * is set to true if specific stream ID was used in the document). - * @property {Array} fontTypes - Used font type in the document (an item is set - * to true if specific font ID was used in the document). - */ - -/** - * 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|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src - * Can be a url to where a PDF is located, a typed array (Uint8Array) - * already populated with data or parameter object. - * - * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used - * if you want to manually serve range requests for data in the PDF. - * - * @param {function} passwordCallback (deprecated) 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}). - * - * @param {function} progressCallback (deprecated) It is used to be able to - * monitor the loading progress of the PDF file (necessary to implement e.g. - * a loading bar). The callback receives an {Object} with the properties: - * {number} loaded and {number} total. - * - * @return {PDFDocumentLoadingTask} - */ -function getDocument(src, pdfDataRangeTransport, - passwordCallback, progressCallback) { - var task = new PDFDocumentLoadingTask(); - - // Support of the obsolete arguments (for compatibility with API v1.0) - if (arguments.length > 1) { - deprecated('getDocument is called with pdfDataRangeTransport, ' + - 'passwordCallback or progressCallback argument'); - } - if (pdfDataRangeTransport) { - if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) { - // Not a PDFDataRangeTransport instance, trying to add missing properties. - pdfDataRangeTransport = Object.create(pdfDataRangeTransport); - pdfDataRangeTransport.length = src.length; - pdfDataRangeTransport.initialData = src.initialData; - if (!pdfDataRangeTransport.abort) { - pdfDataRangeTransport.abort = function () {}; - } - } - src = Object.create(src); - src.range = pdfDataRangeTransport; - } - task.onPassword = passwordCallback || null; - task.onProgress = progressCallback || null; - - var source; - if (typeof src === 'string') { - source = { url: src }; - } else if (isArrayBuffer(src)) { - source = { data: src }; - } else if (src instanceof PDFDataRangeTransport) { - source = { range: src }; - } else { - if (typeof src !== 'object') { - error('Invalid parameter in getDocument, need either Uint8Array, ' + - 'string or a parameter object'); - } - if (!src.url && !src.data && !src.range) { - error('Invalid parameter object: need either .data, .range or .url'); - } - - source = src; - } - - var params = {}; - var rangeTransport = null; - var worker = null; - for (var key in source) { - if (key === 'url' && typeof window !== 'undefined') { - // The full path is required in the 'url' field. - params[key] = new URL(source[key], window.location).href; - continue; - } else if (key === 'range') { - rangeTransport = source[key]; - continue; - } else if (key === 'worker') { - worker = source[key]; - continue; - } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { - // Converting string or array-like data to Uint8Array. - var pdfBytes = source[key]; - if (typeof pdfBytes === 'string') { - params[key] = stringToBytes(pdfBytes); - } else if (typeof pdfBytes === 'object' && pdfBytes !== null && - !isNaN(pdfBytes.length)) { - params[key] = new Uint8Array(pdfBytes); - } else if (isArrayBuffer(pdfBytes)) { - params[key] = new Uint8Array(pdfBytes); - } else { - error('Invalid PDF binary data: either typed array, string or ' + - 'array-like object is expected in the data property.'); - } - continue; - } - params[key] = source[key]; - } - - params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - - if (!worker) { - // Worker was not provided -- creating and owning our own. - worker = new PDFWorker(); - task._worker = worker; - } - var docId = task.docId; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - return _fetchDocument(worker, params, rangeTransport, docId).then( - function (workerId) { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - var messageHandler = new MessageHandler(docId, workerId, worker.port); - var transport = new WorkerTransport(messageHandler, task, rangeTransport); - task._transport = transport; - messageHandler.send('Ready', null); - }); - }).catch(task._capability.reject); - - return task; -} - -/** - * Starts fetching of specified PDF document/data. - * @param {PDFWorker} worker - * @param {Object} source - * @param {PDFDataRangeTransport} pdfDataRangeTransport - * @param {string} docId Unique document id, used as MessageHandler id. - * @returns {Promise} The promise, which is resolved when worker id of - * MessageHandler is known. - * @private - */ -function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { - if (worker.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); - } - - source.disableAutoFetch = getDefaultSetting('disableAutoFetch'); - source.disableStream = getDefaultSetting('disableStream'); - source.chunkedViewerLoading = !!pdfDataRangeTransport; - if (pdfDataRangeTransport) { - source.length = pdfDataRangeTransport.length; - source.initialData = pdfDataRangeTransport.initialData; - } - return worker.messageHandler.sendWithPromise('GetDocRequest', { - docId: docId, - source: source, - disableRange: getDefaultSetting('disableRange'), - maxImageSize: getDefaultSetting('maxImageSize'), - cMapUrl: getDefaultSetting('cMapUrl'), - cMapPacked: getDefaultSetting('cMapPacked'), - disableFontFace: getDefaultSetting('disableFontFace'), - disableCreateObjectURL: getDefaultSetting('disableCreateObjectURL'), - postMessageTransfers: getDefaultSetting('postMessageTransfers') && - !isPostMessageTransfersDisabled, - }).then(function (workerId) { - if (worker.destroyed) { - throw new Error('Worker was destroyed'); - } - return workerId; - }); -} - -/** - * PDF document loading operation. - * @class - * @alias PDFDocumentLoadingTask - */ -var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { - var nextDocumentId = 0; - - /** @constructs PDFDocumentLoadingTask */ - function PDFDocumentLoadingTask() { - this._capability = createPromiseCapability(); - this._transport = null; - this._worker = null; - - /** - * Unique document loading task id -- used in MessageHandlers. - * @type {string} - */ - this.docId = 'd' + (nextDocumentId++); - - /** - * Shows if loading task is destroyed. - * @type {boolean} - */ - this.destroyed = false; - - /** - * Callback 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}). - */ - this.onPassword = null; - - /** - * Callback to be able to monitor the loading progress of the PDF file - * (necessary to implement e.g. a loading bar). The callback receives - * an {Object} with the properties: {number} loaded and {number} total. - */ - this.onProgress = null; - - /** - * Callback to when unsupported feature is used. The callback receives - * an {UNSUPPORTED_FEATURES} argument. - */ - this.onUnsupportedFeature = null; - } - - PDFDocumentLoadingTask.prototype = - /** @lends PDFDocumentLoadingTask.prototype */ { - /** - * @return {Promise} - */ - get promise() { - return this._capability.promise; - }, - - /** - * Aborts all network requests and destroys worker. - * @return {Promise} A promise that is resolved after destruction activity - * is completed. - */ - destroy: function () { - this.destroyed = true; - - var transportDestroyed = !this._transport ? Promise.resolve() : - this._transport.destroy(); - return transportDestroyed.then(function () { - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - }.bind(this)); - }, - - /** - * Registers callbacks to indicate the document loading completion. - * - * @param {function} onFulfilled The callback for the loading completion. - * @param {function} onRejected The callback for the loading failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return PDFDocumentLoadingTask; -})(); - -/** - * Abstract class to support range requests file loading. - * @class - * @alias PDFDataRangeTransport - * @param {number} length - * @param {Uint8Array} initialData - */ -var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() { - function PDFDataRangeTransport(length, initialData) { - this.length = length; - this.initialData = initialData; - - this._rangeListeners = []; - this._progressListeners = []; - this._progressiveReadListeners = []; - this._readyCapability = createPromiseCapability(); - } - PDFDataRangeTransport.prototype = - /** @lends PDFDataRangeTransport.prototype */ { - addRangeListener: - function PDFDataRangeTransport_addRangeListener(listener) { - this._rangeListeners.push(listener); - }, - - addProgressListener: - function PDFDataRangeTransport_addProgressListener(listener) { - this._progressListeners.push(listener); - }, - - addProgressiveReadListener: - function PDFDataRangeTransport_addProgressiveReadListener(listener) { - this._progressiveReadListeners.push(listener); - }, - - onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) { - var listeners = this._rangeListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](begin, chunk); - } - }, - - onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) { - this._readyCapability.promise.then(function () { - var listeners = this._progressListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](loaded); - } - }.bind(this)); - }, - - onDataProgressiveRead: - function PDFDataRangeTransport_onDataProgress(chunk) { - this._readyCapability.promise.then(function () { - var listeners = this._progressiveReadListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](chunk); - } - }.bind(this)); - }, - - transportReady: function PDFDataRangeTransport_transportReady() { - this._readyCapability.resolve(); - }, - - requestDataRange: - function PDFDataRangeTransport_requestDataRange(begin, end) { - throw new Error('Abstract method PDFDataRangeTransport.requestDataRange'); - }, - - abort: function PDFDataRangeTransport_abort() { - } - }; - return PDFDataRangeTransport; -})(); - -/** - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used - * properties that can be read synchronously. - * @class - * @alias PDFDocumentProxy - */ -var PDFDocumentProxy = (function PDFDocumentProxyClosure() { - function PDFDocumentProxy(pdfInfo, transport, loadingTask) { - this.pdfInfo = pdfInfo; - this.transport = transport; - this.loadingTask = loadingTask; - } - PDFDocumentProxy.prototype = /** @lends 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; - }, - /** - * @param {number} pageNumber The page number to get. The first page is 1. - * @return {Promise} A promise that is resolved with a {@link PDFPageProxy} - * object. - */ - getPage: function PDFDocumentProxy_getPage(pageNumber) { - return this.transport.getPage(pageNumber); - }, - /** - * @param {{num: number, gen: number}} ref The page reference. Must have - * the 'num' and 'gen' properties. - * @return {Promise} A promise that is resolved with the page index that is - * associated with the reference. - */ - getPageIndex: function PDFDocumentProxy_getPageIndex(ref) { - return this.transport.getPageIndex(ref); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named destinations to reference numbers. - * - * This can be slow for large documents: use getDestination instead - */ - getDestinations: function PDFDocumentProxy_getDestinations() { - return this.transport.getDestinations(); - }, - /** - * @param {string} id The named destination to get. - * @return {Promise} A promise that is resolved with all information - * of the given named destination. - */ - getDestination: function PDFDocumentProxy_getDestination(id) { - return this.transport.getDestination(id); - }, - /** - * @return {Promise} A promise that is resolved with: - * an Array containing the pageLabels that correspond to the pageIndexes, - * or `null` when no pageLabels are present in the PDF file. - */ - getPageLabels: function PDFDocumentProxy_getPageLabels() { - return this.transport.getPageLabels(); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named attachments to their content. - */ - getAttachments: function PDFDocumentProxy_getAttachments() { - return this.transport.getAttachments(); - }, - /** - * @return {Promise} A promise that is resolved with an array of all the - * JavaScript strings in the name tree. - */ - getJavaScript: function PDFDocumentProxy_getJavaScript() { - return this.transport.getJavaScript(); - }, - /** - * @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 Uint8Array, - * dest: dest obj, - * url: string, - * items: array of more items like this - * }, - * ... - * ]. - */ - getOutline: function PDFDocumentProxy_getOutline() { - return this.transport.getOutline(); - }, - /** - * @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() { - return this.transport.getMetadata(); - }, - /** - * @return {Promise} A promise that is resolved with a TypedArray that has - * the raw data from the PDF. - */ - getData: function PDFDocumentProxy_getData() { - return this.transport.getData(); - }, - /** - * @return {Promise} A promise that is resolved when the document's data - * is loaded. It is resolved with an {Object} that contains the length - * property that indicates size of the PDF data in bytes. - */ - getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() { - return this.transport.downloadInfoCapability.promise; - }, - /** - * @return {Promise} A promise this is resolved with current stats about - * document structures (see {@link PDFDocumentStats}). - */ - getStats: function PDFDocumentProxy_getStats() { - return this.transport.getStats(); - }, - /** - * Cleans up resources allocated by the document, e.g. created @font-face. - */ - cleanup: function PDFDocumentProxy_cleanup() { - this.transport.startCleanup(); - }, - /** - * Destroys current document instance and terminates worker. - */ - destroy: function PDFDocumentProxy_destroy() { - return this.loadingTask.destroy(); - } - }; - return PDFDocumentProxy; -})(); - -/** - * Page getTextContent parameters. - * - * @typedef {Object} getTextContentParameters - * @param {boolean} normalizeWhitespace - replaces all occurrences of - * whitespace with standard spaces (0x20). The default value is `false`. - * @param {boolean} disableCombineTextItems - do not attempt to combine - * same line {@link TextItem}'s. The default value is `false`. - */ - -/** - * Page text content. - * - * @typedef {Object} TextContent - * @property {array} items - array of {@link TextItem} - * @property {Object} styles - {@link TextStyles} objects, indexed by font - * name. - */ - -/** - * Page text content part. - * - * @typedef {Object} TextItem - * @property {string} str - text content. - * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'. - * @property {array} transform - transformation matrix. - * @property {number} width - width in device space. - * @property {number} height - height in device space. - * @property {string} fontName - font name used by pdf.js for converted font. - */ - -/** - * Text style. - * - * @typedef {Object} TextStyle - * @property {number} ascent - font ascent. - * @property {number} descent - font descent. - * @property {boolean} vertical - text is in vertical mode. - * @property {string} fontFamily - possible font family - */ - -/** - * Page annotation parameters. - * - * @typedef {Object} GetAnnotationsParameters - * @param {string} intent - Determines the annotations that will be fetched, - * can be either 'display' (viewable annotations) or 'print' - * (printable annotations). - * If the parameter is omitted, all annotations are fetched. - */ - -/** - * Page render parameters. - * - * @typedef {Object} RenderParameters - * @property {Object} canvasContext - A 2D context of a DOM Canvas object. - * @property {PageViewport} viewport - Rendering viewport obtained by - * calling of PDFPage.getViewport method. - * @property {string} intent - Rendering intent, can be 'display' or 'print' - * (default value is 'display'). - * @property {boolean} renderInteractiveForms - (optional) Whether or not - * interactive form elements are rendered in the display - * layer. If so, we do not render them on canvas as well. - * @property {Array} transform - (optional) Additional transform, applied - * just before viewport transform. - * @property {Object} imageLayer - (optional) An object that has beginLayout, - * endLayout and appendImage functions. - * @property {function} continueCallback - (deprecated) 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. - */ - -/** - * PDF page operator list. - * - * @typedef {Object} PDFOperatorList - * @property {Array} fnArray - Array containing the operator functions. - * @property {Array} argsArray - Array containing the arguments of the - * functions. - */ - -/** - * Proxy to a PDFPage in the worker thread. - * @class - * @alias PDFPageProxy - */ -var PDFPageProxy = (function PDFPageProxyClosure() { - function PDFPageProxy(pageIndex, pageInfo, transport) { - this.pageIndex = pageIndex; - this.pageInfo = pageInfo; - this.transport = transport; - this.stats = new StatTimer(); - this.stats.enabled = getDefaultSetting('enableStats'); - this.commonObjs = transport.commonObjs; - this.objs = new PDFObjects(); - this.cleanupAfterRender = false; - this.pendingCleanup = false; - this.intentStates = Object.create(null); - this.destroyed = false; - } - PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ { - /** - * @return {number} Page number of the page. First page is 1. - */ - get pageNumber() { - return this.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 PageViewport(this.view, scale, rotate, 0, 0); - }, - /** - * @param {GetAnnotationsParameters} params - Annotation parameters. - * @return {Promise} A promise that is resolved with an {Array} of the - * annotation objects. - */ - getAnnotations: function PDFPageProxy_getAnnotations(params) { - var intent = (params && params.intent) || null; - - if (!this.annotationsPromise || this.annotationsIntent !== intent) { - this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, - intent); - this.annotationsIntent = intent; - } - return this.annotationsPromise; - }, - /** - * Begins the process of rendering a page to the desired context. - * @param {RenderParameters} params Page render parameters. - * @return {RenderTask} An object that contains the promise, which - * is resolved when the page finishes rendering. - */ - 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.pendingCleanup = false; - - var renderingIntent = (params.intent === 'print' ? 'print' : 'display'); - var renderInteractiveForms = (params.renderInteractiveForms === true ? - true : /* Default */ false); - - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = Object.create(null); - } - var intentState = this.intentStates[renderingIntent]; - - // If there's no displayReadyCapability yet, then the operatorList - // was never requested before. Make the request and create the promise. - if (!intentState.displayReadyCapability) { - intentState.receivingOperatorList = true; - intentState.displayReadyCapability = createPromiseCapability(); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.stats.time('Page Request'); - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageNumber - 1, - intent: renderingIntent, - renderInteractiveForms: renderInteractiveForms, - }); - } - - var internalRenderTask = new InternalRenderTask(complete, params, - this.objs, - this.commonObjs, - intentState.operatorList, - this.pageNumber); - internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print'; - if (!intentState.renderTasks) { - intentState.renderTasks = []; - } - intentState.renderTasks.push(internalRenderTask); - var renderTask = internalRenderTask.task; - - // Obsolete parameter support - if (params.continueCallback) { - deprecated('render is used with continueCallback parameter'); - renderTask.onContinue = params.continueCallback; - } - - var self = this; - intentState.displayReadyCapability.promise.then( - function pageDisplayReadyPromise(transparency) { - if (self.pendingCleanup) { - complete(); - return; - } - stats.time('Rendering'); - internalRenderTask.initializeGraphics(transparency); - internalRenderTask.operatorListChanged(); - }, - function pageDisplayReadPromiseError(reason) { - complete(reason); - } - ); - - function complete(error) { - var i = intentState.renderTasks.indexOf(internalRenderTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } - - if (self.cleanupAfterRender) { - self.pendingCleanup = true; - } - self._tryCleanup(); - - if (error) { - internalRenderTask.capability.reject(error); - } else { - internalRenderTask.capability.resolve(); - } - stats.timeEnd('Rendering'); - stats.timeEnd('Overall'); - } - - return renderTask; - }, - - /** - * @return {Promise} A promise resolved with an {@link PDFOperatorList} - * object that represents page's operator list. - */ - getOperatorList: function PDFPageProxy_getOperatorList() { - function operatorListChanged() { - if (intentState.operatorList.lastChunk) { - intentState.opListReadCapability.resolve(intentState.operatorList); - - var i = intentState.renderTasks.indexOf(opListTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } - } - } - - var renderingIntent = 'oplist'; - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = Object.create(null); - } - var intentState = this.intentStates[renderingIntent]; - var opListTask; - - if (!intentState.opListReadCapability) { - opListTask = {}; - opListTask.operatorListChanged = operatorListChanged; - intentState.receivingOperatorList = true; - intentState.opListReadCapability = createPromiseCapability(); - intentState.renderTasks = []; - intentState.renderTasks.push(opListTask); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageIndex, - intent: renderingIntent - }); - } - return intentState.opListReadCapability.promise; - }, - - /** - * @param {getTextContentParameters} params - getTextContent parameters. - * @return {Promise} That is resolved a {@link TextContent} - * object that represent the page text content. - */ - getTextContent: function PDFPageProxy_getTextContent(params) { - return this.transport.messageHandler.sendWithPromise('GetTextContent', { - pageIndex: this.pageNumber - 1, - normalizeWhitespace: (params && params.normalizeWhitespace === true ? - true : /* Default */ false), - combineTextItems: (params && params.disableCombineTextItems === true ? - false : /* Default */ true), - }); - }, - - /** - * Destroys page object. - */ - _destroy: function PDFPageProxy_destroy() { - this.destroyed = true; - this.transport.pageCache[this.pageIndex] = null; - - var waitOn = []; - Object.keys(this.intentStates).forEach(function(intent) { - if (intent === 'oplist') { - // Avoid errors below, since the renderTasks are just stubs. - return; - } - var intentState = this.intentStates[intent]; - intentState.renderTasks.forEach(function(renderTask) { - var renderCompleted = renderTask.capability.promise. - catch(function () {}); // ignoring failures - waitOn.push(renderCompleted); - renderTask.cancel(); - }); - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - return Promise.all(waitOn); - }, - - /** - * Cleans up resources allocated by the page. (deprecated) - */ - destroy: function() { - deprecated('page destroy method, use cleanup() instead'); - this.cleanup(); - }, - - /** - * Cleans up resources allocated by the page. - */ - cleanup: function PDFPageProxy_cleanup() { - this.pendingCleanup = true; - this._tryCleanup(); - }, - /** - * For internal use only. Attempts to clean up if rendering is in a state - * where that's possible. - * @ignore - */ - _tryCleanup: function PDFPageProxy_tryCleanup() { - if (!this.pendingCleanup || - Object.keys(this.intentStates).some(function(intent) { - var intentState = this.intentStates[intent]; - return (intentState.renderTasks.length !== 0 || - intentState.receivingOperatorList); - }, this)) { - return; - } - - Object.keys(this.intentStates).forEach(function(intent) { - delete this.intentStates[intent]; - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - }, - /** - * For internal use only. - * @ignore - */ - _startRenderPage: function PDFPageProxy_startRenderPage(transparency, - intent) { - var intentState = this.intentStates[intent]; - // TODO Refactor RenderPageRequest to separate rendering - // and operator list logic - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.resolve(transparency); - } - }, - /** - * For internal use only. - * @ignore - */ - _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, - intent) { - var intentState = this.intentStates[intent]; - var i, ii; - // Add the new chunk to the current operator list. - for (i = 0, ii = operatorListChunk.length; i < ii; i++) { - intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); - intentState.operatorList.argsArray.push( - operatorListChunk.argsArray[i]); - } - intentState.operatorList.lastChunk = operatorListChunk.lastChunk; - - // Notify all the rendering tasks there are more operators to be consumed. - for (i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); - } - - if (operatorListChunk.lastChunk) { - intentState.receivingOperatorList = false; - this._tryCleanup(); - } - } - }; - return PDFPageProxy; -})(); - -/** - * PDF.js web worker abstraction, it controls instantiation of PDF documents and - * WorkerTransport for them. If creation of a web worker is not possible, - * a "fake" worker will be used instead. - * @class - */ -var PDFWorker = (function PDFWorkerClosure() { - var nextFakeWorkerId = 0; - - function getWorkerSrc() { - if (typeof workerSrc !== 'undefined') { - return workerSrc; - } - if (getDefaultSetting('workerSrc')) { - return getDefaultSetting('workerSrc'); - } - if (pdfjsFilePath) { - return pdfjsFilePath.replace(/\.js$/i, '.worker.js'); - } - error('No PDFJS.workerSrc specified'); - } - - var fakeWorkerFilesLoadedCapability; - - // Loads worker code into main thread. - function setupFakeWorkerGlobal() { - var WorkerMessageHandler; - if (!fakeWorkerFilesLoadedCapability) { - fakeWorkerFilesLoadedCapability = createPromiseCapability(); - // In the developer build load worker_loader which in turn loads all the - // other files and resolves the promise. In production only the - // pdf.worker.js file is needed. - var loader = fakeWorkerFilesLoader || function (callback) { - Util.loadScript(getWorkerSrc(), function () { - callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler); - }); - }; - loader(fakeWorkerFilesLoadedCapability.resolve); - } - return fakeWorkerFilesLoadedCapability.promise; - } - - function FakeWorkerPort(defer) { - this._listeners = []; - this._defer = defer; - this._deferred = Promise.resolve(undefined); - } - FakeWorkerPort.prototype = { - postMessage: function (obj, transfers) { - function cloneValue(value) { - // Trying to perform a structured clone close to the spec, including - // transfers. - if (typeof value !== 'object' || value === null) { - return value; - } - if (cloned.has(value)) { // already cloned the object - return cloned.get(value); - } - var result; - var buffer; - if ((buffer = value.buffer) && isArrayBuffer(buffer)) { - // We found object with ArrayBuffer (typed array). - var transferable = transfers && transfers.indexOf(buffer) >= 0; - if (value === buffer) { - // Special case when we are faking typed arrays in compatibility.js. - result = value; - } else if (transferable) { - result = new value.constructor(buffer, value.byteOffset, - value.byteLength); - } else { - result = new value.constructor(value); - } - cloned.set(value, result); - return result; - } - result = isArray(value) ? [] : {}; - cloned.set(value, result); // adding to cache now for cyclic references - // Cloning all value and object properties, however ignoring properties - // defined via getter. - for (var i in value) { - var desc, p = value; - while (!(desc = Object.getOwnPropertyDescriptor(p, i))) { - p = Object.getPrototypeOf(p); - } - if (typeof desc.value === 'undefined' || - typeof desc.value === 'function') { - continue; - } - result[i] = cloneValue(desc.value); - } - return result; - } - - if (!this._defer) { - this._listeners.forEach(function (listener) { - listener.call(this, {data: obj}); - }, this); - return; - } - - var cloned = new WeakMap(); - var e = {data: cloneValue(obj)}; - this._deferred.then(function () { - this._listeners.forEach(function (listener) { - listener.call(this, e); - }, this); - }.bind(this)); - }, - addEventListener: function (name, listener) { - this._listeners.push(listener); - }, - removeEventListener: function (name, listener) { - var i = this._listeners.indexOf(listener); - this._listeners.splice(i, 1); - }, - terminate: function () { - this._listeners = []; - } - }; - - function createCDNWrapper(url) { - // We will rely on blob URL's property to specify origin. - // We want this function to fail in case if createObjectURL or Blob do not - // exist or fail for some reason -- our Worker creation will fail anyway. - var wrapper = 'importScripts(\'' + url + '\');'; - return URL.createObjectURL(new Blob([wrapper])); - } - - function PDFWorker(name) { - this.name = name; - this.destroyed = false; - - this._readyCapability = createPromiseCapability(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - this._initialize(); - } - - PDFWorker.prototype = /** @lends PDFWorker.prototype */ { - get promise() { - return this._readyCapability.promise; - }, - - get port() { - return this._port; - }, - - get messageHandler() { - return this._messageHandler; - }, - - _initialize: function PDFWorker_initialize() { - // If worker support isn't disabled explicit and the browser has worker - // support, create a new web worker and test if it/the browser fulfills - // 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 v.15.) - if (!isWorkerDisabled && !getDefaultSetting('disableWorker') && - typeof Worker !== 'undefined') { - var workerSrc = getWorkerSrc(); - - try { - // Wraps workerSrc path into blob URL, if the former does not belong - // to the same origin. - if (!isSameOrigin(window.location.href, workerSrc)) { - workerSrc = createCDNWrapper( - new URL(workerSrc, window.location).href); - } - // 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', worker); - var terminateEarly = function() { - worker.removeEventListener('error', onWorkerError); - messageHandler.destroy(); - worker.terminate(); - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - } else { - // Fall back to fake worker if the termination is caused by an - // error (e.g. NetworkError / SecurityError). - this._setupFakeWorker(); - } - }.bind(this); - - var onWorkerError = function(event) { - if (!this._webWorker) { - // Worker failed to initialize due to an error. Clean up and fall - // back to the fake worker. - terminateEarly(); - } - }.bind(this); - worker.addEventListener('error', onWorkerError); - - messageHandler.on('test', function PDFWorker_test(data) { - worker.removeEventListener('error', onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; // worker was destroyed - } - var supportTypedArray = data && data.supportTypedArray; - if (supportTypedArray) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - if (!data.supportTransfers) { - isPostMessageTransfersDisabled = true; - } - this._readyCapability.resolve(); - // Send global setting, e.g. verbosity level. - messageHandler.send('configure', { - verbosity: getVerbosityLevel() - }); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }.bind(this)); - - messageHandler.on('console_log', function (data) { - console.log.apply(console, data); - }); - messageHandler.on('console_error', function (data) { - console.error.apply(console, data); - }); - - messageHandler.on('ready', function (data) { - worker.removeEventListener('error', onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; // worker was destroyed - } - try { - sendTest(); - } catch (e) { - // We need fallback to a faked worker. - this._setupFakeWorker(); - } - }.bind(this)); - - var sendTest = function () { - var postMessageTransfers = - getDefaultSetting('postMessageTransfers') && - !isPostMessageTransfersDisabled; - var testObj = new Uint8Array([postMessageTransfers ? 255 : 0]); - // Some versions of Opera throw a DATA_CLONE_ERR on serializing the - // typed array. Also, checking if we can use transfers. - try { - messageHandler.send('test', testObj, [testObj.buffer]); - } catch (ex) { - info('Cannot use postMessage transfers'); - testObj[0] = 0; - messageHandler.send('test', testObj); - } - }; - - // It might take time for worker to initialize (especially when AMD - // loader is used). We will try to send test immediately, and then - // when 'ready' message will arrive. The worker shall process only - // first received 'test'. - sendTest(); - 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. - this._setupFakeWorker(); - }, - - _setupFakeWorker: function PDFWorker_setupFakeWorker() { - if (!isWorkerDisabled && !getDefaultSetting('disableWorker')) { - warn('Setting up fake worker.'); - isWorkerDisabled = true; - } - - setupFakeWorkerGlobal().then(function (WorkerMessageHandler) { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - return; - } - - // We cannot turn on proper fake port simulation (this includes - // structured cloning) when typed arrays are not supported. Relying - // on a chance that messages will be sent in proper order. - var isTypedArraysPresent = Uint8Array !== Float32Array; - var port = new FakeWorkerPort(isTypedArraysPresent); - this._port = port; - - // All fake workers use the same port, making id unique. - var id = 'fake' + (nextFakeWorkerId++); - - // If the main thread is our worker, setup the handling for the - // messages -- the main thread sends to it self. - var workerHandler = new MessageHandler(id + '_worker', id, port); - WorkerMessageHandler.setup(workerHandler, port); - - var messageHandler = new MessageHandler(id, id + '_worker', port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - }.bind(this)); - }, - - /** - * Destroys the worker instance. - */ - destroy: function PDFWorker_destroy() { - this.destroyed = true; - if (this._webWorker) { - // We need to terminate only web worker created resource. - this._webWorker.terminate(); - this._webWorker = null; - } - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - }; - - return PDFWorker; -})(); - -/** - * For internal use only. - * @ignore - */ -var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; - this.pdfDataRangeTransport = pdfDataRangeTransport; - this.commonObjs = new PDFObjects(); - this.fontLoader = new FontLoader(loadingTask.docId); - - this.destroyed = false; - this.destroyCapability = null; - - this.pageCache = []; - this.pagePromises = []; - this.downloadInfoCapability = createPromiseCapability(); - - this.setupMessageHandler(); - } - WorkerTransport.prototype = { - destroy: function WorkerTransport_destroy() { - if (this.destroyCapability) { - return this.destroyCapability.promise; - } - - this.destroyed = true; - this.destroyCapability = createPromiseCapability(); - - var waitOn = []; - // We need to wait for all renderings to be completed, e.g. - // timeout/rAF can take a long time. - this.pageCache.forEach(function (page) { - if (page) { - waitOn.push(page._destroy()); - } - }); - this.pageCache = []; - this.pagePromises = []; - var self = this; - // We also need to wait for the worker to finish its long running tasks. - var terminated = this.messageHandler.sendWithPromise('Terminate', null); - waitOn.push(terminated); - Promise.all(waitOn).then(function () { - self.fontLoader.clear(); - if (self.pdfDataRangeTransport) { - self.pdfDataRangeTransport.abort(); - self.pdfDataRangeTransport = null; - } - if (self.messageHandler) { - self.messageHandler.destroy(); - self.messageHandler = null; - } - self.destroyCapability.resolve(); - }, this.destroyCapability.reject); - return this.destroyCapability.promise; - }, - - setupMessageHandler: - function WorkerTransport_setupMessageHandler() { - var messageHandler = this.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 - }); - }); - - pdfDataRangeTransport.addProgressiveReadListener(function(chunk) { - messageHandler.send('OnDataRange', { - chunk: chunk - }); - }); - - messageHandler.on('RequestDataRange', - function transportDataRange(data) { - pdfDataRangeTransport.requestDataRange(data.begin, data.end); - }, this); - } - - messageHandler.on('GetDoc', function transportDoc(data) { - var pdfInfo = data.pdfInfo; - this.numPages = data.pdfInfo.numPages; - var loadingTask = this.loadingTask; - var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); - this.pdfDocument = pdfDocument; - loadingTask._capability.resolve(pdfDocument); - }, this); - - messageHandler.on('NeedPassword', - function transportNeedPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.NEED_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('IncorrectPassword', - function transportIncorrectPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.INCORRECT_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { - this.loadingTask._capability.reject( - new InvalidPDFException(exception.message)); - }, this); - - messageHandler.on('MissingPDF', function transportMissingPDF(exception) { - this.loadingTask._capability.reject( - new MissingPDFException(exception.message)); - }, this); - - messageHandler.on('UnexpectedResponse', - function transportUnexpectedResponse(exception) { - this.loadingTask._capability.reject( - new UnexpectedResponseException(exception.message, exception.status)); - }, this); - - messageHandler.on('UnknownError', - function transportUnknownError(exception) { - this.loadingTask._capability.reject( - new UnknownErrorException(exception.message, exception.details)); - }, this); - - messageHandler.on('DataLoaded', function transportPage(data) { - this.downloadInfoCapability.resolve(data); - }, this); - - messageHandler.on('PDFManagerReady', function transportPage(data) { - if (this.pdfDataRangeTransport) { - this.pdfDataRangeTransport.transportReady(); - } - }, this); - - messageHandler.on('StartRenderPage', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page.stats.timeEnd('Page Request'); - page._startRenderPage(data.transparency, data.intent); - }, this); - - messageHandler.on('RenderPageChunk', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page._renderPageChunk(data.operatorList, data.intent); - }, this); - - messageHandler.on('commonobj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var id = data[0]; - var type = data[1]; - if (this.commonObjs.hasData(id)) { - return; - } - - switch (type) { - case 'Font': - var exportedData = data[2]; - - if ('error' in exportedData) { - var exportedError = exportedData.error; - warn('Error during font loading: ' + exportedError); - this.commonObjs.resolve(id, exportedError); - break; - } - var fontRegistry = null; - if (getDefaultSetting('pdfBug') && globalScope.FontInspector && - globalScope['FontInspector'].enabled) { - fontRegistry = { - registerFont: function (font, url) { - globalScope['FontInspector'].fontAdded(font, url); - } - }; - } - var font = new FontFaceObject(exportedData, { - isEvalSuported: getDefaultSetting('isEvalSupported'), - disableFontFace: getDefaultSetting('disableFontFace'), - fontRegistry: fontRegistry - }); - - this.fontLoader.bind( - [font], - function fontReady(fontObjs) { - this.commonObjs.resolve(id, font); - }.bind(this) - ); - break; - case 'FontPath': - this.commonObjs.resolve(id, data[2]); - break; - default: - error('Got unknown common object type ' + type); - } - }, this); - - messageHandler.on('obj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var id = data[0]; - var pageIndex = data[1]; - var type = data[2]; - var pageProxy = this.pageCache[pageIndex]; - var imageData; - if (pageProxy.objs.hasData(id)) { - return; - } - - switch (type) { - case 'JpegStream': - imageData = data[3]; - loadJpegStream(id, imageData, pageProxy.objs); - break; - case 'Image': - 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 (imageData && '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.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var loadingTask = this.loadingTask; - if (loadingTask.onProgress) { - loadingTask.onProgress({ - loaded: data.loaded, - total: data.total - }); - } - }, this); - - messageHandler.on('PageError', function transportError(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var page = this.pageCache[data.pageNum - 1]; - var intentState = page.intentStates[data.intent]; - - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(data.error); - } else { - error(data.error); - } - - if (intentState.operatorList) { - // Mark operator list as complete. - intentState.operatorList.lastChunk = true; - for (var i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); - } - } - }, this); - - messageHandler.on('UnsupportedFeature', - function transportUnsupportedFeature(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var featureId = data.featureId; - var loadingTask = this.loadingTask; - if (loadingTask.onUnsupportedFeature) { - loadingTask.onUnsupportedFeature(featureId); - } - _UnsupportedManager.notify(featureId); - }, this); - - messageHandler.on('JpegDecode', function(data) { - if (this.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); - } - - var imageUrl = data[0]; - var components = data[1]; - if (components !== 3 && components !== 1) { - return Promise.reject( - new Error('Only 3 components or 1 component can be returned')); - } - - return new Promise(function (resolve, reject) { - var img = new Image(); - img.onload = function () { - 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; - var i, j; - - if (components === 3) { - for (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 (i = 0, j = 0; i < rgbaLength; i += 4, j++) { - buf[j] = data[i]; - } - } - resolve({ data: buf, width: width, height: height}); - }; - img.onerror = function () { - reject(new Error('JpegDecode failed to load image')); - }; - img.src = imageUrl; - }); - }, this); - }, - - getData: function WorkerTransport_getData() { - return this.messageHandler.sendWithPromise('GetData', null); - }, - - getPage: function WorkerTransport_getPage(pageNumber, capability) { - if (!isInt(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) { - return Promise.reject(new Error('Invalid page request')); - } - - var pageIndex = pageNumber - 1; - if (pageIndex in this.pagePromises) { - return this.pagePromises[pageIndex]; - } - var promise = this.messageHandler.sendWithPromise('GetPage', { - pageIndex: pageIndex - }).then(function (pageInfo) { - if (this.destroyed) { - throw new Error('Transport destroyed'); - } - var page = new PDFPageProxy(pageIndex, pageInfo, this); - this.pageCache[pageIndex] = page; - return page; - }.bind(this)); - this.pagePromises[pageIndex] = promise; - return promise; - }, - - getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { - return this.messageHandler.sendWithPromise('GetPageIndex', { - ref: ref, - }).catch(function (reason) { - return Promise.reject(new Error(reason)); - }); - }, - - getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise('GetAnnotations', { - pageIndex: pageIndex, - intent: intent, - }); - }, - - getDestinations: function WorkerTransport_getDestinations() { - return this.messageHandler.sendWithPromise('GetDestinations', null); - }, - - getDestination: function WorkerTransport_getDestination(id) { - return this.messageHandler.sendWithPromise('GetDestination', { id: id }); - }, - - getPageLabels: function WorkerTransport_getPageLabels() { - return this.messageHandler.sendWithPromise('GetPageLabels', null); - }, - - getAttachments: function WorkerTransport_getAttachments() { - return this.messageHandler.sendWithPromise('GetAttachments', null); - }, - - getJavaScript: function WorkerTransport_getJavaScript() { - return this.messageHandler.sendWithPromise('GetJavaScript', null); - }, - - getOutline: function WorkerTransport_getOutline() { - return this.messageHandler.sendWithPromise('GetOutline', null); - }, - - getMetadata: function WorkerTransport_getMetadata() { - return this.messageHandler.sendWithPromise('GetMetadata', null). - then(function transportMetadata(results) { - return { - info: results[0], - metadata: (results[1] ? new Metadata(results[1]) : null) - }; - }); - }, - - getStats: function WorkerTransport_getStats() { - return this.messageHandler.sendWithPromise('GetStats', null); - }, - - startCleanup: function WorkerTransport_startCleanup() { - this.messageHandler.sendWithPromise('Cleanup', null). - then(function endCleanup() { - for (var i = 0, ii = this.pageCache.length; i < ii; i++) { - var page = this.pageCache[i]; - if (page) { - page.cleanup(); - } - } - this.commonObjs.clear(); - this.fontLoader.clear(); - }.bind(this)); - } - }; - return WorkerTransport; - -})(); - -/** - * 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. - * @ignore - */ -var PDFObjects = (function PDFObjectsClosure() { - function PDFObjects() { - this.objs = Object.create(null); - } - - 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 = { - capability: createPromiseCapability(), - 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).capability.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.capability.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 = Object.create(null); - } - }; - return PDFObjects; -})(); - -/** - * Allows controlling of the rendering tasks. - * @class - * @alias RenderTask - */ -var RenderTask = (function RenderTaskClosure() { - function RenderTask(internalRenderTask) { - this._internalRenderTask = internalRenderTask; - - /** - * Callback for incremental rendering -- 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. - * @type {function} - */ - this.onContinue = null; - } - - RenderTask.prototype = /** @lends RenderTask.prototype */ { - /** - * Promise for rendering task completion. - * @return {Promise} - */ - get promise() { - return this._internalRenderTask.capability.promise; - }, - - /** - * Cancels the rendering task. If the task is currently rendering it will - * not be cancelled until graphics pauses with a timeout. The promise that - * this object extends will resolved when cancelled. - */ - cancel: function RenderTask_cancel() { - this._internalRenderTask.cancel(); - }, - - /** - * Registers callbacks to indicate the rendering task completion. - * - * @param {function} onFulfilled The callback for the rendering completion. - * @param {function} onRejected The callback for the rendering failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function RenderTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return RenderTask; -})(); - -/** - * For internal use only. - * @ignore - */ -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.useRequestAnimationFrame = false; - this.cancelled = false; - this.capability = createPromiseCapability(); - this.task = new RenderTask(this); - // caching this-bound methods - this._continueBound = this._continue.bind(this); - this._scheduleNextBound = this._scheduleNext.bind(this); - this._nextBound = this._next.bind(this); - } - - InternalRenderTask.prototype = { - - initializeGraphics: - function InternalRenderTask_initializeGraphics(transparency) { - - if (this.cancelled) { - return; - } - if (getDefaultSetting('pdfBug') && globalScope.StepperManager && - 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.imageLayer); - - this.gfx.beginDrawing(params.transform, 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._continueBound; - } - 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.task.onContinue) { - this.task.onContinue.call(this.task, this._scheduleNextBound); - } else { - this._scheduleNext(); - } - }, - - _scheduleNext: function InternalRenderTask__scheduleNext() { - if (this.useRequestAnimationFrame && typeof window !== 'undefined') { - window.requestAnimationFrame(this._nextBound); - } else { - Promise.resolve(undefined).then(this._nextBound); - } - }, - - _next: function InternalRenderTask__next() { - if (this.cancelled) { - return; - } - this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, - this.operatorListIdx, - this._continueBound, - this.stepper); - if (this.operatorListIdx === this.operatorList.argsArray.length) { - this.running = false; - if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); - this.callback(); - } - } - } - - }; - - return InternalRenderTask; -})(); - -/** - * (Deprecated) Global observer of unsupported feature usages. Use - * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. - */ -var _UnsupportedManager = (function UnsupportedManagerClosure() { - var listeners = []; - return { - listen: function (cb) { - deprecated('Global UnsupportedManager.listen is used: ' + - ' use PDFDocumentLoadingTask.onUnsupportedFeature instead'); - listeners.push(cb); - }, - notify: function (featureId) { - for (var i = 0, ii = listeners.length; i < ii; i++) { - listeners[i](featureId); - } - } - }; -})(); - -if (typeof pdfjsVersion !== 'undefined') { - exports.version = pdfjsVersion; -} -if (typeof pdfjsBuild !== 'undefined') { - exports.build = pdfjsBuild; -} - -exports.getDocument = getDocument; -exports.PDFDataRangeTransport = PDFDataRangeTransport; -exports.PDFWorker = PDFWorker; -exports.PDFDocumentProxy = PDFDocumentProxy; -exports.PDFPageProxy = PDFPageProxy; -exports._UnsupportedManager = _UnsupportedManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayGlobal = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils, root.pdfjsDisplayAPI, - root.pdfjsDisplayAnnotationLayer, root.pdfjsDisplayTextLayer, - root.pdfjsDisplayMetadata, root.pdfjsDisplaySVG); - } -}(this, function (exports, sharedUtil, displayDOMUtils, displayAPI, - displayAnnotationLayer, displayTextLayer, displayMetadata, - displaySVG) { - - var globalScope = sharedUtil.globalScope; - var deprecated = sharedUtil.deprecated; - var warn = sharedUtil.warn; - var LinkTarget = displayDOMUtils.LinkTarget; - - var isWorker = (typeof window === 'undefined'); - - // The global PDFJS object is now deprecated and will not be supported in - // the future. The members below are maintained for backward compatibility - // and shall not be extended or modified. If the global.js is included as - // a module, we will create a global PDFJS object instance or use existing. - if (!globalScope.PDFJS) { - globalScope.PDFJS = {}; - } - var PDFJS = globalScope.PDFJS; - - if (typeof pdfjsVersion !== 'undefined') { - PDFJS.version = pdfjsVersion; - } - if (typeof pdfjsBuild !== 'undefined') { - PDFJS.build = pdfjsBuild; - } - - PDFJS.pdfBug = false; - - if (PDFJS.verbosity !== undefined) { - sharedUtil.setVerbosityLevel(PDFJS.verbosity); - } - delete PDFJS.verbosity; - Object.defineProperty(PDFJS, 'verbosity', { - get: function () { return sharedUtil.getVerbosityLevel(); }, - set: function (level) { sharedUtil.setVerbosityLevel(level); }, - enumerable: true, - configurable: true - }); - - PDFJS.VERBOSITY_LEVELS = sharedUtil.VERBOSITY_LEVELS; - PDFJS.OPS = sharedUtil.OPS; - PDFJS.UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; - PDFJS.isValidUrl = sharedUtil.isValidUrl; - PDFJS.shadow = sharedUtil.shadow; - PDFJS.createBlob = sharedUtil.createBlob; - PDFJS.createObjectURL = function PDFJS_createObjectURL(data, contentType) { - return sharedUtil.createObjectURL(data, contentType, - PDFJS.disableCreateObjectURL); - }; - Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - var value = sharedUtil.isLittleEndian(); - return sharedUtil.shadow(PDFJS, 'isLittleEndian', value); - } - }); - PDFJS.removeNullCharacters = sharedUtil.removeNullCharacters; - PDFJS.PasswordResponses = sharedUtil.PasswordResponses; - PDFJS.PasswordException = sharedUtil.PasswordException; - PDFJS.UnknownErrorException = sharedUtil.UnknownErrorException; - PDFJS.InvalidPDFException = sharedUtil.InvalidPDFException; - PDFJS.MissingPDFException = sharedUtil.MissingPDFException; - PDFJS.UnexpectedResponseException = sharedUtil.UnexpectedResponseException; - PDFJS.Util = sharedUtil.Util; - PDFJS.PageViewport = sharedUtil.PageViewport; - PDFJS.createPromiseCapability = sharedUtil.createPromiseCapability; - - /** - * 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); - - /** - * The url of where the predefined Adobe CMaps are located. Include trailing - * slash. - * @var {string} - */ - PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); - - /** - * Specifies if CMaps are binary packed. - * @var {boolean} - */ - PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; - - /** - * By default fonts are converted to OpenType fonts and loaded via font face - * rules. If disabled, the font will be rendered using a built in font - * renderer that constructs the glyphs with primitive path commands. - * @var {boolean} - */ - PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? - false : PDFJS.disableFontFace); - - /** - * Path for image resources, mainly for annotation icons. Include trailing - * slash. - * @var {string} - */ - PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? - '' : PDFJS.imageResourcesPath); - - /** - * Disable the web worker and run all code on the main thread. This will - * happen automatically if the browser doesn't support workers or sending - * typed arrays to workers. - * @var {boolean} - */ - PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? - false : PDFJS.disableWorker); - - /** - * Path and filename of the worker file. Required when the worker is enabled - * in development mode. If unspecified in the production build, the worker - * will be loaded based on the location of the pdf.js file. It is recommended - * that the workerSrc is set in a custom application to prevent issues caused - * by third-party frameworks and libraries. - * @var {string} - */ - PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); - - /** - * Disable range request loading of PDF files. When enabled and if the server - * supports partial content requests then the PDF will be fetched in chunks. - * Enabled (false) by default. - * @var {boolean} - */ - PDFJS.disableRange = (PDFJS.disableRange === undefined ? - false : PDFJS.disableRange); - - /** - * Disable streaming of PDF file data. By default PDF.js attempts to load PDF - * in chunks. This default behavior can be disabled. - * @var {boolean} - */ - PDFJS.disableStream = (PDFJS.disableStream === undefined ? - false : PDFJS.disableStream); - - /** - * Disable pre-fetching of PDF file data. When range requests are enabled - * PDF.js will automatically keep fetching more data even if it isn't needed - * to display the current page. This default behavior can be disabled. - * - * NOTE: It is also necessary to disable streaming, see above, - * in order for disabling of pre-fetching to work correctly. - * @var {boolean} - */ - PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? - false : PDFJS.disableAutoFetch); - - /** - * Enables special hooks for debugging PDF.js. - * @var {boolean} - */ - PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); - - /** - * Enables transfer usage in postMessage for ArrayBuffers. - * @var {boolean} - */ - PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? - true : PDFJS.postMessageTransfers); - - /** - * Disables URL.createObjectURL usage. - * @var {boolean} - */ - PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? - false : PDFJS.disableCreateObjectURL); - - /** - * Disables WebGL usage. - * @var {boolean} - */ - PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? - true : PDFJS.disableWebGL); - - /** - * Specifies the |target| attribute for external links. - * The constants from PDFJS.LinkTarget should be used: - * - NONE [default] - * - SELF - * - BLANK - * - PARENT - * - TOP - * @var {number} - */ - PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? - LinkTarget.NONE : PDFJS.externalLinkTarget); - - /** - * Specifies the |rel| attribute for external links. Defaults to stripping - * the referrer. - * @var {string} - */ - PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ? - 'noreferrer' : PDFJS.externalLinkRel); - - /** - * Determines if we can eval strings as JS. Primarily used to improve - * performance for font rendering. - * @var {boolean} - */ - PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? - true : PDFJS.isEvalSupported); - - var savedOpenExternalLinksInNewWindow = PDFJS.openExternalLinksInNewWindow; - delete PDFJS.openExternalLinksInNewWindow; - Object.defineProperty(PDFJS, 'openExternalLinksInNewWindow', { - get: function () { - return PDFJS.externalLinkTarget === LinkTarget.BLANK; - }, - set: function (value) { - if (value) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - } - if (PDFJS.externalLinkTarget !== LinkTarget.NONE) { - warn('PDFJS.externalLinkTarget is already initialized'); - return; - } - PDFJS.externalLinkTarget = value ? LinkTarget.BLANK : LinkTarget.NONE; - }, - enumerable: true, - configurable: true - }); - if (savedOpenExternalLinksInNewWindow) { - /** - * (Deprecated) Opens external links in a new window if enabled. - * The default behavior opens external links in the PDF.js window. - * - * NOTE: This property has been deprecated, please use - * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. - * @var {boolean} - */ - PDFJS.openExternalLinksInNewWindow = savedOpenExternalLinksInNewWindow; - } - - PDFJS.getDocument = displayAPI.getDocument; - PDFJS.PDFDataRangeTransport = displayAPI.PDFDataRangeTransport; - PDFJS.PDFWorker = displayAPI.PDFWorker; - - Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - var value = displayDOMUtils.hasCanvasTypedArrays(); - return sharedUtil.shadow(PDFJS, 'hasCanvasTypedArrays', value); - } - }); - PDFJS.CustomStyle = displayDOMUtils.CustomStyle; - PDFJS.LinkTarget = LinkTarget; - PDFJS.addLinkAttributes = displayDOMUtils.addLinkAttributes; - PDFJS.getFilenameFromUrl = displayDOMUtils.getFilenameFromUrl; - PDFJS.isExternalLinkTargetSet = displayDOMUtils.isExternalLinkTargetSet; - - PDFJS.AnnotationLayer = displayAnnotationLayer.AnnotationLayer; - - PDFJS.renderTextLayer = displayTextLayer.renderTextLayer; - - PDFJS.Metadata = displayMetadata.Metadata; - - PDFJS.SVGGraphics = displaySVG.SVGGraphics; - - PDFJS.UnsupportedManager = displayAPI._UnsupportedManager; - - exports.globalScope = globalScope; - exports.isWorker = isWorker; - exports.PDFJS = globalScope.PDFJS; -})); - }).call(pdfjsLibs); - - exports.PDFJS = pdfjsLibs.pdfjsDisplayGlobal.PDFJS; - exports.build = pdfjsLibs.pdfjsDisplayAPI.build; - exports.version = pdfjsLibs.pdfjsDisplayAPI.version; - exports.getDocument = pdfjsLibs.pdfjsDisplayAPI.getDocument; - exports.PDFDataRangeTransport = - pdfjsLibs.pdfjsDisplayAPI.PDFDataRangeTransport; - exports.PDFWorker = pdfjsLibs.pdfjsDisplayAPI.PDFWorker; - exports.renderTextLayer = pdfjsLibs.pdfjsDisplayTextLayer.renderTextLayer; - exports.AnnotationLayer = - pdfjsLibs.pdfjsDisplayAnnotationLayer.AnnotationLayer; - exports.CustomStyle = pdfjsLibs.pdfjsDisplayDOMUtils.CustomStyle; - exports.PasswordResponses = pdfjsLibs.pdfjsSharedUtil.PasswordResponses; - exports.InvalidPDFException = pdfjsLibs.pdfjsSharedUtil.InvalidPDFException; - exports.MissingPDFException = pdfjsLibs.pdfjsSharedUtil.MissingPDFException; - exports.SVGGraphics = pdfjsLibs.pdfjsDisplaySVG.SVGGraphics; - exports.UnexpectedResponseException = - pdfjsLibs.pdfjsSharedUtil.UnexpectedResponseException; - exports.OPS = pdfjsLibs.pdfjsSharedUtil.OPS; - exports.UNSUPPORTED_FEATURES = pdfjsLibs.pdfjsSharedUtil.UNSUPPORTED_FEATURES; - exports.isValidUrl = pdfjsLibs.pdfjsSharedUtil.isValidUrl; - exports.createObjectURL = pdfjsLibs.pdfjsSharedUtil.createObjectURL; - exports.removeNullCharacters = pdfjsLibs.pdfjsSharedUtil.removeNullCharacters; - exports.shadow = pdfjsLibs.pdfjsSharedUtil.shadow; - exports.createBlob = pdfjsLibs.pdfjsSharedUtil.createBlob; - exports.getFilenameFromUrl = - pdfjsLibs.pdfjsDisplayDOMUtils.getFilenameFromUrl; - exports.addLinkAttributes = pdfjsLibs.pdfjsDisplayDOMUtils.addLinkAttributes; -})); - diff --git a/services/web/public/js/libs/pdfjs-1.6.210p1/pdf.worker.js b/services/web/public/js/libs/pdfjs-1.6.210p1/pdf.worker.js deleted file mode 100644 index 3c9afed587..0000000000 --- a/services/web/public/js/libs/pdfjs-1.6.210p1/pdf.worker.js +++ /dev/null @@ -1,43512 +0,0 @@ -/* Copyright 2012 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 globalstrict: false */ -/* umdutils ignore */ - -(function (root, factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { -define('pdfjs-dist/build/pdf.worker', ['exports'], factory); - } else if (typeof exports !== 'undefined') { - factory(exports); - } else { -factory((root.pdfjsDistBuildPdfWorker = {})); - } -}(this, function (exports) { - // Use strict in our context only - users might not want it - 'use strict'; - -var pdfjsVersion = '1.6.210'; -var pdfjsBuild = '4ce2356'; - - var pdfjsFilePath = - typeof document !== 'undefined' && document.currentScript ? - document.currentScript.src : null; - - var pdfjsLibs = {}; - - (function pdfjsWrapper() { - - - -(function (root, factory) { - { - factory((root.pdfjsCoreArithmeticDecoder = {})); - } -}(this, function (exports) { - -/* This class implements the QM Coder decoding as defined in - * JPEG 2000 Part I Final Committee Draft Version 1.0 - * Annex C.3 Arithmetic decoding procedure - * available at http://www.jpeg.org/public/fcd15444-1.pdf - * - * The arithmetic decoder is used in conjunction with context models to decode - * JPEG2000 and JBIG2 streams. - */ -var ArithmeticDecoder = (function ArithmeticDecoderClosure() { - // Table C-2 - var QeTable = [ - {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1}, - {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0}, - {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0}, - {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0}, - {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0}, - {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0}, - {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1}, - {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0}, - {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0}, - {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0}, - {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0}, - {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0}, - {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0}, - {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0}, - {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1}, - {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0}, - {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0}, - {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0}, - {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0}, - {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0}, - {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0}, - {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0}, - {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0}, - {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0}, - {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0}, - {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0}, - {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0}, - {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0}, - {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0}, - {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0}, - {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0}, - {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0}, - {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0}, - {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0}, - {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0}, - {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0}, - {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0}, - {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0}, - {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0}, - {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0}, - {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0}, - {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0}, - {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0}, - {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0}, - {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0}, - {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0}, - {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0} - ]; - - // C.3.5 Initialisation of the decoder (INITDEC) - function ArithmeticDecoder(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - - this.chigh = data[start]; - this.clow = 0; - - this.byteIn(); - - this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F); - this.clow = (this.clow << 7) & 0xFFFF; - this.ct -= 7; - this.a = 0x8000; - } - - ArithmeticDecoder.prototype = { - // C.3.4 Compressed data input (BYTEIN) - byteIn: function ArithmeticDecoder_byteIn() { - var data = this.data; - var bp = this.bp; - if (data[bp] === 0xFF) { - var b1 = data[bp + 1]; - if (b1 > 0x8F) { - this.clow += 0xFF00; - this.ct = 8; - } else { - bp++; - this.clow += (data[bp] << 9); - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 0xFFFF) { - this.chigh += (this.clow >> 16); - this.clow &= 0xFFFF; - } - }, - // C.3.2 Decoding a decision (DECODE) - readBit: function ArithmeticDecoder_readBit(contexts, pos) { - // contexts are packed into 1 byte: - // highest 7 bits carry cx.index, lowest bit carries cx.mps - var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; - var qeTableIcx = QeTable[cx_index]; - var qeIcx = qeTableIcx.qe; - var d; - var a = this.a - qeIcx; - - if (this.chigh < qeIcx) { - // exchangeLps - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - // exchangeMps - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - // C.3.3 renormD; - do { - if (this.ct === 0) { - this.byteIn(); - } - - a <<= 1; - this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1); - this.clow = (this.clow << 1) & 0xFFFF; - this.ct--; - } while ((a & 0x8000) === 0); - this.a = a; - - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } - }; - - return ArithmeticDecoder; -})(); - -exports.ArithmeticDecoder = ArithmeticDecoder; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreBidi = {})); - } -}(this, function (exports) { - - // Character types for symbols from 0000 to 00FF. - var baseTypes = [ - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', - 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN', - 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON', - 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', - 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', - 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' - ]; - - // Character types for symbols from 0600 to 06FF - var arabicTypes = [ - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', - 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM', - 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL' - ]; - - function isOdd(i) { - return (i & 1) !== 0; - } - - function isEven(i) { - return (i & 1) === 0; - } - - function findUnequal(arr, start, value) { - for (var j = start, jj = arr.length; j < jj; ++j) { - if (arr[j] !== value) { - return j; - } - } - return j; - } - - function setValues(arr, start, end, value) { - for (var j = start; j < end; ++j) { - arr[j] = value; - } - } - - function reverseValues(arr, start, end) { - for (var i = start, j = end - 1; i < j; ++i, --j) { - var temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - } - - function createBidiText(str, isLTR, vertical) { - return { - str: str, - dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl')) - }; - } - - // These are used in bidi(), which is called frequently. We re-use them on - // each call to avoid unnecessary allocations. - var chars = []; - var types = []; - - function bidi(str, startLevel, vertical) { - var isLTR = true; - var strLength = str.length; - if (strLength === 0 || vertical) { - return createBidiText(str, isLTR, vertical); - } - - // Get types and fill arrays - chars.length = strLength; - types.length = strLength; - var numBidi = 0; - - var i, ii; - for (i = 0; i < strLength; ++i) { - chars[i] = str.charAt(i); - - var charCode = str.charCodeAt(i); - var charType = 'L'; - if (charCode <= 0x00ff) { - charType = baseTypes[charCode]; - } else if (0x0590 <= charCode && charCode <= 0x05f4) { - charType = 'R'; - } else if (0x0600 <= charCode && charCode <= 0x06ff) { - charType = arabicTypes[charCode & 0xff]; - } else if (0x0700 <= charCode && charCode <= 0x08AC) { - charType = 'AL'; - } - if (charType === 'R' || charType === 'AL' || charType === 'AN') { - numBidi++; - } - types[i] = charType; - } - - // Detect the bidi method - // - If there are no rtl characters then no bidi needed - // - If less than 30% chars are rtl then string is primarily ltr - // - If more than 30% chars are rtl then string is primarily rtl - if (numBidi === 0) { - isLTR = true; - return createBidiText(str, isLTR); - } - - if (startLevel === -1) { - if ((strLength / numBidi) < 0.3) { - isLTR = true; - startLevel = 0; - } else { - isLTR = false; - startLevel = 1; - } - } - - var levels = []; - for (i = 0; i < strLength; ++i) { - levels[i] = startLevel; - } - - /* - X1-X10: skip most of this, since we are NOT doing the embeddings. - */ - var e = (isOdd(startLevel) ? 'R' : 'L'); - var sor = e; - var eor = sor; - - /* - W1. Examine each non-spacing mark (NSM) in the level run, and change the - type of the NSM to the type of the previous character. If the NSM is at the - start of the level run, it will get the type of sor. - */ - var lastType = sor; - for (i = 0; i < strLength; ++i) { - if (types[i] === 'NSM') { - types[i] = lastType; - } else { - lastType = types[i]; - } - } - - /* - W2. Search backwards from each instance of a European number until the - first strong type (R, L, AL, or sor) is found. If an AL is found, change - the type of the European number to Arabic number. - */ - lastType = sor; - var t; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = (lastType === 'AL') ? 'AN' : 'EN'; - } else if (t === 'R' || t === 'L' || t === 'AL') { - lastType = t; - } - } - - /* - W3. Change all ALs to R. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'AL') { - types[i] = 'R'; - } - } - - /* - W4. A single European separator between two European numbers changes to a - European number. A single common separator between two numbers of the same - type changes to that type: - */ - for (i = 1; i < strLength - 1; ++i) { - if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') { - types[i] = 'EN'; - } - if (types[i] === 'CS' && - (types[i - 1] === 'EN' || types[i - 1] === 'AN') && - types[i + 1] === types[i - 1]) { - types[i] = types[i - 1]; - } - } - - /* - W5. A sequence of European terminators adjacent to European numbers changes - to all European numbers: - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'EN') { - // do before - var j; - for (j = i - 1; j >= 0; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - // do after - for (j = i + 1; j < strLength; ++j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - } - } - - /* - W6. Otherwise, separators and terminators change to Other Neutral: - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') { - types[i] = 'ON'; - } - } - - /* - W7. Search backwards from each instance of a European number until the - first strong type (R, L, or sor) is found. If an L is found, then change - the type of the European number to L. - */ - lastType = sor; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = ((lastType === 'L') ? 'L' : 'EN'); - } else if (t === 'R' || t === 'L') { - lastType = t; - } - } - - /* - N1. A sequence of neutrals takes the direction of the surrounding strong - text if the text on both sides has the same direction. European and Arabic - numbers are treated as though they were R. Start-of-level-run (sor) and - end-of-level-run (eor) are used at level run boundaries. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - var end = findUnequal(types, i + 1, 'ON'); - var before = sor; - if (i > 0) { - before = types[i - 1]; - } - - var after = eor; - if (end + 1 < strLength) { - after = types[end + 1]; - } - if (before !== 'L') { - before = 'R'; - } - if (after !== 'L') { - after = 'R'; - } - if (before === after) { - setValues(types, i, end, before); - } - i = end - 1; // reset to end (-1 so next iteration is ok) - } - } - - /* - N2. Any remaining neutrals take the embedding direction. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - types[i] = e; - } - } - - /* - I1. For all characters with an even (left-to-right) embedding direction, - those of type R go up one level and those of type AN or EN go up two - levels. - I2. For all characters with an odd (right-to-left) embedding direction, - those of type L, EN or AN go up one level. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (isEven(levels[i])) { - if (t === 'R') { - levels[i] += 1; - } else if (t === 'AN' || t === 'EN') { - levels[i] += 2; - } - } else { // isOdd - if (t === 'L' || t === 'AN' || t === 'EN') { - levels[i] += 1; - } - } - } - - /* - L1. On each line, reset the embedding level of the following characters to - the paragraph embedding level: - - segment separators, - paragraph separators, - any sequence of whitespace characters preceding a segment separator or - paragraph separator, and any sequence of white space characters at the end - of the line. - */ - - // don't bother as text is only single line - - /* - L2. From the highest level found in the text to the lowest odd level on - each line, reverse any contiguous sequence of characters that are at that - level or higher. - */ - - // find highest level & lowest odd level - var highestLevel = -1; - var lowestOddLevel = 99; - var level; - for (i = 0, ii = levels.length; i < ii; ++i) { - level = levels[i]; - if (highestLevel < level) { - highestLevel = level; - } - if (lowestOddLevel > level && isOdd(level)) { - lowestOddLevel = level; - } - } - - // now reverse between those limits - for (level = highestLevel; level >= lowestOddLevel; --level) { - // find segments to reverse - var start = -1; - for (i = 0, ii = levels.length; i < ii; ++i) { - if (levels[i] < level) { - if (start >= 0) { - reverseValues(chars, start, i); - start = -1; - } - } else if (start < 0) { - start = i; - } - } - if (start >= 0) { - reverseValues(chars, start, levels.length); - } - } - - /* - L3. Combining marks applied to a right-to-left base character will at this - point precede their base character. If the rendering engine expects them to - follow the base characters in the final display process, then the ordering - of the marks and the base character must be reversed. - */ - - // don't bother for now - - /* - L4. A character that possesses the mirrored property as specified by - Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved - directionality of that character is R. - */ - - // don't mirror as characters are already mirrored in the pdf - - // Finally, return string - for (i = 0, ii = chars.length; i < ii; ++i) { - var ch = chars[i]; - if (ch === '<' || ch === '>') { - chars[i] = ''; - } - } - return createBidiText(chars.join(''), isLTR); - } - -exports.bidi = bidi; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCharsets = {})); - } -}(this, function (exports) { - -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' -]; - -exports.ISOAdobeCharset = ISOAdobeCharset; -exports.ExpertCharset = ExpertCharset; -exports.ExpertSubsetCharset = ExpertSubsetCharset; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreEncodings = {})); - } -}(this, function (exports) { - - var ExpertEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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 MacExpertEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', - 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', - 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', - 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', - 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', - 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', - 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', - 'Circumflexsmall', 'hypheninferior', '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', '', '', 'asuperior', 'centsuperior', '', '', '', '', - 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', - 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', - 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', - 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', - 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', - 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', - 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', - 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', - 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', - 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', - 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', - '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', - 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', - 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', - 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', - 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', - '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', - 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', - 'periodsuperior', 'Dotaccentsmall', 'Ringsmall']; - - var MacRomanEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', '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', 'grave', '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', '', - 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', - 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', - 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', - 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', - 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', - 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', - 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', - 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', - 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', - 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', - 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', - 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', - 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', - 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', - 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', - 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', - 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', - 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', - 'ogonek', 'caron']; - - var StandardEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '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']; - - var WinAnsiEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', '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', 'grave', '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', - 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', - 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', - 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', - 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', - 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', - 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', - 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', - 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', - 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', - 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', - 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', - 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', - 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', - 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', - 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', - 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', - 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', - 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', - 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', - 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', - 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', - 'ydieresis']; - - var SymbolSetEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', - 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', - 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', - 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', - 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', - 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', - 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', - 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', - 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', - 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', - 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', - 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', - 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', - 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', - 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', - 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', - 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', - 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', - 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', - 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', - 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', - 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', - 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', - 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', - 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', - 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', - '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', - 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', - 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', - 'bracerightbt']; - - var ZapfDingbatsEncoding = [ - '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', - 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', - 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', - 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', - 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', - 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', - 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', - 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', - 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', - 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', - 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', - 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', - 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', - 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', - 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', - 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', - 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', - 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', - 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', - 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', - 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191']; - - function getEncoding(encodingName) { - switch (encodingName) { - case 'WinAnsiEncoding': - return WinAnsiEncoding; - case 'StandardEncoding': - return StandardEncoding; - case 'MacRomanEncoding': - return MacRomanEncoding; - case 'SymbolSetEncoding': - return SymbolSetEncoding; - case 'ZapfDingbatsEncoding': - return ZapfDingbatsEncoding; - case 'ExpertEncoding': - return ExpertEncoding; - case 'MacExpertEncoding': - return MacExpertEncoding; - default: - return null; - } - } - - exports.WinAnsiEncoding = WinAnsiEncoding; - exports.StandardEncoding = StandardEncoding; - exports.MacRomanEncoding = MacRomanEncoding; - exports.SymbolSetEncoding = SymbolSetEncoding; - exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding; - exports.ExpertEncoding = ExpertEncoding; - exports.getEncoding = getEncoding; -})); - - -(function (root, factory) { - { - factory((root.pdfjsSharedUtil = {})); - } -}(this, function (exports) { - -var globalScope = (typeof window !== 'undefined') ? window : - (typeof global !== 'undefined') ? global : - (typeof self !== 'undefined') ? self : this; - -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 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationFieldFlag = { - READONLY: 0x0000001, - REQUIRED: 0x0000002, - NOEXPORT: 0x0000004, - MULTILINE: 0x0001000, - PASSWORD: 0x0002000, - NOTOGGLETOOFF: 0x0004000, - RADIO: 0x0008000, - PUSHBUTTON: 0x0010000, - COMBO: 0x0020000, - EDIT: 0x0040000, - SORT: 0x0080000, - FILESELECT: 0x0100000, - MULTISELECT: 0x0200000, - DONOTSPELLCHECK: 0x0400000, - DONOTSCROLL: 0x0800000, - COMB: 0x1000000, - RICHTEXT: 0x2000000, - RADIOSINUNISON: 0x2000000, - COMMITONSELCHANGE: 0x4000000, -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -var VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -var verbosity = VERBOSITY_LEVELS.warnings; - -function setVerbosityLevel(level) { - verbosity = level; -} - -function getVerbosityLevel() { - return verbosity; -} - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (verbosity >= VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (verbosity >= VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- display regardless of the PDFJS.verbosity setting. -function deprecated(details) { - console.log('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (verbosity >= VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Checks if URLs have the same origin. For non-HTTP based URLs, returns false. -function isSameOrigin(baseUrl, otherUrl) { - try { - var base = new URL(baseUrl); - if (!base.origin || base.origin === 'null') { - return false; // non-HTTP url - } - } catch (e) { - return false; - } - - var other = new URL(otherUrl, base); - return base.origin === other.origin; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url || typeof url !== 'string') { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} - -function getLookupTableFactory(initializer) { - var lookup; - return function () { - if (initializer) { - lookup = Object.create(null); - initializer(lookup); - initializer = null; - } - return lookup; - }; -} - -var PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - -var NullCharactersRegExp = /\x00/g; - -function removeNullCharacters(str) { - if (typeof str !== 'string') { - warn('The argument for removeNullCharacters must be a string.'); - return str; - } - return str.replace(NullCharactersRegExp, ''); -} - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -/** - * Gets length of the array (Array, Uint8Array, or string) in bytes. - * @param {Array|Uint8Array|string} arr - * @returns {number} - */ -function arrayByteLength(arr) { - if (arr.length !== undefined) { - return arr.length; - } - assert(arr.byteLength !== undefined); - return arr.byteLength; -} - -/** - * Combines array items (arrays) into single Uint8Array object. - * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string). - * @returns {Uint8Array} - */ -function arraysToBytes(arr) { - // Shortcut: if first and only item is Uint8Array, return it. - if (arr.length === 1 && (arr[0] instanceof Uint8Array)) { - return arr[0]; - } - var resultLength = 0; - var i, ii = arr.length; - var item, itemLength ; - for (i = 0; i < ii; i++) { - item = arr[i]; - itemLength = arrayByteLength(item); - resultLength += itemLength; - } - var pos = 0; - var data = new Uint8Array(resultLength); - for (i = 0; i < ii; i++) { - item = arr[i]; - if (!(item instanceof Uint8Array)) { - if (typeof item === 'string') { - item = stringToBytes(item); - } else { - item = new Uint8Array(item); - } - } - itemLength = item.byteLength; - data.set(item, pos); - pos += itemLength; - } - return data; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -// Checks if it's possible to eval JS expressions. -function isEvalSupported() { - try { - /* jshint evil: true */ - new Function(''); - return true; - } catch (e) { - return false; - } -} - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -exports.Uint32ArrayView = Uint32ArrayView; - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - var ROMAN_NUMBER_MAP = [ - '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', - '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', - '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' - ]; - /** - * Converts positive integers to (upper case) Roman numerals. - * @param {integer} number - The number that should be converted. - * @param {boolean} lowerCase - Indicates if the result should be converted - * to lower case letters. The default is false. - * @return {string} The resulting Roman number. - */ - Util.toRoman = function Util_toRoman(number, lowerCase) { - assert(isInt(number) && number > 0, - 'The number should be a positive integer.'); - var pos, romanBuf = []; - // Thousands - while (number >= 1000) { - number -= 1000; - romanBuf.push('M'); - } - // Hundreds - pos = (number / 100) | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - // Tens - pos = (number / 10) | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - // Ones - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - - var romanStr = romanBuf.join(''); - return (lowerCase ? romanStr.toLowerCase() : romanStr); - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - 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; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PageViewport - */ -var PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isArray(v) { - return v instanceof Array; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -// Checks if ch is one of the following characters: SPACE, TAB, CR or LF. -function isSpace(ch) { - return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fulfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libraries are: - * - There currently isn't a separate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} promises array of data and/or promises to wait for. - * @return {Promise} New dependent promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -(function WeakMapClosure() { - if (globalScope.WeakMap) { - return; - } - - var id = 0; - function WeakMap() { - this.id = '$weakmap' + (id++); - } - WeakMap.prototype = { - has: function(obj) { - return !!Object.getOwnPropertyDescriptor(obj, this.id); - }, - get: function(obj, defaultValue) { - return this.has(obj) ? obj[this.id] : defaultValue; - }, - set: function(obj, value) { - Object.defineProperty(obj, this.id, { - value: value, - enumerable: false, - configurable: true - }); - }, - delete: function(obj) { - delete obj[this.id]; - } - }; - - globalScope.WeakMap = WeakMap; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = Object.create(null); - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -var createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - return new Blob([data], { type: contentType }); - } - warn('The "Blob" constructor is not supported.'); -}; - -var createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType, forceDataSchema) { - if (!forceDataSchema && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = Object.create(null); - var ah = this.actionHandler = Object.create(null); - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - // feature detect for URL constructor - var hasWorkingUrl = false; - try { - if (typeof URL === 'function' && - typeof URL.prototype === 'object' && - ('origin' in URL.prototype)) { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } - } catch(e) { } - - if (hasWorkingUrl) { - return; - } - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' === h) { - invalid.call(this); - } - // XXX - return h.toLowerCase(); - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF, ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message); - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] !== EOF || cursor === 0) && - !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' === c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' === this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && - base._scheme === this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF === c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c); - break loop; - } - break; - - case 'scheme data': - if ('?' === c) { - this._query = '?'; - state = 'query'; - } else if ('#' === c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' === c && '/' === input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue; - } - break; - - case 'relative': - this._isRelative = true; - if ('file' !== this._scheme) { - this._scheme = base._scheme; - } - if (EOF === c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' === c || '\\' === c) { - if ('\\' === c) { - err('\\ is an invalid code point.'); - } - state = 'relative slash'; - } else if ('?' === c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' === c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1]; - var nextNextC = input[cursor+2]; - if ('file' !== this._scheme || !ALPHA.test(c) || - (nextC !== ':' && nextC !== '|') || - (EOF !== nextNextC && '/' !== nextNextC && '\\' !== nextNextC && - '?' !== nextNextC && '#' !== nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' === c || '\\' === c) { - if ('\\' === c) { - err('\\ is an invalid code point.'); - } - if ('file' === this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' !== this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' === c) { - state = 'authority second slash'; - } else { - err('Expected \'/\', got: ' + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' !== c) { - err('Expected \'/\', got: ' + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' !== c && '\\' !== c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' === c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' === cp || '\n' === cp || '\r' === cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' === cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - if (null !== this._password) { - this._password += tempC; - } else { - this._username += tempC; - } - } - buffer = ''; - } else if (EOF === c || '/' === c || '\\' === c || - '?' === c || '#' === c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF === c || '/' === c || '\\' === c || '?' === c || '#' === c) { - if (buffer.length === 2 && ALPHA.test(buffer[0]) && - (buffer[1] === ':' || buffer[1] === '|')) { - state = 'relative path'; - } else if (buffer.length === 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' === c || '\n' === c || '\r' === c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' === c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' === stateOverride) { - break loop; - } - } else if (EOF === c || '/' === c || - '\\' === c || '?' === c || '#' === c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' !== c && '\n' !== c && '\r' !== c) { - if ('[' === c) { - seenBracket = true; - } else if (']' === c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF === c || '/' === c || '\\' === c || - '?' === c || '#' === c || stateOverride) { - if ('' !== buffer) { - var temp = parseInt(buffer, 10); - if (temp !== relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' === c || '\n' === c || '\r' === c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' === c) { - err('\'\\\' not allowed in path.'); - } - state = 'relative path'; - if ('/' !== c && '\\' !== c) { - continue; - } - break; - - case 'relative path': - if (EOF === c || '/' === c || '\\' === c || - (!stateOverride && ('?' === c || '#' === c))) { - if ('\\' === c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' === buffer) { - this._path.pop(); - if ('/' !== c && '\\' !== c) { - this._path.push(''); - } - } else if ('.' === buffer && '/' !== c && '\\' !== c) { - this._path.push(''); - } else if ('.' !== buffer) { - if ('file' === this._scheme && this._path.length === 0 && - buffer.length === 2 && ALPHA.test(buffer[0]) && - buffer[1] === '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' === c) { - this._query = '?'; - state = 'query'; - } else if ('#' === c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' !== c && '\n' !== c && '\r' !== c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' === c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF !== c && '\t' !== c && '\n' !== c && '\r' !== c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function JURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof JURL)) { - base = new JURL(String(base)); - } - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - JURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) { - return this._url; - } - var authority = ''; - if ('' !== this._username || null !== this._password) { - authority = this._username + - (null !== this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) { - return; - } - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) { - return; - } - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) { - return; - } - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) { - return; - } - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) { - return; - } - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' === this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) { - return; - } - this._query = '?'; - if ('?' === search[0]) { - search = search.slice(1); - } - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' === this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) { - return; - } - this._fragment = '#'; - if ('#' === hash[0]) { - hash = hash.slice(1); - } - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - JURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - JURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = JURL; -})(globalScope); - -exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; -exports.IDENTITY_MATRIX = IDENTITY_MATRIX; -exports.OPS = OPS; -exports.VERBOSITY_LEVELS = VERBOSITY_LEVELS; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; -exports.AnnotationBorderStyleType = AnnotationBorderStyleType; -exports.AnnotationFieldFlag = AnnotationFieldFlag; -exports.AnnotationFlag = AnnotationFlag; -exports.AnnotationType = AnnotationType; -exports.FontType = FontType; -exports.ImageKind = ImageKind; -exports.InvalidPDFException = InvalidPDFException; -exports.MessageHandler = MessageHandler; -exports.MissingDataException = MissingDataException; -exports.MissingPDFException = MissingPDFException; -exports.NotImplementedException = NotImplementedException; -exports.PageViewport = PageViewport; -exports.PasswordException = PasswordException; -exports.PasswordResponses = PasswordResponses; -exports.StatTimer = StatTimer; -exports.StreamType = StreamType; -exports.TextRenderingMode = TextRenderingMode; -exports.UnexpectedResponseException = UnexpectedResponseException; -exports.UnknownErrorException = UnknownErrorException; -exports.Util = Util; -exports.XRefParseException = XRefParseException; -exports.arrayByteLength = arrayByteLength; -exports.arraysToBytes = arraysToBytes; -exports.assert = assert; -exports.bytesToString = bytesToString; -exports.createBlob = createBlob; -exports.createPromiseCapability = createPromiseCapability; -exports.createObjectURL = createObjectURL; -exports.deprecated = deprecated; -exports.error = error; -exports.getLookupTableFactory = getLookupTableFactory; -exports.getVerbosityLevel = getVerbosityLevel; -exports.globalScope = globalScope; -exports.info = info; -exports.isArray = isArray; -exports.isArrayBuffer = isArrayBuffer; -exports.isBool = isBool; -exports.isEmptyObj = isEmptyObj; -exports.isInt = isInt; -exports.isNum = isNum; -exports.isString = isString; -exports.isSpace = isSpace; -exports.isSameOrigin = isSameOrigin; -exports.isValidUrl = isValidUrl; -exports.isLittleEndian = isLittleEndian; -exports.isEvalSupported = isEvalSupported; -exports.loadJpegStream = loadJpegStream; -exports.log2 = log2; -exports.readInt8 = readInt8; -exports.readUint16 = readUint16; -exports.readUint32 = readUint32; -exports.removeNullCharacters = removeNullCharacters; -exports.setVerbosityLevel = setVerbosityLevel; -exports.shadow = shadow; -exports.string32 = string32; -exports.stringToBytes = stringToBytes; -exports.stringToPDFString = stringToPDFString; -exports.stringToUTF8String = stringToUTF8String; -exports.utf8StringToString = utf8StringToString; -exports.warn = warn; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCFFParser = {}), root.pdfjsSharedUtil, - root.pdfjsCoreCharsets, root.pdfjsCoreEncodings); - } -}(this, function (exports, sharedUtil, coreCharsets, coreEncodings) { - -var error = sharedUtil.error; -var info = sharedUtil.info; -var bytesToString = sharedUtil.bytesToString; -var warn = sharedUtil.warn; -var isArray = sharedUtil.isArray; -var Util = sharedUtil.Util; -var stringToBytes = sharedUtil.stringToBytes; -var assert = sharedUtil.assert; -var ISOAdobeCharset = coreCharsets.ISOAdobeCharset; -var ExpertCharset = coreCharsets.ExpertCharset; -var ExpertSubsetCharset = coreCharsets.ExpertSubsetCharset; -var StandardEncoding = coreEncodings.StandardEncoding; -var ExpertEncoding = coreEncodings.ExpertEncoding; - -// Maximum subroutine call depth of type 2 chartrings. Matches OTS. -var MAX_SUBR_NESTING = 10; - -/** - * The CFF class takes a Type1 file and wrap it into a - * 'Compact Font Format' which itself embed Type2 charstrings. - */ -var CFFStandardStrings = [ - '.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', 'exclamsmall', - 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', - 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', - 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', - 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', - 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', - 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', - 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', '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', 'questiondownsmall', 'oneeighth', - 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', - 'zerosuperior', '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', '001.000', '001.001', '001.002', '001.003', - 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold' -]; - - -var CFFParser = (function CFFParserClosure() { - var CharstringValidationData = [ - null, - { id: 'hstem', min: 2, stackClearing: true, stem: true }, - null, - { id: 'vstem', min: 2, stackClearing: true, stem: true }, - { id: 'vmoveto', min: 1, stackClearing: true }, - { id: 'rlineto', min: 2, resetStack: true }, - { id: 'hlineto', min: 1, resetStack: true }, - { id: 'vlineto', min: 1, resetStack: true }, - { id: 'rrcurveto', min: 6, resetStack: true }, - null, - { id: 'callsubr', min: 1, undefStack: true }, - { id: 'return', min: 0, undefStack: true }, - null, // 12 - null, - { id: 'endchar', min: 0, stackClearing: true }, - null, - null, - null, - { id: 'hstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'hintmask', min: 0, stackClearing: true }, - { id: 'cntrmask', min: 0, stackClearing: true }, - { id: 'rmoveto', min: 2, stackClearing: true }, - { id: 'hmoveto', min: 1, stackClearing: true }, - { id: 'vstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'rcurveline', min: 8, resetStack: true }, - { id: 'rlinecurve', min: 8, resetStack: true }, - { id: 'vvcurveto', min: 4, resetStack: true }, - { id: 'hhcurveto', min: 4, resetStack: true }, - null, // shortint - { id: 'callgsubr', min: 1, undefStack: true }, - { id: 'vhcurveto', min: 4, resetStack: true }, - { id: 'hvcurveto', min: 4, resetStack: true } - ]; - var CharstringValidationData12 = [ - null, - null, - null, - { id: 'and', min: 2, stackDelta: -1 }, - { id: 'or', min: 2, stackDelta: -1 }, - { id: 'not', min: 1, stackDelta: 0 }, - null, - null, - null, - { id: 'abs', min: 1, stackDelta: 0 }, - { id: 'add', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] + stack[index - 1]; - } - }, - { id: 'sub', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] - stack[index - 1]; - } - }, - { id: 'div', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] / stack[index - 1]; - } - }, - null, - { id: 'neg', min: 1, stackDelta: 0, - stackFn: function stack_div(stack, index) { - stack[index - 1] = -stack[index - 1]; - } - }, - { id: 'eq', min: 2, stackDelta: -1 }, - null, - null, - { id: 'drop', min: 1, stackDelta: -1 }, - null, - { id: 'put', min: 2, stackDelta: -2 }, - { id: 'get', min: 1, stackDelta: 0 }, - { id: 'ifelse', min: 4, stackDelta: -3 }, - { id: 'random', min: 0, stackDelta: 1 }, - { id: 'mul', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] * stack[index - 1]; - } - }, - null, - { id: 'sqrt', min: 1, stackDelta: 0 }, - { id: 'dup', min: 1, stackDelta: 1 }, - { id: 'exch', min: 2, stackDelta: 0 }, - { id: 'index', min: 2, stackDelta: 0 }, - { id: 'roll', min: 3, stackDelta: -2 }, - null, - null, - null, - { id: 'hflex', min: 7, resetStack: true }, - { id: 'flex', min: 13, resetStack: true }, - { id: 'hflex1', min: 9, resetStack: true }, - { id: 'flex1', min: 11, resetStack: true } - ]; - - function CFFParser(file, properties, seacAnalysisEnabled) { - this.bytes = file.getBytes(); - this.properties = properties; - this.seacAnalysisEnabled = !!seacAnalysisEnabled; - } - CFFParser.prototype = { - parse: function CFFParser_parse() { - var properties = this.properties; - var cff = new CFF(); - this.cff = cff; - - // The first five sections must be in order, all the others are reached - // via offsets contained in one of the below. - var header = this.parseHeader(); - var nameIndex = this.parseIndex(header.endPos); - var topDictIndex = this.parseIndex(nameIndex.endPos); - var stringIndex = this.parseIndex(topDictIndex.endPos); - var globalSubrIndex = this.parseIndex(stringIndex.endPos); - - var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); - var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); - - cff.header = header.obj; - cff.names = this.parseNameIndex(nameIndex.obj); - cff.strings = this.parseStringIndex(stringIndex.obj); - cff.topDict = topDict; - cff.globalSubrIndex = globalSubrIndex.obj; - - this.parsePrivateDict(cff.topDict); - - cff.isCIDFont = topDict.hasName('ROS'); - - var charStringOffset = topDict.getByName('CharStrings'); - var charStringIndex = this.parseIndex(charStringOffset).obj; - - var fontMatrix = topDict.getByName('FontMatrix'); - if (fontMatrix) { - properties.fontMatrix = fontMatrix; - } - - var fontBBox = topDict.getByName('FontBBox'); - if (fontBBox) { - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - } - - var charset, encoding; - if (cff.isCIDFont) { - var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; - for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { - var dictRaw = fdArrayIndex.get(i); - var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), - cff.strings); - this.parsePrivateDict(fontDict); - cff.fdArray.push(fontDict); - } - // cid fonts don't have an encoding - encoding = null; - charset = this.parseCharsets(topDict.getByName('charset'), - charStringIndex.count, cff.strings, true); - cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), - charStringIndex.count); - } else { - charset = this.parseCharsets(topDict.getByName('charset'), - charStringIndex.count, cff.strings, false); - encoding = this.parseEncoding(topDict.getByName('Encoding'), - properties, - cff.strings, charset.charset); - } - - cff.charset = charset; - cff.encoding = encoding; - - var charStringsAndSeacs = this.parseCharStrings( - charStringIndex, - topDict.privateDict.subrsIndex, - globalSubrIndex.obj, - cff.fdSelect, - cff.fdArray); - cff.charStrings = charStringsAndSeacs.charStrings; - cff.seacs = charStringsAndSeacs.seacs; - cff.widths = charStringsAndSeacs.widths; - - return cff; - }, - parseHeader: function CFFParser_parseHeader() { - var bytes = this.bytes; - var bytesLength = bytes.length; - var offset = 0; - - // Prevent an infinite loop, by checking that the offset is within the - // bounds of the bytes array. Necessary in empty, or invalid, font files. - while (offset < bytesLength && bytes[offset] !== 1) { - ++offset; - } - if (offset >= bytesLength) { - error('Invalid CFF header'); - } else if (offset !== 0) { - info('cff data is shifted'); - bytes = bytes.subarray(offset); - this.bytes = bytes; - } - var major = bytes[0]; - var minor = bytes[1]; - var hdrSize = bytes[2]; - var offSize = bytes[3]; - var header = new CFFHeader(major, minor, hdrSize, offSize); - return { obj: header, endPos: hdrSize }; - }, - parseDict: function CFFParser_parseDict(dict) { - var pos = 0; - - function parseOperand() { - var value = dict[pos++]; - if (value === 30) { - return parseFloatOperand(); - } else if (value === 28) { - value = dict[pos++]; - value = ((value << 24) | (dict[pos++] << 16)) >> 16; - return value; - } else if (value === 29) { - value = dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - return value; - } else if (value >= 32 && value <= 246) { - return value - 139; - } else if (value >= 247 && value <= 250) { - return ((value - 247) * 256) + dict[pos++] + 108; - } else if (value >= 251 && value <= 254) { - return -((value - 251) * 256) - dict[pos++] - 108; - } else { - error('255 is not a valid DICT command'); - } - return -1; - } - - function parseFloatOperand() { - var str = ''; - var eof = 15; - var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', - '9', '.', 'E', 'E-', null, '-']; - var length = dict.length; - while (pos < length) { - var b = dict[pos++]; - var b1 = b >> 4; - var b2 = b & 15; - - if (b1 === eof) { - break; - } - str += lookup[b1]; - - if (b2 === eof) { - break; - } - str += lookup[b2]; - } - return parseFloat(str); - } - - var operands = []; - var entries = []; - - pos = 0; - var end = dict.length; - while (pos < end) { - var b = dict[pos]; - if (b <= 21) { - if (b === 12) { - b = (b << 8) | dict[++pos]; - } - entries.push([b, operands]); - operands = []; - ++pos; - } else { - operands.push(parseOperand()); - } - } - return entries; - }, - parseIndex: function CFFParser_parseIndex(pos) { - var cffIndex = new CFFIndex(); - var bytes = this.bytes; - var count = (bytes[pos++] << 8) | bytes[pos++]; - var offsets = []; - var end = pos; - var i, ii; - - if (count !== 0) { - var offsetSize = bytes[pos++]; - // add 1 for offset to determine size of last object - var startPos = pos + ((count + 1) * offsetSize) - 1; - - for (i = 0, ii = count + 1; i < ii; ++i) { - var offset = 0; - for (var j = 0; j < offsetSize; ++j) { - offset <<= 8; - offset += bytes[pos++]; - } - offsets.push(startPos + offset); - } - end = offsets[count]; - } - for (i = 0, ii = offsets.length - 1; i < ii; ++i) { - var offsetStart = offsets[i]; - var offsetEnd = offsets[i + 1]; - cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); - } - return {obj: cffIndex, endPos: end}; - }, - parseNameIndex: function CFFParser_parseNameIndex(index) { - var names = []; - for (var i = 0, ii = index.count; i < ii; ++i) { - var name = index.get(i); - // OTS doesn't allow names to be over 127 characters. - var length = Math.min(name.length, 127); - var data = []; - // OTS also only permits certain characters in the name. - for (var j = 0; j < length; ++j) { - var c = name[j]; - if (j === 0 && c === 0) { - data[j] = c; - continue; - } - if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ || - c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ || - c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ || - c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) { - data[j] = 95; - continue; - } - data[j] = c; - } - names.push(bytesToString(data)); - } - return names; - }, - parseStringIndex: function CFFParser_parseStringIndex(index) { - var strings = new CFFStrings(); - for (var i = 0, ii = index.count; i < ii; ++i) { - var data = index.get(i); - strings.add(bytesToString(data)); - } - return strings; - }, - createDict: function CFFParser_createDict(Type, dict, strings) { - var cffDict = new Type(strings); - for (var i = 0, ii = dict.length; i < ii; ++i) { - var pair = dict[i]; - var key = pair[0]; - var value = pair[1]; - cffDict.setByKey(key, value); - } - return cffDict; - }, - parseCharString: function CFFParser_parseCharString(state, data, - localSubrIndex, - globalSubrIndex) { - if (state.callDepth > MAX_SUBR_NESTING) { - return false; - } - var stackSize = state.stackSize; - var stack = state.stack; - - var length = data.length; - - for (var j = 0; j < length;) { - var value = data[j++]; - var validationCommand = null; - if (value === 12) { - var q = data[j++]; - if (q === 0) { - // The CFF specification state that the 'dotsection' command - // (12, 0) is deprecated and treated as a no-op, but all Type2 - // charstrings processors should support them. Unfortunately - // the font sanitizer don't. As a workaround the sequence (12, 0) - // is replaced by a useless (0, hmoveto). - data[j - 2] = 139; - data[j - 1] = 22; - stackSize = 0; - } else { - validationCommand = CharstringValidationData12[q]; - } - } else if (value === 28) { // number (16 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16; - j += 2; - stackSize++; - } else if (value === 14) { - if (stackSize >= 4) { - stackSize -= 4; - if (this.seacAnalysisEnabled) { - state.seac = stack.slice(stackSize, stackSize + 4); - return false; - } - } - validationCommand = CharstringValidationData[value]; - } else if (value >= 32 && value <= 246) { // number - stack[stackSize] = value - 139; - stackSize++; - } else if (value >= 247 && value <= 254) { // number (+1 bytes) - stack[stackSize] = (value < 251 ? - ((value - 247) << 8) + data[j] + 108 : - -((value - 251) << 8) - data[j] - 108); - j++; - stackSize++; - } else if (value === 255) { // number (32 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) | - (data[j + 2] << 8) | data[j + 3]) / 65536; - j += 4; - stackSize++; - } else if (value === 19 || value === 20) { - state.hints += stackSize >> 1; - // skipping right amount of hints flag data - j += (state.hints + 7) >> 3; - stackSize %= 2; - validationCommand = CharstringValidationData[value]; - } else if (value === 10 || value === 29) { - var subrsIndex; - if (value === 10) { - subrsIndex = localSubrIndex; - } else { - subrsIndex = globalSubrIndex; - } - if (!subrsIndex) { - validationCommand = CharstringValidationData[value]; - warn('Missing subrsIndex for ' + validationCommand.id); - return false; - } - var bias = 32768; - if (subrsIndex.count < 1240) { - bias = 107; - } else if (subrsIndex.count < 33900) { - bias = 1131; - } - var subrNumber = stack[--stackSize] + bias; - if (subrNumber < 0 || subrNumber >= subrsIndex.count) { - validationCommand = CharstringValidationData[value]; - warn('Out of bounds subrIndex for ' + validationCommand.id); - return false; - } - state.stackSize = stackSize; - state.callDepth++; - var valid = this.parseCharString(state, subrsIndex.get(subrNumber), - localSubrIndex, globalSubrIndex); - if (!valid) { - return false; - } - state.callDepth--; - stackSize = state.stackSize; - continue; - } else if (value === 11) { - state.stackSize = stackSize; - return true; - } else { - validationCommand = CharstringValidationData[value]; - } - if (validationCommand) { - if (validationCommand.stem) { - state.hints += stackSize >> 1; - } - if ('min' in validationCommand) { - if (!state.undefStack && stackSize < validationCommand.min) { - warn('Not enough parameters for ' + validationCommand.id + - '; actual: ' + stackSize + - ', expected: ' + validationCommand.min); - return false; - } - } - if (state.firstStackClearing && validationCommand.stackClearing) { - state.firstStackClearing = false; - // the optional character width can be found before the first - // stack-clearing command arguments - stackSize -= validationCommand.min; - if (stackSize >= 2 && validationCommand.stem) { - // there are even amount of arguments for stem commands - stackSize %= 2; - } else if (stackSize > 1) { - warn('Found too many parameters for stack-clearing command'); - } - if (stackSize > 0 && stack[stackSize - 1] >= 0) { - state.width = stack[stackSize - 1]; - } - } - if ('stackDelta' in validationCommand) { - if ('stackFn' in validationCommand) { - validationCommand.stackFn(stack, stackSize); - } - stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - state.undefStack = false; - } else if (validationCommand.undefStack) { - stackSize = 0; - state.undefStack = true; - state.firstStackClearing = false; - } - } - } - state.stackSize = stackSize; - return true; - }, - parseCharStrings: function CFFParser_parseCharStrings(charStrings, - localSubrIndex, - globalSubrIndex, - fdSelect, - fdArray) { - var seacs = []; - var widths = []; - var count = charStrings.count; - for (var i = 0; i < count; i++) { - var charstring = charStrings.get(i); - var state = { - callDepth: 0, - stackSize: 0, - stack: [], - undefStack: true, - hints: 0, - firstStackClearing: true, - seac: null, - width: null - }; - var valid = true; - var localSubrToUse = null; - if (fdSelect && fdArray.length) { - var fdIndex = fdSelect.getFDIndex(i); - if (fdIndex === -1) { - warn('Glyph index is not in fd select.'); - valid = false; - } - if (fdIndex >= fdArray.length) { - warn('Invalid fd index for glyph index.'); - valid = false; - } - if (valid) { - localSubrToUse = fdArray[fdIndex].privateDict.subrsIndex; - } - } else if (localSubrIndex) { - localSubrToUse = localSubrIndex; - } - if (valid) { - valid = this.parseCharString(state, charstring, localSubrToUse, - globalSubrIndex); - } - if (state.width !== null) { - widths[i] = state.width; - } - if (state.seac !== null) { - seacs[i] = state.seac; - } - if (!valid) { - // resetting invalid charstring to single 'endchar' - charStrings.set(i, new Uint8Array([14])); - } - } - return { charStrings: charStrings, seacs: seacs, widths: widths }; - }, - emptyPrivateDictionary: - function CFFParser_emptyPrivateDictionary(parentDict) { - var privateDict = this.createDict(CFFPrivateDict, [], - parentDict.strings); - parentDict.setByKey(18, [0, 0]); - parentDict.privateDict = privateDict; - }, - parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { - // no private dict, do nothing - if (!parentDict.hasName('Private')) { - this.emptyPrivateDictionary(parentDict); - return; - } - var privateOffset = parentDict.getByName('Private'); - // make sure the params are formatted correctly - if (!isArray(privateOffset) || privateOffset.length !== 2) { - parentDict.removeByName('Private'); - return; - } - var size = privateOffset[0]; - var offset = privateOffset[1]; - // remove empty dicts or ones that refer to invalid location - if (size === 0 || offset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - - var privateDictEnd = offset + size; - var dictData = this.bytes.subarray(offset, privateDictEnd); - var dict = this.parseDict(dictData); - var privateDict = this.createDict(CFFPrivateDict, dict, - parentDict.strings); - parentDict.privateDict = privateDict; - - // Parse the Subrs index also since it's relative to the private dict. - if (!privateDict.getByName('Subrs')) { - return; - } - var subrsOffset = privateDict.getByName('Subrs'); - var relativeOffset = offset + subrsOffset; - // Validate the offset. - if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - var subrsIndex = this.parseIndex(relativeOffset); - privateDict.subrsIndex = subrsIndex.obj; - }, - parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { - if (pos === 0) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, - ISOAdobeCharset); - } else if (pos === 1) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, - ExpertCharset); - } else if (pos === 2) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, - ExpertSubsetCharset); - } - - var bytes = this.bytes; - var start = pos; - var format = bytes[pos++]; - var charset = ['.notdef']; - var id, count, i; - - // subtract 1 for the .notdef glyph - length -= 1; - - switch (format) { - case 0: - for (i = 0; i < length; i++) { - id = (bytes[pos++] << 8) | bytes[pos++]; - charset.push(cid ? id : strings.get(id)); - } - break; - case 1: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - case 2: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - default: - error('Unknown charset format'); - } - // Raw won't be needed if we actually compile the charset. - var end = pos; - var raw = bytes.subarray(start, end); - - return new CFFCharset(false, format, charset, raw); - }, - parseEncoding: function CFFParser_parseEncoding(pos, - properties, - strings, - charset) { - var encoding = Object.create(null); - var bytes = this.bytes; - var predefined = false; - var hasSupplement = false; - var format, i, ii; - var raw = null; - - function readSupplement() { - var supplementsCount = bytes[pos++]; - for (i = 0; i < supplementsCount; i++) { - var code = bytes[pos++]; - var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); - encoding[code] = charset.indexOf(strings.get(sid)); - } - } - - if (pos === 0 || pos === 1) { - predefined = true; - format = pos; - var baseEncoding = pos ? ExpertEncoding : StandardEncoding; - for (i = 0, ii = charset.length; i < ii; i++) { - var index = baseEncoding.indexOf(charset[i]); - if (index !== -1) { - encoding[index] = i; - } - } - } else { - var dataStart = pos; - format = bytes[pos++]; - switch (format & 0x7f) { - case 0: - var glyphsCount = bytes[pos++]; - for (i = 1; i <= glyphsCount; i++) { - encoding[bytes[pos++]] = i; - } - break; - - case 1: - var rangesCount = bytes[pos++]; - var gid = 1; - for (i = 0; i < rangesCount; i++) { - var start = bytes[pos++]; - var left = bytes[pos++]; - for (var j = start; j <= start + left; j++) { - encoding[j] = gid++; - } - } - break; - - default: - error('Unknown encoding format: ' + format + ' in CFF'); - break; - } - var dataEnd = pos; - if (format & 0x80) { - // The font sanitizer does not support CFF encoding with a - // supplement, since the encoding is not really used to map - // between gid to glyph, let's overwrite what is declared in - // the top dictionary to let the sanitizer think the font use - // StandardEncoding, that's a lie but that's ok. - bytes[dataStart] &= 0x7f; - readSupplement(); - hasSupplement = true; - } - raw = bytes.subarray(dataStart, dataEnd); - } - format = format & 0x7f; - return new CFFEncoding(predefined, format, encoding, raw); - }, - parseFDSelect: function CFFParser_parseFDSelect(pos, length) { - var start = pos; - var bytes = this.bytes; - var format = bytes[pos++]; - var fdSelect = [], rawBytes; - var i, invalidFirstGID = false; - - switch (format) { - case 0: - for (i = 0; i < length; ++i) { - var id = bytes[pos++]; - fdSelect.push(id); - } - rawBytes = bytes.subarray(start, pos); - break; - case 3: - var rangesCount = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i < rangesCount; ++i) { - var first = (bytes[pos++] << 8) | bytes[pos++]; - if (i === 0 && first !== 0) { - warn('parseFDSelect: The first range must have a first GID of 0' + - ' -- trying to recover.'); - invalidFirstGID = true; - first = 0; - } - var fdIndex = bytes[pos++]; - var next = (bytes[pos] << 8) | bytes[pos + 1]; - for (var j = first; j < next; ++j) { - fdSelect.push(fdIndex); - } - } - // Advance past the sentinel(next). - pos += 2; - rawBytes = bytes.subarray(start, pos); - - if (invalidFirstGID) { - rawBytes[3] = rawBytes[4] = 0; // Adjust the first range, first GID. - } - break; - default: - error('parseFDSelect: Unknown format "' + format + '".'); - break; - } - assert(fdSelect.length === length, 'parseFDSelect: Invalid font data.'); - - return new CFFFDSelect(fdSelect, rawBytes); - } - }; - return CFFParser; -})(); - -// Compact Font Format -var CFF = (function CFFClosure() { - function CFF() { - this.header = null; - this.names = []; - this.topDict = null; - this.strings = new CFFStrings(); - this.globalSubrIndex = null; - - // The following could really be per font, but since we only have one font - // store them here. - this.encoding = null; - this.charset = null; - this.charStrings = null; - this.fdArray = []; - this.fdSelect = null; - - this.isCIDFont = false; - } - return CFF; -})(); - -var CFFHeader = (function CFFHeaderClosure() { - function CFFHeader(major, minor, hdrSize, offSize) { - this.major = major; - this.minor = minor; - this.hdrSize = hdrSize; - this.offSize = offSize; - } - return CFFHeader; -})(); - -var CFFStrings = (function CFFStringsClosure() { - function CFFStrings() { - this.strings = []; - } - CFFStrings.prototype = { - get: function CFFStrings_get(index) { - if (index >= 0 && index <= 390) { - return CFFStandardStrings[index]; - } - if (index - 391 <= this.strings.length) { - return this.strings[index - 391]; - } - return CFFStandardStrings[0]; - }, - add: function CFFStrings_add(value) { - this.strings.push(value); - }, - get count() { - return this.strings.length; - } - }; - return CFFStrings; -})(); - -var CFFIndex = (function CFFIndexClosure() { - function CFFIndex() { - this.objects = []; - this.length = 0; - } - CFFIndex.prototype = { - add: function CFFIndex_add(data) { - this.length += data.length; - this.objects.push(data); - }, - set: function CFFIndex_set(index, data) { - this.length += data.length - this.objects[index].length; - this.objects[index] = data; - }, - get: function CFFIndex_get(index) { - return this.objects[index]; - }, - get count() { - return this.objects.length; - } - }; - return CFFIndex; -})(); - -var CFFDict = (function CFFDictClosure() { - function CFFDict(tables, strings) { - this.keyToNameMap = tables.keyToNameMap; - this.nameToKeyMap = tables.nameToKeyMap; - this.defaults = tables.defaults; - this.types = tables.types; - this.opcodes = tables.opcodes; - this.order = tables.order; - this.strings = strings; - this.values = Object.create(null); - } - CFFDict.prototype = { - // value should always be an array - setByKey: function CFFDict_setByKey(key, value) { - if (!(key in this.keyToNameMap)) { - return false; - } - // ignore empty values - if (value.length === 0) { - return true; - } - var type = this.types[key]; - // remove the array wrapping these types of values - if (type === 'num' || type === 'sid' || type === 'offset') { - value = value[0]; - // Ignore invalid values (fixes bug 1068432). - if (isNaN(value)) { - warn('Invalid CFFDict value: ' + value + ', for key: ' + key + '.'); - return true; - } - } - this.values[key] = value; - return true; - }, - setByName: function CFFDict_setByName(name, value) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - this.values[this.nameToKeyMap[name]] = value; - }, - hasName: function CFFDict_hasName(name) { - return this.nameToKeyMap[name] in this.values; - }, - getByName: function CFFDict_getByName(name) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - var key = this.nameToKeyMap[name]; - if (!(key in this.values)) { - return this.defaults[key]; - } - return this.values[key]; - }, - removeByName: function CFFDict_removeByName(name) { - delete this.values[this.nameToKeyMap[name]]; - } - }; - CFFDict.createTables = function CFFDict_createTables(layout) { - var tables = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [] - }; - for (var i = 0, ii = layout.length; i < ii; ++i) { - var entry = layout[i]; - var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; - tables.keyToNameMap[key] = entry[1]; - tables.nameToKeyMap[entry[1]] = key; - tables.types[key] = entry[2]; - tables.defaults[key] = entry[3]; - tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; - tables.order.push(key); - } - return tables; - }; - return CFFDict; -})(); - -var CFFTopDict = (function CFFTopDictClosure() { - var layout = [ - [[12, 30], 'ROS', ['sid', 'sid', 'num'], null], - [[12, 20], 'SyntheticBase', 'num', null], - [0, 'version', 'sid', null], - [1, 'Notice', 'sid', null], - [[12, 0], 'Copyright', 'sid', null], - [2, 'FullName', 'sid', null], - [3, 'FamilyName', 'sid', null], - [4, 'Weight', 'sid', null], - [[12, 1], 'isFixedPitch', 'num', 0], - [[12, 2], 'ItalicAngle', 'num', 0], - [[12, 3], 'UnderlinePosition', 'num', -100], - [[12, 4], 'UnderlineThickness', 'num', 50], - [[12, 5], 'PaintType', 'num', 0], - [[12, 6], 'CharstringType', 'num', 2], - [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], - [0.001, 0, 0, 0.001, 0, 0]], - [13, 'UniqueID', 'num', null], - [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], - [[12, 8], 'StrokeWidth', 'num', 0], - [14, 'XUID', 'array', null], - [15, 'charset', 'offset', 0], - [16, 'Encoding', 'offset', 0], - [17, 'CharStrings', 'offset', 0], - [18, 'Private', ['offset', 'offset'], null], - [[12, 21], 'PostScript', 'sid', null], - [[12, 22], 'BaseFontName', 'sid', null], - [[12, 23], 'BaseFontBlend', 'delta', null], - [[12, 31], 'CIDFontVersion', 'num', 0], - [[12, 32], 'CIDFontRevision', 'num', 0], - [[12, 33], 'CIDFontType', 'num', 0], - [[12, 34], 'CIDCount', 'num', 8720], - [[12, 35], 'UIDBase', 'num', null], - // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes - // before FDArray. - [[12, 37], 'FDSelect', 'offset', null], - [[12, 36], 'FDArray', 'offset', null], - [[12, 38], 'FontName', 'sid', null] - ]; - var tables = null; - function CFFTopDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.privateDict = null; - } - CFFTopDict.prototype = Object.create(CFFDict.prototype); - return CFFTopDict; -})(); - -var CFFPrivateDict = (function CFFPrivateDictClosure() { - var layout = [ - [6, 'BlueValues', 'delta', null], - [7, 'OtherBlues', 'delta', null], - [8, 'FamilyBlues', 'delta', null], - [9, 'FamilyOtherBlues', 'delta', null], - [[12, 9], 'BlueScale', 'num', 0.039625], - [[12, 10], 'BlueShift', 'num', 7], - [[12, 11], 'BlueFuzz', 'num', 1], - [10, 'StdHW', 'num', null], - [11, 'StdVW', 'num', null], - [[12, 12], 'StemSnapH', 'delta', null], - [[12, 13], 'StemSnapV', 'delta', null], - [[12, 14], 'ForceBold', 'num', 0], - [[12, 17], 'LanguageGroup', 'num', 0], - [[12, 18], 'ExpansionFactor', 'num', 0.06], - [[12, 19], 'initialRandomSeed', 'num', 0], - [20, 'defaultWidthX', 'num', 0], - [21, 'nominalWidthX', 'num', 0], - [19, 'Subrs', 'offset', null] - ]; - var tables = null; - function CFFPrivateDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.subrsIndex = null; - } - CFFPrivateDict.prototype = Object.create(CFFDict.prototype); - return CFFPrivateDict; -})(); - -var CFFCharsetPredefinedTypes = { - ISO_ADOBE: 0, - EXPERT: 1, - EXPERT_SUBSET: 2 -}; -var CFFCharset = (function CFFCharsetClosure() { - function CFFCharset(predefined, format, charset, raw) { - this.predefined = predefined; - this.format = format; - this.charset = charset; - this.raw = raw; - } - return CFFCharset; -})(); - -var CFFEncoding = (function CFFEncodingClosure() { - function CFFEncoding(predefined, format, encoding, raw) { - this.predefined = predefined; - this.format = format; - this.encoding = encoding; - this.raw = raw; - } - return CFFEncoding; -})(); - -var CFFFDSelect = (function CFFFDSelectClosure() { - function CFFFDSelect(fdSelect, raw) { - this.fdSelect = fdSelect; - this.raw = raw; - } - CFFFDSelect.prototype = { - getFDIndex: function CFFFDSelect_get(glyphIndex) { - if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { - return -1; - } - return this.fdSelect[glyphIndex]; - } - }; - return CFFFDSelect; -})(); - -// Helper class to keep track of where an offset is within the data and helps -// filling in that offset once it's known. -var CFFOffsetTracker = (function CFFOffsetTrackerClosure() { - function CFFOffsetTracker() { - this.offsets = Object.create(null); - } - CFFOffsetTracker.prototype = { - isTracking: function CFFOffsetTracker_isTracking(key) { - return key in this.offsets; - }, - track: function CFFOffsetTracker_track(key, location) { - if (key in this.offsets) { - error('Already tracking location of ' + key); - } - this.offsets[key] = location; - }, - offset: function CFFOffsetTracker_offset(value) { - for (var key in this.offsets) { - this.offsets[key] += value; - } - }, - setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, - values, - output) { - if (!(key in this.offsets)) { - error('Not tracking location of ' + key); - } - var data = output.data; - var dataOffset = this.offsets[key]; - var size = 5; - for (var i = 0, ii = values.length; i < ii; ++i) { - var offset0 = i * size + dataOffset; - var offset1 = offset0 + 1; - var offset2 = offset0 + 2; - var offset3 = offset0 + 3; - var offset4 = offset0 + 4; - // It's easy to screw up offsets so perform this sanity check. - if (data[offset0] !== 0x1d || data[offset1] !== 0 || - data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { - error('writing to an offset that is not empty'); - } - var value = values[i]; - data[offset0] = 0x1d; - data[offset1] = (value >> 24) & 0xFF; - data[offset2] = (value >> 16) & 0xFF; - data[offset3] = (value >> 8) & 0xFF; - data[offset4] = value & 0xFF; - } - } - }; - return CFFOffsetTracker; -})(); - -// Takes a CFF and converts it to the binary representation. -var CFFCompiler = (function CFFCompilerClosure() { - function CFFCompiler(cff) { - this.cff = cff; - } - CFFCompiler.prototype = { - compile: function CFFCompiler_compile() { - var cff = this.cff; - var output = { - data: [], - length: 0, - add: function CFFCompiler_add(data) { - this.data = this.data.concat(data); - this.length = this.data.length; - } - }; - - // Compile the five entries that must be in order. - var header = this.compileHeader(cff.header); - output.add(header); - - var nameIndex = this.compileNameIndex(cff.names); - output.add(nameIndex); - - if (cff.isCIDFont) { - // The spec is unclear on how font matrices should relate to each other - // when there is one in the main top dict and the sub top dicts. - // Windows handles this differently than linux and osx so we have to - // normalize to work on all. - // Rules based off of some mailing list discussions: - // - If main font has a matrix and subfont doesn't, use the main matrix. - // - If no main font matrix and there is a subfont matrix, use the - // subfont matrix. - // - If both have matrices, concat together. - // - If neither have matrices, use default. - // To make this work on all platforms we move the top matrix into each - // sub top dict and concat if necessary. - if (cff.topDict.hasName('FontMatrix')) { - var base = cff.topDict.getByName('FontMatrix'); - cff.topDict.removeByName('FontMatrix'); - for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { - var subDict = cff.fdArray[i]; - var matrix = base.slice(0); - if (subDict.hasName('FontMatrix')) { - matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); - } - subDict.setByName('FontMatrix', matrix); - } - } - } - - var compiled = this.compileTopDicts([cff.topDict], - output.length, - cff.isCIDFont); - output.add(compiled.output); - var topDictTracker = compiled.trackers[0]; - - var stringIndex = this.compileStringIndex(cff.strings.strings); - output.add(stringIndex); - - var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); - output.add(globalSubrIndex); - - // Now start on the other entries that have no specific order. - if (cff.encoding && cff.topDict.hasName('Encoding')) { - if (cff.encoding.predefined) { - topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], - output); - } else { - var encoding = this.compileEncoding(cff.encoding); - topDictTracker.setEntryLocation('Encoding', [output.length], output); - output.add(encoding); - } - } - - if (cff.charset && cff.topDict.hasName('charset')) { - if (cff.charset.predefined) { - topDictTracker.setEntryLocation('charset', [cff.charset.format], - output); - } else { - var charset = this.compileCharset(cff.charset); - topDictTracker.setEntryLocation('charset', [output.length], output); - output.add(charset); - } - } - - var charStrings = this.compileCharStrings(cff.charStrings); - topDictTracker.setEntryLocation('CharStrings', [output.length], output); - output.add(charStrings); - - if (cff.isCIDFont) { - // For some reason FDSelect must be in front of FDArray on windows. OSX - // and linux don't seem to care. - topDictTracker.setEntryLocation('FDSelect', [output.length], output); - var fdSelect = this.compileFDSelect(cff.fdSelect.raw); - output.add(fdSelect); - // It is unclear if the sub font dictionary can have CID related - // dictionary keys, but the sanitizer doesn't like them so remove them. - compiled = this.compileTopDicts(cff.fdArray, output.length, true); - topDictTracker.setEntryLocation('FDArray', [output.length], output); - output.add(compiled.output); - var fontDictTrackers = compiled.trackers; - - this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); - } - - this.compilePrivateDicts([cff.topDict], [topDictTracker], output); - - // If the font data ends with INDEX whose object data is zero-length, - // the sanitizer will bail out. Add a dummy byte to avoid that. - output.add([0]); - - return output.data; - }, - encodeNumber: function CFFCompiler_encodeNumber(value) { - if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt - return this.encodeInteger(value); - } else { - return this.encodeFloat(value); - } - }, - encodeFloat: function CFFCompiler_encodeFloat(num) { - var value = num.toString(); - - // rounding inaccurate doubles - var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value); - if (m) { - var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length)); - value = (Math.round(num * epsilon) / epsilon).toString(); - } - - var nibbles = ''; - var i, ii; - for (i = 0, ii = value.length; i < ii; ++i) { - var a = value[i]; - if (a === 'e') { - nibbles += value[++i] === '-' ? 'c' : 'b'; - } else if (a === '.') { - nibbles += 'a'; - } else if (a === '-') { - nibbles += 'e'; - } else { - nibbles += a; - } - } - nibbles += (nibbles.length & 1) ? 'f' : 'ff'; - var out = [30]; - for (i = 0, ii = nibbles.length; i < ii; i += 2) { - out.push(parseInt(nibbles.substr(i, 2), 16)); - } - return out; - }, - encodeInteger: function CFFCompiler_encodeInteger(value) { - var code; - if (value >= -107 && value <= 107) { - code = [value + 139]; - } else if (value >= 108 && value <= 1131) { - value = value - 108; - code = [(value >> 8) + 247, value & 0xFF]; - } else if (value >= -1131 && value <= -108) { - value = -value - 108; - code = [(value >> 8) + 251, value & 0xFF]; - } else if (value >= -32768 && value <= 32767) { - code = [0x1c, (value >> 8) & 0xFF, value & 0xFF]; - } else { - code = [0x1d, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF]; - } - return code; - }, - compileHeader: function CFFCompiler_compileHeader(header) { - return [ - header.major, - header.minor, - header.hdrSize, - header.offSize - ]; - }, - compileNameIndex: function CFFCompiler_compileNameIndex(names) { - var nameIndex = new CFFIndex(); - for (var i = 0, ii = names.length; i < ii; ++i) { - nameIndex.add(stringToBytes(names[i])); - } - return this.compileIndex(nameIndex); - }, - compileTopDicts: function CFFCompiler_compileTopDicts(dicts, - length, - removeCidKeys) { - var fontDictTrackers = []; - var fdArrayIndex = new CFFIndex(); - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - if (removeCidKeys) { - fontDict.removeByName('CIDFontVersion'); - fontDict.removeByName('CIDFontRevision'); - fontDict.removeByName('CIDFontType'); - fontDict.removeByName('CIDCount'); - fontDict.removeByName('UIDBase'); - } - var fontDictTracker = new CFFOffsetTracker(); - var fontDictData = this.compileDict(fontDict, fontDictTracker); - fontDictTrackers.push(fontDictTracker); - fdArrayIndex.add(fontDictData); - fontDictTracker.offset(length); - } - fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); - return { - trackers: fontDictTrackers, - output: fdArrayIndex - }; - }, - compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, - trackers, - output) { - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - assert(fontDict.privateDict && fontDict.hasName('Private'), - 'There must be an private dictionary.'); - var privateDict = fontDict.privateDict; - var privateDictTracker = new CFFOffsetTracker(); - var privateDictData = this.compileDict(privateDict, privateDictTracker); - - var outputLength = output.length; - privateDictTracker.offset(outputLength); - if (!privateDictData.length) { - // The private dictionary was empty, set the output length to zero to - // ensure the offset length isn't out of bounds in the eyes of the - // sanitizer. - outputLength = 0; - } - - trackers[i].setEntryLocation('Private', - [privateDictData.length, outputLength], - output); - output.add(privateDictData); - - if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { - var subrs = this.compileIndex(privateDict.subrsIndex); - privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], - output); - output.add(subrs); - } - } - }, - compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { - var out = []; - // The dictionary keys must be in a certain order. - var order = dict.order; - for (var i = 0; i < order.length; ++i) { - var key = order[i]; - if (!(key in dict.values)) { - continue; - } - var values = dict.values[key]; - var types = dict.types[key]; - if (!isArray(types)) { - types = [types]; - } - if (!isArray(values)) { - values = [values]; - } - - // Remove any empty dict values. - if (values.length === 0) { - continue; - } - - for (var j = 0, jj = types.length; j < jj; ++j) { - var type = types[j]; - var value = values[j]; - switch (type) { - case 'num': - case 'sid': - out = out.concat(this.encodeNumber(value)); - break; - case 'offset': - // For offsets we just insert a 32bit integer so we don't have to - // deal with figuring out the length of the offset when it gets - // replaced later on by the compiler. - var name = dict.keyToNameMap[key]; - // Some offsets have the offset and the length, so just record the - // position of the first one. - if (!offsetTracker.isTracking(name)) { - offsetTracker.track(name, out.length); - } - out = out.concat([0x1d, 0, 0, 0, 0]); - break; - case 'array': - case 'delta': - out = out.concat(this.encodeNumber(value)); - for (var k = 1, kk = values.length; k < kk; ++k) { - out = out.concat(this.encodeNumber(values[k])); - } - break; - default: - error('Unknown data type of ' + type); - break; - } - } - out = out.concat(dict.opcodes[key]); - } - return out; - }, - compileStringIndex: function CFFCompiler_compileStringIndex(strings) { - var stringIndex = new CFFIndex(); - for (var i = 0, ii = strings.length; i < ii; ++i) { - stringIndex.add(stringToBytes(strings[i])); - } - return this.compileIndex(stringIndex); - }, - compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { - var globalSubrIndex = this.cff.globalSubrIndex; - this.out.writeByteArray(this.compileIndex(globalSubrIndex)); - }, - compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { - return this.compileIndex(charStrings); - }, - compileCharset: function CFFCompiler_compileCharset(charset) { - return this.compileTypedArray(charset.raw); - }, - compileEncoding: function CFFCompiler_compileEncoding(encoding) { - return this.compileTypedArray(encoding.raw); - }, - compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { - return this.compileTypedArray(fdSelect); - }, - compileTypedArray: function CFFCompiler_compileTypedArray(data) { - var out = []; - for (var i = 0, ii = data.length; i < ii; ++i) { - out[i] = data[i]; - } - return out; - }, - compileIndex: function CFFCompiler_compileIndex(index, trackers) { - trackers = trackers || []; - var objects = index.objects; - // First 2 bytes contains the number of objects contained into this index - var count = objects.length; - - // If there is no object, just create an index. This technically - // should just be [0, 0] but OTS has an issue with that. - if (count === 0) { - return [0, 0, 0]; - } - - var data = [(count >> 8) & 0xFF, count & 0xff]; - - var lastOffset = 1, i; - for (i = 0; i < count; ++i) { - lastOffset += objects[i].length; - } - - var offsetSize; - if (lastOffset < 0x100) { - offsetSize = 1; - } else if (lastOffset < 0x10000) { - offsetSize = 2; - } else if (lastOffset < 0x1000000) { - offsetSize = 3; - } else { - offsetSize = 4; - } - - // Next byte contains the offset size use to reference object in the file - data.push(offsetSize); - - // Add another offset after this one because we need a new offset - var relativeOffset = 1; - for (i = 0; i < count + 1; i++) { - if (offsetSize === 1) { - data.push(relativeOffset & 0xFF); - } else if (offsetSize === 2) { - data.push((relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else if (offsetSize === 3) { - data.push((relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else { - data.push((relativeOffset >>> 24) & 0xFF, - (relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } - - if (objects[i]) { - relativeOffset += objects[i].length; - } - } - - for (i = 0; i < count; i++) { - // Notify the tracker where the object will be offset in the data. - if (trackers[i]) { - trackers[i].offset(data.length); - } - for (var j = 0, jj = objects[i].length; j < jj; j++) { - data.push(objects[i][j]); - } - } - return data; - } - }; - return CFFCompiler; -})(); - -exports.CFFStandardStrings = CFFStandardStrings; -exports.CFFParser = CFFParser; -exports.CFF = CFF; -exports.CFFHeader = CFFHeader; -exports.CFFStrings = CFFStrings; -exports.CFFIndex = CFFIndex; -exports.CFFCharset = CFFCharset; -exports.CFFTopDict = CFFTopDict; -exports.CFFPrivateDict = CFFPrivateDict; -exports.CFFCompiler = CFFCompiler; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreChunkedStream = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var MissingDataException = sharedUtil.MissingDataException; -var arrayByteLength = sharedUtil.arrayByteLength; -var arraysToBytes = sharedUtil.arraysToBytes; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var isInt = sharedUtil.isInt; -var isEmptyObj = sharedUtil.isEmptyObj; - -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; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache - } - - // 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 (!this.loadedChunks[chunk]) { - chunks.push(chunk); - } - } - return chunks; - }, - - getBaseStreams: function ChunkedStream_getBaseStreams() { - return [this]; - }, - - allChunksLoaded: function ChunkedStream_allChunksLoaded() { - return this.numChunksLoaded === this.numChunks; - }, - - onReceiveData: function ChunkedStream_onReceiveData(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; - var curChunk; - - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - onReceiveProgressiveData: - function ChunkedStream_onReceiveProgressiveData(data) { - var position = this.progressiveDataLength; - var beginChunk = Math.floor(position / this.chunkSize); - - this.bytes.set(new Uint8Array(data), position); - position += data.byteLength; - this.progressiveDataLength = position; - var endChunk = position >= this.end ? this.numChunks : - Math.floor(position / this.chunkSize); - var curChunk; - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - ensureByte: function ChunkedStream_ensureByte(pos) { - var chunk = Math.floor(pos / this.chunkSize); - if (chunk === this.lastSuccessfulEnsureByteChunk) { - return; - } - - if (!this.loadedChunks[chunk]) { - throw new MissingDataException(pos, pos + 1); - } - this.lastSuccessfulEnsureByteChunk = chunk; - }, - - ensureRange: function ChunkedStream_ensureRange(begin, end) { - if (begin >= end) { - return; - } - - if (end <= this.progressiveDataLength) { - 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 (!this.loadedChunks[chunk]) { - throw new MissingDataException(begin, end); - } - } - }, - - nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) { - var chunk, numChunks = this.numChunks; - for (var i = 0; i < numChunks; ++i) { - chunk = (beginChunk + i) % numChunks; // Wrap around to beginning - if (!this.loadedChunks[chunk]) { - return chunk; - } - } - return null; - }, - - hasChunk: function ChunkedStream_hasChunk(chunk) { - return !!this.loadedChunks[chunk]; - }, - - get length() { - return this.end - this.start; - }, - - get isEmpty() { - return this.length === 0; - }, - - getByte: function ChunkedStream_getByte() { - var pos = this.pos; - if (pos >= this.end) { - return -1; - } - this.ensureByte(pos); - return this.bytes[this.pos++]; - }, - - getUint16: function ChunkedStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - - getInt32: function ChunkedStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - - // 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); - }, - - peekByte: function ChunkedStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - - 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) { - this.ensureRange(start, start + length); - - 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 (!this.loadedChunks[chunk]) { - 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(pdfNetworkStream, args) { - var chunkSize = args.rangeChunkSize; - var length = args.length; - this.stream = new ChunkedStream(length, chunkSize, this); - this.length = length; - this.chunkSize = chunkSize; - this.pdfNetworkStream = pdfNetworkStream; - this.url = args.url; - this.disableAutoFetch = args.disableAutoFetch; - this.msgHandler = args.msgHandler; - - this.currRequestId = 0; - - this.chunksNeededByRequest = Object.create(null); - this.requestsByChunk = Object.create(null); - this.promisesByRequest = Object.create(null); - this.progressiveDataLength = 0; - this.aborted = false; - - this._loadedStreamCapability = createPromiseCapability(); - } - - ChunkedStreamManager.prototype = { - onLoadedStream: function ChunkedStreamManager_getLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - sendRequest: function ChunkedStreamManager_sendRequest(begin, end) { - var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end); - if (!rangeReader.isStreamingSupported) { - rangeReader.onProgress = this.onProgress.bind(this); - } - var chunks = [], loaded = 0; - var manager = this; - var promise = new Promise(function (resolve, reject) { - var readChunk = function (chunk) { - try { - if (!chunk.done) { - var data = chunk.value; - chunks.push(data); - loaded += arrayByteLength(data); - if (rangeReader.isStreamingSupported) { - manager.onProgress({loaded: loaded}); - } - rangeReader.read().then(readChunk, reject); - return; - } - var chunkData = arraysToBytes(chunks); - chunks = null; - resolve(chunkData); - } catch (e) { - reject(e); - } - }; - rangeReader.read().then(readChunk, reject); - }); - promise.then(function (data) { - if (this.aborted) { - return; // ignoring any data after abort - } - this.onReceiveData({chunk: data, begin: begin}); - }.bind(this)); - // TODO check errors - }, - - // 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._loadedStreamCapability.promise; - }, - - _requestChunks: function ChunkedStreamManager_requestChunks(chunks) { - var requestId = this.currRequestId++; - - var i, ii; - var chunksNeeded = Object.create(null); - this.chunksNeededByRequest[requestId] = chunksNeeded; - for (i = 0, ii = chunks.length; i < ii; i++) { - if (!this.stream.hasChunk(chunks[i])) { - chunksNeeded[chunks[i]] = true; - } - } - - if (isEmptyObj(chunksNeeded)) { - return Promise.resolve(); - } - - var capability = createPromiseCapability(); - this.promisesByRequest[requestId] = capability; - - 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 capability.promise; - } - - var groupedChunksToRequest = this.groupChunks(chunksToRequest); - - for (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); - } - - return capability.promise; - }, - - 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) { - - 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); - } - - return this._requestChunks(chunks); - }, - - requestRanges: function ChunkedStreamManager_requestRanges(ranges) { - 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; }); - return this._requestChunks(chunksToRequest); - }, - - // Groups a sorted array of chunks into as few contiguous larger - // chunks as possible - groupChunks: function ChunkedStreamManager_groupChunks(chunks) { - var groupedChunks = []; - var beginChunk = -1; - var prevChunk = -1; - for (var i = 0; i < chunks.length; ++i) { - var chunk = chunks[i]; - - if (beginChunk < 0) { - beginChunk = chunk; - } - - if (prevChunk >= 0 && 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 isProgressive = args.begin === undefined; - var begin = isProgressive ? this.progressiveDataLength : args.begin; - var end = begin + chunk.byteLength; - - var beginChunk = Math.floor(begin / this.chunkSize); - var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : - Math.ceil(end / this.chunkSize); - - if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; - } else { - this.stream.onReceiveData(begin, chunk); - } - - if (this.stream.allChunksLoaded()) { - this._loadedStreamCapability.resolve(this.stream); - } - - var loadedRequests = []; - var i, requestId; - for (chunk = beginChunk; chunk < endChunk; ++chunk) { - // The server might return more chunks than requested - var requestIds = this.requestsByChunk[chunk] || []; - delete this.requestsByChunk[chunk]; - - for (i = 0; i < requestIds.length; ++i) { - 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 (i = 0; i < loadedRequests.length; ++i) { - requestId = loadedRequests[i]; - var capability = this.promisesByRequest[requestId]; - delete this.promisesByRequest[requestId]; - capability.resolve(); - } - - this.msgHandler.send('DocProgress', { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length - }); - }, - - onError: function ChunkedStreamManager_onError(err) { - this._loadedStreamCapability.reject(err); - }, - - getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) { - var chunk = Math.floor(begin / this.chunkSize); - return chunk; - }, - - getEndChunk: function ChunkedStreamManager_getEndChunk(end) { - var chunk = Math.floor((end - 1) / this.chunkSize) + 1; - return chunk; - }, - - abort: function ChunkedStreamManager_abort() { - this.aborted = true; - if (this.pdfNetworkStream) { - this.pdfNetworkStream.cancelAllRequests('abort'); - } - for(var requestId in this.promisesByRequest) { - var capability = this.promisesByRequest[requestId]; - capability.reject(new Error('Request was aborted')); - } - } - }; - - return ChunkedStreamManager; -})(); - -exports.ChunkedStream = ChunkedStream; -exports.ChunkedStreamManager = ChunkedStreamManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreGlyphList = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { -var getLookupTableFactory = sharedUtil.getLookupTableFactory; - -var getGlyphsUnicode = getLookupTableFactory(function (t) { - t['A'] = 0x0041; - t['AE'] = 0x00C6; - t['AEacute'] = 0x01FC; - t['AEmacron'] = 0x01E2; - t['AEsmall'] = 0xF7E6; - t['Aacute'] = 0x00C1; - t['Aacutesmall'] = 0xF7E1; - t['Abreve'] = 0x0102; - t['Abreveacute'] = 0x1EAE; - t['Abrevecyrillic'] = 0x04D0; - t['Abrevedotbelow'] = 0x1EB6; - t['Abrevegrave'] = 0x1EB0; - t['Abrevehookabove'] = 0x1EB2; - t['Abrevetilde'] = 0x1EB4; - t['Acaron'] = 0x01CD; - t['Acircle'] = 0x24B6; - t['Acircumflex'] = 0x00C2; - t['Acircumflexacute'] = 0x1EA4; - t['Acircumflexdotbelow'] = 0x1EAC; - t['Acircumflexgrave'] = 0x1EA6; - t['Acircumflexhookabove'] = 0x1EA8; - t['Acircumflexsmall'] = 0xF7E2; - t['Acircumflextilde'] = 0x1EAA; - t['Acute'] = 0xF6C9; - t['Acutesmall'] = 0xF7B4; - t['Acyrillic'] = 0x0410; - t['Adblgrave'] = 0x0200; - t['Adieresis'] = 0x00C4; - t['Adieresiscyrillic'] = 0x04D2; - t['Adieresismacron'] = 0x01DE; - t['Adieresissmall'] = 0xF7E4; - t['Adotbelow'] = 0x1EA0; - t['Adotmacron'] = 0x01E0; - t['Agrave'] = 0x00C0; - t['Agravesmall'] = 0xF7E0; - t['Ahookabove'] = 0x1EA2; - t['Aiecyrillic'] = 0x04D4; - t['Ainvertedbreve'] = 0x0202; - t['Alpha'] = 0x0391; - t['Alphatonos'] = 0x0386; - t['Amacron'] = 0x0100; - t['Amonospace'] = 0xFF21; - t['Aogonek'] = 0x0104; - t['Aring'] = 0x00C5; - t['Aringacute'] = 0x01FA; - t['Aringbelow'] = 0x1E00; - t['Aringsmall'] = 0xF7E5; - t['Asmall'] = 0xF761; - t['Atilde'] = 0x00C3; - t['Atildesmall'] = 0xF7E3; - t['Aybarmenian'] = 0x0531; - t['B'] = 0x0042; - t['Bcircle'] = 0x24B7; - t['Bdotaccent'] = 0x1E02; - t['Bdotbelow'] = 0x1E04; - t['Becyrillic'] = 0x0411; - t['Benarmenian'] = 0x0532; - t['Beta'] = 0x0392; - t['Bhook'] = 0x0181; - t['Blinebelow'] = 0x1E06; - t['Bmonospace'] = 0xFF22; - t['Brevesmall'] = 0xF6F4; - t['Bsmall'] = 0xF762; - t['Btopbar'] = 0x0182; - t['C'] = 0x0043; - t['Caarmenian'] = 0x053E; - t['Cacute'] = 0x0106; - t['Caron'] = 0xF6CA; - t['Caronsmall'] = 0xF6F5; - t['Ccaron'] = 0x010C; - t['Ccedilla'] = 0x00C7; - t['Ccedillaacute'] = 0x1E08; - t['Ccedillasmall'] = 0xF7E7; - t['Ccircle'] = 0x24B8; - t['Ccircumflex'] = 0x0108; - t['Cdot'] = 0x010A; - t['Cdotaccent'] = 0x010A; - t['Cedillasmall'] = 0xF7B8; - t['Chaarmenian'] = 0x0549; - t['Cheabkhasiancyrillic'] = 0x04BC; - t['Checyrillic'] = 0x0427; - t['Chedescenderabkhasiancyrillic'] = 0x04BE; - t['Chedescendercyrillic'] = 0x04B6; - t['Chedieresiscyrillic'] = 0x04F4; - t['Cheharmenian'] = 0x0543; - t['Chekhakassiancyrillic'] = 0x04CB; - t['Cheverticalstrokecyrillic'] = 0x04B8; - t['Chi'] = 0x03A7; - t['Chook'] = 0x0187; - t['Circumflexsmall'] = 0xF6F6; - t['Cmonospace'] = 0xFF23; - t['Coarmenian'] = 0x0551; - t['Csmall'] = 0xF763; - t['D'] = 0x0044; - t['DZ'] = 0x01F1; - t['DZcaron'] = 0x01C4; - t['Daarmenian'] = 0x0534; - t['Dafrican'] = 0x0189; - t['Dcaron'] = 0x010E; - t['Dcedilla'] = 0x1E10; - t['Dcircle'] = 0x24B9; - t['Dcircumflexbelow'] = 0x1E12; - t['Dcroat'] = 0x0110; - t['Ddotaccent'] = 0x1E0A; - t['Ddotbelow'] = 0x1E0C; - t['Decyrillic'] = 0x0414; - t['Deicoptic'] = 0x03EE; - t['Delta'] = 0x2206; - t['Deltagreek'] = 0x0394; - t['Dhook'] = 0x018A; - t['Dieresis'] = 0xF6CB; - t['DieresisAcute'] = 0xF6CC; - t['DieresisGrave'] = 0xF6CD; - t['Dieresissmall'] = 0xF7A8; - t['Digammagreek'] = 0x03DC; - t['Djecyrillic'] = 0x0402; - t['Dlinebelow'] = 0x1E0E; - t['Dmonospace'] = 0xFF24; - t['Dotaccentsmall'] = 0xF6F7; - t['Dslash'] = 0x0110; - t['Dsmall'] = 0xF764; - t['Dtopbar'] = 0x018B; - t['Dz'] = 0x01F2; - t['Dzcaron'] = 0x01C5; - t['Dzeabkhasiancyrillic'] = 0x04E0; - t['Dzecyrillic'] = 0x0405; - t['Dzhecyrillic'] = 0x040F; - t['E'] = 0x0045; - t['Eacute'] = 0x00C9; - t['Eacutesmall'] = 0xF7E9; - t['Ebreve'] = 0x0114; - t['Ecaron'] = 0x011A; - t['Ecedillabreve'] = 0x1E1C; - t['Echarmenian'] = 0x0535; - t['Ecircle'] = 0x24BA; - t['Ecircumflex'] = 0x00CA; - t['Ecircumflexacute'] = 0x1EBE; - t['Ecircumflexbelow'] = 0x1E18; - t['Ecircumflexdotbelow'] = 0x1EC6; - t['Ecircumflexgrave'] = 0x1EC0; - t['Ecircumflexhookabove'] = 0x1EC2; - t['Ecircumflexsmall'] = 0xF7EA; - t['Ecircumflextilde'] = 0x1EC4; - t['Ecyrillic'] = 0x0404; - t['Edblgrave'] = 0x0204; - t['Edieresis'] = 0x00CB; - t['Edieresissmall'] = 0xF7EB; - t['Edot'] = 0x0116; - t['Edotaccent'] = 0x0116; - t['Edotbelow'] = 0x1EB8; - t['Efcyrillic'] = 0x0424; - t['Egrave'] = 0x00C8; - t['Egravesmall'] = 0xF7E8; - t['Eharmenian'] = 0x0537; - t['Ehookabove'] = 0x1EBA; - t['Eightroman'] = 0x2167; - t['Einvertedbreve'] = 0x0206; - t['Eiotifiedcyrillic'] = 0x0464; - t['Elcyrillic'] = 0x041B; - t['Elevenroman'] = 0x216A; - t['Emacron'] = 0x0112; - t['Emacronacute'] = 0x1E16; - t['Emacrongrave'] = 0x1E14; - t['Emcyrillic'] = 0x041C; - t['Emonospace'] = 0xFF25; - t['Encyrillic'] = 0x041D; - t['Endescendercyrillic'] = 0x04A2; - t['Eng'] = 0x014A; - t['Enghecyrillic'] = 0x04A4; - t['Enhookcyrillic'] = 0x04C7; - t['Eogonek'] = 0x0118; - t['Eopen'] = 0x0190; - t['Epsilon'] = 0x0395; - t['Epsilontonos'] = 0x0388; - t['Ercyrillic'] = 0x0420; - t['Ereversed'] = 0x018E; - t['Ereversedcyrillic'] = 0x042D; - t['Escyrillic'] = 0x0421; - t['Esdescendercyrillic'] = 0x04AA; - t['Esh'] = 0x01A9; - t['Esmall'] = 0xF765; - t['Eta'] = 0x0397; - t['Etarmenian'] = 0x0538; - t['Etatonos'] = 0x0389; - t['Eth'] = 0x00D0; - t['Ethsmall'] = 0xF7F0; - t['Etilde'] = 0x1EBC; - t['Etildebelow'] = 0x1E1A; - t['Euro'] = 0x20AC; - t['Ezh'] = 0x01B7; - t['Ezhcaron'] = 0x01EE; - t['Ezhreversed'] = 0x01B8; - t['F'] = 0x0046; - t['Fcircle'] = 0x24BB; - t['Fdotaccent'] = 0x1E1E; - t['Feharmenian'] = 0x0556; - t['Feicoptic'] = 0x03E4; - t['Fhook'] = 0x0191; - t['Fitacyrillic'] = 0x0472; - t['Fiveroman'] = 0x2164; - t['Fmonospace'] = 0xFF26; - t['Fourroman'] = 0x2163; - t['Fsmall'] = 0xF766; - t['G'] = 0x0047; - t['GBsquare'] = 0x3387; - t['Gacute'] = 0x01F4; - t['Gamma'] = 0x0393; - t['Gammaafrican'] = 0x0194; - t['Gangiacoptic'] = 0x03EA; - t['Gbreve'] = 0x011E; - t['Gcaron'] = 0x01E6; - t['Gcedilla'] = 0x0122; - t['Gcircle'] = 0x24BC; - t['Gcircumflex'] = 0x011C; - t['Gcommaaccent'] = 0x0122; - t['Gdot'] = 0x0120; - t['Gdotaccent'] = 0x0120; - t['Gecyrillic'] = 0x0413; - t['Ghadarmenian'] = 0x0542; - t['Ghemiddlehookcyrillic'] = 0x0494; - t['Ghestrokecyrillic'] = 0x0492; - t['Gheupturncyrillic'] = 0x0490; - t['Ghook'] = 0x0193; - t['Gimarmenian'] = 0x0533; - t['Gjecyrillic'] = 0x0403; - t['Gmacron'] = 0x1E20; - t['Gmonospace'] = 0xFF27; - t['Grave'] = 0xF6CE; - t['Gravesmall'] = 0xF760; - t['Gsmall'] = 0xF767; - t['Gsmallhook'] = 0x029B; - t['Gstroke'] = 0x01E4; - t['H'] = 0x0048; - t['H18533'] = 0x25CF; - t['H18543'] = 0x25AA; - t['H18551'] = 0x25AB; - t['H22073'] = 0x25A1; - t['HPsquare'] = 0x33CB; - t['Haabkhasiancyrillic'] = 0x04A8; - t['Hadescendercyrillic'] = 0x04B2; - t['Hardsigncyrillic'] = 0x042A; - t['Hbar'] = 0x0126; - t['Hbrevebelow'] = 0x1E2A; - t['Hcedilla'] = 0x1E28; - t['Hcircle'] = 0x24BD; - t['Hcircumflex'] = 0x0124; - t['Hdieresis'] = 0x1E26; - t['Hdotaccent'] = 0x1E22; - t['Hdotbelow'] = 0x1E24; - t['Hmonospace'] = 0xFF28; - t['Hoarmenian'] = 0x0540; - t['Horicoptic'] = 0x03E8; - t['Hsmall'] = 0xF768; - t['Hungarumlaut'] = 0xF6CF; - t['Hungarumlautsmall'] = 0xF6F8; - t['Hzsquare'] = 0x3390; - t['I'] = 0x0049; - t['IAcyrillic'] = 0x042F; - t['IJ'] = 0x0132; - t['IUcyrillic'] = 0x042E; - t['Iacute'] = 0x00CD; - t['Iacutesmall'] = 0xF7ED; - t['Ibreve'] = 0x012C; - t['Icaron'] = 0x01CF; - t['Icircle'] = 0x24BE; - t['Icircumflex'] = 0x00CE; - t['Icircumflexsmall'] = 0xF7EE; - t['Icyrillic'] = 0x0406; - t['Idblgrave'] = 0x0208; - t['Idieresis'] = 0x00CF; - t['Idieresisacute'] = 0x1E2E; - t['Idieresiscyrillic'] = 0x04E4; - t['Idieresissmall'] = 0xF7EF; - t['Idot'] = 0x0130; - t['Idotaccent'] = 0x0130; - t['Idotbelow'] = 0x1ECA; - t['Iebrevecyrillic'] = 0x04D6; - t['Iecyrillic'] = 0x0415; - t['Ifraktur'] = 0x2111; - t['Igrave'] = 0x00CC; - t['Igravesmall'] = 0xF7EC; - t['Ihookabove'] = 0x1EC8; - t['Iicyrillic'] = 0x0418; - t['Iinvertedbreve'] = 0x020A; - t['Iishortcyrillic'] = 0x0419; - t['Imacron'] = 0x012A; - t['Imacroncyrillic'] = 0x04E2; - t['Imonospace'] = 0xFF29; - t['Iniarmenian'] = 0x053B; - t['Iocyrillic'] = 0x0401; - t['Iogonek'] = 0x012E; - t['Iota'] = 0x0399; - t['Iotaafrican'] = 0x0196; - t['Iotadieresis'] = 0x03AA; - t['Iotatonos'] = 0x038A; - t['Ismall'] = 0xF769; - t['Istroke'] = 0x0197; - t['Itilde'] = 0x0128; - t['Itildebelow'] = 0x1E2C; - t['Izhitsacyrillic'] = 0x0474; - t['Izhitsadblgravecyrillic'] = 0x0476; - t['J'] = 0x004A; - t['Jaarmenian'] = 0x0541; - t['Jcircle'] = 0x24BF; - t['Jcircumflex'] = 0x0134; - t['Jecyrillic'] = 0x0408; - t['Jheharmenian'] = 0x054B; - t['Jmonospace'] = 0xFF2A; - t['Jsmall'] = 0xF76A; - t['K'] = 0x004B; - t['KBsquare'] = 0x3385; - t['KKsquare'] = 0x33CD; - t['Kabashkircyrillic'] = 0x04A0; - t['Kacute'] = 0x1E30; - t['Kacyrillic'] = 0x041A; - t['Kadescendercyrillic'] = 0x049A; - t['Kahookcyrillic'] = 0x04C3; - t['Kappa'] = 0x039A; - t['Kastrokecyrillic'] = 0x049E; - t['Kaverticalstrokecyrillic'] = 0x049C; - t['Kcaron'] = 0x01E8; - t['Kcedilla'] = 0x0136; - t['Kcircle'] = 0x24C0; - t['Kcommaaccent'] = 0x0136; - t['Kdotbelow'] = 0x1E32; - t['Keharmenian'] = 0x0554; - t['Kenarmenian'] = 0x053F; - t['Khacyrillic'] = 0x0425; - t['Kheicoptic'] = 0x03E6; - t['Khook'] = 0x0198; - t['Kjecyrillic'] = 0x040C; - t['Klinebelow'] = 0x1E34; - t['Kmonospace'] = 0xFF2B; - t['Koppacyrillic'] = 0x0480; - t['Koppagreek'] = 0x03DE; - t['Ksicyrillic'] = 0x046E; - t['Ksmall'] = 0xF76B; - t['L'] = 0x004C; - t['LJ'] = 0x01C7; - t['LL'] = 0xF6BF; - t['Lacute'] = 0x0139; - t['Lambda'] = 0x039B; - t['Lcaron'] = 0x013D; - t['Lcedilla'] = 0x013B; - t['Lcircle'] = 0x24C1; - t['Lcircumflexbelow'] = 0x1E3C; - t['Lcommaaccent'] = 0x013B; - t['Ldot'] = 0x013F; - t['Ldotaccent'] = 0x013F; - t['Ldotbelow'] = 0x1E36; - t['Ldotbelowmacron'] = 0x1E38; - t['Liwnarmenian'] = 0x053C; - t['Lj'] = 0x01C8; - t['Ljecyrillic'] = 0x0409; - t['Llinebelow'] = 0x1E3A; - t['Lmonospace'] = 0xFF2C; - t['Lslash'] = 0x0141; - t['Lslashsmall'] = 0xF6F9; - t['Lsmall'] = 0xF76C; - t['M'] = 0x004D; - t['MBsquare'] = 0x3386; - t['Macron'] = 0xF6D0; - t['Macronsmall'] = 0xF7AF; - t['Macute'] = 0x1E3E; - t['Mcircle'] = 0x24C2; - t['Mdotaccent'] = 0x1E40; - t['Mdotbelow'] = 0x1E42; - t['Menarmenian'] = 0x0544; - t['Mmonospace'] = 0xFF2D; - t['Msmall'] = 0xF76D; - t['Mturned'] = 0x019C; - t['Mu'] = 0x039C; - t['N'] = 0x004E; - t['NJ'] = 0x01CA; - t['Nacute'] = 0x0143; - t['Ncaron'] = 0x0147; - t['Ncedilla'] = 0x0145; - t['Ncircle'] = 0x24C3; - t['Ncircumflexbelow'] = 0x1E4A; - t['Ncommaaccent'] = 0x0145; - t['Ndotaccent'] = 0x1E44; - t['Ndotbelow'] = 0x1E46; - t['Nhookleft'] = 0x019D; - t['Nineroman'] = 0x2168; - t['Nj'] = 0x01CB; - t['Njecyrillic'] = 0x040A; - t['Nlinebelow'] = 0x1E48; - t['Nmonospace'] = 0xFF2E; - t['Nowarmenian'] = 0x0546; - t['Nsmall'] = 0xF76E; - t['Ntilde'] = 0x00D1; - t['Ntildesmall'] = 0xF7F1; - t['Nu'] = 0x039D; - t['O'] = 0x004F; - t['OE'] = 0x0152; - t['OEsmall'] = 0xF6FA; - t['Oacute'] = 0x00D3; - t['Oacutesmall'] = 0xF7F3; - t['Obarredcyrillic'] = 0x04E8; - t['Obarreddieresiscyrillic'] = 0x04EA; - t['Obreve'] = 0x014E; - t['Ocaron'] = 0x01D1; - t['Ocenteredtilde'] = 0x019F; - t['Ocircle'] = 0x24C4; - t['Ocircumflex'] = 0x00D4; - t['Ocircumflexacute'] = 0x1ED0; - t['Ocircumflexdotbelow'] = 0x1ED8; - t['Ocircumflexgrave'] = 0x1ED2; - t['Ocircumflexhookabove'] = 0x1ED4; - t['Ocircumflexsmall'] = 0xF7F4; - t['Ocircumflextilde'] = 0x1ED6; - t['Ocyrillic'] = 0x041E; - t['Odblacute'] = 0x0150; - t['Odblgrave'] = 0x020C; - t['Odieresis'] = 0x00D6; - t['Odieresiscyrillic'] = 0x04E6; - t['Odieresissmall'] = 0xF7F6; - t['Odotbelow'] = 0x1ECC; - t['Ogoneksmall'] = 0xF6FB; - t['Ograve'] = 0x00D2; - t['Ogravesmall'] = 0xF7F2; - t['Oharmenian'] = 0x0555; - t['Ohm'] = 0x2126; - t['Ohookabove'] = 0x1ECE; - t['Ohorn'] = 0x01A0; - t['Ohornacute'] = 0x1EDA; - t['Ohorndotbelow'] = 0x1EE2; - t['Ohorngrave'] = 0x1EDC; - t['Ohornhookabove'] = 0x1EDE; - t['Ohorntilde'] = 0x1EE0; - t['Ohungarumlaut'] = 0x0150; - t['Oi'] = 0x01A2; - t['Oinvertedbreve'] = 0x020E; - t['Omacron'] = 0x014C; - t['Omacronacute'] = 0x1E52; - t['Omacrongrave'] = 0x1E50; - t['Omega'] = 0x2126; - t['Omegacyrillic'] = 0x0460; - t['Omegagreek'] = 0x03A9; - t['Omegaroundcyrillic'] = 0x047A; - t['Omegatitlocyrillic'] = 0x047C; - t['Omegatonos'] = 0x038F; - t['Omicron'] = 0x039F; - t['Omicrontonos'] = 0x038C; - t['Omonospace'] = 0xFF2F; - t['Oneroman'] = 0x2160; - t['Oogonek'] = 0x01EA; - t['Oogonekmacron'] = 0x01EC; - t['Oopen'] = 0x0186; - t['Oslash'] = 0x00D8; - t['Oslashacute'] = 0x01FE; - t['Oslashsmall'] = 0xF7F8; - t['Osmall'] = 0xF76F; - t['Ostrokeacute'] = 0x01FE; - t['Otcyrillic'] = 0x047E; - t['Otilde'] = 0x00D5; - t['Otildeacute'] = 0x1E4C; - t['Otildedieresis'] = 0x1E4E; - t['Otildesmall'] = 0xF7F5; - t['P'] = 0x0050; - t['Pacute'] = 0x1E54; - t['Pcircle'] = 0x24C5; - t['Pdotaccent'] = 0x1E56; - t['Pecyrillic'] = 0x041F; - t['Peharmenian'] = 0x054A; - t['Pemiddlehookcyrillic'] = 0x04A6; - t['Phi'] = 0x03A6; - t['Phook'] = 0x01A4; - t['Pi'] = 0x03A0; - t['Piwrarmenian'] = 0x0553; - t['Pmonospace'] = 0xFF30; - t['Psi'] = 0x03A8; - t['Psicyrillic'] = 0x0470; - t['Psmall'] = 0xF770; - t['Q'] = 0x0051; - t['Qcircle'] = 0x24C6; - t['Qmonospace'] = 0xFF31; - t['Qsmall'] = 0xF771; - t['R'] = 0x0052; - t['Raarmenian'] = 0x054C; - t['Racute'] = 0x0154; - t['Rcaron'] = 0x0158; - t['Rcedilla'] = 0x0156; - t['Rcircle'] = 0x24C7; - t['Rcommaaccent'] = 0x0156; - t['Rdblgrave'] = 0x0210; - t['Rdotaccent'] = 0x1E58; - t['Rdotbelow'] = 0x1E5A; - t['Rdotbelowmacron'] = 0x1E5C; - t['Reharmenian'] = 0x0550; - t['Rfraktur'] = 0x211C; - t['Rho'] = 0x03A1; - t['Ringsmall'] = 0xF6FC; - t['Rinvertedbreve'] = 0x0212; - t['Rlinebelow'] = 0x1E5E; - t['Rmonospace'] = 0xFF32; - t['Rsmall'] = 0xF772; - t['Rsmallinverted'] = 0x0281; - t['Rsmallinvertedsuperior'] = 0x02B6; - t['S'] = 0x0053; - t['SF010000'] = 0x250C; - t['SF020000'] = 0x2514; - t['SF030000'] = 0x2510; - t['SF040000'] = 0x2518; - t['SF050000'] = 0x253C; - t['SF060000'] = 0x252C; - t['SF070000'] = 0x2534; - t['SF080000'] = 0x251C; - t['SF090000'] = 0x2524; - t['SF100000'] = 0x2500; - t['SF110000'] = 0x2502; - t['SF190000'] = 0x2561; - t['SF200000'] = 0x2562; - t['SF210000'] = 0x2556; - t['SF220000'] = 0x2555; - t['SF230000'] = 0x2563; - t['SF240000'] = 0x2551; - t['SF250000'] = 0x2557; - t['SF260000'] = 0x255D; - t['SF270000'] = 0x255C; - t['SF280000'] = 0x255B; - t['SF360000'] = 0x255E; - t['SF370000'] = 0x255F; - t['SF380000'] = 0x255A; - t['SF390000'] = 0x2554; - t['SF400000'] = 0x2569; - t['SF410000'] = 0x2566; - t['SF420000'] = 0x2560; - t['SF430000'] = 0x2550; - t['SF440000'] = 0x256C; - t['SF450000'] = 0x2567; - t['SF460000'] = 0x2568; - t['SF470000'] = 0x2564; - t['SF480000'] = 0x2565; - t['SF490000'] = 0x2559; - t['SF500000'] = 0x2558; - t['SF510000'] = 0x2552; - t['SF520000'] = 0x2553; - t['SF530000'] = 0x256B; - t['SF540000'] = 0x256A; - t['Sacute'] = 0x015A; - t['Sacutedotaccent'] = 0x1E64; - t['Sampigreek'] = 0x03E0; - t['Scaron'] = 0x0160; - t['Scarondotaccent'] = 0x1E66; - t['Scaronsmall'] = 0xF6FD; - t['Scedilla'] = 0x015E; - t['Schwa'] = 0x018F; - t['Schwacyrillic'] = 0x04D8; - t['Schwadieresiscyrillic'] = 0x04DA; - t['Scircle'] = 0x24C8; - t['Scircumflex'] = 0x015C; - t['Scommaaccent'] = 0x0218; - t['Sdotaccent'] = 0x1E60; - t['Sdotbelow'] = 0x1E62; - t['Sdotbelowdotaccent'] = 0x1E68; - t['Seharmenian'] = 0x054D; - t['Sevenroman'] = 0x2166; - t['Shaarmenian'] = 0x0547; - t['Shacyrillic'] = 0x0428; - t['Shchacyrillic'] = 0x0429; - t['Sheicoptic'] = 0x03E2; - t['Shhacyrillic'] = 0x04BA; - t['Shimacoptic'] = 0x03EC; - t['Sigma'] = 0x03A3; - t['Sixroman'] = 0x2165; - t['Smonospace'] = 0xFF33; - t['Softsigncyrillic'] = 0x042C; - t['Ssmall'] = 0xF773; - t['Stigmagreek'] = 0x03DA; - t['T'] = 0x0054; - t['Tau'] = 0x03A4; - t['Tbar'] = 0x0166; - t['Tcaron'] = 0x0164; - t['Tcedilla'] = 0x0162; - t['Tcircle'] = 0x24C9; - t['Tcircumflexbelow'] = 0x1E70; - t['Tcommaaccent'] = 0x0162; - t['Tdotaccent'] = 0x1E6A; - t['Tdotbelow'] = 0x1E6C; - t['Tecyrillic'] = 0x0422; - t['Tedescendercyrillic'] = 0x04AC; - t['Tenroman'] = 0x2169; - t['Tetsecyrillic'] = 0x04B4; - t['Theta'] = 0x0398; - t['Thook'] = 0x01AC; - t['Thorn'] = 0x00DE; - t['Thornsmall'] = 0xF7FE; - t['Threeroman'] = 0x2162; - t['Tildesmall'] = 0xF6FE; - t['Tiwnarmenian'] = 0x054F; - t['Tlinebelow'] = 0x1E6E; - t['Tmonospace'] = 0xFF34; - t['Toarmenian'] = 0x0539; - t['Tonefive'] = 0x01BC; - t['Tonesix'] = 0x0184; - t['Tonetwo'] = 0x01A7; - t['Tretroflexhook'] = 0x01AE; - t['Tsecyrillic'] = 0x0426; - t['Tshecyrillic'] = 0x040B; - t['Tsmall'] = 0xF774; - t['Twelveroman'] = 0x216B; - t['Tworoman'] = 0x2161; - t['U'] = 0x0055; - t['Uacute'] = 0x00DA; - t['Uacutesmall'] = 0xF7FA; - t['Ubreve'] = 0x016C; - t['Ucaron'] = 0x01D3; - t['Ucircle'] = 0x24CA; - t['Ucircumflex'] = 0x00DB; - t['Ucircumflexbelow'] = 0x1E76; - t['Ucircumflexsmall'] = 0xF7FB; - t['Ucyrillic'] = 0x0423; - t['Udblacute'] = 0x0170; - t['Udblgrave'] = 0x0214; - t['Udieresis'] = 0x00DC; - t['Udieresisacute'] = 0x01D7; - t['Udieresisbelow'] = 0x1E72; - t['Udieresiscaron'] = 0x01D9; - t['Udieresiscyrillic'] = 0x04F0; - t['Udieresisgrave'] = 0x01DB; - t['Udieresismacron'] = 0x01D5; - t['Udieresissmall'] = 0xF7FC; - t['Udotbelow'] = 0x1EE4; - t['Ugrave'] = 0x00D9; - t['Ugravesmall'] = 0xF7F9; - t['Uhookabove'] = 0x1EE6; - t['Uhorn'] = 0x01AF; - t['Uhornacute'] = 0x1EE8; - t['Uhorndotbelow'] = 0x1EF0; - t['Uhorngrave'] = 0x1EEA; - t['Uhornhookabove'] = 0x1EEC; - t['Uhorntilde'] = 0x1EEE; - t['Uhungarumlaut'] = 0x0170; - t['Uhungarumlautcyrillic'] = 0x04F2; - t['Uinvertedbreve'] = 0x0216; - t['Ukcyrillic'] = 0x0478; - t['Umacron'] = 0x016A; - t['Umacroncyrillic'] = 0x04EE; - t['Umacrondieresis'] = 0x1E7A; - t['Umonospace'] = 0xFF35; - t['Uogonek'] = 0x0172; - t['Upsilon'] = 0x03A5; - t['Upsilon1'] = 0x03D2; - t['Upsilonacutehooksymbolgreek'] = 0x03D3; - t['Upsilonafrican'] = 0x01B1; - t['Upsilondieresis'] = 0x03AB; - t['Upsilondieresishooksymbolgreek'] = 0x03D4; - t['Upsilonhooksymbol'] = 0x03D2; - t['Upsilontonos'] = 0x038E; - t['Uring'] = 0x016E; - t['Ushortcyrillic'] = 0x040E; - t['Usmall'] = 0xF775; - t['Ustraightcyrillic'] = 0x04AE; - t['Ustraightstrokecyrillic'] = 0x04B0; - t['Utilde'] = 0x0168; - t['Utildeacute'] = 0x1E78; - t['Utildebelow'] = 0x1E74; - t['V'] = 0x0056; - t['Vcircle'] = 0x24CB; - t['Vdotbelow'] = 0x1E7E; - t['Vecyrillic'] = 0x0412; - t['Vewarmenian'] = 0x054E; - t['Vhook'] = 0x01B2; - t['Vmonospace'] = 0xFF36; - t['Voarmenian'] = 0x0548; - t['Vsmall'] = 0xF776; - t['Vtilde'] = 0x1E7C; - t['W'] = 0x0057; - t['Wacute'] = 0x1E82; - t['Wcircle'] = 0x24CC; - t['Wcircumflex'] = 0x0174; - t['Wdieresis'] = 0x1E84; - t['Wdotaccent'] = 0x1E86; - t['Wdotbelow'] = 0x1E88; - t['Wgrave'] = 0x1E80; - t['Wmonospace'] = 0xFF37; - t['Wsmall'] = 0xF777; - t['X'] = 0x0058; - t['Xcircle'] = 0x24CD; - t['Xdieresis'] = 0x1E8C; - t['Xdotaccent'] = 0x1E8A; - t['Xeharmenian'] = 0x053D; - t['Xi'] = 0x039E; - t['Xmonospace'] = 0xFF38; - t['Xsmall'] = 0xF778; - t['Y'] = 0x0059; - t['Yacute'] = 0x00DD; - t['Yacutesmall'] = 0xF7FD; - t['Yatcyrillic'] = 0x0462; - t['Ycircle'] = 0x24CE; - t['Ycircumflex'] = 0x0176; - t['Ydieresis'] = 0x0178; - t['Ydieresissmall'] = 0xF7FF; - t['Ydotaccent'] = 0x1E8E; - t['Ydotbelow'] = 0x1EF4; - t['Yericyrillic'] = 0x042B; - t['Yerudieresiscyrillic'] = 0x04F8; - t['Ygrave'] = 0x1EF2; - t['Yhook'] = 0x01B3; - t['Yhookabove'] = 0x1EF6; - t['Yiarmenian'] = 0x0545; - t['Yicyrillic'] = 0x0407; - t['Yiwnarmenian'] = 0x0552; - t['Ymonospace'] = 0xFF39; - t['Ysmall'] = 0xF779; - t['Ytilde'] = 0x1EF8; - t['Yusbigcyrillic'] = 0x046A; - t['Yusbigiotifiedcyrillic'] = 0x046C; - t['Yuslittlecyrillic'] = 0x0466; - t['Yuslittleiotifiedcyrillic'] = 0x0468; - t['Z'] = 0x005A; - t['Zaarmenian'] = 0x0536; - t['Zacute'] = 0x0179; - t['Zcaron'] = 0x017D; - t['Zcaronsmall'] = 0xF6FF; - t['Zcircle'] = 0x24CF; - t['Zcircumflex'] = 0x1E90; - t['Zdot'] = 0x017B; - t['Zdotaccent'] = 0x017B; - t['Zdotbelow'] = 0x1E92; - t['Zecyrillic'] = 0x0417; - t['Zedescendercyrillic'] = 0x0498; - t['Zedieresiscyrillic'] = 0x04DE; - t['Zeta'] = 0x0396; - t['Zhearmenian'] = 0x053A; - t['Zhebrevecyrillic'] = 0x04C1; - t['Zhecyrillic'] = 0x0416; - t['Zhedescendercyrillic'] = 0x0496; - t['Zhedieresiscyrillic'] = 0x04DC; - t['Zlinebelow'] = 0x1E94; - t['Zmonospace'] = 0xFF3A; - t['Zsmall'] = 0xF77A; - t['Zstroke'] = 0x01B5; - t['a'] = 0x0061; - t['aabengali'] = 0x0986; - t['aacute'] = 0x00E1; - t['aadeva'] = 0x0906; - t['aagujarati'] = 0x0A86; - t['aagurmukhi'] = 0x0A06; - t['aamatragurmukhi'] = 0x0A3E; - t['aarusquare'] = 0x3303; - t['aavowelsignbengali'] = 0x09BE; - t['aavowelsigndeva'] = 0x093E; - t['aavowelsigngujarati'] = 0x0ABE; - t['abbreviationmarkarmenian'] = 0x055F; - t['abbreviationsigndeva'] = 0x0970; - t['abengali'] = 0x0985; - t['abopomofo'] = 0x311A; - t['abreve'] = 0x0103; - t['abreveacute'] = 0x1EAF; - t['abrevecyrillic'] = 0x04D1; - t['abrevedotbelow'] = 0x1EB7; - t['abrevegrave'] = 0x1EB1; - t['abrevehookabove'] = 0x1EB3; - t['abrevetilde'] = 0x1EB5; - t['acaron'] = 0x01CE; - t['acircle'] = 0x24D0; - t['acircumflex'] = 0x00E2; - t['acircumflexacute'] = 0x1EA5; - t['acircumflexdotbelow'] = 0x1EAD; - t['acircumflexgrave'] = 0x1EA7; - t['acircumflexhookabove'] = 0x1EA9; - t['acircumflextilde'] = 0x1EAB; - t['acute'] = 0x00B4; - t['acutebelowcmb'] = 0x0317; - t['acutecmb'] = 0x0301; - t['acutecomb'] = 0x0301; - t['acutedeva'] = 0x0954; - t['acutelowmod'] = 0x02CF; - t['acutetonecmb'] = 0x0341; - t['acyrillic'] = 0x0430; - t['adblgrave'] = 0x0201; - t['addakgurmukhi'] = 0x0A71; - t['adeva'] = 0x0905; - t['adieresis'] = 0x00E4; - t['adieresiscyrillic'] = 0x04D3; - t['adieresismacron'] = 0x01DF; - t['adotbelow'] = 0x1EA1; - t['adotmacron'] = 0x01E1; - t['ae'] = 0x00E6; - t['aeacute'] = 0x01FD; - t['aekorean'] = 0x3150; - t['aemacron'] = 0x01E3; - t['afii00208'] = 0x2015; - t['afii08941'] = 0x20A4; - t['afii10017'] = 0x0410; - t['afii10018'] = 0x0411; - t['afii10019'] = 0x0412; - t['afii10020'] = 0x0413; - t['afii10021'] = 0x0414; - t['afii10022'] = 0x0415; - t['afii10023'] = 0x0401; - t['afii10024'] = 0x0416; - t['afii10025'] = 0x0417; - t['afii10026'] = 0x0418; - t['afii10027'] = 0x0419; - t['afii10028'] = 0x041A; - t['afii10029'] = 0x041B; - t['afii10030'] = 0x041C; - t['afii10031'] = 0x041D; - t['afii10032'] = 0x041E; - t['afii10033'] = 0x041F; - t['afii10034'] = 0x0420; - t['afii10035'] = 0x0421; - t['afii10036'] = 0x0422; - t['afii10037'] = 0x0423; - t['afii10038'] = 0x0424; - t['afii10039'] = 0x0425; - t['afii10040'] = 0x0426; - t['afii10041'] = 0x0427; - t['afii10042'] = 0x0428; - t['afii10043'] = 0x0429; - t['afii10044'] = 0x042A; - t['afii10045'] = 0x042B; - t['afii10046'] = 0x042C; - t['afii10047'] = 0x042D; - t['afii10048'] = 0x042E; - t['afii10049'] = 0x042F; - t['afii10050'] = 0x0490; - t['afii10051'] = 0x0402; - t['afii10052'] = 0x0403; - t['afii10053'] = 0x0404; - t['afii10054'] = 0x0405; - t['afii10055'] = 0x0406; - t['afii10056'] = 0x0407; - t['afii10057'] = 0x0408; - t['afii10058'] = 0x0409; - t['afii10059'] = 0x040A; - t['afii10060'] = 0x040B; - t['afii10061'] = 0x040C; - t['afii10062'] = 0x040E; - t['afii10063'] = 0xF6C4; - t['afii10064'] = 0xF6C5; - t['afii10065'] = 0x0430; - t['afii10066'] = 0x0431; - t['afii10067'] = 0x0432; - t['afii10068'] = 0x0433; - t['afii10069'] = 0x0434; - t['afii10070'] = 0x0435; - t['afii10071'] = 0x0451; - t['afii10072'] = 0x0436; - t['afii10073'] = 0x0437; - t['afii10074'] = 0x0438; - t['afii10075'] = 0x0439; - t['afii10076'] = 0x043A; - t['afii10077'] = 0x043B; - t['afii10078'] = 0x043C; - t['afii10079'] = 0x043D; - t['afii10080'] = 0x043E; - t['afii10081'] = 0x043F; - t['afii10082'] = 0x0440; - t['afii10083'] = 0x0441; - t['afii10084'] = 0x0442; - t['afii10085'] = 0x0443; - t['afii10086'] = 0x0444; - t['afii10087'] = 0x0445; - t['afii10088'] = 0x0446; - t['afii10089'] = 0x0447; - t['afii10090'] = 0x0448; - t['afii10091'] = 0x0449; - t['afii10092'] = 0x044A; - t['afii10093'] = 0x044B; - t['afii10094'] = 0x044C; - t['afii10095'] = 0x044D; - t['afii10096'] = 0x044E; - t['afii10097'] = 0x044F; - t['afii10098'] = 0x0491; - t['afii10099'] = 0x0452; - t['afii10100'] = 0x0453; - t['afii10101'] = 0x0454; - t['afii10102'] = 0x0455; - t['afii10103'] = 0x0456; - t['afii10104'] = 0x0457; - t['afii10105'] = 0x0458; - t['afii10106'] = 0x0459; - t['afii10107'] = 0x045A; - t['afii10108'] = 0x045B; - t['afii10109'] = 0x045C; - t['afii10110'] = 0x045E; - t['afii10145'] = 0x040F; - t['afii10146'] = 0x0462; - t['afii10147'] = 0x0472; - t['afii10148'] = 0x0474; - t['afii10192'] = 0xF6C6; - t['afii10193'] = 0x045F; - t['afii10194'] = 0x0463; - t['afii10195'] = 0x0473; - t['afii10196'] = 0x0475; - t['afii10831'] = 0xF6C7; - t['afii10832'] = 0xF6C8; - t['afii10846'] = 0x04D9; - t['afii299'] = 0x200E; - t['afii300'] = 0x200F; - t['afii301'] = 0x200D; - t['afii57381'] = 0x066A; - t['afii57388'] = 0x060C; - t['afii57392'] = 0x0660; - t['afii57393'] = 0x0661; - t['afii57394'] = 0x0662; - t['afii57395'] = 0x0663; - t['afii57396'] = 0x0664; - t['afii57397'] = 0x0665; - t['afii57398'] = 0x0666; - t['afii57399'] = 0x0667; - t['afii57400'] = 0x0668; - t['afii57401'] = 0x0669; - t['afii57403'] = 0x061B; - t['afii57407'] = 0x061F; - t['afii57409'] = 0x0621; - t['afii57410'] = 0x0622; - t['afii57411'] = 0x0623; - t['afii57412'] = 0x0624; - t['afii57413'] = 0x0625; - t['afii57414'] = 0x0626; - t['afii57415'] = 0x0627; - t['afii57416'] = 0x0628; - t['afii57417'] = 0x0629; - t['afii57418'] = 0x062A; - t['afii57419'] = 0x062B; - t['afii57420'] = 0x062C; - t['afii57421'] = 0x062D; - t['afii57422'] = 0x062E; - t['afii57423'] = 0x062F; - t['afii57424'] = 0x0630; - t['afii57425'] = 0x0631; - t['afii57426'] = 0x0632; - t['afii57427'] = 0x0633; - t['afii57428'] = 0x0634; - t['afii57429'] = 0x0635; - t['afii57430'] = 0x0636; - t['afii57431'] = 0x0637; - t['afii57432'] = 0x0638; - t['afii57433'] = 0x0639; - t['afii57434'] = 0x063A; - t['afii57440'] = 0x0640; - t['afii57441'] = 0x0641; - t['afii57442'] = 0x0642; - t['afii57443'] = 0x0643; - t['afii57444'] = 0x0644; - t['afii57445'] = 0x0645; - t['afii57446'] = 0x0646; - t['afii57448'] = 0x0648; - t['afii57449'] = 0x0649; - t['afii57450'] = 0x064A; - t['afii57451'] = 0x064B; - t['afii57452'] = 0x064C; - t['afii57453'] = 0x064D; - t['afii57454'] = 0x064E; - t['afii57455'] = 0x064F; - t['afii57456'] = 0x0650; - t['afii57457'] = 0x0651; - t['afii57458'] = 0x0652; - t['afii57470'] = 0x0647; - t['afii57505'] = 0x06A4; - t['afii57506'] = 0x067E; - t['afii57507'] = 0x0686; - t['afii57508'] = 0x0698; - t['afii57509'] = 0x06AF; - t['afii57511'] = 0x0679; - t['afii57512'] = 0x0688; - t['afii57513'] = 0x0691; - t['afii57514'] = 0x06BA; - t['afii57519'] = 0x06D2; - t['afii57534'] = 0x06D5; - t['afii57636'] = 0x20AA; - t['afii57645'] = 0x05BE; - t['afii57658'] = 0x05C3; - t['afii57664'] = 0x05D0; - t['afii57665'] = 0x05D1; - t['afii57666'] = 0x05D2; - t['afii57667'] = 0x05D3; - t['afii57668'] = 0x05D4; - t['afii57669'] = 0x05D5; - t['afii57670'] = 0x05D6; - t['afii57671'] = 0x05D7; - t['afii57672'] = 0x05D8; - t['afii57673'] = 0x05D9; - t['afii57674'] = 0x05DA; - t['afii57675'] = 0x05DB; - t['afii57676'] = 0x05DC; - t['afii57677'] = 0x05DD; - t['afii57678'] = 0x05DE; - t['afii57679'] = 0x05DF; - t['afii57680'] = 0x05E0; - t['afii57681'] = 0x05E1; - t['afii57682'] = 0x05E2; - t['afii57683'] = 0x05E3; - t['afii57684'] = 0x05E4; - t['afii57685'] = 0x05E5; - t['afii57686'] = 0x05E6; - t['afii57687'] = 0x05E7; - t['afii57688'] = 0x05E8; - t['afii57689'] = 0x05E9; - t['afii57690'] = 0x05EA; - t['afii57694'] = 0xFB2A; - t['afii57695'] = 0xFB2B; - t['afii57700'] = 0xFB4B; - t['afii57705'] = 0xFB1F; - t['afii57716'] = 0x05F0; - t['afii57717'] = 0x05F1; - t['afii57718'] = 0x05F2; - t['afii57723'] = 0xFB35; - t['afii57793'] = 0x05B4; - t['afii57794'] = 0x05B5; - t['afii57795'] = 0x05B6; - t['afii57796'] = 0x05BB; - t['afii57797'] = 0x05B8; - t['afii57798'] = 0x05B7; - t['afii57799'] = 0x05B0; - t['afii57800'] = 0x05B2; - t['afii57801'] = 0x05B1; - t['afii57802'] = 0x05B3; - t['afii57803'] = 0x05C2; - t['afii57804'] = 0x05C1; - t['afii57806'] = 0x05B9; - t['afii57807'] = 0x05BC; - t['afii57839'] = 0x05BD; - t['afii57841'] = 0x05BF; - t['afii57842'] = 0x05C0; - t['afii57929'] = 0x02BC; - t['afii61248'] = 0x2105; - t['afii61289'] = 0x2113; - t['afii61352'] = 0x2116; - t['afii61573'] = 0x202C; - t['afii61574'] = 0x202D; - t['afii61575'] = 0x202E; - t['afii61664'] = 0x200C; - t['afii63167'] = 0x066D; - t['afii64937'] = 0x02BD; - t['agrave'] = 0x00E0; - t['agujarati'] = 0x0A85; - t['agurmukhi'] = 0x0A05; - t['ahiragana'] = 0x3042; - t['ahookabove'] = 0x1EA3; - t['aibengali'] = 0x0990; - t['aibopomofo'] = 0x311E; - t['aideva'] = 0x0910; - t['aiecyrillic'] = 0x04D5; - t['aigujarati'] = 0x0A90; - t['aigurmukhi'] = 0x0A10; - t['aimatragurmukhi'] = 0x0A48; - t['ainarabic'] = 0x0639; - t['ainfinalarabic'] = 0xFECA; - t['aininitialarabic'] = 0xFECB; - t['ainmedialarabic'] = 0xFECC; - t['ainvertedbreve'] = 0x0203; - t['aivowelsignbengali'] = 0x09C8; - t['aivowelsigndeva'] = 0x0948; - t['aivowelsigngujarati'] = 0x0AC8; - t['akatakana'] = 0x30A2; - t['akatakanahalfwidth'] = 0xFF71; - t['akorean'] = 0x314F; - t['alef'] = 0x05D0; - t['alefarabic'] = 0x0627; - t['alefdageshhebrew'] = 0xFB30; - t['aleffinalarabic'] = 0xFE8E; - t['alefhamzaabovearabic'] = 0x0623; - t['alefhamzaabovefinalarabic'] = 0xFE84; - t['alefhamzabelowarabic'] = 0x0625; - t['alefhamzabelowfinalarabic'] = 0xFE88; - t['alefhebrew'] = 0x05D0; - t['aleflamedhebrew'] = 0xFB4F; - t['alefmaddaabovearabic'] = 0x0622; - t['alefmaddaabovefinalarabic'] = 0xFE82; - t['alefmaksuraarabic'] = 0x0649; - t['alefmaksurafinalarabic'] = 0xFEF0; - t['alefmaksurainitialarabic'] = 0xFEF3; - t['alefmaksuramedialarabic'] = 0xFEF4; - t['alefpatahhebrew'] = 0xFB2E; - t['alefqamatshebrew'] = 0xFB2F; - t['aleph'] = 0x2135; - t['allequal'] = 0x224C; - t['alpha'] = 0x03B1; - t['alphatonos'] = 0x03AC; - t['amacron'] = 0x0101; - t['amonospace'] = 0xFF41; - t['ampersand'] = 0x0026; - t['ampersandmonospace'] = 0xFF06; - t['ampersandsmall'] = 0xF726; - t['amsquare'] = 0x33C2; - t['anbopomofo'] = 0x3122; - t['angbopomofo'] = 0x3124; - t['angbracketleft'] = 0x3008; // Glyph is missing from Adobe's original list. - t['angbracketright'] = 0x3009; // Glyph is missing from Adobe's original list. - t['angkhankhuthai'] = 0x0E5A; - t['angle'] = 0x2220; - t['anglebracketleft'] = 0x3008; - t['anglebracketleftvertical'] = 0xFE3F; - t['anglebracketright'] = 0x3009; - t['anglebracketrightvertical'] = 0xFE40; - t['angleleft'] = 0x2329; - t['angleright'] = 0x232A; - t['angstrom'] = 0x212B; - t['anoteleia'] = 0x0387; - t['anudattadeva'] = 0x0952; - t['anusvarabengali'] = 0x0982; - t['anusvaradeva'] = 0x0902; - t['anusvaragujarati'] = 0x0A82; - t['aogonek'] = 0x0105; - t['apaatosquare'] = 0x3300; - t['aparen'] = 0x249C; - t['apostrophearmenian'] = 0x055A; - t['apostrophemod'] = 0x02BC; - t['apple'] = 0xF8FF; - t['approaches'] = 0x2250; - t['approxequal'] = 0x2248; - t['approxequalorimage'] = 0x2252; - t['approximatelyequal'] = 0x2245; - t['araeaekorean'] = 0x318E; - t['araeakorean'] = 0x318D; - t['arc'] = 0x2312; - t['arighthalfring'] = 0x1E9A; - t['aring'] = 0x00E5; - t['aringacute'] = 0x01FB; - t['aringbelow'] = 0x1E01; - t['arrowboth'] = 0x2194; - t['arrowdashdown'] = 0x21E3; - t['arrowdashleft'] = 0x21E0; - t['arrowdashright'] = 0x21E2; - t['arrowdashup'] = 0x21E1; - t['arrowdblboth'] = 0x21D4; - t['arrowdbldown'] = 0x21D3; - t['arrowdblleft'] = 0x21D0; - t['arrowdblright'] = 0x21D2; - t['arrowdblup'] = 0x21D1; - t['arrowdown'] = 0x2193; - t['arrowdownleft'] = 0x2199; - t['arrowdownright'] = 0x2198; - t['arrowdownwhite'] = 0x21E9; - t['arrowheaddownmod'] = 0x02C5; - t['arrowheadleftmod'] = 0x02C2; - t['arrowheadrightmod'] = 0x02C3; - t['arrowheadupmod'] = 0x02C4; - t['arrowhorizex'] = 0xF8E7; - t['arrowleft'] = 0x2190; - t['arrowleftdbl'] = 0x21D0; - t['arrowleftdblstroke'] = 0x21CD; - t['arrowleftoverright'] = 0x21C6; - t['arrowleftwhite'] = 0x21E6; - t['arrowright'] = 0x2192; - t['arrowrightdblstroke'] = 0x21CF; - t['arrowrightheavy'] = 0x279E; - t['arrowrightoverleft'] = 0x21C4; - t['arrowrightwhite'] = 0x21E8; - t['arrowtableft'] = 0x21E4; - t['arrowtabright'] = 0x21E5; - t['arrowup'] = 0x2191; - t['arrowupdn'] = 0x2195; - t['arrowupdnbse'] = 0x21A8; - t['arrowupdownbase'] = 0x21A8; - t['arrowupleft'] = 0x2196; - t['arrowupleftofdown'] = 0x21C5; - t['arrowupright'] = 0x2197; - t['arrowupwhite'] = 0x21E7; - t['arrowvertex'] = 0xF8E6; - t['asciicircum'] = 0x005E; - t['asciicircummonospace'] = 0xFF3E; - t['asciitilde'] = 0x007E; - t['asciitildemonospace'] = 0xFF5E; - t['ascript'] = 0x0251; - t['ascriptturned'] = 0x0252; - t['asmallhiragana'] = 0x3041; - t['asmallkatakana'] = 0x30A1; - t['asmallkatakanahalfwidth'] = 0xFF67; - t['asterisk'] = 0x002A; - t['asteriskaltonearabic'] = 0x066D; - t['asteriskarabic'] = 0x066D; - t['asteriskmath'] = 0x2217; - t['asteriskmonospace'] = 0xFF0A; - t['asterisksmall'] = 0xFE61; - t['asterism'] = 0x2042; - t['asuperior'] = 0xF6E9; - t['asymptoticallyequal'] = 0x2243; - t['at'] = 0x0040; - t['atilde'] = 0x00E3; - t['atmonospace'] = 0xFF20; - t['atsmall'] = 0xFE6B; - t['aturned'] = 0x0250; - t['aubengali'] = 0x0994; - t['aubopomofo'] = 0x3120; - t['audeva'] = 0x0914; - t['augujarati'] = 0x0A94; - t['augurmukhi'] = 0x0A14; - t['aulengthmarkbengali'] = 0x09D7; - t['aumatragurmukhi'] = 0x0A4C; - t['auvowelsignbengali'] = 0x09CC; - t['auvowelsigndeva'] = 0x094C; - t['auvowelsigngujarati'] = 0x0ACC; - t['avagrahadeva'] = 0x093D; - t['aybarmenian'] = 0x0561; - t['ayin'] = 0x05E2; - t['ayinaltonehebrew'] = 0xFB20; - t['ayinhebrew'] = 0x05E2; - t['b'] = 0x0062; - t['babengali'] = 0x09AC; - t['backslash'] = 0x005C; - t['backslashmonospace'] = 0xFF3C; - t['badeva'] = 0x092C; - t['bagujarati'] = 0x0AAC; - t['bagurmukhi'] = 0x0A2C; - t['bahiragana'] = 0x3070; - t['bahtthai'] = 0x0E3F; - t['bakatakana'] = 0x30D0; - t['bar'] = 0x007C; - t['barmonospace'] = 0xFF5C; - t['bbopomofo'] = 0x3105; - t['bcircle'] = 0x24D1; - t['bdotaccent'] = 0x1E03; - t['bdotbelow'] = 0x1E05; - t['beamedsixteenthnotes'] = 0x266C; - t['because'] = 0x2235; - t['becyrillic'] = 0x0431; - t['beharabic'] = 0x0628; - t['behfinalarabic'] = 0xFE90; - t['behinitialarabic'] = 0xFE91; - t['behiragana'] = 0x3079; - t['behmedialarabic'] = 0xFE92; - t['behmeeminitialarabic'] = 0xFC9F; - t['behmeemisolatedarabic'] = 0xFC08; - t['behnoonfinalarabic'] = 0xFC6D; - t['bekatakana'] = 0x30D9; - t['benarmenian'] = 0x0562; - t['bet'] = 0x05D1; - t['beta'] = 0x03B2; - t['betasymbolgreek'] = 0x03D0; - t['betdagesh'] = 0xFB31; - t['betdageshhebrew'] = 0xFB31; - t['bethebrew'] = 0x05D1; - t['betrafehebrew'] = 0xFB4C; - t['bhabengali'] = 0x09AD; - t['bhadeva'] = 0x092D; - t['bhagujarati'] = 0x0AAD; - t['bhagurmukhi'] = 0x0A2D; - t['bhook'] = 0x0253; - t['bihiragana'] = 0x3073; - t['bikatakana'] = 0x30D3; - t['bilabialclick'] = 0x0298; - t['bindigurmukhi'] = 0x0A02; - t['birusquare'] = 0x3331; - t['blackcircle'] = 0x25CF; - t['blackdiamond'] = 0x25C6; - t['blackdownpointingtriangle'] = 0x25BC; - t['blackleftpointingpointer'] = 0x25C4; - t['blackleftpointingtriangle'] = 0x25C0; - t['blacklenticularbracketleft'] = 0x3010; - t['blacklenticularbracketleftvertical'] = 0xFE3B; - t['blacklenticularbracketright'] = 0x3011; - t['blacklenticularbracketrightvertical'] = 0xFE3C; - t['blacklowerlefttriangle'] = 0x25E3; - t['blacklowerrighttriangle'] = 0x25E2; - t['blackrectangle'] = 0x25AC; - t['blackrightpointingpointer'] = 0x25BA; - t['blackrightpointingtriangle'] = 0x25B6; - t['blacksmallsquare'] = 0x25AA; - t['blacksmilingface'] = 0x263B; - t['blacksquare'] = 0x25A0; - t['blackstar'] = 0x2605; - t['blackupperlefttriangle'] = 0x25E4; - t['blackupperrighttriangle'] = 0x25E5; - t['blackuppointingsmalltriangle'] = 0x25B4; - t['blackuppointingtriangle'] = 0x25B2; - t['blank'] = 0x2423; - t['blinebelow'] = 0x1E07; - t['block'] = 0x2588; - t['bmonospace'] = 0xFF42; - t['bobaimaithai'] = 0x0E1A; - t['bohiragana'] = 0x307C; - t['bokatakana'] = 0x30DC; - t['bparen'] = 0x249D; - t['bqsquare'] = 0x33C3; - t['braceex'] = 0xF8F4; - t['braceleft'] = 0x007B; - t['braceleftbt'] = 0xF8F3; - t['braceleftmid'] = 0xF8F2; - t['braceleftmonospace'] = 0xFF5B; - t['braceleftsmall'] = 0xFE5B; - t['bracelefttp'] = 0xF8F1; - t['braceleftvertical'] = 0xFE37; - t['braceright'] = 0x007D; - t['bracerightbt'] = 0xF8FE; - t['bracerightmid'] = 0xF8FD; - t['bracerightmonospace'] = 0xFF5D; - t['bracerightsmall'] = 0xFE5C; - t['bracerighttp'] = 0xF8FC; - t['bracerightvertical'] = 0xFE38; - t['bracketleft'] = 0x005B; - t['bracketleftbt'] = 0xF8F0; - t['bracketleftex'] = 0xF8EF; - t['bracketleftmonospace'] = 0xFF3B; - t['bracketlefttp'] = 0xF8EE; - t['bracketright'] = 0x005D; - t['bracketrightbt'] = 0xF8FB; - t['bracketrightex'] = 0xF8FA; - t['bracketrightmonospace'] = 0xFF3D; - t['bracketrighttp'] = 0xF8F9; - t['breve'] = 0x02D8; - t['brevebelowcmb'] = 0x032E; - t['brevecmb'] = 0x0306; - t['breveinvertedbelowcmb'] = 0x032F; - t['breveinvertedcmb'] = 0x0311; - t['breveinverteddoublecmb'] = 0x0361; - t['bridgebelowcmb'] = 0x032A; - t['bridgeinvertedbelowcmb'] = 0x033A; - t['brokenbar'] = 0x00A6; - t['bstroke'] = 0x0180; - t['bsuperior'] = 0xF6EA; - t['btopbar'] = 0x0183; - t['buhiragana'] = 0x3076; - t['bukatakana'] = 0x30D6; - t['bullet'] = 0x2022; - t['bulletinverse'] = 0x25D8; - t['bulletoperator'] = 0x2219; - t['bullseye'] = 0x25CE; - t['c'] = 0x0063; - t['caarmenian'] = 0x056E; - t['cabengali'] = 0x099A; - t['cacute'] = 0x0107; - t['cadeva'] = 0x091A; - t['cagujarati'] = 0x0A9A; - t['cagurmukhi'] = 0x0A1A; - t['calsquare'] = 0x3388; - t['candrabindubengali'] = 0x0981; - t['candrabinducmb'] = 0x0310; - t['candrabindudeva'] = 0x0901; - t['candrabindugujarati'] = 0x0A81; - t['capslock'] = 0x21EA; - t['careof'] = 0x2105; - t['caron'] = 0x02C7; - t['caronbelowcmb'] = 0x032C; - t['caroncmb'] = 0x030C; - t['carriagereturn'] = 0x21B5; - t['cbopomofo'] = 0x3118; - t['ccaron'] = 0x010D; - t['ccedilla'] = 0x00E7; - t['ccedillaacute'] = 0x1E09; - t['ccircle'] = 0x24D2; - t['ccircumflex'] = 0x0109; - t['ccurl'] = 0x0255; - t['cdot'] = 0x010B; - t['cdotaccent'] = 0x010B; - t['cdsquare'] = 0x33C5; - t['cedilla'] = 0x00B8; - t['cedillacmb'] = 0x0327; - t['cent'] = 0x00A2; - t['centigrade'] = 0x2103; - t['centinferior'] = 0xF6DF; - t['centmonospace'] = 0xFFE0; - t['centoldstyle'] = 0xF7A2; - t['centsuperior'] = 0xF6E0; - t['chaarmenian'] = 0x0579; - t['chabengali'] = 0x099B; - t['chadeva'] = 0x091B; - t['chagujarati'] = 0x0A9B; - t['chagurmukhi'] = 0x0A1B; - t['chbopomofo'] = 0x3114; - t['cheabkhasiancyrillic'] = 0x04BD; - t['checkmark'] = 0x2713; - t['checyrillic'] = 0x0447; - t['chedescenderabkhasiancyrillic'] = 0x04BF; - t['chedescendercyrillic'] = 0x04B7; - t['chedieresiscyrillic'] = 0x04F5; - t['cheharmenian'] = 0x0573; - t['chekhakassiancyrillic'] = 0x04CC; - t['cheverticalstrokecyrillic'] = 0x04B9; - t['chi'] = 0x03C7; - t['chieuchacirclekorean'] = 0x3277; - t['chieuchaparenkorean'] = 0x3217; - t['chieuchcirclekorean'] = 0x3269; - t['chieuchkorean'] = 0x314A; - t['chieuchparenkorean'] = 0x3209; - t['chochangthai'] = 0x0E0A; - t['chochanthai'] = 0x0E08; - t['chochingthai'] = 0x0E09; - t['chochoethai'] = 0x0E0C; - t['chook'] = 0x0188; - t['cieucacirclekorean'] = 0x3276; - t['cieucaparenkorean'] = 0x3216; - t['cieuccirclekorean'] = 0x3268; - t['cieuckorean'] = 0x3148; - t['cieucparenkorean'] = 0x3208; - t['cieucuparenkorean'] = 0x321C; - t['circle'] = 0x25CB; - t['circlecopyrt'] = 0x00A9; // Glyph is missing from Adobe's original list. - t['circlemultiply'] = 0x2297; - t['circleot'] = 0x2299; - t['circleplus'] = 0x2295; - t['circlepostalmark'] = 0x3036; - t['circlewithlefthalfblack'] = 0x25D0; - t['circlewithrighthalfblack'] = 0x25D1; - t['circumflex'] = 0x02C6; - t['circumflexbelowcmb'] = 0x032D; - t['circumflexcmb'] = 0x0302; - t['clear'] = 0x2327; - t['clickalveolar'] = 0x01C2; - t['clickdental'] = 0x01C0; - t['clicklateral'] = 0x01C1; - t['clickretroflex'] = 0x01C3; - t['club'] = 0x2663; - t['clubsuitblack'] = 0x2663; - t['clubsuitwhite'] = 0x2667; - t['cmcubedsquare'] = 0x33A4; - t['cmonospace'] = 0xFF43; - t['cmsquaredsquare'] = 0x33A0; - t['coarmenian'] = 0x0581; - t['colon'] = 0x003A; - t['colonmonetary'] = 0x20A1; - t['colonmonospace'] = 0xFF1A; - t['colonsign'] = 0x20A1; - t['colonsmall'] = 0xFE55; - t['colontriangularhalfmod'] = 0x02D1; - t['colontriangularmod'] = 0x02D0; - t['comma'] = 0x002C; - t['commaabovecmb'] = 0x0313; - t['commaaboverightcmb'] = 0x0315; - t['commaaccent'] = 0xF6C3; - t['commaarabic'] = 0x060C; - t['commaarmenian'] = 0x055D; - t['commainferior'] = 0xF6E1; - t['commamonospace'] = 0xFF0C; - t['commareversedabovecmb'] = 0x0314; - t['commareversedmod'] = 0x02BD; - t['commasmall'] = 0xFE50; - t['commasuperior'] = 0xF6E2; - t['commaturnedabovecmb'] = 0x0312; - t['commaturnedmod'] = 0x02BB; - t['compass'] = 0x263C; - t['congruent'] = 0x2245; - t['contourintegral'] = 0x222E; - t['control'] = 0x2303; - t['controlACK'] = 0x0006; - t['controlBEL'] = 0x0007; - t['controlBS'] = 0x0008; - t['controlCAN'] = 0x0018; - t['controlCR'] = 0x000D; - t['controlDC1'] = 0x0011; - t['controlDC2'] = 0x0012; - t['controlDC3'] = 0x0013; - t['controlDC4'] = 0x0014; - t['controlDEL'] = 0x007F; - t['controlDLE'] = 0x0010; - t['controlEM'] = 0x0019; - t['controlENQ'] = 0x0005; - t['controlEOT'] = 0x0004; - t['controlESC'] = 0x001B; - t['controlETB'] = 0x0017; - t['controlETX'] = 0x0003; - t['controlFF'] = 0x000C; - t['controlFS'] = 0x001C; - t['controlGS'] = 0x001D; - t['controlHT'] = 0x0009; - t['controlLF'] = 0x000A; - t['controlNAK'] = 0x0015; - t['controlRS'] = 0x001E; - t['controlSI'] = 0x000F; - t['controlSO'] = 0x000E; - t['controlSOT'] = 0x0002; - t['controlSTX'] = 0x0001; - t['controlSUB'] = 0x001A; - t['controlSYN'] = 0x0016; - t['controlUS'] = 0x001F; - t['controlVT'] = 0x000B; - t['copyright'] = 0x00A9; - t['copyrightsans'] = 0xF8E9; - t['copyrightserif'] = 0xF6D9; - t['cornerbracketleft'] = 0x300C; - t['cornerbracketlefthalfwidth'] = 0xFF62; - t['cornerbracketleftvertical'] = 0xFE41; - t['cornerbracketright'] = 0x300D; - t['cornerbracketrighthalfwidth'] = 0xFF63; - t['cornerbracketrightvertical'] = 0xFE42; - t['corporationsquare'] = 0x337F; - t['cosquare'] = 0x33C7; - t['coverkgsquare'] = 0x33C6; - t['cparen'] = 0x249E; - t['cruzeiro'] = 0x20A2; - t['cstretched'] = 0x0297; - t['curlyand'] = 0x22CF; - t['curlyor'] = 0x22CE; - t['currency'] = 0x00A4; - t['cyrBreve'] = 0xF6D1; - t['cyrFlex'] = 0xF6D2; - t['cyrbreve'] = 0xF6D4; - t['cyrflex'] = 0xF6D5; - t['d'] = 0x0064; - t['daarmenian'] = 0x0564; - t['dabengali'] = 0x09A6; - t['dadarabic'] = 0x0636; - t['dadeva'] = 0x0926; - t['dadfinalarabic'] = 0xFEBE; - t['dadinitialarabic'] = 0xFEBF; - t['dadmedialarabic'] = 0xFEC0; - t['dagesh'] = 0x05BC; - t['dageshhebrew'] = 0x05BC; - t['dagger'] = 0x2020; - t['daggerdbl'] = 0x2021; - t['dagujarati'] = 0x0AA6; - t['dagurmukhi'] = 0x0A26; - t['dahiragana'] = 0x3060; - t['dakatakana'] = 0x30C0; - t['dalarabic'] = 0x062F; - t['dalet'] = 0x05D3; - t['daletdagesh'] = 0xFB33; - t['daletdageshhebrew'] = 0xFB33; - t['dalethebrew'] = 0x05D3; - t['dalfinalarabic'] = 0xFEAA; - t['dammaarabic'] = 0x064F; - t['dammalowarabic'] = 0x064F; - t['dammatanaltonearabic'] = 0x064C; - t['dammatanarabic'] = 0x064C; - t['danda'] = 0x0964; - t['dargahebrew'] = 0x05A7; - t['dargalefthebrew'] = 0x05A7; - t['dasiapneumatacyrilliccmb'] = 0x0485; - t['dblGrave'] = 0xF6D3; - t['dblanglebracketleft'] = 0x300A; - t['dblanglebracketleftvertical'] = 0xFE3D; - t['dblanglebracketright'] = 0x300B; - t['dblanglebracketrightvertical'] = 0xFE3E; - t['dblarchinvertedbelowcmb'] = 0x032B; - t['dblarrowleft'] = 0x21D4; - t['dblarrowright'] = 0x21D2; - t['dbldanda'] = 0x0965; - t['dblgrave'] = 0xF6D6; - t['dblgravecmb'] = 0x030F; - t['dblintegral'] = 0x222C; - t['dbllowline'] = 0x2017; - t['dbllowlinecmb'] = 0x0333; - t['dbloverlinecmb'] = 0x033F; - t['dblprimemod'] = 0x02BA; - t['dblverticalbar'] = 0x2016; - t['dblverticallineabovecmb'] = 0x030E; - t['dbopomofo'] = 0x3109; - t['dbsquare'] = 0x33C8; - t['dcaron'] = 0x010F; - t['dcedilla'] = 0x1E11; - t['dcircle'] = 0x24D3; - t['dcircumflexbelow'] = 0x1E13; - t['dcroat'] = 0x0111; - t['ddabengali'] = 0x09A1; - t['ddadeva'] = 0x0921; - t['ddagujarati'] = 0x0AA1; - t['ddagurmukhi'] = 0x0A21; - t['ddalarabic'] = 0x0688; - t['ddalfinalarabic'] = 0xFB89; - t['dddhadeva'] = 0x095C; - t['ddhabengali'] = 0x09A2; - t['ddhadeva'] = 0x0922; - t['ddhagujarati'] = 0x0AA2; - t['ddhagurmukhi'] = 0x0A22; - t['ddotaccent'] = 0x1E0B; - t['ddotbelow'] = 0x1E0D; - t['decimalseparatorarabic'] = 0x066B; - t['decimalseparatorpersian'] = 0x066B; - t['decyrillic'] = 0x0434; - t['degree'] = 0x00B0; - t['dehihebrew'] = 0x05AD; - t['dehiragana'] = 0x3067; - t['deicoptic'] = 0x03EF; - t['dekatakana'] = 0x30C7; - t['deleteleft'] = 0x232B; - t['deleteright'] = 0x2326; - t['delta'] = 0x03B4; - t['deltaturned'] = 0x018D; - t['denominatorminusonenumeratorbengali'] = 0x09F8; - t['dezh'] = 0x02A4; - t['dhabengali'] = 0x09A7; - t['dhadeva'] = 0x0927; - t['dhagujarati'] = 0x0AA7; - t['dhagurmukhi'] = 0x0A27; - t['dhook'] = 0x0257; - t['dialytikatonos'] = 0x0385; - t['dialytikatonoscmb'] = 0x0344; - t['diamond'] = 0x2666; - t['diamondsuitwhite'] = 0x2662; - t['dieresis'] = 0x00A8; - t['dieresisacute'] = 0xF6D7; - t['dieresisbelowcmb'] = 0x0324; - t['dieresiscmb'] = 0x0308; - t['dieresisgrave'] = 0xF6D8; - t['dieresistonos'] = 0x0385; - t['dihiragana'] = 0x3062; - t['dikatakana'] = 0x30C2; - t['dittomark'] = 0x3003; - t['divide'] = 0x00F7; - t['divides'] = 0x2223; - t['divisionslash'] = 0x2215; - t['djecyrillic'] = 0x0452; - t['dkshade'] = 0x2593; - t['dlinebelow'] = 0x1E0F; - t['dlsquare'] = 0x3397; - t['dmacron'] = 0x0111; - t['dmonospace'] = 0xFF44; - t['dnblock'] = 0x2584; - t['dochadathai'] = 0x0E0E; - t['dodekthai'] = 0x0E14; - t['dohiragana'] = 0x3069; - t['dokatakana'] = 0x30C9; - t['dollar'] = 0x0024; - t['dollarinferior'] = 0xF6E3; - t['dollarmonospace'] = 0xFF04; - t['dollaroldstyle'] = 0xF724; - t['dollarsmall'] = 0xFE69; - t['dollarsuperior'] = 0xF6E4; - t['dong'] = 0x20AB; - t['dorusquare'] = 0x3326; - t['dotaccent'] = 0x02D9; - t['dotaccentcmb'] = 0x0307; - t['dotbelowcmb'] = 0x0323; - t['dotbelowcomb'] = 0x0323; - t['dotkatakana'] = 0x30FB; - t['dotlessi'] = 0x0131; - t['dotlessj'] = 0xF6BE; - t['dotlessjstrokehook'] = 0x0284; - t['dotmath'] = 0x22C5; - t['dottedcircle'] = 0x25CC; - t['doubleyodpatah'] = 0xFB1F; - t['doubleyodpatahhebrew'] = 0xFB1F; - t['downtackbelowcmb'] = 0x031E; - t['downtackmod'] = 0x02D5; - t['dparen'] = 0x249F; - t['dsuperior'] = 0xF6EB; - t['dtail'] = 0x0256; - t['dtopbar'] = 0x018C; - t['duhiragana'] = 0x3065; - t['dukatakana'] = 0x30C5; - t['dz'] = 0x01F3; - t['dzaltone'] = 0x02A3; - t['dzcaron'] = 0x01C6; - t['dzcurl'] = 0x02A5; - t['dzeabkhasiancyrillic'] = 0x04E1; - t['dzecyrillic'] = 0x0455; - t['dzhecyrillic'] = 0x045F; - t['e'] = 0x0065; - t['eacute'] = 0x00E9; - t['earth'] = 0x2641; - t['ebengali'] = 0x098F; - t['ebopomofo'] = 0x311C; - t['ebreve'] = 0x0115; - t['ecandradeva'] = 0x090D; - t['ecandragujarati'] = 0x0A8D; - t['ecandravowelsigndeva'] = 0x0945; - t['ecandravowelsigngujarati'] = 0x0AC5; - t['ecaron'] = 0x011B; - t['ecedillabreve'] = 0x1E1D; - t['echarmenian'] = 0x0565; - t['echyiwnarmenian'] = 0x0587; - t['ecircle'] = 0x24D4; - t['ecircumflex'] = 0x00EA; - t['ecircumflexacute'] = 0x1EBF; - t['ecircumflexbelow'] = 0x1E19; - t['ecircumflexdotbelow'] = 0x1EC7; - t['ecircumflexgrave'] = 0x1EC1; - t['ecircumflexhookabove'] = 0x1EC3; - t['ecircumflextilde'] = 0x1EC5; - t['ecyrillic'] = 0x0454; - t['edblgrave'] = 0x0205; - t['edeva'] = 0x090F; - t['edieresis'] = 0x00EB; - t['edot'] = 0x0117; - t['edotaccent'] = 0x0117; - t['edotbelow'] = 0x1EB9; - t['eegurmukhi'] = 0x0A0F; - t['eematragurmukhi'] = 0x0A47; - t['efcyrillic'] = 0x0444; - t['egrave'] = 0x00E8; - t['egujarati'] = 0x0A8F; - t['eharmenian'] = 0x0567; - t['ehbopomofo'] = 0x311D; - t['ehiragana'] = 0x3048; - t['ehookabove'] = 0x1EBB; - t['eibopomofo'] = 0x311F; - t['eight'] = 0x0038; - t['eightarabic'] = 0x0668; - t['eightbengali'] = 0x09EE; - t['eightcircle'] = 0x2467; - t['eightcircleinversesansserif'] = 0x2791; - t['eightdeva'] = 0x096E; - t['eighteencircle'] = 0x2471; - t['eighteenparen'] = 0x2485; - t['eighteenperiod'] = 0x2499; - t['eightgujarati'] = 0x0AEE; - t['eightgurmukhi'] = 0x0A6E; - t['eighthackarabic'] = 0x0668; - t['eighthangzhou'] = 0x3028; - t['eighthnotebeamed'] = 0x266B; - t['eightideographicparen'] = 0x3227; - t['eightinferior'] = 0x2088; - t['eightmonospace'] = 0xFF18; - t['eightoldstyle'] = 0xF738; - t['eightparen'] = 0x247B; - t['eightperiod'] = 0x248F; - t['eightpersian'] = 0x06F8; - t['eightroman'] = 0x2177; - t['eightsuperior'] = 0x2078; - t['eightthai'] = 0x0E58; - t['einvertedbreve'] = 0x0207; - t['eiotifiedcyrillic'] = 0x0465; - t['ekatakana'] = 0x30A8; - t['ekatakanahalfwidth'] = 0xFF74; - t['ekonkargurmukhi'] = 0x0A74; - t['ekorean'] = 0x3154; - t['elcyrillic'] = 0x043B; - t['element'] = 0x2208; - t['elevencircle'] = 0x246A; - t['elevenparen'] = 0x247E; - t['elevenperiod'] = 0x2492; - t['elevenroman'] = 0x217A; - t['ellipsis'] = 0x2026; - t['ellipsisvertical'] = 0x22EE; - t['emacron'] = 0x0113; - t['emacronacute'] = 0x1E17; - t['emacrongrave'] = 0x1E15; - t['emcyrillic'] = 0x043C; - t['emdash'] = 0x2014; - t['emdashvertical'] = 0xFE31; - t['emonospace'] = 0xFF45; - t['emphasismarkarmenian'] = 0x055B; - t['emptyset'] = 0x2205; - t['enbopomofo'] = 0x3123; - t['encyrillic'] = 0x043D; - t['endash'] = 0x2013; - t['endashvertical'] = 0xFE32; - t['endescendercyrillic'] = 0x04A3; - t['eng'] = 0x014B; - t['engbopomofo'] = 0x3125; - t['enghecyrillic'] = 0x04A5; - t['enhookcyrillic'] = 0x04C8; - t['enspace'] = 0x2002; - t['eogonek'] = 0x0119; - t['eokorean'] = 0x3153; - t['eopen'] = 0x025B; - t['eopenclosed'] = 0x029A; - t['eopenreversed'] = 0x025C; - t['eopenreversedclosed'] = 0x025E; - t['eopenreversedhook'] = 0x025D; - t['eparen'] = 0x24A0; - t['epsilon'] = 0x03B5; - t['epsilontonos'] = 0x03AD; - t['equal'] = 0x003D; - t['equalmonospace'] = 0xFF1D; - t['equalsmall'] = 0xFE66; - t['equalsuperior'] = 0x207C; - t['equivalence'] = 0x2261; - t['erbopomofo'] = 0x3126; - t['ercyrillic'] = 0x0440; - t['ereversed'] = 0x0258; - t['ereversedcyrillic'] = 0x044D; - t['escyrillic'] = 0x0441; - t['esdescendercyrillic'] = 0x04AB; - t['esh'] = 0x0283; - t['eshcurl'] = 0x0286; - t['eshortdeva'] = 0x090E; - t['eshortvowelsigndeva'] = 0x0946; - t['eshreversedloop'] = 0x01AA; - t['eshsquatreversed'] = 0x0285; - t['esmallhiragana'] = 0x3047; - t['esmallkatakana'] = 0x30A7; - t['esmallkatakanahalfwidth'] = 0xFF6A; - t['estimated'] = 0x212E; - t['esuperior'] = 0xF6EC; - t['eta'] = 0x03B7; - t['etarmenian'] = 0x0568; - t['etatonos'] = 0x03AE; - t['eth'] = 0x00F0; - t['etilde'] = 0x1EBD; - t['etildebelow'] = 0x1E1B; - t['etnahtafoukhhebrew'] = 0x0591; - t['etnahtafoukhlefthebrew'] = 0x0591; - t['etnahtahebrew'] = 0x0591; - t['etnahtalefthebrew'] = 0x0591; - t['eturned'] = 0x01DD; - t['eukorean'] = 0x3161; - t['euro'] = 0x20AC; - t['evowelsignbengali'] = 0x09C7; - t['evowelsigndeva'] = 0x0947; - t['evowelsigngujarati'] = 0x0AC7; - t['exclam'] = 0x0021; - t['exclamarmenian'] = 0x055C; - t['exclamdbl'] = 0x203C; - t['exclamdown'] = 0x00A1; - t['exclamdownsmall'] = 0xF7A1; - t['exclammonospace'] = 0xFF01; - t['exclamsmall'] = 0xF721; - t['existential'] = 0x2203; - t['ezh'] = 0x0292; - t['ezhcaron'] = 0x01EF; - t['ezhcurl'] = 0x0293; - t['ezhreversed'] = 0x01B9; - t['ezhtail'] = 0x01BA; - t['f'] = 0x0066; - t['fadeva'] = 0x095E; - t['fagurmukhi'] = 0x0A5E; - t['fahrenheit'] = 0x2109; - t['fathaarabic'] = 0x064E; - t['fathalowarabic'] = 0x064E; - t['fathatanarabic'] = 0x064B; - t['fbopomofo'] = 0x3108; - t['fcircle'] = 0x24D5; - t['fdotaccent'] = 0x1E1F; - t['feharabic'] = 0x0641; - t['feharmenian'] = 0x0586; - t['fehfinalarabic'] = 0xFED2; - t['fehinitialarabic'] = 0xFED3; - t['fehmedialarabic'] = 0xFED4; - t['feicoptic'] = 0x03E5; - t['female'] = 0x2640; - t['ff'] = 0xFB00; - t['ffi'] = 0xFB03; - t['ffl'] = 0xFB04; - t['fi'] = 0xFB01; - t['fifteencircle'] = 0x246E; - t['fifteenparen'] = 0x2482; - t['fifteenperiod'] = 0x2496; - t['figuredash'] = 0x2012; - t['filledbox'] = 0x25A0; - t['filledrect'] = 0x25AC; - t['finalkaf'] = 0x05DA; - t['finalkafdagesh'] = 0xFB3A; - t['finalkafdageshhebrew'] = 0xFB3A; - t['finalkafhebrew'] = 0x05DA; - t['finalmem'] = 0x05DD; - t['finalmemhebrew'] = 0x05DD; - t['finalnun'] = 0x05DF; - t['finalnunhebrew'] = 0x05DF; - t['finalpe'] = 0x05E3; - t['finalpehebrew'] = 0x05E3; - t['finaltsadi'] = 0x05E5; - t['finaltsadihebrew'] = 0x05E5; - t['firsttonechinese'] = 0x02C9; - t['fisheye'] = 0x25C9; - t['fitacyrillic'] = 0x0473; - t['five'] = 0x0035; - t['fivearabic'] = 0x0665; - t['fivebengali'] = 0x09EB; - t['fivecircle'] = 0x2464; - t['fivecircleinversesansserif'] = 0x278E; - t['fivedeva'] = 0x096B; - t['fiveeighths'] = 0x215D; - t['fivegujarati'] = 0x0AEB; - t['fivegurmukhi'] = 0x0A6B; - t['fivehackarabic'] = 0x0665; - t['fivehangzhou'] = 0x3025; - t['fiveideographicparen'] = 0x3224; - t['fiveinferior'] = 0x2085; - t['fivemonospace'] = 0xFF15; - t['fiveoldstyle'] = 0xF735; - t['fiveparen'] = 0x2478; - t['fiveperiod'] = 0x248C; - t['fivepersian'] = 0x06F5; - t['fiveroman'] = 0x2174; - t['fivesuperior'] = 0x2075; - t['fivethai'] = 0x0E55; - t['fl'] = 0xFB02; - t['florin'] = 0x0192; - t['fmonospace'] = 0xFF46; - t['fmsquare'] = 0x3399; - t['fofanthai'] = 0x0E1F; - t['fofathai'] = 0x0E1D; - t['fongmanthai'] = 0x0E4F; - t['forall'] = 0x2200; - t['four'] = 0x0034; - t['fourarabic'] = 0x0664; - t['fourbengali'] = 0x09EA; - t['fourcircle'] = 0x2463; - t['fourcircleinversesansserif'] = 0x278D; - t['fourdeva'] = 0x096A; - t['fourgujarati'] = 0x0AEA; - t['fourgurmukhi'] = 0x0A6A; - t['fourhackarabic'] = 0x0664; - t['fourhangzhou'] = 0x3024; - t['fourideographicparen'] = 0x3223; - t['fourinferior'] = 0x2084; - t['fourmonospace'] = 0xFF14; - t['fournumeratorbengali'] = 0x09F7; - t['fouroldstyle'] = 0xF734; - t['fourparen'] = 0x2477; - t['fourperiod'] = 0x248B; - t['fourpersian'] = 0x06F4; - t['fourroman'] = 0x2173; - t['foursuperior'] = 0x2074; - t['fourteencircle'] = 0x246D; - t['fourteenparen'] = 0x2481; - t['fourteenperiod'] = 0x2495; - t['fourthai'] = 0x0E54; - t['fourthtonechinese'] = 0x02CB; - t['fparen'] = 0x24A1; - t['fraction'] = 0x2044; - t['franc'] = 0x20A3; - t['g'] = 0x0067; - t['gabengali'] = 0x0997; - t['gacute'] = 0x01F5; - t['gadeva'] = 0x0917; - t['gafarabic'] = 0x06AF; - t['gaffinalarabic'] = 0xFB93; - t['gafinitialarabic'] = 0xFB94; - t['gafmedialarabic'] = 0xFB95; - t['gagujarati'] = 0x0A97; - t['gagurmukhi'] = 0x0A17; - t['gahiragana'] = 0x304C; - t['gakatakana'] = 0x30AC; - t['gamma'] = 0x03B3; - t['gammalatinsmall'] = 0x0263; - t['gammasuperior'] = 0x02E0; - t['gangiacoptic'] = 0x03EB; - t['gbopomofo'] = 0x310D; - t['gbreve'] = 0x011F; - t['gcaron'] = 0x01E7; - t['gcedilla'] = 0x0123; - t['gcircle'] = 0x24D6; - t['gcircumflex'] = 0x011D; - t['gcommaaccent'] = 0x0123; - t['gdot'] = 0x0121; - t['gdotaccent'] = 0x0121; - t['gecyrillic'] = 0x0433; - t['gehiragana'] = 0x3052; - t['gekatakana'] = 0x30B2; - t['geometricallyequal'] = 0x2251; - t['gereshaccenthebrew'] = 0x059C; - t['gereshhebrew'] = 0x05F3; - t['gereshmuqdamhebrew'] = 0x059D; - t['germandbls'] = 0x00DF; - t['gershayimaccenthebrew'] = 0x059E; - t['gershayimhebrew'] = 0x05F4; - t['getamark'] = 0x3013; - t['ghabengali'] = 0x0998; - t['ghadarmenian'] = 0x0572; - t['ghadeva'] = 0x0918; - t['ghagujarati'] = 0x0A98; - t['ghagurmukhi'] = 0x0A18; - t['ghainarabic'] = 0x063A; - t['ghainfinalarabic'] = 0xFECE; - t['ghaininitialarabic'] = 0xFECF; - t['ghainmedialarabic'] = 0xFED0; - t['ghemiddlehookcyrillic'] = 0x0495; - t['ghestrokecyrillic'] = 0x0493; - t['gheupturncyrillic'] = 0x0491; - t['ghhadeva'] = 0x095A; - t['ghhagurmukhi'] = 0x0A5A; - t['ghook'] = 0x0260; - t['ghzsquare'] = 0x3393; - t['gihiragana'] = 0x304E; - t['gikatakana'] = 0x30AE; - t['gimarmenian'] = 0x0563; - t['gimel'] = 0x05D2; - t['gimeldagesh'] = 0xFB32; - t['gimeldageshhebrew'] = 0xFB32; - t['gimelhebrew'] = 0x05D2; - t['gjecyrillic'] = 0x0453; - t['glottalinvertedstroke'] = 0x01BE; - t['glottalstop'] = 0x0294; - t['glottalstopinverted'] = 0x0296; - t['glottalstopmod'] = 0x02C0; - t['glottalstopreversed'] = 0x0295; - t['glottalstopreversedmod'] = 0x02C1; - t['glottalstopreversedsuperior'] = 0x02E4; - t['glottalstopstroke'] = 0x02A1; - t['glottalstopstrokereversed'] = 0x02A2; - t['gmacron'] = 0x1E21; - t['gmonospace'] = 0xFF47; - t['gohiragana'] = 0x3054; - t['gokatakana'] = 0x30B4; - t['gparen'] = 0x24A2; - t['gpasquare'] = 0x33AC; - t['gradient'] = 0x2207; - t['grave'] = 0x0060; - t['gravebelowcmb'] = 0x0316; - t['gravecmb'] = 0x0300; - t['gravecomb'] = 0x0300; - t['gravedeva'] = 0x0953; - t['gravelowmod'] = 0x02CE; - t['gravemonospace'] = 0xFF40; - t['gravetonecmb'] = 0x0340; - t['greater'] = 0x003E; - t['greaterequal'] = 0x2265; - t['greaterequalorless'] = 0x22DB; - t['greatermonospace'] = 0xFF1E; - t['greaterorequivalent'] = 0x2273; - t['greaterorless'] = 0x2277; - t['greateroverequal'] = 0x2267; - t['greatersmall'] = 0xFE65; - t['gscript'] = 0x0261; - t['gstroke'] = 0x01E5; - t['guhiragana'] = 0x3050; - t['guillemotleft'] = 0x00AB; - t['guillemotright'] = 0x00BB; - t['guilsinglleft'] = 0x2039; - t['guilsinglright'] = 0x203A; - t['gukatakana'] = 0x30B0; - t['guramusquare'] = 0x3318; - t['gysquare'] = 0x33C9; - t['h'] = 0x0068; - t['haabkhasiancyrillic'] = 0x04A9; - t['haaltonearabic'] = 0x06C1; - t['habengali'] = 0x09B9; - t['hadescendercyrillic'] = 0x04B3; - t['hadeva'] = 0x0939; - t['hagujarati'] = 0x0AB9; - t['hagurmukhi'] = 0x0A39; - t['haharabic'] = 0x062D; - t['hahfinalarabic'] = 0xFEA2; - t['hahinitialarabic'] = 0xFEA3; - t['hahiragana'] = 0x306F; - t['hahmedialarabic'] = 0xFEA4; - t['haitusquare'] = 0x332A; - t['hakatakana'] = 0x30CF; - t['hakatakanahalfwidth'] = 0xFF8A; - t['halantgurmukhi'] = 0x0A4D; - t['hamzaarabic'] = 0x0621; - t['hamzalowarabic'] = 0x0621; - t['hangulfiller'] = 0x3164; - t['hardsigncyrillic'] = 0x044A; - t['harpoonleftbarbup'] = 0x21BC; - t['harpoonrightbarbup'] = 0x21C0; - t['hasquare'] = 0x33CA; - t['hatafpatah'] = 0x05B2; - t['hatafpatah16'] = 0x05B2; - t['hatafpatah23'] = 0x05B2; - t['hatafpatah2f'] = 0x05B2; - t['hatafpatahhebrew'] = 0x05B2; - t['hatafpatahnarrowhebrew'] = 0x05B2; - t['hatafpatahquarterhebrew'] = 0x05B2; - t['hatafpatahwidehebrew'] = 0x05B2; - t['hatafqamats'] = 0x05B3; - t['hatafqamats1b'] = 0x05B3; - t['hatafqamats28'] = 0x05B3; - t['hatafqamats34'] = 0x05B3; - t['hatafqamatshebrew'] = 0x05B3; - t['hatafqamatsnarrowhebrew'] = 0x05B3; - t['hatafqamatsquarterhebrew'] = 0x05B3; - t['hatafqamatswidehebrew'] = 0x05B3; - t['hatafsegol'] = 0x05B1; - t['hatafsegol17'] = 0x05B1; - t['hatafsegol24'] = 0x05B1; - t['hatafsegol30'] = 0x05B1; - t['hatafsegolhebrew'] = 0x05B1; - t['hatafsegolnarrowhebrew'] = 0x05B1; - t['hatafsegolquarterhebrew'] = 0x05B1; - t['hatafsegolwidehebrew'] = 0x05B1; - t['hbar'] = 0x0127; - t['hbopomofo'] = 0x310F; - t['hbrevebelow'] = 0x1E2B; - t['hcedilla'] = 0x1E29; - t['hcircle'] = 0x24D7; - t['hcircumflex'] = 0x0125; - t['hdieresis'] = 0x1E27; - t['hdotaccent'] = 0x1E23; - t['hdotbelow'] = 0x1E25; - t['he'] = 0x05D4; - t['heart'] = 0x2665; - t['heartsuitblack'] = 0x2665; - t['heartsuitwhite'] = 0x2661; - t['hedagesh'] = 0xFB34; - t['hedageshhebrew'] = 0xFB34; - t['hehaltonearabic'] = 0x06C1; - t['heharabic'] = 0x0647; - t['hehebrew'] = 0x05D4; - t['hehfinalaltonearabic'] = 0xFBA7; - t['hehfinalalttwoarabic'] = 0xFEEA; - t['hehfinalarabic'] = 0xFEEA; - t['hehhamzaabovefinalarabic'] = 0xFBA5; - t['hehhamzaaboveisolatedarabic'] = 0xFBA4; - t['hehinitialaltonearabic'] = 0xFBA8; - t['hehinitialarabic'] = 0xFEEB; - t['hehiragana'] = 0x3078; - t['hehmedialaltonearabic'] = 0xFBA9; - t['hehmedialarabic'] = 0xFEEC; - t['heiseierasquare'] = 0x337B; - t['hekatakana'] = 0x30D8; - t['hekatakanahalfwidth'] = 0xFF8D; - t['hekutaarusquare'] = 0x3336; - t['henghook'] = 0x0267; - t['herutusquare'] = 0x3339; - t['het'] = 0x05D7; - t['hethebrew'] = 0x05D7; - t['hhook'] = 0x0266; - t['hhooksuperior'] = 0x02B1; - t['hieuhacirclekorean'] = 0x327B; - t['hieuhaparenkorean'] = 0x321B; - t['hieuhcirclekorean'] = 0x326D; - t['hieuhkorean'] = 0x314E; - t['hieuhparenkorean'] = 0x320D; - t['hihiragana'] = 0x3072; - t['hikatakana'] = 0x30D2; - t['hikatakanahalfwidth'] = 0xFF8B; - t['hiriq'] = 0x05B4; - t['hiriq14'] = 0x05B4; - t['hiriq21'] = 0x05B4; - t['hiriq2d'] = 0x05B4; - t['hiriqhebrew'] = 0x05B4; - t['hiriqnarrowhebrew'] = 0x05B4; - t['hiriqquarterhebrew'] = 0x05B4; - t['hiriqwidehebrew'] = 0x05B4; - t['hlinebelow'] = 0x1E96; - t['hmonospace'] = 0xFF48; - t['hoarmenian'] = 0x0570; - t['hohipthai'] = 0x0E2B; - t['hohiragana'] = 0x307B; - t['hokatakana'] = 0x30DB; - t['hokatakanahalfwidth'] = 0xFF8E; - t['holam'] = 0x05B9; - t['holam19'] = 0x05B9; - t['holam26'] = 0x05B9; - t['holam32'] = 0x05B9; - t['holamhebrew'] = 0x05B9; - t['holamnarrowhebrew'] = 0x05B9; - t['holamquarterhebrew'] = 0x05B9; - t['holamwidehebrew'] = 0x05B9; - t['honokhukthai'] = 0x0E2E; - t['hookabovecomb'] = 0x0309; - t['hookcmb'] = 0x0309; - t['hookpalatalizedbelowcmb'] = 0x0321; - t['hookretroflexbelowcmb'] = 0x0322; - t['hoonsquare'] = 0x3342; - t['horicoptic'] = 0x03E9; - t['horizontalbar'] = 0x2015; - t['horncmb'] = 0x031B; - t['hotsprings'] = 0x2668; - t['house'] = 0x2302; - t['hparen'] = 0x24A3; - t['hsuperior'] = 0x02B0; - t['hturned'] = 0x0265; - t['huhiragana'] = 0x3075; - t['huiitosquare'] = 0x3333; - t['hukatakana'] = 0x30D5; - t['hukatakanahalfwidth'] = 0xFF8C; - t['hungarumlaut'] = 0x02DD; - t['hungarumlautcmb'] = 0x030B; - t['hv'] = 0x0195; - t['hyphen'] = 0x002D; - t['hypheninferior'] = 0xF6E5; - t['hyphenmonospace'] = 0xFF0D; - t['hyphensmall'] = 0xFE63; - t['hyphensuperior'] = 0xF6E6; - t['hyphentwo'] = 0x2010; - t['i'] = 0x0069; - t['iacute'] = 0x00ED; - t['iacyrillic'] = 0x044F; - t['ibengali'] = 0x0987; - t['ibopomofo'] = 0x3127; - t['ibreve'] = 0x012D; - t['icaron'] = 0x01D0; - t['icircle'] = 0x24D8; - t['icircumflex'] = 0x00EE; - t['icyrillic'] = 0x0456; - t['idblgrave'] = 0x0209; - t['ideographearthcircle'] = 0x328F; - t['ideographfirecircle'] = 0x328B; - t['ideographicallianceparen'] = 0x323F; - t['ideographiccallparen'] = 0x323A; - t['ideographiccentrecircle'] = 0x32A5; - t['ideographicclose'] = 0x3006; - t['ideographiccomma'] = 0x3001; - t['ideographiccommaleft'] = 0xFF64; - t['ideographiccongratulationparen'] = 0x3237; - t['ideographiccorrectcircle'] = 0x32A3; - t['ideographicearthparen'] = 0x322F; - t['ideographicenterpriseparen'] = 0x323D; - t['ideographicexcellentcircle'] = 0x329D; - t['ideographicfestivalparen'] = 0x3240; - t['ideographicfinancialcircle'] = 0x3296; - t['ideographicfinancialparen'] = 0x3236; - t['ideographicfireparen'] = 0x322B; - t['ideographichaveparen'] = 0x3232; - t['ideographichighcircle'] = 0x32A4; - t['ideographiciterationmark'] = 0x3005; - t['ideographiclaborcircle'] = 0x3298; - t['ideographiclaborparen'] = 0x3238; - t['ideographicleftcircle'] = 0x32A7; - t['ideographiclowcircle'] = 0x32A6; - t['ideographicmedicinecircle'] = 0x32A9; - t['ideographicmetalparen'] = 0x322E; - t['ideographicmoonparen'] = 0x322A; - t['ideographicnameparen'] = 0x3234; - t['ideographicperiod'] = 0x3002; - t['ideographicprintcircle'] = 0x329E; - t['ideographicreachparen'] = 0x3243; - t['ideographicrepresentparen'] = 0x3239; - t['ideographicresourceparen'] = 0x323E; - t['ideographicrightcircle'] = 0x32A8; - t['ideographicsecretcircle'] = 0x3299; - t['ideographicselfparen'] = 0x3242; - t['ideographicsocietyparen'] = 0x3233; - t['ideographicspace'] = 0x3000; - t['ideographicspecialparen'] = 0x3235; - t['ideographicstockparen'] = 0x3231; - t['ideographicstudyparen'] = 0x323B; - t['ideographicsunparen'] = 0x3230; - t['ideographicsuperviseparen'] = 0x323C; - t['ideographicwaterparen'] = 0x322C; - t['ideographicwoodparen'] = 0x322D; - t['ideographiczero'] = 0x3007; - t['ideographmetalcircle'] = 0x328E; - t['ideographmooncircle'] = 0x328A; - t['ideographnamecircle'] = 0x3294; - t['ideographsuncircle'] = 0x3290; - t['ideographwatercircle'] = 0x328C; - t['ideographwoodcircle'] = 0x328D; - t['ideva'] = 0x0907; - t['idieresis'] = 0x00EF; - t['idieresisacute'] = 0x1E2F; - t['idieresiscyrillic'] = 0x04E5; - t['idotbelow'] = 0x1ECB; - t['iebrevecyrillic'] = 0x04D7; - t['iecyrillic'] = 0x0435; - t['ieungacirclekorean'] = 0x3275; - t['ieungaparenkorean'] = 0x3215; - t['ieungcirclekorean'] = 0x3267; - t['ieungkorean'] = 0x3147; - t['ieungparenkorean'] = 0x3207; - t['igrave'] = 0x00EC; - t['igujarati'] = 0x0A87; - t['igurmukhi'] = 0x0A07; - t['ihiragana'] = 0x3044; - t['ihookabove'] = 0x1EC9; - t['iibengali'] = 0x0988; - t['iicyrillic'] = 0x0438; - t['iideva'] = 0x0908; - t['iigujarati'] = 0x0A88; - t['iigurmukhi'] = 0x0A08; - t['iimatragurmukhi'] = 0x0A40; - t['iinvertedbreve'] = 0x020B; - t['iishortcyrillic'] = 0x0439; - t['iivowelsignbengali'] = 0x09C0; - t['iivowelsigndeva'] = 0x0940; - t['iivowelsigngujarati'] = 0x0AC0; - t['ij'] = 0x0133; - t['ikatakana'] = 0x30A4; - t['ikatakanahalfwidth'] = 0xFF72; - t['ikorean'] = 0x3163; - t['ilde'] = 0x02DC; - t['iluyhebrew'] = 0x05AC; - t['imacron'] = 0x012B; - t['imacroncyrillic'] = 0x04E3; - t['imageorapproximatelyequal'] = 0x2253; - t['imatragurmukhi'] = 0x0A3F; - t['imonospace'] = 0xFF49; - t['increment'] = 0x2206; - t['infinity'] = 0x221E; - t['iniarmenian'] = 0x056B; - t['integral'] = 0x222B; - t['integralbottom'] = 0x2321; - t['integralbt'] = 0x2321; - t['integralex'] = 0xF8F5; - t['integraltop'] = 0x2320; - t['integraltp'] = 0x2320; - t['intersection'] = 0x2229; - t['intisquare'] = 0x3305; - t['invbullet'] = 0x25D8; - t['invcircle'] = 0x25D9; - t['invsmileface'] = 0x263B; - t['iocyrillic'] = 0x0451; - t['iogonek'] = 0x012F; - t['iota'] = 0x03B9; - t['iotadieresis'] = 0x03CA; - t['iotadieresistonos'] = 0x0390; - t['iotalatin'] = 0x0269; - t['iotatonos'] = 0x03AF; - t['iparen'] = 0x24A4; - t['irigurmukhi'] = 0x0A72; - t['ismallhiragana'] = 0x3043; - t['ismallkatakana'] = 0x30A3; - t['ismallkatakanahalfwidth'] = 0xFF68; - t['issharbengali'] = 0x09FA; - t['istroke'] = 0x0268; - t['isuperior'] = 0xF6ED; - t['iterationhiragana'] = 0x309D; - t['iterationkatakana'] = 0x30FD; - t['itilde'] = 0x0129; - t['itildebelow'] = 0x1E2D; - t['iubopomofo'] = 0x3129; - t['iucyrillic'] = 0x044E; - t['ivowelsignbengali'] = 0x09BF; - t['ivowelsigndeva'] = 0x093F; - t['ivowelsigngujarati'] = 0x0ABF; - t['izhitsacyrillic'] = 0x0475; - t['izhitsadblgravecyrillic'] = 0x0477; - t['j'] = 0x006A; - t['jaarmenian'] = 0x0571; - t['jabengali'] = 0x099C; - t['jadeva'] = 0x091C; - t['jagujarati'] = 0x0A9C; - t['jagurmukhi'] = 0x0A1C; - t['jbopomofo'] = 0x3110; - t['jcaron'] = 0x01F0; - t['jcircle'] = 0x24D9; - t['jcircumflex'] = 0x0135; - t['jcrossedtail'] = 0x029D; - t['jdotlessstroke'] = 0x025F; - t['jecyrillic'] = 0x0458; - t['jeemarabic'] = 0x062C; - t['jeemfinalarabic'] = 0xFE9E; - t['jeeminitialarabic'] = 0xFE9F; - t['jeemmedialarabic'] = 0xFEA0; - t['jeharabic'] = 0x0698; - t['jehfinalarabic'] = 0xFB8B; - t['jhabengali'] = 0x099D; - t['jhadeva'] = 0x091D; - t['jhagujarati'] = 0x0A9D; - t['jhagurmukhi'] = 0x0A1D; - t['jheharmenian'] = 0x057B; - t['jis'] = 0x3004; - t['jmonospace'] = 0xFF4A; - t['jparen'] = 0x24A5; - t['jsuperior'] = 0x02B2; - t['k'] = 0x006B; - t['kabashkircyrillic'] = 0x04A1; - t['kabengali'] = 0x0995; - t['kacute'] = 0x1E31; - t['kacyrillic'] = 0x043A; - t['kadescendercyrillic'] = 0x049B; - t['kadeva'] = 0x0915; - t['kaf'] = 0x05DB; - t['kafarabic'] = 0x0643; - t['kafdagesh'] = 0xFB3B; - t['kafdageshhebrew'] = 0xFB3B; - t['kaffinalarabic'] = 0xFEDA; - t['kafhebrew'] = 0x05DB; - t['kafinitialarabic'] = 0xFEDB; - t['kafmedialarabic'] = 0xFEDC; - t['kafrafehebrew'] = 0xFB4D; - t['kagujarati'] = 0x0A95; - t['kagurmukhi'] = 0x0A15; - t['kahiragana'] = 0x304B; - t['kahookcyrillic'] = 0x04C4; - t['kakatakana'] = 0x30AB; - t['kakatakanahalfwidth'] = 0xFF76; - t['kappa'] = 0x03BA; - t['kappasymbolgreek'] = 0x03F0; - t['kapyeounmieumkorean'] = 0x3171; - t['kapyeounphieuphkorean'] = 0x3184; - t['kapyeounpieupkorean'] = 0x3178; - t['kapyeounssangpieupkorean'] = 0x3179; - t['karoriisquare'] = 0x330D; - t['kashidaautoarabic'] = 0x0640; - t['kashidaautonosidebearingarabic'] = 0x0640; - t['kasmallkatakana'] = 0x30F5; - t['kasquare'] = 0x3384; - t['kasraarabic'] = 0x0650; - t['kasratanarabic'] = 0x064D; - t['kastrokecyrillic'] = 0x049F; - t['katahiraprolongmarkhalfwidth'] = 0xFF70; - t['kaverticalstrokecyrillic'] = 0x049D; - t['kbopomofo'] = 0x310E; - t['kcalsquare'] = 0x3389; - t['kcaron'] = 0x01E9; - t['kcedilla'] = 0x0137; - t['kcircle'] = 0x24DA; - t['kcommaaccent'] = 0x0137; - t['kdotbelow'] = 0x1E33; - t['keharmenian'] = 0x0584; - t['kehiragana'] = 0x3051; - t['kekatakana'] = 0x30B1; - t['kekatakanahalfwidth'] = 0xFF79; - t['kenarmenian'] = 0x056F; - t['kesmallkatakana'] = 0x30F6; - t['kgreenlandic'] = 0x0138; - t['khabengali'] = 0x0996; - t['khacyrillic'] = 0x0445; - t['khadeva'] = 0x0916; - t['khagujarati'] = 0x0A96; - t['khagurmukhi'] = 0x0A16; - t['khaharabic'] = 0x062E; - t['khahfinalarabic'] = 0xFEA6; - t['khahinitialarabic'] = 0xFEA7; - t['khahmedialarabic'] = 0xFEA8; - t['kheicoptic'] = 0x03E7; - t['khhadeva'] = 0x0959; - t['khhagurmukhi'] = 0x0A59; - t['khieukhacirclekorean'] = 0x3278; - t['khieukhaparenkorean'] = 0x3218; - t['khieukhcirclekorean'] = 0x326A; - t['khieukhkorean'] = 0x314B; - t['khieukhparenkorean'] = 0x320A; - t['khokhaithai'] = 0x0E02; - t['khokhonthai'] = 0x0E05; - t['khokhuatthai'] = 0x0E03; - t['khokhwaithai'] = 0x0E04; - t['khomutthai'] = 0x0E5B; - t['khook'] = 0x0199; - t['khorakhangthai'] = 0x0E06; - t['khzsquare'] = 0x3391; - t['kihiragana'] = 0x304D; - t['kikatakana'] = 0x30AD; - t['kikatakanahalfwidth'] = 0xFF77; - t['kiroguramusquare'] = 0x3315; - t['kiromeetorusquare'] = 0x3316; - t['kirosquare'] = 0x3314; - t['kiyeokacirclekorean'] = 0x326E; - t['kiyeokaparenkorean'] = 0x320E; - t['kiyeokcirclekorean'] = 0x3260; - t['kiyeokkorean'] = 0x3131; - t['kiyeokparenkorean'] = 0x3200; - t['kiyeoksioskorean'] = 0x3133; - t['kjecyrillic'] = 0x045C; - t['klinebelow'] = 0x1E35; - t['klsquare'] = 0x3398; - t['kmcubedsquare'] = 0x33A6; - t['kmonospace'] = 0xFF4B; - t['kmsquaredsquare'] = 0x33A2; - t['kohiragana'] = 0x3053; - t['kohmsquare'] = 0x33C0; - t['kokaithai'] = 0x0E01; - t['kokatakana'] = 0x30B3; - t['kokatakanahalfwidth'] = 0xFF7A; - t['kooposquare'] = 0x331E; - t['koppacyrillic'] = 0x0481; - t['koreanstandardsymbol'] = 0x327F; - t['koroniscmb'] = 0x0343; - t['kparen'] = 0x24A6; - t['kpasquare'] = 0x33AA; - t['ksicyrillic'] = 0x046F; - t['ktsquare'] = 0x33CF; - t['kturned'] = 0x029E; - t['kuhiragana'] = 0x304F; - t['kukatakana'] = 0x30AF; - t['kukatakanahalfwidth'] = 0xFF78; - t['kvsquare'] = 0x33B8; - t['kwsquare'] = 0x33BE; - t['l'] = 0x006C; - t['labengali'] = 0x09B2; - t['lacute'] = 0x013A; - t['ladeva'] = 0x0932; - t['lagujarati'] = 0x0AB2; - t['lagurmukhi'] = 0x0A32; - t['lakkhangyaothai'] = 0x0E45; - t['lamaleffinalarabic'] = 0xFEFC; - t['lamalefhamzaabovefinalarabic'] = 0xFEF8; - t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7; - t['lamalefhamzabelowfinalarabic'] = 0xFEFA; - t['lamalefhamzabelowisolatedarabic'] = 0xFEF9; - t['lamalefisolatedarabic'] = 0xFEFB; - t['lamalefmaddaabovefinalarabic'] = 0xFEF6; - t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5; - t['lamarabic'] = 0x0644; - t['lambda'] = 0x03BB; - t['lambdastroke'] = 0x019B; - t['lamed'] = 0x05DC; - t['lameddagesh'] = 0xFB3C; - t['lameddageshhebrew'] = 0xFB3C; - t['lamedhebrew'] = 0x05DC; - t['lamfinalarabic'] = 0xFEDE; - t['lamhahinitialarabic'] = 0xFCCA; - t['laminitialarabic'] = 0xFEDF; - t['lamjeeminitialarabic'] = 0xFCC9; - t['lamkhahinitialarabic'] = 0xFCCB; - t['lamlamhehisolatedarabic'] = 0xFDF2; - t['lammedialarabic'] = 0xFEE0; - t['lammeemhahinitialarabic'] = 0xFD88; - t['lammeeminitialarabic'] = 0xFCCC; - t['largecircle'] = 0x25EF; - t['lbar'] = 0x019A; - t['lbelt'] = 0x026C; - t['lbopomofo'] = 0x310C; - t['lcaron'] = 0x013E; - t['lcedilla'] = 0x013C; - t['lcircle'] = 0x24DB; - t['lcircumflexbelow'] = 0x1E3D; - t['lcommaaccent'] = 0x013C; - t['ldot'] = 0x0140; - t['ldotaccent'] = 0x0140; - t['ldotbelow'] = 0x1E37; - t['ldotbelowmacron'] = 0x1E39; - t['leftangleabovecmb'] = 0x031A; - t['lefttackbelowcmb'] = 0x0318; - t['less'] = 0x003C; - t['lessequal'] = 0x2264; - t['lessequalorgreater'] = 0x22DA; - t['lessmonospace'] = 0xFF1C; - t['lessorequivalent'] = 0x2272; - t['lessorgreater'] = 0x2276; - t['lessoverequal'] = 0x2266; - t['lesssmall'] = 0xFE64; - t['lezh'] = 0x026E; - t['lfblock'] = 0x258C; - t['lhookretroflex'] = 0x026D; - t['lira'] = 0x20A4; - t['liwnarmenian'] = 0x056C; - t['lj'] = 0x01C9; - t['ljecyrillic'] = 0x0459; - t['ll'] = 0xF6C0; - t['lladeva'] = 0x0933; - t['llagujarati'] = 0x0AB3; - t['llinebelow'] = 0x1E3B; - t['llladeva'] = 0x0934; - t['llvocalicbengali'] = 0x09E1; - t['llvocalicdeva'] = 0x0961; - t['llvocalicvowelsignbengali'] = 0x09E3; - t['llvocalicvowelsigndeva'] = 0x0963; - t['lmiddletilde'] = 0x026B; - t['lmonospace'] = 0xFF4C; - t['lmsquare'] = 0x33D0; - t['lochulathai'] = 0x0E2C; - t['logicaland'] = 0x2227; - t['logicalnot'] = 0x00AC; - t['logicalnotreversed'] = 0x2310; - t['logicalor'] = 0x2228; - t['lolingthai'] = 0x0E25; - t['longs'] = 0x017F; - t['lowlinecenterline'] = 0xFE4E; - t['lowlinecmb'] = 0x0332; - t['lowlinedashed'] = 0xFE4D; - t['lozenge'] = 0x25CA; - t['lparen'] = 0x24A7; - t['lslash'] = 0x0142; - t['lsquare'] = 0x2113; - t['lsuperior'] = 0xF6EE; - t['ltshade'] = 0x2591; - t['luthai'] = 0x0E26; - t['lvocalicbengali'] = 0x098C; - t['lvocalicdeva'] = 0x090C; - t['lvocalicvowelsignbengali'] = 0x09E2; - t['lvocalicvowelsigndeva'] = 0x0962; - t['lxsquare'] = 0x33D3; - t['m'] = 0x006D; - t['mabengali'] = 0x09AE; - t['macron'] = 0x00AF; - t['macronbelowcmb'] = 0x0331; - t['macroncmb'] = 0x0304; - t['macronlowmod'] = 0x02CD; - t['macronmonospace'] = 0xFFE3; - t['macute'] = 0x1E3F; - t['madeva'] = 0x092E; - t['magujarati'] = 0x0AAE; - t['magurmukhi'] = 0x0A2E; - t['mahapakhhebrew'] = 0x05A4; - t['mahapakhlefthebrew'] = 0x05A4; - t['mahiragana'] = 0x307E; - t['maichattawalowleftthai'] = 0xF895; - t['maichattawalowrightthai'] = 0xF894; - t['maichattawathai'] = 0x0E4B; - t['maichattawaupperleftthai'] = 0xF893; - t['maieklowleftthai'] = 0xF88C; - t['maieklowrightthai'] = 0xF88B; - t['maiekthai'] = 0x0E48; - t['maiekupperleftthai'] = 0xF88A; - t['maihanakatleftthai'] = 0xF884; - t['maihanakatthai'] = 0x0E31; - t['maitaikhuleftthai'] = 0xF889; - t['maitaikhuthai'] = 0x0E47; - t['maitholowleftthai'] = 0xF88F; - t['maitholowrightthai'] = 0xF88E; - t['maithothai'] = 0x0E49; - t['maithoupperleftthai'] = 0xF88D; - t['maitrilowleftthai'] = 0xF892; - t['maitrilowrightthai'] = 0xF891; - t['maitrithai'] = 0x0E4A; - t['maitriupperleftthai'] = 0xF890; - t['maiyamokthai'] = 0x0E46; - t['makatakana'] = 0x30DE; - t['makatakanahalfwidth'] = 0xFF8F; - t['male'] = 0x2642; - t['mansyonsquare'] = 0x3347; - t['maqafhebrew'] = 0x05BE; - t['mars'] = 0x2642; - t['masoracirclehebrew'] = 0x05AF; - t['masquare'] = 0x3383; - t['mbopomofo'] = 0x3107; - t['mbsquare'] = 0x33D4; - t['mcircle'] = 0x24DC; - t['mcubedsquare'] = 0x33A5; - t['mdotaccent'] = 0x1E41; - t['mdotbelow'] = 0x1E43; - t['meemarabic'] = 0x0645; - t['meemfinalarabic'] = 0xFEE2; - t['meeminitialarabic'] = 0xFEE3; - t['meemmedialarabic'] = 0xFEE4; - t['meemmeeminitialarabic'] = 0xFCD1; - t['meemmeemisolatedarabic'] = 0xFC48; - t['meetorusquare'] = 0x334D; - t['mehiragana'] = 0x3081; - t['meizierasquare'] = 0x337E; - t['mekatakana'] = 0x30E1; - t['mekatakanahalfwidth'] = 0xFF92; - t['mem'] = 0x05DE; - t['memdagesh'] = 0xFB3E; - t['memdageshhebrew'] = 0xFB3E; - t['memhebrew'] = 0x05DE; - t['menarmenian'] = 0x0574; - t['merkhahebrew'] = 0x05A5; - t['merkhakefulahebrew'] = 0x05A6; - t['merkhakefulalefthebrew'] = 0x05A6; - t['merkhalefthebrew'] = 0x05A5; - t['mhook'] = 0x0271; - t['mhzsquare'] = 0x3392; - t['middledotkatakanahalfwidth'] = 0xFF65; - t['middot'] = 0x00B7; - t['mieumacirclekorean'] = 0x3272; - t['mieumaparenkorean'] = 0x3212; - t['mieumcirclekorean'] = 0x3264; - t['mieumkorean'] = 0x3141; - t['mieumpansioskorean'] = 0x3170; - t['mieumparenkorean'] = 0x3204; - t['mieumpieupkorean'] = 0x316E; - t['mieumsioskorean'] = 0x316F; - t['mihiragana'] = 0x307F; - t['mikatakana'] = 0x30DF; - t['mikatakanahalfwidth'] = 0xFF90; - t['minus'] = 0x2212; - t['minusbelowcmb'] = 0x0320; - t['minuscircle'] = 0x2296; - t['minusmod'] = 0x02D7; - t['minusplus'] = 0x2213; - t['minute'] = 0x2032; - t['miribaarusquare'] = 0x334A; - t['mirisquare'] = 0x3349; - t['mlonglegturned'] = 0x0270; - t['mlsquare'] = 0x3396; - t['mmcubedsquare'] = 0x33A3; - t['mmonospace'] = 0xFF4D; - t['mmsquaredsquare'] = 0x339F; - t['mohiragana'] = 0x3082; - t['mohmsquare'] = 0x33C1; - t['mokatakana'] = 0x30E2; - t['mokatakanahalfwidth'] = 0xFF93; - t['molsquare'] = 0x33D6; - t['momathai'] = 0x0E21; - t['moverssquare'] = 0x33A7; - t['moverssquaredsquare'] = 0x33A8; - t['mparen'] = 0x24A8; - t['mpasquare'] = 0x33AB; - t['mssquare'] = 0x33B3; - t['msuperior'] = 0xF6EF; - t['mturned'] = 0x026F; - t['mu'] = 0x00B5; - t['mu1'] = 0x00B5; - t['muasquare'] = 0x3382; - t['muchgreater'] = 0x226B; - t['muchless'] = 0x226A; - t['mufsquare'] = 0x338C; - t['mugreek'] = 0x03BC; - t['mugsquare'] = 0x338D; - t['muhiragana'] = 0x3080; - t['mukatakana'] = 0x30E0; - t['mukatakanahalfwidth'] = 0xFF91; - t['mulsquare'] = 0x3395; - t['multiply'] = 0x00D7; - t['mumsquare'] = 0x339B; - t['munahhebrew'] = 0x05A3; - t['munahlefthebrew'] = 0x05A3; - t['musicalnote'] = 0x266A; - t['musicalnotedbl'] = 0x266B; - t['musicflatsign'] = 0x266D; - t['musicsharpsign'] = 0x266F; - t['mussquare'] = 0x33B2; - t['muvsquare'] = 0x33B6; - t['muwsquare'] = 0x33BC; - t['mvmegasquare'] = 0x33B9; - t['mvsquare'] = 0x33B7; - t['mwmegasquare'] = 0x33BF; - t['mwsquare'] = 0x33BD; - t['n'] = 0x006E; - t['nabengali'] = 0x09A8; - t['nabla'] = 0x2207; - t['nacute'] = 0x0144; - t['nadeva'] = 0x0928; - t['nagujarati'] = 0x0AA8; - t['nagurmukhi'] = 0x0A28; - t['nahiragana'] = 0x306A; - t['nakatakana'] = 0x30CA; - t['nakatakanahalfwidth'] = 0xFF85; - t['napostrophe'] = 0x0149; - t['nasquare'] = 0x3381; - t['nbopomofo'] = 0x310B; - t['nbspace'] = 0x00A0; - t['ncaron'] = 0x0148; - t['ncedilla'] = 0x0146; - t['ncircle'] = 0x24DD; - t['ncircumflexbelow'] = 0x1E4B; - t['ncommaaccent'] = 0x0146; - t['ndotaccent'] = 0x1E45; - t['ndotbelow'] = 0x1E47; - t['nehiragana'] = 0x306D; - t['nekatakana'] = 0x30CD; - t['nekatakanahalfwidth'] = 0xFF88; - t['newsheqelsign'] = 0x20AA; - t['nfsquare'] = 0x338B; - t['ngabengali'] = 0x0999; - t['ngadeva'] = 0x0919; - t['ngagujarati'] = 0x0A99; - t['ngagurmukhi'] = 0x0A19; - t['ngonguthai'] = 0x0E07; - t['nhiragana'] = 0x3093; - t['nhookleft'] = 0x0272; - t['nhookretroflex'] = 0x0273; - t['nieunacirclekorean'] = 0x326F; - t['nieunaparenkorean'] = 0x320F; - t['nieuncieuckorean'] = 0x3135; - t['nieuncirclekorean'] = 0x3261; - t['nieunhieuhkorean'] = 0x3136; - t['nieunkorean'] = 0x3134; - t['nieunpansioskorean'] = 0x3168; - t['nieunparenkorean'] = 0x3201; - t['nieunsioskorean'] = 0x3167; - t['nieuntikeutkorean'] = 0x3166; - t['nihiragana'] = 0x306B; - t['nikatakana'] = 0x30CB; - t['nikatakanahalfwidth'] = 0xFF86; - t['nikhahitleftthai'] = 0xF899; - t['nikhahitthai'] = 0x0E4D; - t['nine'] = 0x0039; - t['ninearabic'] = 0x0669; - t['ninebengali'] = 0x09EF; - t['ninecircle'] = 0x2468; - t['ninecircleinversesansserif'] = 0x2792; - t['ninedeva'] = 0x096F; - t['ninegujarati'] = 0x0AEF; - t['ninegurmukhi'] = 0x0A6F; - t['ninehackarabic'] = 0x0669; - t['ninehangzhou'] = 0x3029; - t['nineideographicparen'] = 0x3228; - t['nineinferior'] = 0x2089; - t['ninemonospace'] = 0xFF19; - t['nineoldstyle'] = 0xF739; - t['nineparen'] = 0x247C; - t['nineperiod'] = 0x2490; - t['ninepersian'] = 0x06F9; - t['nineroman'] = 0x2178; - t['ninesuperior'] = 0x2079; - t['nineteencircle'] = 0x2472; - t['nineteenparen'] = 0x2486; - t['nineteenperiod'] = 0x249A; - t['ninethai'] = 0x0E59; - t['nj'] = 0x01CC; - t['njecyrillic'] = 0x045A; - t['nkatakana'] = 0x30F3; - t['nkatakanahalfwidth'] = 0xFF9D; - t['nlegrightlong'] = 0x019E; - t['nlinebelow'] = 0x1E49; - t['nmonospace'] = 0xFF4E; - t['nmsquare'] = 0x339A; - t['nnabengali'] = 0x09A3; - t['nnadeva'] = 0x0923; - t['nnagujarati'] = 0x0AA3; - t['nnagurmukhi'] = 0x0A23; - t['nnnadeva'] = 0x0929; - t['nohiragana'] = 0x306E; - t['nokatakana'] = 0x30CE; - t['nokatakanahalfwidth'] = 0xFF89; - t['nonbreakingspace'] = 0x00A0; - t['nonenthai'] = 0x0E13; - t['nonuthai'] = 0x0E19; - t['noonarabic'] = 0x0646; - t['noonfinalarabic'] = 0xFEE6; - t['noonghunnaarabic'] = 0x06BA; - t['noonghunnafinalarabic'] = 0xFB9F; - t['nooninitialarabic'] = 0xFEE7; - t['noonjeeminitialarabic'] = 0xFCD2; - t['noonjeemisolatedarabic'] = 0xFC4B; - t['noonmedialarabic'] = 0xFEE8; - t['noonmeeminitialarabic'] = 0xFCD5; - t['noonmeemisolatedarabic'] = 0xFC4E; - t['noonnoonfinalarabic'] = 0xFC8D; - t['notcontains'] = 0x220C; - t['notelement'] = 0x2209; - t['notelementof'] = 0x2209; - t['notequal'] = 0x2260; - t['notgreater'] = 0x226F; - t['notgreaternorequal'] = 0x2271; - t['notgreaternorless'] = 0x2279; - t['notidentical'] = 0x2262; - t['notless'] = 0x226E; - t['notlessnorequal'] = 0x2270; - t['notparallel'] = 0x2226; - t['notprecedes'] = 0x2280; - t['notsubset'] = 0x2284; - t['notsucceeds'] = 0x2281; - t['notsuperset'] = 0x2285; - t['nowarmenian'] = 0x0576; - t['nparen'] = 0x24A9; - t['nssquare'] = 0x33B1; - t['nsuperior'] = 0x207F; - t['ntilde'] = 0x00F1; - t['nu'] = 0x03BD; - t['nuhiragana'] = 0x306C; - t['nukatakana'] = 0x30CC; - t['nukatakanahalfwidth'] = 0xFF87; - t['nuktabengali'] = 0x09BC; - t['nuktadeva'] = 0x093C; - t['nuktagujarati'] = 0x0ABC; - t['nuktagurmukhi'] = 0x0A3C; - t['numbersign'] = 0x0023; - t['numbersignmonospace'] = 0xFF03; - t['numbersignsmall'] = 0xFE5F; - t['numeralsigngreek'] = 0x0374; - t['numeralsignlowergreek'] = 0x0375; - t['numero'] = 0x2116; - t['nun'] = 0x05E0; - t['nundagesh'] = 0xFB40; - t['nundageshhebrew'] = 0xFB40; - t['nunhebrew'] = 0x05E0; - t['nvsquare'] = 0x33B5; - t['nwsquare'] = 0x33BB; - t['nyabengali'] = 0x099E; - t['nyadeva'] = 0x091E; - t['nyagujarati'] = 0x0A9E; - t['nyagurmukhi'] = 0x0A1E; - t['o'] = 0x006F; - t['oacute'] = 0x00F3; - t['oangthai'] = 0x0E2D; - t['obarred'] = 0x0275; - t['obarredcyrillic'] = 0x04E9; - t['obarreddieresiscyrillic'] = 0x04EB; - t['obengali'] = 0x0993; - t['obopomofo'] = 0x311B; - t['obreve'] = 0x014F; - t['ocandradeva'] = 0x0911; - t['ocandragujarati'] = 0x0A91; - t['ocandravowelsigndeva'] = 0x0949; - t['ocandravowelsigngujarati'] = 0x0AC9; - t['ocaron'] = 0x01D2; - t['ocircle'] = 0x24DE; - t['ocircumflex'] = 0x00F4; - t['ocircumflexacute'] = 0x1ED1; - t['ocircumflexdotbelow'] = 0x1ED9; - t['ocircumflexgrave'] = 0x1ED3; - t['ocircumflexhookabove'] = 0x1ED5; - t['ocircumflextilde'] = 0x1ED7; - t['ocyrillic'] = 0x043E; - t['odblacute'] = 0x0151; - t['odblgrave'] = 0x020D; - t['odeva'] = 0x0913; - t['odieresis'] = 0x00F6; - t['odieresiscyrillic'] = 0x04E7; - t['odotbelow'] = 0x1ECD; - t['oe'] = 0x0153; - t['oekorean'] = 0x315A; - t['ogonek'] = 0x02DB; - t['ogonekcmb'] = 0x0328; - t['ograve'] = 0x00F2; - t['ogujarati'] = 0x0A93; - t['oharmenian'] = 0x0585; - t['ohiragana'] = 0x304A; - t['ohookabove'] = 0x1ECF; - t['ohorn'] = 0x01A1; - t['ohornacute'] = 0x1EDB; - t['ohorndotbelow'] = 0x1EE3; - t['ohorngrave'] = 0x1EDD; - t['ohornhookabove'] = 0x1EDF; - t['ohorntilde'] = 0x1EE1; - t['ohungarumlaut'] = 0x0151; - t['oi'] = 0x01A3; - t['oinvertedbreve'] = 0x020F; - t['okatakana'] = 0x30AA; - t['okatakanahalfwidth'] = 0xFF75; - t['okorean'] = 0x3157; - t['olehebrew'] = 0x05AB; - t['omacron'] = 0x014D; - t['omacronacute'] = 0x1E53; - t['omacrongrave'] = 0x1E51; - t['omdeva'] = 0x0950; - t['omega'] = 0x03C9; - t['omega1'] = 0x03D6; - t['omegacyrillic'] = 0x0461; - t['omegalatinclosed'] = 0x0277; - t['omegaroundcyrillic'] = 0x047B; - t['omegatitlocyrillic'] = 0x047D; - t['omegatonos'] = 0x03CE; - t['omgujarati'] = 0x0AD0; - t['omicron'] = 0x03BF; - t['omicrontonos'] = 0x03CC; - t['omonospace'] = 0xFF4F; - t['one'] = 0x0031; - t['onearabic'] = 0x0661; - t['onebengali'] = 0x09E7; - t['onecircle'] = 0x2460; - t['onecircleinversesansserif'] = 0x278A; - t['onedeva'] = 0x0967; - t['onedotenleader'] = 0x2024; - t['oneeighth'] = 0x215B; - t['onefitted'] = 0xF6DC; - t['onegujarati'] = 0x0AE7; - t['onegurmukhi'] = 0x0A67; - t['onehackarabic'] = 0x0661; - t['onehalf'] = 0x00BD; - t['onehangzhou'] = 0x3021; - t['oneideographicparen'] = 0x3220; - t['oneinferior'] = 0x2081; - t['onemonospace'] = 0xFF11; - t['onenumeratorbengali'] = 0x09F4; - t['oneoldstyle'] = 0xF731; - t['oneparen'] = 0x2474; - t['oneperiod'] = 0x2488; - t['onepersian'] = 0x06F1; - t['onequarter'] = 0x00BC; - t['oneroman'] = 0x2170; - t['onesuperior'] = 0x00B9; - t['onethai'] = 0x0E51; - t['onethird'] = 0x2153; - t['oogonek'] = 0x01EB; - t['oogonekmacron'] = 0x01ED; - t['oogurmukhi'] = 0x0A13; - t['oomatragurmukhi'] = 0x0A4B; - t['oopen'] = 0x0254; - t['oparen'] = 0x24AA; - t['openbullet'] = 0x25E6; - t['option'] = 0x2325; - t['ordfeminine'] = 0x00AA; - t['ordmasculine'] = 0x00BA; - t['orthogonal'] = 0x221F; - t['oshortdeva'] = 0x0912; - t['oshortvowelsigndeva'] = 0x094A; - t['oslash'] = 0x00F8; - t['oslashacute'] = 0x01FF; - t['osmallhiragana'] = 0x3049; - t['osmallkatakana'] = 0x30A9; - t['osmallkatakanahalfwidth'] = 0xFF6B; - t['ostrokeacute'] = 0x01FF; - t['osuperior'] = 0xF6F0; - t['otcyrillic'] = 0x047F; - t['otilde'] = 0x00F5; - t['otildeacute'] = 0x1E4D; - t['otildedieresis'] = 0x1E4F; - t['oubopomofo'] = 0x3121; - t['overline'] = 0x203E; - t['overlinecenterline'] = 0xFE4A; - t['overlinecmb'] = 0x0305; - t['overlinedashed'] = 0xFE49; - t['overlinedblwavy'] = 0xFE4C; - t['overlinewavy'] = 0xFE4B; - t['overscore'] = 0x00AF; - t['ovowelsignbengali'] = 0x09CB; - t['ovowelsigndeva'] = 0x094B; - t['ovowelsigngujarati'] = 0x0ACB; - t['p'] = 0x0070; - t['paampssquare'] = 0x3380; - t['paasentosquare'] = 0x332B; - t['pabengali'] = 0x09AA; - t['pacute'] = 0x1E55; - t['padeva'] = 0x092A; - t['pagedown'] = 0x21DF; - t['pageup'] = 0x21DE; - t['pagujarati'] = 0x0AAA; - t['pagurmukhi'] = 0x0A2A; - t['pahiragana'] = 0x3071; - t['paiyannoithai'] = 0x0E2F; - t['pakatakana'] = 0x30D1; - t['palatalizationcyrilliccmb'] = 0x0484; - t['palochkacyrillic'] = 0x04C0; - t['pansioskorean'] = 0x317F; - t['paragraph'] = 0x00B6; - t['parallel'] = 0x2225; - t['parenleft'] = 0x0028; - t['parenleftaltonearabic'] = 0xFD3E; - t['parenleftbt'] = 0xF8ED; - t['parenleftex'] = 0xF8EC; - t['parenleftinferior'] = 0x208D; - t['parenleftmonospace'] = 0xFF08; - t['parenleftsmall'] = 0xFE59; - t['parenleftsuperior'] = 0x207D; - t['parenlefttp'] = 0xF8EB; - t['parenleftvertical'] = 0xFE35; - t['parenright'] = 0x0029; - t['parenrightaltonearabic'] = 0xFD3F; - t['parenrightbt'] = 0xF8F8; - t['parenrightex'] = 0xF8F7; - t['parenrightinferior'] = 0x208E; - t['parenrightmonospace'] = 0xFF09; - t['parenrightsmall'] = 0xFE5A; - t['parenrightsuperior'] = 0x207E; - t['parenrighttp'] = 0xF8F6; - t['parenrightvertical'] = 0xFE36; - t['partialdiff'] = 0x2202; - t['paseqhebrew'] = 0x05C0; - t['pashtahebrew'] = 0x0599; - t['pasquare'] = 0x33A9; - t['patah'] = 0x05B7; - t['patah11'] = 0x05B7; - t['patah1d'] = 0x05B7; - t['patah2a'] = 0x05B7; - t['patahhebrew'] = 0x05B7; - t['patahnarrowhebrew'] = 0x05B7; - t['patahquarterhebrew'] = 0x05B7; - t['patahwidehebrew'] = 0x05B7; - t['pazerhebrew'] = 0x05A1; - t['pbopomofo'] = 0x3106; - t['pcircle'] = 0x24DF; - t['pdotaccent'] = 0x1E57; - t['pe'] = 0x05E4; - t['pecyrillic'] = 0x043F; - t['pedagesh'] = 0xFB44; - t['pedageshhebrew'] = 0xFB44; - t['peezisquare'] = 0x333B; - t['pefinaldageshhebrew'] = 0xFB43; - t['peharabic'] = 0x067E; - t['peharmenian'] = 0x057A; - t['pehebrew'] = 0x05E4; - t['pehfinalarabic'] = 0xFB57; - t['pehinitialarabic'] = 0xFB58; - t['pehiragana'] = 0x307A; - t['pehmedialarabic'] = 0xFB59; - t['pekatakana'] = 0x30DA; - t['pemiddlehookcyrillic'] = 0x04A7; - t['perafehebrew'] = 0xFB4E; - t['percent'] = 0x0025; - t['percentarabic'] = 0x066A; - t['percentmonospace'] = 0xFF05; - t['percentsmall'] = 0xFE6A; - t['period'] = 0x002E; - t['periodarmenian'] = 0x0589; - t['periodcentered'] = 0x00B7; - t['periodhalfwidth'] = 0xFF61; - t['periodinferior'] = 0xF6E7; - t['periodmonospace'] = 0xFF0E; - t['periodsmall'] = 0xFE52; - t['periodsuperior'] = 0xF6E8; - t['perispomenigreekcmb'] = 0x0342; - t['perpendicular'] = 0x22A5; - t['perthousand'] = 0x2030; - t['peseta'] = 0x20A7; - t['pfsquare'] = 0x338A; - t['phabengali'] = 0x09AB; - t['phadeva'] = 0x092B; - t['phagujarati'] = 0x0AAB; - t['phagurmukhi'] = 0x0A2B; - t['phi'] = 0x03C6; - t['phi1'] = 0x03D5; - t['phieuphacirclekorean'] = 0x327A; - t['phieuphaparenkorean'] = 0x321A; - t['phieuphcirclekorean'] = 0x326C; - t['phieuphkorean'] = 0x314D; - t['phieuphparenkorean'] = 0x320C; - t['philatin'] = 0x0278; - t['phinthuthai'] = 0x0E3A; - t['phisymbolgreek'] = 0x03D5; - t['phook'] = 0x01A5; - t['phophanthai'] = 0x0E1E; - t['phophungthai'] = 0x0E1C; - t['phosamphaothai'] = 0x0E20; - t['pi'] = 0x03C0; - t['pieupacirclekorean'] = 0x3273; - t['pieupaparenkorean'] = 0x3213; - t['pieupcieuckorean'] = 0x3176; - t['pieupcirclekorean'] = 0x3265; - t['pieupkiyeokkorean'] = 0x3172; - t['pieupkorean'] = 0x3142; - t['pieupparenkorean'] = 0x3205; - t['pieupsioskiyeokkorean'] = 0x3174; - t['pieupsioskorean'] = 0x3144; - t['pieupsiostikeutkorean'] = 0x3175; - t['pieupthieuthkorean'] = 0x3177; - t['pieuptikeutkorean'] = 0x3173; - t['pihiragana'] = 0x3074; - t['pikatakana'] = 0x30D4; - t['pisymbolgreek'] = 0x03D6; - t['piwrarmenian'] = 0x0583; - t['plus'] = 0x002B; - t['plusbelowcmb'] = 0x031F; - t['pluscircle'] = 0x2295; - t['plusminus'] = 0x00B1; - t['plusmod'] = 0x02D6; - t['plusmonospace'] = 0xFF0B; - t['plussmall'] = 0xFE62; - t['plussuperior'] = 0x207A; - t['pmonospace'] = 0xFF50; - t['pmsquare'] = 0x33D8; - t['pohiragana'] = 0x307D; - t['pointingindexdownwhite'] = 0x261F; - t['pointingindexleftwhite'] = 0x261C; - t['pointingindexrightwhite'] = 0x261E; - t['pointingindexupwhite'] = 0x261D; - t['pokatakana'] = 0x30DD; - t['poplathai'] = 0x0E1B; - t['postalmark'] = 0x3012; - t['postalmarkface'] = 0x3020; - t['pparen'] = 0x24AB; - t['precedes'] = 0x227A; - t['prescription'] = 0x211E; - t['primemod'] = 0x02B9; - t['primereversed'] = 0x2035; - t['product'] = 0x220F; - t['projective'] = 0x2305; - t['prolongedkana'] = 0x30FC; - t['propellor'] = 0x2318; - t['propersubset'] = 0x2282; - t['propersuperset'] = 0x2283; - t['proportion'] = 0x2237; - t['proportional'] = 0x221D; - t['psi'] = 0x03C8; - t['psicyrillic'] = 0x0471; - t['psilipneumatacyrilliccmb'] = 0x0486; - t['pssquare'] = 0x33B0; - t['puhiragana'] = 0x3077; - t['pukatakana'] = 0x30D7; - t['pvsquare'] = 0x33B4; - t['pwsquare'] = 0x33BA; - t['q'] = 0x0071; - t['qadeva'] = 0x0958; - t['qadmahebrew'] = 0x05A8; - t['qafarabic'] = 0x0642; - t['qaffinalarabic'] = 0xFED6; - t['qafinitialarabic'] = 0xFED7; - t['qafmedialarabic'] = 0xFED8; - t['qamats'] = 0x05B8; - t['qamats10'] = 0x05B8; - t['qamats1a'] = 0x05B8; - t['qamats1c'] = 0x05B8; - t['qamats27'] = 0x05B8; - t['qamats29'] = 0x05B8; - t['qamats33'] = 0x05B8; - t['qamatsde'] = 0x05B8; - t['qamatshebrew'] = 0x05B8; - t['qamatsnarrowhebrew'] = 0x05B8; - t['qamatsqatanhebrew'] = 0x05B8; - t['qamatsqatannarrowhebrew'] = 0x05B8; - t['qamatsqatanquarterhebrew'] = 0x05B8; - t['qamatsqatanwidehebrew'] = 0x05B8; - t['qamatsquarterhebrew'] = 0x05B8; - t['qamatswidehebrew'] = 0x05B8; - t['qarneyparahebrew'] = 0x059F; - t['qbopomofo'] = 0x3111; - t['qcircle'] = 0x24E0; - t['qhook'] = 0x02A0; - t['qmonospace'] = 0xFF51; - t['qof'] = 0x05E7; - t['qofdagesh'] = 0xFB47; - t['qofdageshhebrew'] = 0xFB47; - t['qofhebrew'] = 0x05E7; - t['qparen'] = 0x24AC; - t['quarternote'] = 0x2669; - t['qubuts'] = 0x05BB; - t['qubuts18'] = 0x05BB; - t['qubuts25'] = 0x05BB; - t['qubuts31'] = 0x05BB; - t['qubutshebrew'] = 0x05BB; - t['qubutsnarrowhebrew'] = 0x05BB; - t['qubutsquarterhebrew'] = 0x05BB; - t['qubutswidehebrew'] = 0x05BB; - t['question'] = 0x003F; - t['questionarabic'] = 0x061F; - t['questionarmenian'] = 0x055E; - t['questiondown'] = 0x00BF; - t['questiondownsmall'] = 0xF7BF; - t['questiongreek'] = 0x037E; - t['questionmonospace'] = 0xFF1F; - t['questionsmall'] = 0xF73F; - t['quotedbl'] = 0x0022; - t['quotedblbase'] = 0x201E; - t['quotedblleft'] = 0x201C; - t['quotedblmonospace'] = 0xFF02; - t['quotedblprime'] = 0x301E; - t['quotedblprimereversed'] = 0x301D; - t['quotedblright'] = 0x201D; - t['quoteleft'] = 0x2018; - t['quoteleftreversed'] = 0x201B; - t['quotereversed'] = 0x201B; - t['quoteright'] = 0x2019; - t['quoterightn'] = 0x0149; - t['quotesinglbase'] = 0x201A; - t['quotesingle'] = 0x0027; - t['quotesinglemonospace'] = 0xFF07; - t['r'] = 0x0072; - t['raarmenian'] = 0x057C; - t['rabengali'] = 0x09B0; - t['racute'] = 0x0155; - t['radeva'] = 0x0930; - t['radical'] = 0x221A; - t['radicalex'] = 0xF8E5; - t['radoverssquare'] = 0x33AE; - t['radoverssquaredsquare'] = 0x33AF; - t['radsquare'] = 0x33AD; - t['rafe'] = 0x05BF; - t['rafehebrew'] = 0x05BF; - t['ragujarati'] = 0x0AB0; - t['ragurmukhi'] = 0x0A30; - t['rahiragana'] = 0x3089; - t['rakatakana'] = 0x30E9; - t['rakatakanahalfwidth'] = 0xFF97; - t['ralowerdiagonalbengali'] = 0x09F1; - t['ramiddlediagonalbengali'] = 0x09F0; - t['ramshorn'] = 0x0264; - t['ratio'] = 0x2236; - t['rbopomofo'] = 0x3116; - t['rcaron'] = 0x0159; - t['rcedilla'] = 0x0157; - t['rcircle'] = 0x24E1; - t['rcommaaccent'] = 0x0157; - t['rdblgrave'] = 0x0211; - t['rdotaccent'] = 0x1E59; - t['rdotbelow'] = 0x1E5B; - t['rdotbelowmacron'] = 0x1E5D; - t['referencemark'] = 0x203B; - t['reflexsubset'] = 0x2286; - t['reflexsuperset'] = 0x2287; - t['registered'] = 0x00AE; - t['registersans'] = 0xF8E8; - t['registerserif'] = 0xF6DA; - t['reharabic'] = 0x0631; - t['reharmenian'] = 0x0580; - t['rehfinalarabic'] = 0xFEAE; - t['rehiragana'] = 0x308C; - t['rekatakana'] = 0x30EC; - t['rekatakanahalfwidth'] = 0xFF9A; - t['resh'] = 0x05E8; - t['reshdageshhebrew'] = 0xFB48; - t['reshhebrew'] = 0x05E8; - t['reversedtilde'] = 0x223D; - t['reviahebrew'] = 0x0597; - t['reviamugrashhebrew'] = 0x0597; - t['revlogicalnot'] = 0x2310; - t['rfishhook'] = 0x027E; - t['rfishhookreversed'] = 0x027F; - t['rhabengali'] = 0x09DD; - t['rhadeva'] = 0x095D; - t['rho'] = 0x03C1; - t['rhook'] = 0x027D; - t['rhookturned'] = 0x027B; - t['rhookturnedsuperior'] = 0x02B5; - t['rhosymbolgreek'] = 0x03F1; - t['rhotichookmod'] = 0x02DE; - t['rieulacirclekorean'] = 0x3271; - t['rieulaparenkorean'] = 0x3211; - t['rieulcirclekorean'] = 0x3263; - t['rieulhieuhkorean'] = 0x3140; - t['rieulkiyeokkorean'] = 0x313A; - t['rieulkiyeoksioskorean'] = 0x3169; - t['rieulkorean'] = 0x3139; - t['rieulmieumkorean'] = 0x313B; - t['rieulpansioskorean'] = 0x316C; - t['rieulparenkorean'] = 0x3203; - t['rieulphieuphkorean'] = 0x313F; - t['rieulpieupkorean'] = 0x313C; - t['rieulpieupsioskorean'] = 0x316B; - t['rieulsioskorean'] = 0x313D; - t['rieulthieuthkorean'] = 0x313E; - t['rieultikeutkorean'] = 0x316A; - t['rieulyeorinhieuhkorean'] = 0x316D; - t['rightangle'] = 0x221F; - t['righttackbelowcmb'] = 0x0319; - t['righttriangle'] = 0x22BF; - t['rihiragana'] = 0x308A; - t['rikatakana'] = 0x30EA; - t['rikatakanahalfwidth'] = 0xFF98; - t['ring'] = 0x02DA; - t['ringbelowcmb'] = 0x0325; - t['ringcmb'] = 0x030A; - t['ringhalfleft'] = 0x02BF; - t['ringhalfleftarmenian'] = 0x0559; - t['ringhalfleftbelowcmb'] = 0x031C; - t['ringhalfleftcentered'] = 0x02D3; - t['ringhalfright'] = 0x02BE; - t['ringhalfrightbelowcmb'] = 0x0339; - t['ringhalfrightcentered'] = 0x02D2; - t['rinvertedbreve'] = 0x0213; - t['rittorusquare'] = 0x3351; - t['rlinebelow'] = 0x1E5F; - t['rlongleg'] = 0x027C; - t['rlonglegturned'] = 0x027A; - t['rmonospace'] = 0xFF52; - t['rohiragana'] = 0x308D; - t['rokatakana'] = 0x30ED; - t['rokatakanahalfwidth'] = 0xFF9B; - t['roruathai'] = 0x0E23; - t['rparen'] = 0x24AD; - t['rrabengali'] = 0x09DC; - t['rradeva'] = 0x0931; - t['rragurmukhi'] = 0x0A5C; - t['rreharabic'] = 0x0691; - t['rrehfinalarabic'] = 0xFB8D; - t['rrvocalicbengali'] = 0x09E0; - t['rrvocalicdeva'] = 0x0960; - t['rrvocalicgujarati'] = 0x0AE0; - t['rrvocalicvowelsignbengali'] = 0x09C4; - t['rrvocalicvowelsigndeva'] = 0x0944; - t['rrvocalicvowelsigngujarati'] = 0x0AC4; - t['rsuperior'] = 0xF6F1; - t['rtblock'] = 0x2590; - t['rturned'] = 0x0279; - t['rturnedsuperior'] = 0x02B4; - t['ruhiragana'] = 0x308B; - t['rukatakana'] = 0x30EB; - t['rukatakanahalfwidth'] = 0xFF99; - t['rupeemarkbengali'] = 0x09F2; - t['rupeesignbengali'] = 0x09F3; - t['rupiah'] = 0xF6DD; - t['ruthai'] = 0x0E24; - t['rvocalicbengali'] = 0x098B; - t['rvocalicdeva'] = 0x090B; - t['rvocalicgujarati'] = 0x0A8B; - t['rvocalicvowelsignbengali'] = 0x09C3; - t['rvocalicvowelsigndeva'] = 0x0943; - t['rvocalicvowelsigngujarati'] = 0x0AC3; - t['s'] = 0x0073; - t['sabengali'] = 0x09B8; - t['sacute'] = 0x015B; - t['sacutedotaccent'] = 0x1E65; - t['sadarabic'] = 0x0635; - t['sadeva'] = 0x0938; - t['sadfinalarabic'] = 0xFEBA; - t['sadinitialarabic'] = 0xFEBB; - t['sadmedialarabic'] = 0xFEBC; - t['sagujarati'] = 0x0AB8; - t['sagurmukhi'] = 0x0A38; - t['sahiragana'] = 0x3055; - t['sakatakana'] = 0x30B5; - t['sakatakanahalfwidth'] = 0xFF7B; - t['sallallahoualayhewasallamarabic'] = 0xFDFA; - t['samekh'] = 0x05E1; - t['samekhdagesh'] = 0xFB41; - t['samekhdageshhebrew'] = 0xFB41; - t['samekhhebrew'] = 0x05E1; - t['saraaathai'] = 0x0E32; - t['saraaethai'] = 0x0E41; - t['saraaimaimalaithai'] = 0x0E44; - t['saraaimaimuanthai'] = 0x0E43; - t['saraamthai'] = 0x0E33; - t['saraathai'] = 0x0E30; - t['saraethai'] = 0x0E40; - t['saraiileftthai'] = 0xF886; - t['saraiithai'] = 0x0E35; - t['saraileftthai'] = 0xF885; - t['saraithai'] = 0x0E34; - t['saraothai'] = 0x0E42; - t['saraueeleftthai'] = 0xF888; - t['saraueethai'] = 0x0E37; - t['saraueleftthai'] = 0xF887; - t['sarauethai'] = 0x0E36; - t['sarauthai'] = 0x0E38; - t['sarauuthai'] = 0x0E39; - t['sbopomofo'] = 0x3119; - t['scaron'] = 0x0161; - t['scarondotaccent'] = 0x1E67; - t['scedilla'] = 0x015F; - t['schwa'] = 0x0259; - t['schwacyrillic'] = 0x04D9; - t['schwadieresiscyrillic'] = 0x04DB; - t['schwahook'] = 0x025A; - t['scircle'] = 0x24E2; - t['scircumflex'] = 0x015D; - t['scommaaccent'] = 0x0219; - t['sdotaccent'] = 0x1E61; - t['sdotbelow'] = 0x1E63; - t['sdotbelowdotaccent'] = 0x1E69; - t['seagullbelowcmb'] = 0x033C; - t['second'] = 0x2033; - t['secondtonechinese'] = 0x02CA; - t['section'] = 0x00A7; - t['seenarabic'] = 0x0633; - t['seenfinalarabic'] = 0xFEB2; - t['seeninitialarabic'] = 0xFEB3; - t['seenmedialarabic'] = 0xFEB4; - t['segol'] = 0x05B6; - t['segol13'] = 0x05B6; - t['segol1f'] = 0x05B6; - t['segol2c'] = 0x05B6; - t['segolhebrew'] = 0x05B6; - t['segolnarrowhebrew'] = 0x05B6; - t['segolquarterhebrew'] = 0x05B6; - t['segoltahebrew'] = 0x0592; - t['segolwidehebrew'] = 0x05B6; - t['seharmenian'] = 0x057D; - t['sehiragana'] = 0x305B; - t['sekatakana'] = 0x30BB; - t['sekatakanahalfwidth'] = 0xFF7E; - t['semicolon'] = 0x003B; - t['semicolonarabic'] = 0x061B; - t['semicolonmonospace'] = 0xFF1B; - t['semicolonsmall'] = 0xFE54; - t['semivoicedmarkkana'] = 0x309C; - t['semivoicedmarkkanahalfwidth'] = 0xFF9F; - t['sentisquare'] = 0x3322; - t['sentosquare'] = 0x3323; - t['seven'] = 0x0037; - t['sevenarabic'] = 0x0667; - t['sevenbengali'] = 0x09ED; - t['sevencircle'] = 0x2466; - t['sevencircleinversesansserif'] = 0x2790; - t['sevendeva'] = 0x096D; - t['seveneighths'] = 0x215E; - t['sevengujarati'] = 0x0AED; - t['sevengurmukhi'] = 0x0A6D; - t['sevenhackarabic'] = 0x0667; - t['sevenhangzhou'] = 0x3027; - t['sevenideographicparen'] = 0x3226; - t['seveninferior'] = 0x2087; - t['sevenmonospace'] = 0xFF17; - t['sevenoldstyle'] = 0xF737; - t['sevenparen'] = 0x247A; - t['sevenperiod'] = 0x248E; - t['sevenpersian'] = 0x06F7; - t['sevenroman'] = 0x2176; - t['sevensuperior'] = 0x2077; - t['seventeencircle'] = 0x2470; - t['seventeenparen'] = 0x2484; - t['seventeenperiod'] = 0x2498; - t['seventhai'] = 0x0E57; - t['sfthyphen'] = 0x00AD; - t['shaarmenian'] = 0x0577; - t['shabengali'] = 0x09B6; - t['shacyrillic'] = 0x0448; - t['shaddaarabic'] = 0x0651; - t['shaddadammaarabic'] = 0xFC61; - t['shaddadammatanarabic'] = 0xFC5E; - t['shaddafathaarabic'] = 0xFC60; - t['shaddakasraarabic'] = 0xFC62; - t['shaddakasratanarabic'] = 0xFC5F; - t['shade'] = 0x2592; - t['shadedark'] = 0x2593; - t['shadelight'] = 0x2591; - t['shademedium'] = 0x2592; - t['shadeva'] = 0x0936; - t['shagujarati'] = 0x0AB6; - t['shagurmukhi'] = 0x0A36; - t['shalshelethebrew'] = 0x0593; - t['shbopomofo'] = 0x3115; - t['shchacyrillic'] = 0x0449; - t['sheenarabic'] = 0x0634; - t['sheenfinalarabic'] = 0xFEB6; - t['sheeninitialarabic'] = 0xFEB7; - t['sheenmedialarabic'] = 0xFEB8; - t['sheicoptic'] = 0x03E3; - t['sheqel'] = 0x20AA; - t['sheqelhebrew'] = 0x20AA; - t['sheva'] = 0x05B0; - t['sheva115'] = 0x05B0; - t['sheva15'] = 0x05B0; - t['sheva22'] = 0x05B0; - t['sheva2e'] = 0x05B0; - t['shevahebrew'] = 0x05B0; - t['shevanarrowhebrew'] = 0x05B0; - t['shevaquarterhebrew'] = 0x05B0; - t['shevawidehebrew'] = 0x05B0; - t['shhacyrillic'] = 0x04BB; - t['shimacoptic'] = 0x03ED; - t['shin'] = 0x05E9; - t['shindagesh'] = 0xFB49; - t['shindageshhebrew'] = 0xFB49; - t['shindageshshindot'] = 0xFB2C; - t['shindageshshindothebrew'] = 0xFB2C; - t['shindageshsindot'] = 0xFB2D; - t['shindageshsindothebrew'] = 0xFB2D; - t['shindothebrew'] = 0x05C1; - t['shinhebrew'] = 0x05E9; - t['shinshindot'] = 0xFB2A; - t['shinshindothebrew'] = 0xFB2A; - t['shinsindot'] = 0xFB2B; - t['shinsindothebrew'] = 0xFB2B; - t['shook'] = 0x0282; - t['sigma'] = 0x03C3; - t['sigma1'] = 0x03C2; - t['sigmafinal'] = 0x03C2; - t['sigmalunatesymbolgreek'] = 0x03F2; - t['sihiragana'] = 0x3057; - t['sikatakana'] = 0x30B7; - t['sikatakanahalfwidth'] = 0xFF7C; - t['siluqhebrew'] = 0x05BD; - t['siluqlefthebrew'] = 0x05BD; - t['similar'] = 0x223C; - t['sindothebrew'] = 0x05C2; - t['siosacirclekorean'] = 0x3274; - t['siosaparenkorean'] = 0x3214; - t['sioscieuckorean'] = 0x317E; - t['sioscirclekorean'] = 0x3266; - t['sioskiyeokkorean'] = 0x317A; - t['sioskorean'] = 0x3145; - t['siosnieunkorean'] = 0x317B; - t['siosparenkorean'] = 0x3206; - t['siospieupkorean'] = 0x317D; - t['siostikeutkorean'] = 0x317C; - t['six'] = 0x0036; - t['sixarabic'] = 0x0666; - t['sixbengali'] = 0x09EC; - t['sixcircle'] = 0x2465; - t['sixcircleinversesansserif'] = 0x278F; - t['sixdeva'] = 0x096C; - t['sixgujarati'] = 0x0AEC; - t['sixgurmukhi'] = 0x0A6C; - t['sixhackarabic'] = 0x0666; - t['sixhangzhou'] = 0x3026; - t['sixideographicparen'] = 0x3225; - t['sixinferior'] = 0x2086; - t['sixmonospace'] = 0xFF16; - t['sixoldstyle'] = 0xF736; - t['sixparen'] = 0x2479; - t['sixperiod'] = 0x248D; - t['sixpersian'] = 0x06F6; - t['sixroman'] = 0x2175; - t['sixsuperior'] = 0x2076; - t['sixteencircle'] = 0x246F; - t['sixteencurrencydenominatorbengali'] = 0x09F9; - t['sixteenparen'] = 0x2483; - t['sixteenperiod'] = 0x2497; - t['sixthai'] = 0x0E56; - t['slash'] = 0x002F; - t['slashmonospace'] = 0xFF0F; - t['slong'] = 0x017F; - t['slongdotaccent'] = 0x1E9B; - t['smileface'] = 0x263A; - t['smonospace'] = 0xFF53; - t['sofpasuqhebrew'] = 0x05C3; - t['softhyphen'] = 0x00AD; - t['softsigncyrillic'] = 0x044C; - t['sohiragana'] = 0x305D; - t['sokatakana'] = 0x30BD; - t['sokatakanahalfwidth'] = 0xFF7F; - t['soliduslongoverlaycmb'] = 0x0338; - t['solidusshortoverlaycmb'] = 0x0337; - t['sorusithai'] = 0x0E29; - t['sosalathai'] = 0x0E28; - t['sosothai'] = 0x0E0B; - t['sosuathai'] = 0x0E2A; - t['space'] = 0x0020; - t['spacehackarabic'] = 0x0020; - t['spade'] = 0x2660; - t['spadesuitblack'] = 0x2660; - t['spadesuitwhite'] = 0x2664; - t['sparen'] = 0x24AE; - t['squarebelowcmb'] = 0x033B; - t['squarecc'] = 0x33C4; - t['squarecm'] = 0x339D; - t['squarediagonalcrosshatchfill'] = 0x25A9; - t['squarehorizontalfill'] = 0x25A4; - t['squarekg'] = 0x338F; - t['squarekm'] = 0x339E; - t['squarekmcapital'] = 0x33CE; - t['squareln'] = 0x33D1; - t['squarelog'] = 0x33D2; - t['squaremg'] = 0x338E; - t['squaremil'] = 0x33D5; - t['squaremm'] = 0x339C; - t['squaremsquared'] = 0x33A1; - t['squareorthogonalcrosshatchfill'] = 0x25A6; - t['squareupperlefttolowerrightfill'] = 0x25A7; - t['squareupperrighttolowerleftfill'] = 0x25A8; - t['squareverticalfill'] = 0x25A5; - t['squarewhitewithsmallblack'] = 0x25A3; - t['srsquare'] = 0x33DB; - t['ssabengali'] = 0x09B7; - t['ssadeva'] = 0x0937; - t['ssagujarati'] = 0x0AB7; - t['ssangcieuckorean'] = 0x3149; - t['ssanghieuhkorean'] = 0x3185; - t['ssangieungkorean'] = 0x3180; - t['ssangkiyeokkorean'] = 0x3132; - t['ssangnieunkorean'] = 0x3165; - t['ssangpieupkorean'] = 0x3143; - t['ssangsioskorean'] = 0x3146; - t['ssangtikeutkorean'] = 0x3138; - t['ssuperior'] = 0xF6F2; - t['sterling'] = 0x00A3; - t['sterlingmonospace'] = 0xFFE1; - t['strokelongoverlaycmb'] = 0x0336; - t['strokeshortoverlaycmb'] = 0x0335; - t['subset'] = 0x2282; - t['subsetnotequal'] = 0x228A; - t['subsetorequal'] = 0x2286; - t['succeeds'] = 0x227B; - t['suchthat'] = 0x220B; - t['suhiragana'] = 0x3059; - t['sukatakana'] = 0x30B9; - t['sukatakanahalfwidth'] = 0xFF7D; - t['sukunarabic'] = 0x0652; - t['summation'] = 0x2211; - t['sun'] = 0x263C; - t['superset'] = 0x2283; - t['supersetnotequal'] = 0x228B; - t['supersetorequal'] = 0x2287; - t['svsquare'] = 0x33DC; - t['syouwaerasquare'] = 0x337C; - t['t'] = 0x0074; - t['tabengali'] = 0x09A4; - t['tackdown'] = 0x22A4; - t['tackleft'] = 0x22A3; - t['tadeva'] = 0x0924; - t['tagujarati'] = 0x0AA4; - t['tagurmukhi'] = 0x0A24; - t['taharabic'] = 0x0637; - t['tahfinalarabic'] = 0xFEC2; - t['tahinitialarabic'] = 0xFEC3; - t['tahiragana'] = 0x305F; - t['tahmedialarabic'] = 0xFEC4; - t['taisyouerasquare'] = 0x337D; - t['takatakana'] = 0x30BF; - t['takatakanahalfwidth'] = 0xFF80; - t['tatweelarabic'] = 0x0640; - t['tau'] = 0x03C4; - t['tav'] = 0x05EA; - t['tavdages'] = 0xFB4A; - t['tavdagesh'] = 0xFB4A; - t['tavdageshhebrew'] = 0xFB4A; - t['tavhebrew'] = 0x05EA; - t['tbar'] = 0x0167; - t['tbopomofo'] = 0x310A; - t['tcaron'] = 0x0165; - t['tccurl'] = 0x02A8; - t['tcedilla'] = 0x0163; - t['tcheharabic'] = 0x0686; - t['tchehfinalarabic'] = 0xFB7B; - t['tchehinitialarabic'] = 0xFB7C; - t['tchehmedialarabic'] = 0xFB7D; - t['tcircle'] = 0x24E3; - t['tcircumflexbelow'] = 0x1E71; - t['tcommaaccent'] = 0x0163; - t['tdieresis'] = 0x1E97; - t['tdotaccent'] = 0x1E6B; - t['tdotbelow'] = 0x1E6D; - t['tecyrillic'] = 0x0442; - t['tedescendercyrillic'] = 0x04AD; - t['teharabic'] = 0x062A; - t['tehfinalarabic'] = 0xFE96; - t['tehhahinitialarabic'] = 0xFCA2; - t['tehhahisolatedarabic'] = 0xFC0C; - t['tehinitialarabic'] = 0xFE97; - t['tehiragana'] = 0x3066; - t['tehjeeminitialarabic'] = 0xFCA1; - t['tehjeemisolatedarabic'] = 0xFC0B; - t['tehmarbutaarabic'] = 0x0629; - t['tehmarbutafinalarabic'] = 0xFE94; - t['tehmedialarabic'] = 0xFE98; - t['tehmeeminitialarabic'] = 0xFCA4; - t['tehmeemisolatedarabic'] = 0xFC0E; - t['tehnoonfinalarabic'] = 0xFC73; - t['tekatakana'] = 0x30C6; - t['tekatakanahalfwidth'] = 0xFF83; - t['telephone'] = 0x2121; - t['telephoneblack'] = 0x260E; - t['telishagedolahebrew'] = 0x05A0; - t['telishaqetanahebrew'] = 0x05A9; - t['tencircle'] = 0x2469; - t['tenideographicparen'] = 0x3229; - t['tenparen'] = 0x247D; - t['tenperiod'] = 0x2491; - t['tenroman'] = 0x2179; - t['tesh'] = 0x02A7; - t['tet'] = 0x05D8; - t['tetdagesh'] = 0xFB38; - t['tetdageshhebrew'] = 0xFB38; - t['tethebrew'] = 0x05D8; - t['tetsecyrillic'] = 0x04B5; - t['tevirhebrew'] = 0x059B; - t['tevirlefthebrew'] = 0x059B; - t['thabengali'] = 0x09A5; - t['thadeva'] = 0x0925; - t['thagujarati'] = 0x0AA5; - t['thagurmukhi'] = 0x0A25; - t['thalarabic'] = 0x0630; - t['thalfinalarabic'] = 0xFEAC; - t['thanthakhatlowleftthai'] = 0xF898; - t['thanthakhatlowrightthai'] = 0xF897; - t['thanthakhatthai'] = 0x0E4C; - t['thanthakhatupperleftthai'] = 0xF896; - t['theharabic'] = 0x062B; - t['thehfinalarabic'] = 0xFE9A; - t['thehinitialarabic'] = 0xFE9B; - t['thehmedialarabic'] = 0xFE9C; - t['thereexists'] = 0x2203; - t['therefore'] = 0x2234; - t['theta'] = 0x03B8; - t['theta1'] = 0x03D1; - t['thetasymbolgreek'] = 0x03D1; - t['thieuthacirclekorean'] = 0x3279; - t['thieuthaparenkorean'] = 0x3219; - t['thieuthcirclekorean'] = 0x326B; - t['thieuthkorean'] = 0x314C; - t['thieuthparenkorean'] = 0x320B; - t['thirteencircle'] = 0x246C; - t['thirteenparen'] = 0x2480; - t['thirteenperiod'] = 0x2494; - t['thonangmonthothai'] = 0x0E11; - t['thook'] = 0x01AD; - t['thophuthaothai'] = 0x0E12; - t['thorn'] = 0x00FE; - t['thothahanthai'] = 0x0E17; - t['thothanthai'] = 0x0E10; - t['thothongthai'] = 0x0E18; - t['thothungthai'] = 0x0E16; - t['thousandcyrillic'] = 0x0482; - t['thousandsseparatorarabic'] = 0x066C; - t['thousandsseparatorpersian'] = 0x066C; - t['three'] = 0x0033; - t['threearabic'] = 0x0663; - t['threebengali'] = 0x09E9; - t['threecircle'] = 0x2462; - t['threecircleinversesansserif'] = 0x278C; - t['threedeva'] = 0x0969; - t['threeeighths'] = 0x215C; - t['threegujarati'] = 0x0AE9; - t['threegurmukhi'] = 0x0A69; - t['threehackarabic'] = 0x0663; - t['threehangzhou'] = 0x3023; - t['threeideographicparen'] = 0x3222; - t['threeinferior'] = 0x2083; - t['threemonospace'] = 0xFF13; - t['threenumeratorbengali'] = 0x09F6; - t['threeoldstyle'] = 0xF733; - t['threeparen'] = 0x2476; - t['threeperiod'] = 0x248A; - t['threepersian'] = 0x06F3; - t['threequarters'] = 0x00BE; - t['threequartersemdash'] = 0xF6DE; - t['threeroman'] = 0x2172; - t['threesuperior'] = 0x00B3; - t['threethai'] = 0x0E53; - t['thzsquare'] = 0x3394; - t['tihiragana'] = 0x3061; - t['tikatakana'] = 0x30C1; - t['tikatakanahalfwidth'] = 0xFF81; - t['tikeutacirclekorean'] = 0x3270; - t['tikeutaparenkorean'] = 0x3210; - t['tikeutcirclekorean'] = 0x3262; - t['tikeutkorean'] = 0x3137; - t['tikeutparenkorean'] = 0x3202; - t['tilde'] = 0x02DC; - t['tildebelowcmb'] = 0x0330; - t['tildecmb'] = 0x0303; - t['tildecomb'] = 0x0303; - t['tildedoublecmb'] = 0x0360; - t['tildeoperator'] = 0x223C; - t['tildeoverlaycmb'] = 0x0334; - t['tildeverticalcmb'] = 0x033E; - t['timescircle'] = 0x2297; - t['tipehahebrew'] = 0x0596; - t['tipehalefthebrew'] = 0x0596; - t['tippigurmukhi'] = 0x0A70; - t['titlocyrilliccmb'] = 0x0483; - t['tiwnarmenian'] = 0x057F; - t['tlinebelow'] = 0x1E6F; - t['tmonospace'] = 0xFF54; - t['toarmenian'] = 0x0569; - t['tohiragana'] = 0x3068; - t['tokatakana'] = 0x30C8; - t['tokatakanahalfwidth'] = 0xFF84; - t['tonebarextrahighmod'] = 0x02E5; - t['tonebarextralowmod'] = 0x02E9; - t['tonebarhighmod'] = 0x02E6; - t['tonebarlowmod'] = 0x02E8; - t['tonebarmidmod'] = 0x02E7; - t['tonefive'] = 0x01BD; - t['tonesix'] = 0x0185; - t['tonetwo'] = 0x01A8; - t['tonos'] = 0x0384; - t['tonsquare'] = 0x3327; - t['topatakthai'] = 0x0E0F; - t['tortoiseshellbracketleft'] = 0x3014; - t['tortoiseshellbracketleftsmall'] = 0xFE5D; - t['tortoiseshellbracketleftvertical'] = 0xFE39; - t['tortoiseshellbracketright'] = 0x3015; - t['tortoiseshellbracketrightsmall'] = 0xFE5E; - t['tortoiseshellbracketrightvertical'] = 0xFE3A; - t['totaothai'] = 0x0E15; - t['tpalatalhook'] = 0x01AB; - t['tparen'] = 0x24AF; - t['trademark'] = 0x2122; - t['trademarksans'] = 0xF8EA; - t['trademarkserif'] = 0xF6DB; - t['tretroflexhook'] = 0x0288; - t['triagdn'] = 0x25BC; - t['triaglf'] = 0x25C4; - t['triagrt'] = 0x25BA; - t['triagup'] = 0x25B2; - t['ts'] = 0x02A6; - t['tsadi'] = 0x05E6; - t['tsadidagesh'] = 0xFB46; - t['tsadidageshhebrew'] = 0xFB46; - t['tsadihebrew'] = 0x05E6; - t['tsecyrillic'] = 0x0446; - t['tsere'] = 0x05B5; - t['tsere12'] = 0x05B5; - t['tsere1e'] = 0x05B5; - t['tsere2b'] = 0x05B5; - t['tserehebrew'] = 0x05B5; - t['tserenarrowhebrew'] = 0x05B5; - t['tserequarterhebrew'] = 0x05B5; - t['tserewidehebrew'] = 0x05B5; - t['tshecyrillic'] = 0x045B; - t['tsuperior'] = 0xF6F3; - t['ttabengali'] = 0x099F; - t['ttadeva'] = 0x091F; - t['ttagujarati'] = 0x0A9F; - t['ttagurmukhi'] = 0x0A1F; - t['tteharabic'] = 0x0679; - t['ttehfinalarabic'] = 0xFB67; - t['ttehinitialarabic'] = 0xFB68; - t['ttehmedialarabic'] = 0xFB69; - t['tthabengali'] = 0x09A0; - t['tthadeva'] = 0x0920; - t['tthagujarati'] = 0x0AA0; - t['tthagurmukhi'] = 0x0A20; - t['tturned'] = 0x0287; - t['tuhiragana'] = 0x3064; - t['tukatakana'] = 0x30C4; - t['tukatakanahalfwidth'] = 0xFF82; - t['tusmallhiragana'] = 0x3063; - t['tusmallkatakana'] = 0x30C3; - t['tusmallkatakanahalfwidth'] = 0xFF6F; - t['twelvecircle'] = 0x246B; - t['twelveparen'] = 0x247F; - t['twelveperiod'] = 0x2493; - t['twelveroman'] = 0x217B; - t['twentycircle'] = 0x2473; - t['twentyhangzhou'] = 0x5344; - t['twentyparen'] = 0x2487; - t['twentyperiod'] = 0x249B; - t['two'] = 0x0032; - t['twoarabic'] = 0x0662; - t['twobengali'] = 0x09E8; - t['twocircle'] = 0x2461; - t['twocircleinversesansserif'] = 0x278B; - t['twodeva'] = 0x0968; - t['twodotenleader'] = 0x2025; - t['twodotleader'] = 0x2025; - t['twodotleadervertical'] = 0xFE30; - t['twogujarati'] = 0x0AE8; - t['twogurmukhi'] = 0x0A68; - t['twohackarabic'] = 0x0662; - t['twohangzhou'] = 0x3022; - t['twoideographicparen'] = 0x3221; - t['twoinferior'] = 0x2082; - t['twomonospace'] = 0xFF12; - t['twonumeratorbengali'] = 0x09F5; - t['twooldstyle'] = 0xF732; - t['twoparen'] = 0x2475; - t['twoperiod'] = 0x2489; - t['twopersian'] = 0x06F2; - t['tworoman'] = 0x2171; - t['twostroke'] = 0x01BB; - t['twosuperior'] = 0x00B2; - t['twothai'] = 0x0E52; - t['twothirds'] = 0x2154; - t['u'] = 0x0075; - t['uacute'] = 0x00FA; - t['ubar'] = 0x0289; - t['ubengali'] = 0x0989; - t['ubopomofo'] = 0x3128; - t['ubreve'] = 0x016D; - t['ucaron'] = 0x01D4; - t['ucircle'] = 0x24E4; - t['ucircumflex'] = 0x00FB; - t['ucircumflexbelow'] = 0x1E77; - t['ucyrillic'] = 0x0443; - t['udattadeva'] = 0x0951; - t['udblacute'] = 0x0171; - t['udblgrave'] = 0x0215; - t['udeva'] = 0x0909; - t['udieresis'] = 0x00FC; - t['udieresisacute'] = 0x01D8; - t['udieresisbelow'] = 0x1E73; - t['udieresiscaron'] = 0x01DA; - t['udieresiscyrillic'] = 0x04F1; - t['udieresisgrave'] = 0x01DC; - t['udieresismacron'] = 0x01D6; - t['udotbelow'] = 0x1EE5; - t['ugrave'] = 0x00F9; - t['ugujarati'] = 0x0A89; - t['ugurmukhi'] = 0x0A09; - t['uhiragana'] = 0x3046; - t['uhookabove'] = 0x1EE7; - t['uhorn'] = 0x01B0; - t['uhornacute'] = 0x1EE9; - t['uhorndotbelow'] = 0x1EF1; - t['uhorngrave'] = 0x1EEB; - t['uhornhookabove'] = 0x1EED; - t['uhorntilde'] = 0x1EEF; - t['uhungarumlaut'] = 0x0171; - t['uhungarumlautcyrillic'] = 0x04F3; - t['uinvertedbreve'] = 0x0217; - t['ukatakana'] = 0x30A6; - t['ukatakanahalfwidth'] = 0xFF73; - t['ukcyrillic'] = 0x0479; - t['ukorean'] = 0x315C; - t['umacron'] = 0x016B; - t['umacroncyrillic'] = 0x04EF; - t['umacrondieresis'] = 0x1E7B; - t['umatragurmukhi'] = 0x0A41; - t['umonospace'] = 0xFF55; - t['underscore'] = 0x005F; - t['underscoredbl'] = 0x2017; - t['underscoremonospace'] = 0xFF3F; - t['underscorevertical'] = 0xFE33; - t['underscorewavy'] = 0xFE4F; - t['union'] = 0x222A; - t['universal'] = 0x2200; - t['uogonek'] = 0x0173; - t['uparen'] = 0x24B0; - t['upblock'] = 0x2580; - t['upperdothebrew'] = 0x05C4; - t['upsilon'] = 0x03C5; - t['upsilondieresis'] = 0x03CB; - t['upsilondieresistonos'] = 0x03B0; - t['upsilonlatin'] = 0x028A; - t['upsilontonos'] = 0x03CD; - t['uptackbelowcmb'] = 0x031D; - t['uptackmod'] = 0x02D4; - t['uragurmukhi'] = 0x0A73; - t['uring'] = 0x016F; - t['ushortcyrillic'] = 0x045E; - t['usmallhiragana'] = 0x3045; - t['usmallkatakana'] = 0x30A5; - t['usmallkatakanahalfwidth'] = 0xFF69; - t['ustraightcyrillic'] = 0x04AF; - t['ustraightstrokecyrillic'] = 0x04B1; - t['utilde'] = 0x0169; - t['utildeacute'] = 0x1E79; - t['utildebelow'] = 0x1E75; - t['uubengali'] = 0x098A; - t['uudeva'] = 0x090A; - t['uugujarati'] = 0x0A8A; - t['uugurmukhi'] = 0x0A0A; - t['uumatragurmukhi'] = 0x0A42; - t['uuvowelsignbengali'] = 0x09C2; - t['uuvowelsigndeva'] = 0x0942; - t['uuvowelsigngujarati'] = 0x0AC2; - t['uvowelsignbengali'] = 0x09C1; - t['uvowelsigndeva'] = 0x0941; - t['uvowelsigngujarati'] = 0x0AC1; - t['v'] = 0x0076; - t['vadeva'] = 0x0935; - t['vagujarati'] = 0x0AB5; - t['vagurmukhi'] = 0x0A35; - t['vakatakana'] = 0x30F7; - t['vav'] = 0x05D5; - t['vavdagesh'] = 0xFB35; - t['vavdagesh65'] = 0xFB35; - t['vavdageshhebrew'] = 0xFB35; - t['vavhebrew'] = 0x05D5; - t['vavholam'] = 0xFB4B; - t['vavholamhebrew'] = 0xFB4B; - t['vavvavhebrew'] = 0x05F0; - t['vavyodhebrew'] = 0x05F1; - t['vcircle'] = 0x24E5; - t['vdotbelow'] = 0x1E7F; - t['vecyrillic'] = 0x0432; - t['veharabic'] = 0x06A4; - t['vehfinalarabic'] = 0xFB6B; - t['vehinitialarabic'] = 0xFB6C; - t['vehmedialarabic'] = 0xFB6D; - t['vekatakana'] = 0x30F9; - t['venus'] = 0x2640; - t['verticalbar'] = 0x007C; - t['verticallineabovecmb'] = 0x030D; - t['verticallinebelowcmb'] = 0x0329; - t['verticallinelowmod'] = 0x02CC; - t['verticallinemod'] = 0x02C8; - t['vewarmenian'] = 0x057E; - t['vhook'] = 0x028B; - t['vikatakana'] = 0x30F8; - t['viramabengali'] = 0x09CD; - t['viramadeva'] = 0x094D; - t['viramagujarati'] = 0x0ACD; - t['visargabengali'] = 0x0983; - t['visargadeva'] = 0x0903; - t['visargagujarati'] = 0x0A83; - t['vmonospace'] = 0xFF56; - t['voarmenian'] = 0x0578; - t['voicediterationhiragana'] = 0x309E; - t['voicediterationkatakana'] = 0x30FE; - t['voicedmarkkana'] = 0x309B; - t['voicedmarkkanahalfwidth'] = 0xFF9E; - t['vokatakana'] = 0x30FA; - t['vparen'] = 0x24B1; - t['vtilde'] = 0x1E7D; - t['vturned'] = 0x028C; - t['vuhiragana'] = 0x3094; - t['vukatakana'] = 0x30F4; - t['w'] = 0x0077; - t['wacute'] = 0x1E83; - t['waekorean'] = 0x3159; - t['wahiragana'] = 0x308F; - t['wakatakana'] = 0x30EF; - t['wakatakanahalfwidth'] = 0xFF9C; - t['wakorean'] = 0x3158; - t['wasmallhiragana'] = 0x308E; - t['wasmallkatakana'] = 0x30EE; - t['wattosquare'] = 0x3357; - t['wavedash'] = 0x301C; - t['wavyunderscorevertical'] = 0xFE34; - t['wawarabic'] = 0x0648; - t['wawfinalarabic'] = 0xFEEE; - t['wawhamzaabovearabic'] = 0x0624; - t['wawhamzaabovefinalarabic'] = 0xFE86; - t['wbsquare'] = 0x33DD; - t['wcircle'] = 0x24E6; - t['wcircumflex'] = 0x0175; - t['wdieresis'] = 0x1E85; - t['wdotaccent'] = 0x1E87; - t['wdotbelow'] = 0x1E89; - t['wehiragana'] = 0x3091; - t['weierstrass'] = 0x2118; - t['wekatakana'] = 0x30F1; - t['wekorean'] = 0x315E; - t['weokorean'] = 0x315D; - t['wgrave'] = 0x1E81; - t['whitebullet'] = 0x25E6; - t['whitecircle'] = 0x25CB; - t['whitecircleinverse'] = 0x25D9; - t['whitecornerbracketleft'] = 0x300E; - t['whitecornerbracketleftvertical'] = 0xFE43; - t['whitecornerbracketright'] = 0x300F; - t['whitecornerbracketrightvertical'] = 0xFE44; - t['whitediamond'] = 0x25C7; - t['whitediamondcontainingblacksmalldiamond'] = 0x25C8; - t['whitedownpointingsmalltriangle'] = 0x25BF; - t['whitedownpointingtriangle'] = 0x25BD; - t['whiteleftpointingsmalltriangle'] = 0x25C3; - t['whiteleftpointingtriangle'] = 0x25C1; - t['whitelenticularbracketleft'] = 0x3016; - t['whitelenticularbracketright'] = 0x3017; - t['whiterightpointingsmalltriangle'] = 0x25B9; - t['whiterightpointingtriangle'] = 0x25B7; - t['whitesmallsquare'] = 0x25AB; - t['whitesmilingface'] = 0x263A; - t['whitesquare'] = 0x25A1; - t['whitestar'] = 0x2606; - t['whitetelephone'] = 0x260F; - t['whitetortoiseshellbracketleft'] = 0x3018; - t['whitetortoiseshellbracketright'] = 0x3019; - t['whiteuppointingsmalltriangle'] = 0x25B5; - t['whiteuppointingtriangle'] = 0x25B3; - t['wihiragana'] = 0x3090; - t['wikatakana'] = 0x30F0; - t['wikorean'] = 0x315F; - t['wmonospace'] = 0xFF57; - t['wohiragana'] = 0x3092; - t['wokatakana'] = 0x30F2; - t['wokatakanahalfwidth'] = 0xFF66; - t['won'] = 0x20A9; - t['wonmonospace'] = 0xFFE6; - t['wowaenthai'] = 0x0E27; - t['wparen'] = 0x24B2; - t['wring'] = 0x1E98; - t['wsuperior'] = 0x02B7; - t['wturned'] = 0x028D; - t['wynn'] = 0x01BF; - t['x'] = 0x0078; - t['xabovecmb'] = 0x033D; - t['xbopomofo'] = 0x3112; - t['xcircle'] = 0x24E7; - t['xdieresis'] = 0x1E8D; - t['xdotaccent'] = 0x1E8B; - t['xeharmenian'] = 0x056D; - t['xi'] = 0x03BE; - t['xmonospace'] = 0xFF58; - t['xparen'] = 0x24B3; - t['xsuperior'] = 0x02E3; - t['y'] = 0x0079; - t['yaadosquare'] = 0x334E; - t['yabengali'] = 0x09AF; - t['yacute'] = 0x00FD; - t['yadeva'] = 0x092F; - t['yaekorean'] = 0x3152; - t['yagujarati'] = 0x0AAF; - t['yagurmukhi'] = 0x0A2F; - t['yahiragana'] = 0x3084; - t['yakatakana'] = 0x30E4; - t['yakatakanahalfwidth'] = 0xFF94; - t['yakorean'] = 0x3151; - t['yamakkanthai'] = 0x0E4E; - t['yasmallhiragana'] = 0x3083; - t['yasmallkatakana'] = 0x30E3; - t['yasmallkatakanahalfwidth'] = 0xFF6C; - t['yatcyrillic'] = 0x0463; - t['ycircle'] = 0x24E8; - t['ycircumflex'] = 0x0177; - t['ydieresis'] = 0x00FF; - t['ydotaccent'] = 0x1E8F; - t['ydotbelow'] = 0x1EF5; - t['yeharabic'] = 0x064A; - t['yehbarreearabic'] = 0x06D2; - t['yehbarreefinalarabic'] = 0xFBAF; - t['yehfinalarabic'] = 0xFEF2; - t['yehhamzaabovearabic'] = 0x0626; - t['yehhamzaabovefinalarabic'] = 0xFE8A; - t['yehhamzaaboveinitialarabic'] = 0xFE8B; - t['yehhamzaabovemedialarabic'] = 0xFE8C; - t['yehinitialarabic'] = 0xFEF3; - t['yehmedialarabic'] = 0xFEF4; - t['yehmeeminitialarabic'] = 0xFCDD; - t['yehmeemisolatedarabic'] = 0xFC58; - t['yehnoonfinalarabic'] = 0xFC94; - t['yehthreedotsbelowarabic'] = 0x06D1; - t['yekorean'] = 0x3156; - t['yen'] = 0x00A5; - t['yenmonospace'] = 0xFFE5; - t['yeokorean'] = 0x3155; - t['yeorinhieuhkorean'] = 0x3186; - t['yerahbenyomohebrew'] = 0x05AA; - t['yerahbenyomolefthebrew'] = 0x05AA; - t['yericyrillic'] = 0x044B; - t['yerudieresiscyrillic'] = 0x04F9; - t['yesieungkorean'] = 0x3181; - t['yesieungpansioskorean'] = 0x3183; - t['yesieungsioskorean'] = 0x3182; - t['yetivhebrew'] = 0x059A; - t['ygrave'] = 0x1EF3; - t['yhook'] = 0x01B4; - t['yhookabove'] = 0x1EF7; - t['yiarmenian'] = 0x0575; - t['yicyrillic'] = 0x0457; - t['yikorean'] = 0x3162; - t['yinyang'] = 0x262F; - t['yiwnarmenian'] = 0x0582; - t['ymonospace'] = 0xFF59; - t['yod'] = 0x05D9; - t['yoddagesh'] = 0xFB39; - t['yoddageshhebrew'] = 0xFB39; - t['yodhebrew'] = 0x05D9; - t['yodyodhebrew'] = 0x05F2; - t['yodyodpatahhebrew'] = 0xFB1F; - t['yohiragana'] = 0x3088; - t['yoikorean'] = 0x3189; - t['yokatakana'] = 0x30E8; - t['yokatakanahalfwidth'] = 0xFF96; - t['yokorean'] = 0x315B; - t['yosmallhiragana'] = 0x3087; - t['yosmallkatakana'] = 0x30E7; - t['yosmallkatakanahalfwidth'] = 0xFF6E; - t['yotgreek'] = 0x03F3; - t['yoyaekorean'] = 0x3188; - t['yoyakorean'] = 0x3187; - t['yoyakthai'] = 0x0E22; - t['yoyingthai'] = 0x0E0D; - t['yparen'] = 0x24B4; - t['ypogegrammeni'] = 0x037A; - t['ypogegrammenigreekcmb'] = 0x0345; - t['yr'] = 0x01A6; - t['yring'] = 0x1E99; - t['ysuperior'] = 0x02B8; - t['ytilde'] = 0x1EF9; - t['yturned'] = 0x028E; - t['yuhiragana'] = 0x3086; - t['yuikorean'] = 0x318C; - t['yukatakana'] = 0x30E6; - t['yukatakanahalfwidth'] = 0xFF95; - t['yukorean'] = 0x3160; - t['yusbigcyrillic'] = 0x046B; - t['yusbigiotifiedcyrillic'] = 0x046D; - t['yuslittlecyrillic'] = 0x0467; - t['yuslittleiotifiedcyrillic'] = 0x0469; - t['yusmallhiragana'] = 0x3085; - t['yusmallkatakana'] = 0x30E5; - t['yusmallkatakanahalfwidth'] = 0xFF6D; - t['yuyekorean'] = 0x318B; - t['yuyeokorean'] = 0x318A; - t['yyabengali'] = 0x09DF; - t['yyadeva'] = 0x095F; - t['z'] = 0x007A; - t['zaarmenian'] = 0x0566; - t['zacute'] = 0x017A; - t['zadeva'] = 0x095B; - t['zagurmukhi'] = 0x0A5B; - t['zaharabic'] = 0x0638; - t['zahfinalarabic'] = 0xFEC6; - t['zahinitialarabic'] = 0xFEC7; - t['zahiragana'] = 0x3056; - t['zahmedialarabic'] = 0xFEC8; - t['zainarabic'] = 0x0632; - t['zainfinalarabic'] = 0xFEB0; - t['zakatakana'] = 0x30B6; - t['zaqefgadolhebrew'] = 0x0595; - t['zaqefqatanhebrew'] = 0x0594; - t['zarqahebrew'] = 0x0598; - t['zayin'] = 0x05D6; - t['zayindagesh'] = 0xFB36; - t['zayindageshhebrew'] = 0xFB36; - t['zayinhebrew'] = 0x05D6; - t['zbopomofo'] = 0x3117; - t['zcaron'] = 0x017E; - t['zcircle'] = 0x24E9; - t['zcircumflex'] = 0x1E91; - t['zcurl'] = 0x0291; - t['zdot'] = 0x017C; - t['zdotaccent'] = 0x017C; - t['zdotbelow'] = 0x1E93; - t['zecyrillic'] = 0x0437; - t['zedescendercyrillic'] = 0x0499; - t['zedieresiscyrillic'] = 0x04DF; - t['zehiragana'] = 0x305C; - t['zekatakana'] = 0x30BC; - t['zero'] = 0x0030; - t['zeroarabic'] = 0x0660; - t['zerobengali'] = 0x09E6; - t['zerodeva'] = 0x0966; - t['zerogujarati'] = 0x0AE6; - t['zerogurmukhi'] = 0x0A66; - t['zerohackarabic'] = 0x0660; - t['zeroinferior'] = 0x2080; - t['zeromonospace'] = 0xFF10; - t['zerooldstyle'] = 0xF730; - t['zeropersian'] = 0x06F0; - t['zerosuperior'] = 0x2070; - t['zerothai'] = 0x0E50; - t['zerowidthjoiner'] = 0xFEFF; - t['zerowidthnonjoiner'] = 0x200C; - t['zerowidthspace'] = 0x200B; - t['zeta'] = 0x03B6; - t['zhbopomofo'] = 0x3113; - t['zhearmenian'] = 0x056A; - t['zhebrevecyrillic'] = 0x04C2; - t['zhecyrillic'] = 0x0436; - t['zhedescendercyrillic'] = 0x0497; - t['zhedieresiscyrillic'] = 0x04DD; - t['zihiragana'] = 0x3058; - t['zikatakana'] = 0x30B8; - t['zinorhebrew'] = 0x05AE; - t['zlinebelow'] = 0x1E95; - t['zmonospace'] = 0xFF5A; - t['zohiragana'] = 0x305E; - t['zokatakana'] = 0x30BE; - t['zparen'] = 0x24B5; - t['zretroflexhook'] = 0x0290; - t['zstroke'] = 0x01B6; - t['zuhiragana'] = 0x305A; - t['zukatakana'] = 0x30BA; - t['.notdef'] = 0x0000; -}); - -var getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) { - t['space'] = 0x0020; - t['a1'] = 0x2701; - t['a2'] = 0x2702; - t['a202'] = 0x2703; - t['a3'] = 0x2704; - t['a4'] = 0x260E; - t['a5'] = 0x2706; - t['a119'] = 0x2707; - t['a118'] = 0x2708; - t['a117'] = 0x2709; - t['a11'] = 0x261B; - t['a12'] = 0x261E; - t['a13'] = 0x270C; - t['a14'] = 0x270D; - t['a15'] = 0x270E; - t['a16'] = 0x270F; - t['a105'] = 0x2710; - t['a17'] = 0x2711; - t['a18'] = 0x2712; - t['a19'] = 0x2713; - t['a20'] = 0x2714; - t['a21'] = 0x2715; - t['a22'] = 0x2716; - t['a23'] = 0x2717; - t['a24'] = 0x2718; - t['a25'] = 0x2719; - t['a26'] = 0x271A; - t['a27'] = 0x271B; - t['a28'] = 0x271C; - t['a6'] = 0x271D; - t['a7'] = 0x271E; - t['a8'] = 0x271F; - t['a9'] = 0x2720; - t['a10'] = 0x2721; - t['a29'] = 0x2722; - t['a30'] = 0x2723; - t['a31'] = 0x2724; - t['a32'] = 0x2725; - t['a33'] = 0x2726; - t['a34'] = 0x2727; - t['a35'] = 0x2605; - t['a36'] = 0x2729; - t['a37'] = 0x272A; - t['a38'] = 0x272B; - t['a39'] = 0x272C; - t['a40'] = 0x272D; - t['a41'] = 0x272E; - t['a42'] = 0x272F; - t['a43'] = 0x2730; - t['a44'] = 0x2731; - t['a45'] = 0x2732; - t['a46'] = 0x2733; - t['a47'] = 0x2734; - t['a48'] = 0x2735; - t['a49'] = 0x2736; - t['a50'] = 0x2737; - t['a51'] = 0x2738; - t['a52'] = 0x2739; - t['a53'] = 0x273A; - t['a54'] = 0x273B; - t['a55'] = 0x273C; - t['a56'] = 0x273D; - t['a57'] = 0x273E; - t['a58'] = 0x273F; - t['a59'] = 0x2740; - t['a60'] = 0x2741; - t['a61'] = 0x2742; - t['a62'] = 0x2743; - t['a63'] = 0x2744; - t['a64'] = 0x2745; - t['a65'] = 0x2746; - t['a66'] = 0x2747; - t['a67'] = 0x2748; - t['a68'] = 0x2749; - t['a69'] = 0x274A; - t['a70'] = 0x274B; - t['a71'] = 0x25CF; - t['a72'] = 0x274D; - t['a73'] = 0x25A0; - t['a74'] = 0x274F; - t['a203'] = 0x2750; - t['a75'] = 0x2751; - t['a204'] = 0x2752; - t['a76'] = 0x25B2; - t['a77'] = 0x25BC; - t['a78'] = 0x25C6; - t['a79'] = 0x2756; - t['a81'] = 0x25D7; - t['a82'] = 0x2758; - t['a83'] = 0x2759; - t['a84'] = 0x275A; - t['a97'] = 0x275B; - t['a98'] = 0x275C; - t['a99'] = 0x275D; - t['a100'] = 0x275E; - t['a101'] = 0x2761; - t['a102'] = 0x2762; - t['a103'] = 0x2763; - t['a104'] = 0x2764; - t['a106'] = 0x2765; - t['a107'] = 0x2766; - t['a108'] = 0x2767; - t['a112'] = 0x2663; - t['a111'] = 0x2666; - t['a110'] = 0x2665; - t['a109'] = 0x2660; - t['a120'] = 0x2460; - t['a121'] = 0x2461; - t['a122'] = 0x2462; - t['a123'] = 0x2463; - t['a124'] = 0x2464; - t['a125'] = 0x2465; - t['a126'] = 0x2466; - t['a127'] = 0x2467; - t['a128'] = 0x2468; - t['a129'] = 0x2469; - t['a130'] = 0x2776; - t['a131'] = 0x2777; - t['a132'] = 0x2778; - t['a133'] = 0x2779; - t['a134'] = 0x277A; - t['a135'] = 0x277B; - t['a136'] = 0x277C; - t['a137'] = 0x277D; - t['a138'] = 0x277E; - t['a139'] = 0x277F; - t['a140'] = 0x2780; - t['a141'] = 0x2781; - t['a142'] = 0x2782; - t['a143'] = 0x2783; - t['a144'] = 0x2784; - t['a145'] = 0x2785; - t['a146'] = 0x2786; - t['a147'] = 0x2787; - t['a148'] = 0x2788; - t['a149'] = 0x2789; - t['a150'] = 0x278A; - t['a151'] = 0x278B; - t['a152'] = 0x278C; - t['a153'] = 0x278D; - t['a154'] = 0x278E; - t['a155'] = 0x278F; - t['a156'] = 0x2790; - t['a157'] = 0x2791; - t['a158'] = 0x2792; - t['a159'] = 0x2793; - t['a160'] = 0x2794; - t['a161'] = 0x2192; - t['a163'] = 0x2194; - t['a164'] = 0x2195; - t['a196'] = 0x2798; - t['a165'] = 0x2799; - t['a192'] = 0x279A; - t['a166'] = 0x279B; - t['a167'] = 0x279C; - t['a168'] = 0x279D; - t['a169'] = 0x279E; - t['a170'] = 0x279F; - t['a171'] = 0x27A0; - t['a172'] = 0x27A1; - t['a173'] = 0x27A2; - t['a162'] = 0x27A3; - t['a174'] = 0x27A4; - t['a175'] = 0x27A5; - t['a176'] = 0x27A6; - t['a177'] = 0x27A7; - t['a178'] = 0x27A8; - t['a179'] = 0x27A9; - t['a193'] = 0x27AA; - t['a180'] = 0x27AB; - t['a199'] = 0x27AC; - t['a181'] = 0x27AD; - t['a200'] = 0x27AE; - t['a182'] = 0x27AF; - t['a201'] = 0x27B1; - t['a183'] = 0x27B2; - t['a184'] = 0x27B3; - t['a197'] = 0x27B4; - t['a185'] = 0x27B5; - t['a194'] = 0x27B6; - t['a198'] = 0x27B7; - t['a186'] = 0x27B8; - t['a195'] = 0x27B9; - t['a187'] = 0x27BA; - t['a188'] = 0x27BB; - t['a189'] = 0x27BC; - t['a190'] = 0x27BD; - t['a191'] = 0x27BE; - t['a89'] = 0x2768; // 0xF8D7 - t['a90'] = 0x2769; // 0xF8D8 - t['a93'] = 0x276A; // 0xF8D9 - t['a94'] = 0x276B; // 0xF8DA - t['a91'] = 0x276C; // 0xF8DB - t['a92'] = 0x276D; // 0xF8DC - t['a205'] = 0x276E; // 0xF8DD - t['a85'] = 0x276F; // 0xF8DE - t['a206'] = 0x2770; // 0xF8DF - t['a86'] = 0x2771; // 0xF8E0 - t['a87'] = 0x2772; // 0xF8E1 - t['a88'] = 0x2773; // 0xF8E2 - t['a95'] = 0x2774; // 0xF8E3 - t['a96'] = 0x2775; // 0xF8E4 - t['.notdef'] = 0x0000; -}); - -exports.getGlyphsUnicode = getGlyphsUnicode; -exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreJbig2 = {}), root.pdfjsSharedUtil, - root.pdfjsCoreArithmeticDecoder); - } -}(this, function (exports, sharedUtil, coreArithmeticDecoder) { - -var error = sharedUtil.error; -var log2 = sharedUtil.log2; -var readInt8 = sharedUtil.readInt8; -var readUint16 = sharedUtil.readUint16; -var readUint32 = sharedUtil.readUint32; -var shadow = sharedUtil.shadow; -var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; - -var Jbig2Image = (function Jbig2ImageClosure() { - // Utility data structures - function ContextCache() {} - - ContextCache.prototype = { - getContexts: function(id) { - if (id in this) { - return this[id]; - } - return (this[id] = new Int8Array(1 << 16)); - } - }; - - function DecodingContext(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - - DecodingContext.prototype = { - get decoder() { - var decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, 'decoder', decoder); - }, - get contextCache() { - var cache = new ContextCache(); - return shadow(this, 'contextCache', cache); - } - }; - - // Annex A. Arithmetic Integer Decoding Procedure - // A.2 Procedure for decoding values - function decodeInteger(contextCache, procedure, decoder) { - var contexts = contextCache.getContexts(procedure); - var prev = 1; - - function readBits(length) { - var v = 0; - for (var i = 0; i < length; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev < 256 ? (prev << 1) | bit : - (((prev << 1) | bit) & 511) | 256); - v = (v << 1) | bit; - } - return v >>> 0; - } - - var sign = readBits(1); - var value = readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(32) + 4436) : - readBits(12) + 340) : - readBits(8) + 84) : - readBits(6) + 20) : - readBits(4) + 4) : - readBits(2); - return (sign === 0 ? value : (value > 0 ? -value : null)); - } - - // A.3 The IAID decoding procedure - function decodeIAID(contextCache, decoder, codeLength) { - var contexts = contextCache.getContexts('IAID'); - - var prev = 1; - for (var i = 0; i < codeLength; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev << 1) | bit; - } - if (codeLength < 31) { - return prev & ((1 << codeLength) - 1); - } - return prev & 0x7FFFFFFF; - } - - // 7.3 Segment types - var SegmentTypes = [ - 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, - 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, - null, null, null, null, null, 'patternDictionary', null, null, null, - 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', - 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, - null, null, null, null, null, 'IntermediateGenericRegion', null, - 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', - 'IntermediateGenericRefinementRegion', null, - 'ImmediateGenericRefinementRegion', - 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, - 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', - 'Tables', null, null, null, null, null, null, null, null, - 'Extension' - ]; - - var CodingTemplates = [ - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1}, - {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2}, - {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, - {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0}, - {x: -1, y: 0}], - [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, - {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}] - ]; - - var RefinementTemplates = [ - { - coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, - {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}] - }, - { - coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0}, - {x: 0, y: 1}, {x: 1, y: 1}] - } - ]; - - // See 6.2.5.7 Decoding the bitmap. - var ReusedContexts = [ - 0x9B25, // 10011 0110010 0101 - 0x0795, // 0011 110010 101 - 0x00E5, // 001 11001 01 - 0x0195 // 011001 0101 - ]; - - var RefinementReusedContexts = [ - 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference) - 0x0008 // '0000' + '001000' - ]; - - function decodeBitmapTemplate0(width, height, decodingContext) { - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; - - // ...ooooo.... - // ..ooooooo... Context template for current pixel (X) - // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel) - var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111 - - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = (i < 1) ? row : bitmap[i - 1]; - row2 = (i < 2) ? row : bitmap[i - 2]; - - // At the beginning of each row: - // Fill contextLabel with pixels that are above/right of (X) - contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) | - (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) | - (row1[3] << 4); - - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - - // At each pixel: Clear contextLabel pixels that are shifted - // out of the context, then add new ones. - contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) | - (j + 3 < width ? row2[j + 3] << 11 : 0) | - (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - - return bitmap; - } - - // 6.2 Generic Region Decoding Procedure - function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, - decodingContext) { - if (mmr) { - error('JBIG2 error: MMR encoding is not supported'); - } - - // Use optimized version for the most common case - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && - at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && - at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - - var useskip = !!skip; - var template = CodingTemplates[templateIndex].concat(at); - - // Sorting is non-standard, and it is not required. But sorting increases - // the number of template bits that can be reused from the previous - // contextLabel in the main loop. - template.sort(function (a, b) { - return (a.y - b.y) || (a.x - b.x); - }); - - var templateLength = template.length; - var templateX = new Int8Array(templateLength); - var templateY = new Int8Array(templateLength); - var changingTemplateEntries = []; - var reuseMask = 0, minX = 0, maxX = 0, minY = 0; - var c, k; - - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - // Check if the template pixel appears in two consecutive context labels, - // so it can be reused. Otherwise, we add it to the list of changing - // template entries. - if (k < templateLength - 1 && - template[k].y === template[k + 1].y && - template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << (templateLength - 1 - k); - } else { - changingTemplateEntries.push(k); - } - } - var changingEntriesLength = changingTemplateEntries.length; - - var changingTemplateX = new Int8Array(changingEntriesLength); - var changingTemplateY = new Int8Array(changingEntriesLength); - var changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << (templateLength - 1 - k); - } - - // Get the safe bounding box edges from the width, height, minX, maxX, minY - var sbb_left = -minX; - var sbb_top = -minY; - var sbb_right = width - maxX; - - var pseudoPixelContext = ReusedContexts[templateIndex]; - var row = new Uint8Array(width); - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - - var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); // duplicate previous row - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - // Are we in the middle of a scanline, so we can reuse contextLabel - // bits? - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - // If yes, we can just shift the bits that are reusable and only - // fetch the remaining ones. - contextLabel = (contextLabel << 1) & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - // compute the contextLabel from scratch - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; - } - } - } - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; - } - - // 6.3.2 Generic Refinement Region Decoding Procedure - function decodeRefinement(width, height, templateIndex, referenceBitmap, - offsetX, offsetY, prediction, at, - decodingContext) { - var codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([at[0]]); - } - var codingTemplateLength = codingTemplate.length; - var codingTemplateX = new Int32Array(codingTemplateLength); - var codingTemplateY = new Int32Array(codingTemplateLength); - var k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - - var referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([at[1]]); - } - var referenceTemplateLength = referenceTemplate.length; - var referenceTemplateX = new Int32Array(referenceTemplateLength); - var referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - var referenceWidth = referenceBitmap[0].length; - var referenceHeight = referenceBitmap.length; - - var pseudoPixelContext = RefinementReusedContexts[templateIndex]; - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GR'); - - var ltp = 0; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - error('JBIG2 error: prediction is not supported'); - } - } - var row = new Uint8Array(width); - bitmap.push(row); - for (var j = 0; j < width; j++) { - var i0, j0; - var contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] + offsetY; - j0 = j + referenceTemplateX[k] + offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || - j0 >= referenceWidth) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - - return bitmap; - } - - // 6.5.5 Decoding the symbol dictionary - function decodeSymbolDictionary(huffman, refinement, symbols, - numberOfNewSymbols, numberOfExportedSymbols, - huffmanTables, templateIndex, at, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - var newSymbols = []; - var currentHeight = 0; - var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - - while (newSymbols.length < numberOfNewSymbols) { - var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6 - currentHeight += deltaHeight; - var currentWidth = 0; - var totalWidth = 0; - while (true) { - var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7 - if (deltaWidth === null) { - break; // OOB - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - var bitmap; - if (refinement) { - // 6.5.8.2 Refinement/aggregate-coded symbol bitmap - var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, - currentWidth, currentHeight, 0, - numberOfInstances, 1, //strip size - symbols.concat(newSymbols), - symbolCodeLength, - 0, //transposed - 0, //ds offset - 1, //top left 7.4.3.1.1 - 0, //OR operator - huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext); - } else { - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - var symbol = (symbolId < symbols.length ? symbols[symbolId] : - newSymbols[symbolId - symbols.length]); - bitmap = decodeRefinement(currentWidth, currentHeight, - refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, - decodingContext); - } - } else { - // 6.5.8.1 Direct-coded symbol bitmap - bitmap = decodeBitmap(false, currentWidth, currentHeight, - templateIndex, false, null, at, decodingContext); - } - newSymbols.push(bitmap); - } - } - // 6.5.10 Exported symbols - var exportedSymbols = []; - var flags = [], currentFlag = false; - var totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - var runLength = decodeInteger(contextCache, 'IAEX', decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (var i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (var j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; - } - - function decodeTextRegion(huffman, refinement, width, height, - defaultPixelValue, numberOfSymbolInstances, - stripSize, inputSymbols, symbolCodeLength, - transposed, dsOffset, referenceCorner, - combinationOperator, huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Prepare bitmap - var bitmap = []; - var i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - for (var j = 0; j < width; j++) { - row[j] = defaultPixelValue; - } - } - bitmap.push(row); - } - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - var firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - stripT += deltaT; - - var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7 - firstS += deltaFirstS; - var currentS = firstS; - do { - var currentT = (stripSize === 1 ? 0 : - decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9 - var t = stripSize * stripT + currentT; - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var applyRefinement = (refinement && - decodeInteger(contextCache, 'IARI', decoder)); - var symbolBitmap = inputSymbols[symbolId]; - var symbolWidth = symbolBitmap[0].length; - var symbolHeight = symbolBitmap.length; - if (applyRefinement) { - var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1 - var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2 - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, - refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, - (rdh >> 1) + rdy, false, refinementAt, - decodingContext); - } - var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight); - var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0); - var s2, t2, symbolRow; - if (transposed) { - // Place Symbol Bitmap from T1,S1 - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - // To ignore Parts of Symbol bitmap which goes - // outside bitmap region - var maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: // OR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - case 2: // XOR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolHeight - 1; - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: // OR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; - } - break; - case 2: // XOR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolWidth - 1; - } - i++; - var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8 - if (deltaS === null) { - break; // OOB - } - currentS += deltaS + dsOffset; - } while (true); - } - return bitmap; - } - - function readSegmentHeader(data, start) { - var segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - var flags = data[start + 4]; - var segmentType = flags & 0x3F; - if (!SegmentTypes[segmentType]) { - error('JBIG2 error: invalid segment type: ' + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 0x80); - - var pageAssociationFieldSize = !!(flags & 0x40); - var referredFlags = data[start + 5]; - var referredToCount = (referredFlags >> 5) & 7; - var retainBits = [referredFlags & 31]; - var position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF; - position += 3; - var bytes = (referredToCount + 7) >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - error('JBIG2 error: invalid referred-to flags'); - } - - segmentHeader.retainBits = retainBits; - var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 : - (segmentHeader.number <= 65536 ? 2 : 4)); - var referredTo = []; - var i, ii; - for (i = 0; i < referredToCount; i++) { - var number = (referredToSegmentNumberSize === 1 ? data[position] : - (referredToSegmentNumberSize === 2 ? readUint16(data, position) : - readUint32(data, position))); - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - - if (segmentHeader.length === 0xFFFFFFFF) { - // 7.2.7 Segment data length, unknown segment length - if (segmentType === 38) { // ImmediateGenericRegion - var genericRegionInfo = readRegionSegmentInformation(data, position); - var genericRegionSegmentFlags = data[position + - RegionSegmentInformationFieldLength]; - var genericRegionMmr = !!(genericRegionSegmentFlags & 1); - // searching for the segment end - var searchPatternLength = 6; - var searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 0xFF; - searchPattern[1] = 0xAC; - } - searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF; - searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF; - searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF; - searchPattern[5] = genericRegionInfo.height & 0xFF; - for (i = position, ii = data.length; i < ii; i++) { - var j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 0xFFFFFFFF) { - error('JBIG2 error: segment end was not found'); - } - } else { - error('JBIG2 error: invalid unknown segment length'); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; - } - - function readSegments(header, data, start, end) { - var segments = []; - var position = start; - while (position < end) { - var segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - var segment = { - header: segmentHeader, - data: data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; // end of file is found - } - } - if (header.randomAccess) { - for (var i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; - } - - // 7.4.1 Region segment information field - function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; - } - var RegionSegmentInformationFieldLength = 17; - - function processSegment(segment, visitor) { - var header = segment.header; - - var data = segment.data, position = segment.start, end = segment.end; - var args, at, i, atLength; - switch (header.type) { - case 0: // SymbolDictionary - // 7.4.2 Symbol dictionary segment syntax - var dictionary = {}; - var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1 - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3; - dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3; - dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1; - dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = (dictionaryFlags >> 10) & 3; - dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [dictionary, header.number, header.referredTo, - data, position, end]; - break; - case 6: // ImmediateTextRegion - case 7: // ImmediateLosslessTextRegion - var textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3); - textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3; - textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1; - textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27; - textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1; - if (textRegion.huffman) { - var textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = (textRegionHuffmanFlags) & 3; - textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3; - textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3; - textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3; - textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3; - textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3; - textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3; - textRegion.huffmanRefinementSizeSelector = - !!(textRegionHuffmanFlags & 14); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - // TODO 7.4.3.1.7 Symbol ID Huffman table decoding - if (textRegion.huffman) { - error('JBIG2 error: huffman is not supported'); - } - args = [textRegion, header.referredTo, data, position, end]; - break; - case 38: // ImmediateGenericRegion - case 39: // ImmediateLosslessGenericRegion - var genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = (genericRegionSegmentFlags >> 1) & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [genericRegion, data, position, end]; - break; - case 48: // PageInformation - var pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 0xFFFFFFFF) { - delete pageInfo.height; - } - var pageSegmentFlags = data[position + 16]; - var pageStripingInformation = readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1; - pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [pageInfo]; - break; - case 49: // EndOfPage - break; - case 50: // EndOfStripe - break; - case 51: // EndOfFile - break; - case 62: // 7.4.15 defines 2 extension types which - // are comments and can be ignored. - break; - default: - error('JBIG2 error: segment type ' + header.typeName + '(' + - header.type + ') is not implemented'); - } - var callbackName = 'on' + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } - } - - function processSegments(segments, visitor) { - for (var i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } - } - - function parseJbig2(data, start, end) { - var position = start; - if (data[position] !== 0x97 || data[position + 1] !== 0x4A || - data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || - data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || - data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) { - error('JBIG2 error: invalid header'); - } - var header = {}; - position += 8; - var flags = data[position++]; - header.randomAccess = !(flags & 1); - if (!(flags & 2)) { - header.numberOfPages = readUint32(data, position); - position += 4; - } - var segments = readSegments(header, data, position, end); - error('Not implemented'); - // processSegments(segments, new SimpleSegmentVisitor()); - } - - function parseJbig2Chunks(chunks) { - var visitor = new SimpleSegmentVisitor(); - for (var i = 0, ii = chunks.length; i < ii; i++) { - var chunk = chunks[i]; - var segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor.buffer; - } - - function SimpleSegmentVisitor() {} - - SimpleSegmentVisitor.prototype = { - onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { - this.currentPageInfo = info; - var rowSize = (info.width + 7) >> 3; - var buffer = new Uint8Array(rowSize * info.height); - // The contents of ArrayBuffers are initialized to 0. - // Fill the buffer with 0xFF only if info.defaultPixelValue is set - if (info.defaultPixelValue) { - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = 0xFF; - } - } - this.buffer = buffer; - }, - drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { - var pageInfo = this.currentPageInfo; - var width = regionInfo.width, height = regionInfo.height; - var rowSize = (pageInfo.width + 7) >> 3; - var combinationOperator = pageInfo.combinationOperatorOverride ? - regionInfo.combinationOperator : pageInfo.combinationOperator; - var buffer = this.buffer; - var mask0 = 128 >> (regionInfo.x & 7); - var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - var i, j, mask, offset; - switch (combinationOperator) { - case 0: // OR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - case 2: // XOR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - }, - onImmediateGenericRegion: - function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, - start, end) { - var regionInfo = region.info; - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, - region.template, region.prediction, null, - region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessGenericRegion: - function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion.apply(this, arguments); - }, - onSymbolDictionary: - function SimpleSegmentVisitor_onSymbolDictionary(dictionary, - currentSegment, - referredSegments, - data, start, end) { - var huffmanTables; - if (dictionary.huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - - var decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, - dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, - dictionary.numberOfExportedSymbols, huffmanTables, - dictionary.template, dictionary.at, - dictionary.refinementTemplate, dictionary.refinementAt, - decodingContext); - }, - onImmediateTextRegion: - function SimpleSegmentVisitor_onImmediateTextRegion(region, - referredSegments, - data, start, end) { - var regionInfo = region.info; - var huffmanTables; - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - var symbolCodeLength = log2(inputSymbols.length); - - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeTextRegion(region.huffman, region.refinement, - regionInfo.width, regionInfo.height, region.defaultPixelValue, - region.numberOfSymbolInstances, region.stripSize, inputSymbols, - symbolCodeLength, region.transposed, region.dsOffset, - region.referenceCorner, region.combinationOperator, huffmanTables, - region.refinementTemplate, region.refinementAt, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessTextRegion: - function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { - this.onImmediateTextRegion.apply(this, arguments); - } - }; - - function Jbig2Image() {} - - Jbig2Image.prototype = { - parseChunks: function Jbig2Image_parseChunks(chunks) { - return parseJbig2Chunks(chunks); - } - }; - - return Jbig2Image; -})(); - -exports.Jbig2Image = Jbig2Image; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreJpg = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var error = sharedUtil.error; - -/** - * This code was forked from https://github.com/notmasteryet/jpgjs. - * The original version was created by GitHub user notmasteryet. - * - * - The JPEG specification can be found in the ITU CCITT Recommendation T.81 - * (www.w3.org/Graphics/JPEG/itu-t81.pdf) - * - The JFIF specification can be found in the JPEG File Interchange Format - * (www.w3.org/Graphics/JPEG/jfif3.pdf) - * - The Adobe Application-Specific JPEG markers in the - * Supporting the DCT Filters in PostScript Level 2, Technical Note #5116 - * (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf) - */ - -var JpegImage = (function JpegImageClosure() { - var dctZigZag = new Uint8Array([ - 0, - 1, 8, - 16, 9, 2, - 3, 10, 17, 24, - 32, 25, 18, 11, 4, - 5, 12, 19, 26, 33, 40, - 48, 41, 34, 27, 20, 13, 6, - 7, 14, 21, 28, 35, 42, 49, 56, - 57, 50, 43, 36, 29, 22, 15, - 23, 30, 37, 44, 51, 58, - 59, 52, 45, 38, 31, - 39, 46, 53, 60, - 61, 54, 47, - 55, 62, - 63 - ]); - - var dctCos1 = 4017; // cos(pi/16) - var dctSin1 = 799; // sin(pi/16) - var dctCos3 = 3406; // cos(3*pi/16) - var dctSin3 = 2276; // sin(3*pi/16) - var dctCos6 = 1567; // cos(6*pi/16) - var dctSin6 = 3784; // sin(6*pi/16) - var dctSqrt2 = 5793; // sqrt(2) - var dctSqrt1d2 = 2896; // sqrt(2) / 2 - - function JpegImage() { - this.decodeTransform = null; - this.colorTransform = -1; - } - - function buildHuffmanTable(codeLengths, values) { - var k = 0, code = [], i, j, length = 16; - while (length > 0 && !codeLengths[length - 1]) { - length--; - } - code.push({children: [], index: 0}); - var p = code[0], q; - for (i = 0; i < length; i++) { - for (j = 0; j < codeLengths[i]; j++) { - p = code.pop(); - p.children[p.index] = values[k]; - while (p.index > 0) { - p = code.pop(); - } - p.index++; - code.push(p); - while (code.length <= i) { - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - k++; - } - if (i + 1 < length) { - // p here points to last code - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - } - return code[0].children; - } - - function getBlockBufferOffset(component, row, col) { - return 64 * ((component.blocksPerLine + 1) * row + col); - } - - function decodeScan(data, offset, frame, components, resetInterval, - spectralStart, spectralEnd, successivePrev, successive) { - var mcusPerLine = frame.mcusPerLine; - var progressive = frame.progressive; - - var startOffset = offset, bitsData = 0, bitsCount = 0; - - function readBit() { - if (bitsCount > 0) { - bitsCount--; - return (bitsData >> bitsCount) & 1; - } - bitsData = data[offset++]; - if (bitsData === 0xFF) { - var nextByte = data[offset++]; - if (nextByte) { - error('JPEG error: unexpected marker ' + - ((bitsData << 8) | nextByte).toString(16)); - } - // unstuff 0 - } - bitsCount = 7; - return bitsData >>> 7; - } - - function decodeHuffman(tree) { - var node = tree; - while (true) { - node = node[readBit()]; - if (typeof node === 'number') { - return node; - } - if (typeof node !== 'object') { - error('JPEG error: invalid huffman sequence'); - } - } - } - - function receive(length) { - var n = 0; - while (length > 0) { - n = (n << 1) | readBit(); - length--; - } - return n; - } - - function receiveAndExtend(length) { - if (length === 1) { - return readBit() === 1 ? 1 : -1; - } - var n = receive(length); - if (n >= 1 << (length - 1)) { - return n; - } - return n + (-1 << length) + 1; - } - - function decodeBaseline(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : receiveAndExtend(t); - component.blockData[offset] = (component.pred += diff); - var k = 1; - while (k < 64) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = receiveAndExtend(s); - k++; - } - } - - function decodeDCFirst(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); - component.blockData[offset] = (component.pred += diff); - } - - function decodeDCSuccessive(component, offset) { - component.blockData[offset] |= readBit() << successive; - } - - var eobrun = 0; - function decodeACFirst(component, offset) { - if (eobrun > 0) { - eobrun--; - return; - } - var k = spectralStart, e = spectralEnd; - while (k <= e) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r) - 1; - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = - receiveAndExtend(s) * (1 << successive); - k++; - } - } - - var successiveACState = 0, successiveACNextValue; - function decodeACSuccessive(component, offset) { - var k = spectralStart; - var e = spectralEnd; - var r = 0; - var s; - var rs; - while (k <= e) { - var z = dctZigZag[k]; - switch (successiveACState) { - case 0: // initial state - rs = decodeHuffman(component.huffmanTableAC); - s = rs & 15; - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r); - successiveACState = 4; - } else { - r = 16; - successiveACState = 1; - } - } else { - if (s !== 1) { - error('JPEG error: invalid ACn encoding'); - } - successiveACNextValue = receiveAndExtend(s); - successiveACState = r ? 2 : 3; - } - continue; - case 1: // skipping r zero items - case 2: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - r--; - if (r === 0) { - successiveACState = successiveACState === 2 ? 3 : 0; - } - } - break; - case 3: // set value for a zero item - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - component.blockData[offset + z] = - successiveACNextValue << successive; - successiveACState = 0; - } - break; - case 4: // eob - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } - break; - } - k++; - } - if (successiveACState === 4) { - eobrun--; - if (eobrun === 0) { - successiveACState = 0; - } - } - } - - function decodeMcu(component, decode, mcu, row, col) { - var mcuRow = (mcu / mcusPerLine) | 0; - var mcuCol = mcu % mcusPerLine; - var blockRow = mcuRow * component.v + row; - var blockCol = mcuCol * component.h + col; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - function decodeBlock(component, decode, mcu) { - var blockRow = (mcu / component.blocksPerLine) | 0; - var blockCol = mcu % component.blocksPerLine; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - var componentsLength = components.length; - var component, i, j, k, n; - var decodeFn; - if (progressive) { - if (spectralStart === 0) { - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - } else { - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } - } else { - decodeFn = decodeBaseline; - } - - var mcu = 0, marker; - var mcuExpected; - if (componentsLength === 1) { - mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; - } else { - mcuExpected = mcusPerLine * frame.mcusPerColumn; - } - if (!resetInterval) { - resetInterval = mcuExpected; - } - - var h, v; - while (mcu < mcuExpected) { - // reset interval stuff - for (i = 0; i < componentsLength; i++) { - components[i].pred = 0; - } - eobrun = 0; - - if (componentsLength === 1) { - component = components[0]; - for (n = 0; n < resetInterval; n++) { - decodeBlock(component, decodeFn, mcu); - mcu++; - } - } else { - for (n = 0; n < resetInterval; n++) { - for (i = 0; i < componentsLength; i++) { - component = components[i]; - h = component.h; - v = component.v; - for (j = 0; j < v; j++) { - for (k = 0; k < h; k++) { - decodeMcu(component, decodeFn, mcu, j, k); - } - } - } - mcu++; - } - } - - // find marker - bitsCount = 0; - marker = (data[offset] << 8) | data[offset + 1]; - // Some bad images seem to pad Scan blocks with zero bytes, skip past - // those to attempt to find a valid marker (fixes issue4090.pdf). - while (data[offset] === 0x00 && offset < data.length - 1) { - offset++; - marker = (data[offset] << 8) | data[offset + 1]; - } - if (marker <= 0xFF00) { - error('JPEG error: marker was not found'); - } - - if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx - offset += 2; - } else { - break; - } - } - - return offset - startOffset; - } - - // A port of poppler's IDCT method which in turn is taken from: - // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, - // 'Practical Fast 1-D DCT Algorithms with 11 Multiplications', - // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, - // 988-991. - function quantizeAndInverse(component, blockBufferOffset, p) { - var qt = component.quantizationTable, blockData = component.blockData; - var v0, v1, v2, v3, v4, v5, v6, v7; - var p0, p1, p2, p3, p4, p5, p6, p7; - var t; - - if (!qt) { - error('JPEG error: missing required Quantization Table.'); - } - - // inverse DCT on rows - for (var row = 0; row < 64; row += 8) { - // gather block data - p0 = blockData[blockBufferOffset + row]; - p1 = blockData[blockBufferOffset + row + 1]; - p2 = blockData[blockBufferOffset + row + 2]; - p3 = blockData[blockBufferOffset + row + 3]; - p4 = blockData[blockBufferOffset + row + 4]; - p5 = blockData[blockBufferOffset + row + 5]; - p6 = blockData[blockBufferOffset + row + 6]; - p7 = blockData[blockBufferOffset + row + 7]; - - // dequant p0 - p0 *= qt[row]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 512) >> 10; - p[row] = t; - p[row + 1] = t; - p[row + 2] = t; - p[row + 3] = t; - p[row + 4] = t; - p[row + 5] = t; - p[row + 6] = t; - p[row + 7] = t; - continue; - } - // dequant p1 ... p7 - p1 *= qt[row + 1]; - p2 *= qt[row + 2]; - p3 *= qt[row + 3]; - p4 *= qt[row + 4]; - p5 *= qt[row + 5]; - p6 *= qt[row + 6]; - p7 *= qt[row + 7]; - - // stage 4 - v0 = (dctSqrt2 * p0 + 128) >> 8; - v1 = (dctSqrt2 * p4 + 128) >> 8; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8; - v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8; - v5 = p3 << 4; - v6 = p5 << 4; - - // stage 3 - v0 = (v0 + v1 + 1) >> 1; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p[row] = v0 + v7; - p[row + 7] = v0 - v7; - p[row + 1] = v1 + v6; - p[row + 6] = v1 - v6; - p[row + 2] = v2 + v5; - p[row + 5] = v2 - v5; - p[row + 3] = v3 + v4; - p[row + 4] = v3 - v4; - } - - // inverse DCT on columns - for (var col = 0; col < 8; ++col) { - p0 = p[col]; - p1 = p[col + 8]; - p2 = p[col + 16]; - p3 = p[col + 24]; - p4 = p[col + 32]; - p5 = p[col + 40]; - p6 = p[col + 48]; - p7 = p[col + 56]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 8192) >> 14; - // convert to 8 bit - t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4; - blockData[blockBufferOffset + col] = t; - blockData[blockBufferOffset + col + 8] = t; - blockData[blockBufferOffset + col + 16] = t; - blockData[blockBufferOffset + col + 24] = t; - blockData[blockBufferOffset + col + 32] = t; - blockData[blockBufferOffset + col + 40] = t; - blockData[blockBufferOffset + col + 48] = t; - blockData[blockBufferOffset + col + 56] = t; - continue; - } - - // stage 4 - v0 = (dctSqrt2 * p0 + 2048) >> 12; - v1 = (dctSqrt2 * p4 + 2048) >> 12; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12; - v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12; - v5 = p3; - v6 = p5; - - // stage 3 - // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when - // converting to UInt8 range later. - v0 = ((v0 + v1 + 1) >> 1) + 4112; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p0 = v0 + v7; - p7 = v0 - v7; - p1 = v1 + v6; - p6 = v1 - v6; - p2 = v2 + v5; - p5 = v2 - v5; - p3 = v3 + v4; - p4 = v3 - v4; - - // convert to 8-bit integers - p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4; - p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4; - p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4; - p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4; - p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4; - p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4; - p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4; - p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4; - - // store block data - blockData[blockBufferOffset + col] = p0; - blockData[blockBufferOffset + col + 8] = p1; - blockData[blockBufferOffset + col + 16] = p2; - blockData[blockBufferOffset + col + 24] = p3; - blockData[blockBufferOffset + col + 32] = p4; - blockData[blockBufferOffset + col + 40] = p5; - blockData[blockBufferOffset + col + 48] = p6; - blockData[blockBufferOffset + col + 56] = p7; - } - } - - function buildComponentData(frame, component) { - var blocksPerLine = component.blocksPerLine; - var blocksPerColumn = component.blocksPerColumn; - var computationBuffer = new Int16Array(64); - - for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { - for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { - var offset = getBlockBufferOffset(component, blockRow, blockCol); - quantizeAndInverse(component, offset, computationBuffer); - } - } - return component.blockData; - } - - function clamp0to255(a) { - return a <= 0 ? 0 : a >= 255 ? 255 : a; - } - - JpegImage.prototype = { - parse: function parse(data) { - - function readUint16() { - var value = (data[offset] << 8) | data[offset + 1]; - offset += 2; - return value; - } - - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - - function prepareComponents(frame) { - var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (var i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * - component.h / frame.maxH); - var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * - component.v / frame.maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - - var blocksBufferSize = 64 * blocksPerColumnForMcu * - (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; - } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; - } - - var offset = 0; - var jfif = null; - var adobe = null; - var frame, resetInterval; - var quantizationTables = []; - var huffmanTablesAC = [], huffmanTablesDC = []; - var fileMarker = readUint16(); - if (fileMarker !== 0xFFD8) { // SOI (Start of Image) - error('JPEG error: SOI not found'); - } - - fileMarker = readUint16(); - while (fileMarker !== 0xFFD9) { // EOI (End of image) - var i, j, l; - switch(fileMarker) { - case 0xFFE0: // APP0 (Application Specific) - case 0xFFE1: // APP1 - case 0xFFE2: // APP2 - case 0xFFE3: // APP3 - case 0xFFE4: // APP4 - case 0xFFE5: // APP5 - case 0xFFE6: // APP6 - case 0xFFE7: // APP7 - case 0xFFE8: // APP8 - case 0xFFE9: // APP9 - case 0xFFEA: // APP10 - case 0xFFEB: // APP11 - case 0xFFEC: // APP12 - case 0xFFED: // APP13 - case 0xFFEE: // APP14 - case 0xFFEF: // APP15 - case 0xFFFE: // COM (Comment) - var appData = readDataBlock(); - - if (fileMarker === 0xFFE0) { - if (appData[0] === 0x4A && appData[1] === 0x46 && - appData[2] === 0x49 && appData[3] === 0x46 && - appData[4] === 0) { // 'JFIF\x00' - jfif = { - version: { major: appData[5], minor: appData[6] }, - densityUnits: appData[7], - xDensity: (appData[8] << 8) | appData[9], - yDensity: (appData[10] << 8) | appData[11], - thumbWidth: appData[12], - thumbHeight: appData[13], - thumbData: appData.subarray(14, 14 + - 3 * appData[12] * appData[13]) - }; - } - } - // TODO APP1 - Exif - if (fileMarker === 0xFFEE) { - if (appData[0] === 0x41 && appData[1] === 0x64 && - appData[2] === 0x6F && appData[3] === 0x62 && - appData[4] === 0x65) { // 'Adobe' - adobe = { - version: (appData[5] << 8) | appData[6], - flags0: (appData[7] << 8) | appData[8], - flags1: (appData[9] << 8) | appData[10], - transformCode: appData[11] - }; - } - } - break; - - case 0xFFDB: // DQT (Define Quantization Tables) - var quantizationTablesLength = readUint16(); - var quantizationTablesEnd = quantizationTablesLength + offset - 2; - var z; - while (offset < quantizationTablesEnd) { - var quantizationTableSpec = data[offset++]; - var tableData = new Uint16Array(64); - if ((quantizationTableSpec >> 4) === 0) { // 8 bit values - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = data[offset++]; - } - } else if ((quantizationTableSpec >> 4) === 1) { //16 bit - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = readUint16(); - } - } else { - error('JPEG error: DQT - invalid table spec'); - } - quantizationTables[quantizationTableSpec & 15] = tableData; - } - break; - - case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) - case 0xFFC1: // SOF1 (Start of Frame, Extended DCT) - case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) - if (frame) { - error('JPEG error: Only single frame JPEGs supported'); - } - readUint16(); // skip data length - frame = {}; - frame.extended = (fileMarker === 0xFFC1); - frame.progressive = (fileMarker === 0xFFC2); - frame.precision = data[offset++]; - frame.scanLines = readUint16(); - frame.samplesPerLine = readUint16(); - frame.components = []; - frame.componentIds = {}; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) { - maxH = h; - } - if (maxV < v) { - maxV = v; - } - var qId = data[offset + 2]; - l = frame.components.push({ - h: h, - v: v, - quantizationId: qId, - quantizationTable: null, // See comment below. - }); - frame.componentIds[componentId] = l - 1; - offset += 3; - } - frame.maxH = maxH; - frame.maxV = maxV; - prepareComponents(frame); - break; - - case 0xFFC4: // DHT (Define Huffman Tables) - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength;) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) { - codeLengthSum += (codeLengths[j] = data[offset]); - } - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) { - huffmanValues[j] = data[offset]; - } - i += 17 + codeLengthSum; - - ((huffmanTableSpec >> 4) === 0 ? - huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = - buildHuffmanTable(codeLengths, huffmanValues); - } - break; - - case 0xFFDD: // DRI (Define Restart Interval) - readUint16(); // skip data length - resetInterval = readUint16(); - break; - - case 0xFFDA: // SOS (Start of Scan) - var scanLength = readUint16(); - var selectorsCount = data[offset++]; - var components = [], component; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = frame.componentIds[data[offset++]]; - component = frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, - frame, components, resetInterval, - spectralStart, spectralEnd, - successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - break; - - case 0xFFFF: // Fill bytes - if (data[offset] !== 0xFF) { // Avoid skipping a valid marker. - offset--; - } - break; - - default: - if (data[offset - 3] === 0xFF && - data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) { - // could be incorrect encoding -- last 0xFF byte of the previous - // block was eaten by the encoder - offset -= 3; - break; - } - error('JPEG error: unknown marker ' + fileMarker.toString(16)); - } - fileMarker = readUint16(); - } - - this.width = frame.samplesPerLine; - this.height = frame.scanLines; - this.jfif = jfif; - this.adobe = adobe; - this.components = []; - for (i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - - // Prevent errors when DQT markers are placed after SOF{n} markers, - // by assigning the `quantizationTable` entry after the entire image - // has been parsed (fixes issue7406.pdf). - var quantizationTable = quantizationTables[component.quantizationId]; - if (quantizationTable) { - component.quantizationTable = quantizationTable; - } - - this.components.push({ - output: buildComponentData(frame, component), - scaleX: component.h / frame.maxH, - scaleY: component.v / frame.maxV, - blocksPerLine: component.blocksPerLine, - blocksPerColumn: component.blocksPerColumn - }); - } - this.numComponents = this.components.length; - }, - - _getLinearizedBlockData: function getLinearizedBlockData(width, height) { - var scaleX = this.width / width, scaleY = this.height / height; - - var component, componentScaleX, componentScaleY, blocksPerScanline; - var x, y, i, j, k; - var index; - var offset = 0; - var output; - var numComponents = this.components.length; - var dataLength = width * height * numComponents; - var data = new Uint8Array(dataLength); - var xScaleBlockOffset = new Uint32Array(width); - var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs - - for (i = 0; i < numComponents; i++) { - component = this.components[i]; - componentScaleX = component.scaleX * scaleX; - componentScaleY = component.scaleY * scaleY; - offset = i; - output = component.output; - blocksPerScanline = (component.blocksPerLine + 1) << 3; - // precalculate the xScaleBlockOffset - for (x = 0; x < width; x++) { - j = 0 | (x * componentScaleX); - xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); - } - // linearize the blocks of the component - for (y = 0; y < height; y++) { - j = 0 | (y * componentScaleY); - index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3); - for (x = 0; x < width; x++) { - data[offset] = output[index + xScaleBlockOffset[x]]; - offset += numComponents; - } - } - } - - // decodeTransform contains pairs of multiplier (-256..256) and additive - var transform = this.decodeTransform; - if (transform) { - for (i = 0; i < dataLength;) { - for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { - data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; - } - } - } - return data; - }, - - _isColorConversionNeeded: function isColorConversionNeeded() { - if (this.adobe && this.adobe.transformCode) { - // The adobe transform marker overrides any previous setting - return true; - } else if (this.numComponents === 3) { - if (!this.adobe && this.colorTransform === 0) { - // If the Adobe transform marker is not present and the image - // dictionary has a 'ColorTransform' entry, explicitly set to `0`, - // then the colours should *not* be transformed. - return false; - } - return true; - } else { // `this.numComponents !== 3` - if (!this.adobe && this.colorTransform === 1) { - // If the Adobe transform marker is not present and the image - // dictionary has a 'ColorTransform' entry, explicitly set to `1`, - // then the colours should be transformed. - return true; - } - return false; - } - }, - - _convertYccToRgb: function convertYccToRgb(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 3) { - Y = data[i ]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(Y - 179.456 + 1.402 * Cr); - data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); - data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); - } - return data; - }, - - _convertYcckToRgb: function convertYcckToRgb(data) { - var Y, Cb, Cr, k; - var offset = 0; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - k = data[i + 3]; - - var r = -122.67195406894 + - Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - - 0.154362151871126) + - Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - - 0.00477271405408747 * k + 1.53380253221734) + - Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + - 0.48357088451265) + - k * (-0.000336197177618394 * k + 0.484791561490776); - - var g = 107.268039397724 + - Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + - 0.000659397001245577 * Y + 0.000426105652938837 * k - - 0.176491792462875) + - Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + - 0.000770482631801132 * k - 0.151051492775562) + - Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + - 0.25802910206845) + - k * (-0.000318913117588328 * k - 0.213742400323665); - - var b = -20.810012546947 + - Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + - 0.0020741088115012 * Y - 0.00288260236853442 * k + - 0.814272968359295) + - Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + - 0.000560833691242812 * k - 0.195152027534049) + - Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + - 0.116935020465145) + - k * (-0.000343531996510555 * k + 0.24165260232407); - - data[offset++] = clamp0to255(r); - data[offset++] = clamp0to255(g); - data[offset++] = clamp0to255(b); - } - return data; - }, - - _convertYcckToCmyk: function convertYcckToCmyk(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(434.456 - Y - 1.402 * Cr); - data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); - data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); - // K in data[i + 3] is unchanged - } - return data; - }, - - _convertCmykToRgb: function convertCmykToRgb(data) { - var c, m, y, k; - var offset = 0; - var min = -255 * 255 * 255; - var scale = 1 / 255 / 255; - for (var i = 0, length = data.length; i < length; i += 4) { - c = data[i]; - m = data[i + 1]; - y = data[i + 2]; - k = data[i + 3]; - - var r = - c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k - - 72734.4411664936) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y - - 17.873870861415444 * k - 1401.7366389350734) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 4465.541406466231) - - k * (21.86122147463605 * k + 48317.86113160301); - var g = - c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k - - 20220.756542821975) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 48691.05921601825) + - y * (4.444339102852739 * y + 9.8632861493405 * k - - 6341.191035517494) - - k * (20.737325471181034 * k + 47890.15695978492); - var b = - c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k - - 3616.812083916688) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 28620.90484698408) + - y * (0.03296041114873217 * y + 115.60384449646641 * k - - 49363.43385999684) - - k * (22.33816807309886 * k + 45932.16563550634); - - data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; - data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; - data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; - } - return data; - }, - - getData: function getData(width, height, forceRGBoutput) { - if (this.numComponents > 4) { - error('JPEG error: Unsupported color mode'); - } - // type of data: Uint8Array(width * height * numComponents) - var data = this._getLinearizedBlockData(width, height); - - if (this.numComponents === 1 && forceRGBoutput) { - var dataLength = data.length; - var rgbData = new Uint8Array(dataLength * 3); - var offset = 0; - for (var i = 0; i < dataLength; i++) { - var grayColor = data[i]; - rgbData[offset++] = grayColor; - rgbData[offset++] = grayColor; - rgbData[offset++] = grayColor; - } - return rgbData; - } else if (this.numComponents === 3 && this._isColorConversionNeeded()) { - return this._convertYccToRgb(data); - } else if (this.numComponents === 4) { - if (this._isColorConversionNeeded()) { - if (forceRGBoutput) { - return this._convertYcckToRgb(data); - } else { - return this._convertYcckToCmyk(data); - } - } else if (forceRGBoutput) { - return this._convertCmykToRgb(data); - } - } - return data; - } - }; - - return JpegImage; -})(); - -exports.JpegImage = JpegImage; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreJpx = {}), root.pdfjsSharedUtil, - root.pdfjsCoreArithmeticDecoder); - } -}(this, function (exports, sharedUtil, coreArithmeticDecoder) { - -var info = sharedUtil.info; -var warn = sharedUtil.warn; -var error = sharedUtil.error; -var log2 = sharedUtil.log2; -var readUint16 = sharedUtil.readUint16; -var readUint32 = sharedUtil.readUint32; -var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; - -var JpxImage = (function JpxImageClosure() { - // Table E.1 - var SubbandsGainLog2 = { - 'LL': 0, - 'LH': 1, - 'HL': 1, - 'HH': 2 - }; - function JpxImage() { - this.failOnCorruptedImage = false; - } - JpxImage.prototype = { - parse: function JpxImage_parse(data) { - - var head = readUint16(data, 0); - // No box header, immediate start of codestream (SOC) - if (head === 0xFF4F) { - this.parseCodestream(data, 0, data.length); - return; - } - - var position = 0, length = data.length; - while (position < length) { - var headerSize = 8; - var lbox = readUint32(data, position); - var tbox = readUint32(data, position + 4); - position += headerSize; - if (lbox === 1) { - // XLBox: read UInt64 according to spec. - // JavaScript's int precision of 53 bit should be sufficient here. - lbox = readUint32(data, position) * 4294967296 + - readUint32(data, position + 4); - position += 8; - headerSize += 8; - } - if (lbox === 0) { - lbox = length - position + headerSize; - } - if (lbox < headerSize) { - error('JPX Error: Invalid box field size'); - } - var dataLength = lbox - headerSize; - var jumpDataLength = true; - switch (tbox) { - case 0x6A703268: // 'jp2h' - jumpDataLength = false; // parsing child boxes - break; - case 0x636F6C72: // 'colr' - // Colorspaces are not used, the CS from the PDF is used. - var method = data[position]; - if (method === 1) { - // enumerated colorspace - var colorspace = readUint32(data, position + 3); - switch (colorspace) { - case 16: // this indicates a sRGB colorspace - case 17: // this indicates a grayscale colorspace - case 18: // this indicates a YUV colorspace - break; - default: - warn('Unknown colorspace ' + colorspace); - break; - } - } else if (method === 2) { - info('ICC profile not supported'); - } - break; - case 0x6A703263: // 'jp2c' - this.parseCodestream(data, position, position + dataLength); - break; - case 0x6A502020: // 'jP\024\024' - if (0x0d0a870a !== readUint32(data, position)) { - warn('Invalid JP2 signature'); - } - break; - // The following header types are valid but currently not used: - case 0x6A501A1A: // 'jP\032\032' - case 0x66747970: // 'ftyp' - case 0x72726571: // 'rreq' - case 0x72657320: // 'res ' - case 0x69686472: // 'ihdr' - break; - default: - var headerType = String.fromCharCode((tbox >> 24) & 0xFF, - (tbox >> 16) & 0xFF, - (tbox >> 8) & 0xFF, - tbox & 0xFF); - warn('Unsupported header type ' + tbox + ' (' + headerType + ')'); - break; - } - if (jumpDataLength) { - position += dataLength; - } - } - }, - parseImageProperties: function JpxImage_parseImageProperties(stream) { - var newByte = stream.getByte(); - while (newByte >= 0) { - var oldByte = newByte; - newByte = stream.getByte(); - var code = (oldByte << 8) | newByte; - // Image and tile size (SIZ) - if (code === 0xFF51) { - stream.skip(4); - var Xsiz = stream.getInt32() >>> 0; // Byte 4 - var Ysiz = stream.getInt32() >>> 0; // Byte 8 - var XOsiz = stream.getInt32() >>> 0; // Byte 12 - var YOsiz = stream.getInt32() >>> 0; // Byte 16 - stream.skip(16); - var Csiz = stream.getUint16(); // Byte 36 - this.width = Xsiz - XOsiz; - this.height = Ysiz - YOsiz; - this.componentsCount = Csiz; - // Results are always returned as Uint8Arrays - this.bitsPerComponent = 8; - return; - } - } - error('JPX Error: No size marker found in JPX stream'); - }, - parseCodestream: function JpxImage_parseCodestream(data, start, end) { - var context = {}; - var doNotRecover = false; - try { - var position = start; - while (position + 1 < end) { - var code = readUint16(data, position); - position += 2; - - var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; - switch (code) { - case 0xFF4F: // Start of codestream (SOC) - context.mainHeader = true; - break; - case 0xFFD9: // End of codestream (EOC) - break; - case 0xFF51: // Image and tile size (SIZ) - length = readUint16(data, position); - var siz = {}; - siz.Xsiz = readUint32(data, position + 4); - siz.Ysiz = readUint32(data, position + 8); - siz.XOsiz = readUint32(data, position + 12); - siz.YOsiz = readUint32(data, position + 16); - siz.XTsiz = readUint32(data, position + 20); - siz.YTsiz = readUint32(data, position + 24); - siz.XTOsiz = readUint32(data, position + 28); - siz.YTOsiz = readUint32(data, position + 32); - var componentsCount = readUint16(data, position + 36); - siz.Csiz = componentsCount; - var components = []; - j = position + 38; - for (var i = 0; i < componentsCount; i++) { - var component = { - precision: (data[j] & 0x7F) + 1, - isSigned: !!(data[j] & 0x80), - XRsiz: data[j + 1], - YRsiz: data[j + 1] - }; - calculateComponentDimensions(component, siz); - components.push(component); - } - context.SIZ = siz; - context.components = components; - calculateTileGrids(context, components); - context.QCC = []; - context.COC = []; - break; - case 0xFF5C: // Quantization default (QCD) - length = readUint16(data, position); - var qcd = {}; - j = position + 2; - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('Invalid SQcd value ' + sqcd); - } - qcd.noQuantization = (spqcdSize === 8); - qcd.scalarExpounded = scalarExpounded; - qcd.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - var spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcd.SPqcds = spqcds; - if (context.mainHeader) { - context.QCD = qcd; - } else { - context.currentTile.QCD = qcd; - context.currentTile.QCC = []; - } - break; - case 0xFF5D: // Quantization component (QCC) - length = readUint16(data, position); - var qcc = {}; - j = position + 2; - var cqcc; - if (context.SIZ.Csiz < 257) { - cqcc = data[j++]; - } else { - cqcc = readUint16(data, j); - j += 2; - } - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('Invalid SQcd value ' + sqcd); - } - qcc.noQuantization = (spqcdSize === 8); - qcc.scalarExpounded = scalarExpounded; - qcc.guardBits = sqcd >> 5; - spqcds = []; - while (j < (length + position)) { - spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcc.SPqcds = spqcds; - if (context.mainHeader) { - context.QCC[cqcc] = qcc; - } else { - context.currentTile.QCC[cqcc] = qcc; - } - break; - case 0xFF52: // Coding style default (COD) - length = readUint16(data, position); - var cod = {}; - j = position + 2; - var scod = data[j++]; - cod.entropyCoderWithCustomPrecincts = !!(scod & 1); - cod.sopMarkerUsed = !!(scod & 2); - cod.ephMarkerUsed = !!(scod & 4); - cod.progressionOrder = data[j++]; - cod.layersCount = readUint16(data, j); - j += 2; - cod.multipleComponentTransform = data[j++]; - - cod.decompositionLevelsCount = data[j++]; - cod.xcb = (data[j++] & 0xF) + 2; - cod.ycb = (data[j++] & 0xF) + 2; - var blockStyle = data[j++]; - cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); - cod.resetContextProbabilities = !!(blockStyle & 2); - cod.terminationOnEachCodingPass = !!(blockStyle & 4); - cod.verticalyStripe = !!(blockStyle & 8); - cod.predictableTermination = !!(blockStyle & 16); - cod.segmentationSymbolUsed = !!(blockStyle & 32); - cod.reversibleTransformation = data[j++]; - if (cod.entropyCoderWithCustomPrecincts) { - var precinctsSizes = []; - while (j < length + position) { - var precinctsSize = data[j++]; - precinctsSizes.push({ - PPx: precinctsSize & 0xF, - PPy: precinctsSize >> 4 - }); - } - cod.precinctsSizes = precinctsSizes; - } - var unsupported = []; - if (cod.selectiveArithmeticCodingBypass) { - unsupported.push('selectiveArithmeticCodingBypass'); - } - if (cod.resetContextProbabilities) { - unsupported.push('resetContextProbabilities'); - } - if (cod.terminationOnEachCodingPass) { - unsupported.push('terminationOnEachCodingPass'); - } - if (cod.verticalyStripe) { - unsupported.push('verticalyStripe'); - } - if (cod.predictableTermination) { - unsupported.push('predictableTermination'); - } - if (unsupported.length > 0) { - doNotRecover = true; - throw new Error('Unsupported COD options (' + - unsupported.join(', ') + ')'); - } - if (context.mainHeader) { - context.COD = cod; - } else { - context.currentTile.COD = cod; - context.currentTile.COC = []; - } - break; - case 0xFF90: // Start of tile-part (SOT) - length = readUint16(data, position); - tile = {}; - tile.index = readUint16(data, position + 2); - tile.length = readUint32(data, position + 4); - tile.dataEnd = tile.length + position - 2; - tile.partIndex = data[position + 8]; - tile.partsCount = data[position + 9]; - - context.mainHeader = false; - if (tile.partIndex === 0) { - // reset component specific settings - tile.COD = context.COD; - tile.COC = context.COC.slice(0); // clone of the global COC - tile.QCD = context.QCD; - tile.QCC = context.QCC.slice(0); // clone of the global COC - } - context.currentTile = tile; - break; - case 0xFF93: // Start of data (SOD) - tile = context.currentTile; - if (tile.partIndex === 0) { - initializeTile(context, tile.index); - buildPackets(context); - } - - // moving to the end of the data - length = tile.dataEnd - position; - parseTilePackets(context, data, position, length); - break; - case 0xFF55: // Tile-part lengths, main header (TLM) - case 0xFF57: // Packet length, main header (PLM) - case 0xFF58: // Packet length, tile-part header (PLT) - case 0xFF64: // Comment (COM) - length = readUint16(data, position); - // skipping content - break; - case 0xFF53: // Coding style component (COC) - throw new Error('Codestream code 0xFF53 (COC) is ' + - 'not implemented'); - default: - throw new Error('Unknown codestream code: ' + code.toString(16)); - } - position += length; - } - } catch (e) { - if (doNotRecover || this.failOnCorruptedImage) { - error('JPX Error: ' + e.message); - } else { - warn('JPX: Trying to recover from: ' + e.message); - } - } - this.tiles = transformComponents(context); - this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; - this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; - this.componentsCount = context.SIZ.Csiz; - } - }; - function calculateComponentDimensions(component, siz) { - // Section B.2 Component mapping - component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); - component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); - component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); - component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); - component.width = component.x1 - component.x0; - component.height = component.y1 - component.y0; - } - function calculateTileGrids(context, components) { - var siz = context.SIZ; - // Section B.3 Division into tile and tile-components - var tile, tiles = []; - var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); - var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); - for (var q = 0; q < numYtiles; q++) { - for (var p = 0; p < numXtiles; p++) { - tile = {}; - tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); - tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); - tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); - tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); - tile.width = tile.tx1 - tile.tx0; - tile.height = tile.ty1 - tile.ty0; - tile.components = []; - tiles.push(tile); - } - } - context.tiles = tiles; - - var componentsCount = siz.Csiz; - for (var i = 0, ii = componentsCount; i < ii; i++) { - var component = components[i]; - for (var j = 0, jj = tiles.length; j < jj; j++) { - var tileComponent = {}; - tile = tiles[j]; - tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); - tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); - tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); - tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); - tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; - tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; - tile.components[i] = tileComponent; - } - } - } - function getBlocksDimensions(context, component, r) { - var codOrCoc = component.codingStyleParameters; - var result = {}; - if (!codOrCoc.entropyCoderWithCustomPrecincts) { - result.PPx = 15; - result.PPy = 15; - } else { - result.PPx = codOrCoc.precinctsSizes[r].PPx; - result.PPy = codOrCoc.precinctsSizes[r].PPy; - } - // calculate codeblock size as described in section B.7 - result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : - Math.min(codOrCoc.xcb, result.PPx)); - result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : - Math.min(codOrCoc.ycb, result.PPy)); - return result; - } - function buildPrecincts(context, resolution, dimensions) { - // Section B.6 Division resolution to precincts - var precinctWidth = 1 << dimensions.PPx; - var precinctHeight = 1 << dimensions.PPy; - // Jasper introduces codeblock groups for mapping each subband codeblocks - // to precincts. Precinct partition divides a resolution according to width - // and height parameters. The subband that belongs to the resolution level - // has a different size than the level, unless it is the zero resolution. - - // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding: - // The precinct partitioning for a particular subband is derived from a - // partitioning of its parent LL band (i.e., the LL band at the next higher - // resolution level)... The LL band associated with each resolution level is - // divided into precincts... Each of the resulting precinct regions is then - // mapped into its child subbands (if any) at the next lower resolution - // level. This is accomplished by using the coordinate transformation - // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the - // coordinates of a point in the LL band and child subband, respectively. - var isZeroRes = resolution.resLevel === 0; - var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1)); - var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1)); - var numprecinctswide = (resolution.trx1 > resolution.trx0 ? - Math.ceil(resolution.trx1 / precinctWidth) - - Math.floor(resolution.trx0 / precinctWidth) : 0); - var numprecinctshigh = (resolution.try1 > resolution.try0 ? - Math.ceil(resolution.try1 / precinctHeight) - - Math.floor(resolution.try0 / precinctHeight) : 0); - var numprecincts = numprecinctswide * numprecinctshigh; - - resolution.precinctParameters = { - precinctWidth: precinctWidth, - precinctHeight: precinctHeight, - numprecinctswide: numprecinctswide, - numprecinctshigh: numprecinctshigh, - numprecincts: numprecincts, - precinctWidthInSubband: precinctWidthInSubband, - precinctHeightInSubband: precinctHeightInSubband - }; - } - function buildCodeblocks(context, subband, dimensions) { - // Section B.7 Division sub-band into code-blocks - var xcb_ = dimensions.xcb_; - var ycb_ = dimensions.ycb_; - var codeblockWidth = 1 << xcb_; - var codeblockHeight = 1 << ycb_; - var cbx0 = subband.tbx0 >> xcb_; - var cby0 = subband.tby0 >> ycb_; - var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_; - var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_; - var precinctParameters = subband.resolution.precinctParameters; - var codeblocks = []; - var precincts = []; - var i, j, codeblock, precinctNumber; - for (j = cby0; j < cby1; j++) { - for (i = cbx0; i < cbx1; i++) { - codeblock = { - cbx: i, - cby: j, - tbx0: codeblockWidth * i, - tby0: codeblockHeight * j, - tbx1: codeblockWidth * (i + 1), - tby1: codeblockHeight * (j + 1) - }; - - codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); - codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); - codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); - codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); - - // Calculate precinct number for this codeblock, codeblock position - // should be relative to its subband, use actual dimension and position - // See comment about codeblock group width and height - var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / - precinctParameters.precinctWidthInSubband); - var pj = Math.floor((codeblock.tby0_ - subband.tby0) / - precinctParameters.precinctHeightInSubband); - precinctNumber = pi + (pj * precinctParameters.numprecinctswide); - - codeblock.precinctNumber = precinctNumber; - codeblock.subbandType = subband.type; - codeblock.Lblock = 3; - - if (codeblock.tbx1_ <= codeblock.tbx0_ || - codeblock.tby1_ <= codeblock.tby0_) { - continue; - } - codeblocks.push(codeblock); - // building precinct for the sub-band - var precinct = precincts[precinctNumber]; - if (precinct !== undefined) { - if (i < precinct.cbxMin) { - precinct.cbxMin = i; - } else if (i > precinct.cbxMax) { - precinct.cbxMax = i; - } - if (j < precinct.cbyMin) { - precinct.cbxMin = j; - } else if (j > precinct.cbyMax) { - precinct.cbyMax = j; - } - } else { - precincts[precinctNumber] = precinct = { - cbxMin: i, - cbyMin: j, - cbxMax: i, - cbyMax: j - }; - } - codeblock.precinct = precinct; - } - } - subband.codeblockParameters = { - codeblockWidth: xcb_, - codeblockHeight: ycb_, - numcodeblockwide: cbx1 - cbx0 + 1, - numcodeblockhigh: cby1 - cby0 + 1 - }; - subband.codeblocks = codeblocks; - subband.precincts = precincts; - } - function createPacket(resolution, precinctNumber, layerNumber) { - var precinctCodeblocks = []; - // Section B.10.8 Order of info in packet - var subbands = resolution.subbands; - // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence - for (var i = 0, ii = subbands.length; i < ii; i++) { - var subband = subbands[i]; - var codeblocks = subband.codeblocks; - for (var j = 0, jj = codeblocks.length; j < jj; j++) { - var codeblock = codeblocks[j]; - if (codeblock.precinctNumber !== precinctNumber) { - continue; - } - precinctCodeblocks.push(codeblock); - } - } - return { - layerNumber: layerNumber, - codeblocks: precinctCodeblocks - }; - } - function LayerResolutionComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var l = 0, r = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.1 Layer-resolution-component-position - for (; l < layersCount; l++) { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - r = 0; - } - error('JPX Error: Out of packets'); - }; - } - function ResolutionLayerComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var r = 0, l = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.2 Resolution-layer-component-position - for (; r <= maxDecompositionLevelsCount; r++) { - for (; l < layersCount; l++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - l = 0; - } - error('JPX Error: Out of packets'); - }; - } - function ResolutionPositionComponentLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var l, r, c, p; - var maxDecompositionLevelsCount = 0; - for (c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - component.codingStyleParameters.decompositionLevelsCount); - } - var maxNumPrecinctsInLevel = new Int32Array( - maxDecompositionLevelsCount + 1); - for (r = 0; r <= maxDecompositionLevelsCount; ++r) { - var maxNumPrecincts = 0; - for (c = 0; c < componentsCount; ++c) { - var resolutions = tile.components[c].resolutions; - if (r < resolutions.length) { - maxNumPrecincts = Math.max(maxNumPrecincts, - resolutions[r].precinctParameters.numprecincts); - } - } - maxNumPrecinctsInLevel[r] = maxNumPrecincts; - } - l = 0; - r = 0; - c = 0; - p = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.3 Resolution-position-component-layer - for (; r <= maxDecompositionLevelsCount; r++) { - for (; p < maxNumPrecinctsInLevel[r]; p++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - if (p >= numprecincts) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, p, l); - l++; - return packet; - } - l = 0; - } - c = 0; - } - p = 0; - } - error('JPX Error: Out of packets'); - }; - } - function PositionComponentResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var precinctsIterationSizes = precinctsSizes; - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.4 Position-component-resolution-layer - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = - precinctsSizes.components[c].resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - c = 0; - } - px = 0; - } - error('JPX Error: Out of packets'); - }; - } - function ComponentPositionResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.5 Component-position-resolution-layer - for (; c < componentsCount; ++c) { - var component = tile.components[c]; - var precinctsIterationSizes = precinctsSizes.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = precinctsIterationSizes.resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - px = 0; - } - py = 0; - } - error('JPX Error: Out of packets'); - }; - } - function getPrecinctIndexIfExist( - pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { - var posX = pxIndex * precinctIterationSizes.minWidth; - var posY = pyIndex * precinctIterationSizes.minHeight; - if (posX % sizeInImageScale.width !== 0 || - posY % sizeInImageScale.height !== 0) { - return null; - } - var startPrecinctRowIndex = - (posY / sizeInImageScale.width) * - resolution.precinctParameters.numprecinctswide; - return (posX / sizeInImageScale.height) + startPrecinctRowIndex; - } - function getPrecinctSizesInImageScale(tile) { - var componentsCount = tile.components.length; - var minWidth = Number.MAX_VALUE; - var minHeight = Number.MAX_VALUE; - var maxNumWide = 0; - var maxNumHigh = 0; - var sizePerComponent = new Array(componentsCount); - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - var sizePerResolution = new Array(decompositionLevelsCount + 1); - var minWidthCurrentComponent = Number.MAX_VALUE; - var minHeightCurrentComponent = Number.MAX_VALUE; - var maxNumWideCurrentComponent = 0; - var maxNumHighCurrentComponent = 0; - var scale = 1; - for (var r = decompositionLevelsCount; r >= 0; --r) { - var resolution = component.resolutions[r]; - var widthCurrentResolution = - scale * resolution.precinctParameters.precinctWidth; - var heightCurrentResolution = - scale * resolution.precinctParameters.precinctHeight; - minWidthCurrentComponent = Math.min( - minWidthCurrentComponent, - widthCurrentResolution); - minHeightCurrentComponent = Math.min( - minHeightCurrentComponent, - heightCurrentResolution); - maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, - resolution.precinctParameters.numprecinctswide); - maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, - resolution.precinctParameters.numprecinctshigh); - sizePerResolution[r] = { - width: widthCurrentResolution, - height: heightCurrentResolution - }; - scale <<= 1; - } - minWidth = Math.min(minWidth, minWidthCurrentComponent); - minHeight = Math.min(minHeight, minHeightCurrentComponent); - maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); - maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); - sizePerComponent[c] = { - resolutions: sizePerResolution, - minWidth: minWidthCurrentComponent, - minHeight: minHeightCurrentComponent, - maxNumWide: maxNumWideCurrentComponent, - maxNumHigh: maxNumHighCurrentComponent - }; - } - return { - components: sizePerComponent, - minWidth: minWidth, - minHeight: minHeight, - maxNumWide: maxNumWide, - maxNumHigh: maxNumHigh - }; - } - function buildPackets(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var componentsCount = siz.Csiz; - // Creating resolutions and sub-bands for each component - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - // Section B.5 Resolution levels and sub-bands - var resolutions = []; - var subbands = []; - for (var r = 0; r <= decompositionLevelsCount; r++) { - var blocksDimensions = getBlocksDimensions(context, component, r); - var resolution = {}; - var scale = 1 << (decompositionLevelsCount - r); - resolution.trx0 = Math.ceil(component.tcx0 / scale); - resolution.try0 = Math.ceil(component.tcy0 / scale); - resolution.trx1 = Math.ceil(component.tcx1 / scale); - resolution.try1 = Math.ceil(component.tcy1 / scale); - resolution.resLevel = r; - buildPrecincts(context, resolution, blocksDimensions); - resolutions.push(resolution); - - var subband; - if (r === 0) { - // one sub-band (LL) with last decomposition - subband = {}; - subband.type = 'LL'; - subband.tbx0 = Math.ceil(component.tcx0 / scale); - subband.tby0 = Math.ceil(component.tcy0 / scale); - subband.tbx1 = Math.ceil(component.tcx1 / scale); - subband.tby1 = Math.ceil(component.tcy1 / scale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolution.subbands = [subband]; - } else { - var bscale = 1 << (decompositionLevelsCount - r + 1); - var resolutionSubbands = []; - // three sub-bands (HL, LH and HH) with rest of decompositions - subband = {}; - subband.type = 'HL'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'LH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'HH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - resolution.subbands = resolutionSubbands; - } - } - component.resolutions = resolutions; - component.subbands = subbands; - } - // Generate the packets sequence - var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; - switch (progressionOrder) { - case 0: - tile.packetsIterator = - new LayerResolutionComponentPositionIterator(context); - break; - case 1: - tile.packetsIterator = - new ResolutionLayerComponentPositionIterator(context); - break; - case 2: - tile.packetsIterator = - new ResolutionPositionComponentLayerIterator(context); - break; - case 3: - tile.packetsIterator = - new PositionComponentResolutionLayerIterator(context); - break; - case 4: - tile.packetsIterator = - new ComponentPositionResolutionLayerIterator(context); - break; - default: - error('JPX Error: Unsupported progression order ' + progressionOrder); - } - } - function parseTilePackets(context, data, offset, dataLength) { - var position = 0; - var buffer, bufferSize = 0, skipNextBit = false; - function readBits(count) { - while (bufferSize < count) { - var b = data[offset + position]; - position++; - if (skipNextBit) { - buffer = (buffer << 7) | b; - bufferSize += 7; - skipNextBit = false; - } else { - buffer = (buffer << 8) | b; - bufferSize += 8; - } - if (b === 0xFF) { - skipNextBit = true; - } - } - bufferSize -= count; - return (buffer >>> bufferSize) & ((1 << count) - 1); - } - function skipMarkerIfEqual(value) { - if (data[offset + position - 1] === 0xFF && - data[offset + position] === value) { - skipBytes(1); - return true; - } else if (data[offset + position] === 0xFF && - data[offset + position + 1] === value) { - skipBytes(2); - return true; - } - return false; - } - function skipBytes(count) { - position += count; - } - function alignToByte() { - bufferSize = 0; - if (skipNextBit) { - position++; - skipNextBit = false; - } - } - function readCodingpasses() { - if (readBits(1) === 0) { - return 1; - } - if (readBits(1) === 0) { - return 2; - } - var value = readBits(2); - if (value < 3) { - return value + 3; - } - value = readBits(5); - if (value < 31) { - return value + 6; - } - value = readBits(7); - return value + 37; - } - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var sopMarkerUsed = context.COD.sopMarkerUsed; - var ephMarkerUsed = context.COD.ephMarkerUsed; - var packetsIterator = tile.packetsIterator; - while (position < dataLength) { - alignToByte(); - if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { - // Skip also marker segment length and packet sequence ID - skipBytes(4); - } - var packet = packetsIterator.nextPacket(); - if (!readBits(1)) { - continue; - } - var layerNumber = packet.layerNumber; - var queue = [], codeblock; - for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { - codeblock = packet.codeblocks[i]; - var precinct = codeblock.precinct; - var codeblockColumn = codeblock.cbx - precinct.cbxMin; - var codeblockRow = codeblock.cby - precinct.cbyMin; - var codeblockIncluded = false; - var firstTimeInclusion = false; - var valueReady; - if (codeblock['included'] !== undefined) { - codeblockIncluded = !!readBits(1); - } else { - // reading inclusion tree - precinct = codeblock.precinct; - var inclusionTree, zeroBitPlanesTree; - if (precinct['inclusionTree'] !== undefined) { - inclusionTree = precinct.inclusionTree; - } else { - // building inclusion and zero bit-planes trees - var width = precinct.cbxMax - precinct.cbxMin + 1; - var height = precinct.cbyMax - precinct.cbyMin + 1; - inclusionTree = new InclusionTree(width, height, layerNumber); - zeroBitPlanesTree = new TagTree(width, height); - precinct.inclusionTree = inclusionTree; - precinct.zeroBitPlanesTree = zeroBitPlanesTree; - } - - if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { - while (true) { - if (readBits(1)) { - valueReady = !inclusionTree.nextLevel(); - if (valueReady) { - codeblock.included = true; - codeblockIncluded = firstTimeInclusion = true; - break; - } - } else { - inclusionTree.incrementValue(layerNumber); - break; - } - } - } - } - if (!codeblockIncluded) { - continue; - } - if (firstTimeInclusion) { - zeroBitPlanesTree = precinct.zeroBitPlanesTree; - zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); - while (true) { - if (readBits(1)) { - valueReady = !zeroBitPlanesTree.nextLevel(); - if (valueReady) { - break; - } - } else { - zeroBitPlanesTree.incrementValue(); - } - } - codeblock.zeroBitPlanes = zeroBitPlanesTree.value; - } - var codingpasses = readCodingpasses(); - while (readBits(1)) { - codeblock.Lblock++; - } - var codingpassesLog2 = log2(codingpasses); - // rounding down log2 - var bits = ((codingpasses < (1 << codingpassesLog2)) ? - codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; - var codedDataLength = readBits(bits); - queue.push({ - codeblock: codeblock, - codingpasses: codingpasses, - dataLength: codedDataLength - }); - } - alignToByte(); - if (ephMarkerUsed) { - skipMarkerIfEqual(0x92); - } - while (queue.length > 0) { - var packetItem = queue.shift(); - codeblock = packetItem.codeblock; - if (codeblock['data'] === undefined) { - codeblock.data = []; - } - codeblock.data.push({ - data: data, - start: offset + position, - end: offset + position + packetItem.dataLength, - codingpasses: packetItem.codingpasses - }); - position += packetItem.dataLength; - } - } - return position; - } - function copyCoefficients(coefficients, levelWidth, levelHeight, subband, - delta, mb, reversible, segmentationSymbolUsed) { - var x0 = subband.tbx0; - var y0 = subband.tby0; - var width = subband.tbx1 - subband.tbx0; - var codeblocks = subband.codeblocks; - var right = subband.type.charAt(0) === 'H' ? 1 : 0; - var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0; - - for (var i = 0, ii = codeblocks.length; i < ii; ++i) { - var codeblock = codeblocks[i]; - var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; - var blockHeight = codeblock.tby1_ - codeblock.tby0_; - if (blockWidth === 0 || blockHeight === 0) { - continue; - } - if (codeblock['data'] === undefined) { - continue; - } - - var bitModel, currentCodingpassType; - bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, - codeblock.zeroBitPlanes, mb); - currentCodingpassType = 2; // first bit plane starts from cleanup - - // collect data - var data = codeblock.data, totalLength = 0, codingpasses = 0; - var j, jj, dataItem; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - totalLength += dataItem.end - dataItem.start; - codingpasses += dataItem.codingpasses; - } - var encodedData = new Uint8Array(totalLength); - var position = 0; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); - encodedData.set(chunk, position); - position += chunk.length; - } - // decoding the item - var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); - bitModel.setDecoder(decoder); - - for (j = 0; j < codingpasses; j++) { - switch (currentCodingpassType) { - case 0: - bitModel.runSignificancePropagationPass(); - break; - case 1: - bitModel.runMagnitudeRefinementPass(); - break; - case 2: - bitModel.runCleanupPass(); - if (segmentationSymbolUsed) { - bitModel.checkSegmentationSymbol(); - } - break; - } - currentCodingpassType = (currentCodingpassType + 1) % 3; - } - - var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width; - var sign = bitModel.coefficentsSign; - var magnitude = bitModel.coefficentsMagnitude; - var bitsDecoded = bitModel.bitsDecoded; - var magnitudeCorrection = reversible ? 0 : 0.5; - var k, n, nb; - position = 0; - // Do the interleaving of Section F.3.3 here, so we do not need - // to copy later. LL level is not interleaved, just copied. - var interleave = (subband.type !== 'LL'); - for (j = 0; j < blockHeight; j++) { - var row = (offset / width) | 0; // row in the non-interleaved subband - var levelOffset = 2 * row * (levelWidth - width) + right + bottom; - for (k = 0; k < blockWidth; k++) { - n = magnitude[position]; - if (n !== 0) { - n = (n + magnitudeCorrection) * delta; - if (sign[position] !== 0) { - n = -n; - } - nb = bitsDecoded[position]; - var pos = interleave ? (levelOffset + (offset << 1)) : offset; - if (reversible && (nb >= mb)) { - coefficients[pos] = n; - } else { - coefficients[pos] = n * (1 << (mb - nb)); - } - } - offset++; - position++; - } - offset += width - blockWidth; - } - } - } - function transformTile(context, tile, c) { - var component = tile.components[c]; - var codingStyleParameters = component.codingStyleParameters; - var quantizationParameters = component.quantizationParameters; - var decompositionLevelsCount = - codingStyleParameters.decompositionLevelsCount; - var spqcds = quantizationParameters.SPqcds; - var scalarExpounded = quantizationParameters.scalarExpounded; - var guardBits = quantizationParameters.guardBits; - var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; - var precision = context.components[c].precision; - - var reversible = codingStyleParameters.reversibleTransformation; - var transform = (reversible ? new ReversibleTransform() : - new IrreversibleTransform()); - - var subbandCoefficients = []; - var b = 0; - for (var i = 0; i <= decompositionLevelsCount; i++) { - var resolution = component.resolutions[i]; - - var width = resolution.trx1 - resolution.trx0; - var height = resolution.try1 - resolution.try0; - // Allocate space for the whole sublevel. - var coefficients = new Float32Array(width * height); - - for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { - var mu, epsilon; - if (!scalarExpounded) { - // formula E-5 - mu = spqcds[0].mu; - epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); - } else { - mu = spqcds[b].mu; - epsilon = spqcds[b].epsilon; - b++; - } - - var subband = resolution.subbands[j]; - var gainLog2 = SubbandsGainLog2[subband.type]; - - // calculate quantization coefficient (Section E.1.1.1) - var delta = (reversible ? 1 : - Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048)); - var mb = (guardBits + epsilon - 1); - - // In the first resolution level, copyCoefficients will fill the - // whole array with coefficients. In the succeeding passes, - // copyCoefficients will consecutively fill in the values that belong - // to the interleaved positions of the HL, LH, and HH coefficients. - // The LL coefficients will then be interleaved in Transform.iterate(). - copyCoefficients(coefficients, width, height, subband, delta, mb, - reversible, segmentationSymbolUsed); - } - subbandCoefficients.push({ - width: width, - height: height, - items: coefficients - }); - } - - var result = transform.calculate(subbandCoefficients, - component.tcx0, component.tcy0); - return { - left: component.tcx0, - top: component.tcy0, - width: result.width, - height: result.height, - items: result.items - }; - } - function transformComponents(context) { - var siz = context.SIZ; - var components = context.components; - var componentsCount = siz.Csiz; - var resultImages = []; - for (var i = 0, ii = context.tiles.length; i < ii; i++) { - var tile = context.tiles[i]; - var transformedTiles = []; - var c; - for (c = 0; c < componentsCount; c++) { - transformedTiles[c] = transformTile(context, tile, c); - } - var tile0 = transformedTiles[0]; - var out = new Uint8Array(tile0.items.length * componentsCount); - var result = { - left: tile0.left, - top: tile0.top, - width: tile0.width, - height: tile0.height, - items: out - }; - - // Section G.2.2 Inverse multi component transform - var shift, offset, max, min, maxK; - var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; - if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - var fourComponents = componentsCount === 4; - var y0items = transformedTiles[0].items; - var y1items = transformedTiles[1].items; - var y2items = transformedTiles[2].items; - var y3items = fourComponents ? transformedTiles[3].items : null; - - // HACK: The multiple component transform formulas below assume that - // all components have the same precision. With this in mind, we - // compute shift and offset only once. - shift = components[0].precision - 8; - offset = (128 << shift) + 0.5; - max = 255 * (1 << shift); - maxK = max * 0.5; - min = -maxK; - - var component0 = tile.components[0]; - var alpha01 = componentsCount - 3; - jj = y0items.length; - if (!component0.codingStyleParameters.reversibleTransformation) { - // inverse irreversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - r = y0 + 1.402 * y2; - g = y0 - 0.34413 * y1 - 0.71414 * y2; - b = y0 + 1.772 * y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } else { - // inverse reversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - g = y0 - ((y2 + y1) >> 2); - r = g + y2; - b = g + y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } - if (fourComponents) { - for (j = 0, pos = 3; j < jj; j++, pos += 4) { - k = y3items[j]; - out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift; - } - } - } else { // no multi-component transform - for (c = 0; c < componentsCount; c++) { - var items = transformedTiles[c].items; - shift = components[c].precision - 8; - offset = (128 << shift) + 0.5; - max = (127.5 * (1 << shift)); - min = -max; - for (pos = c, j = 0, jj = items.length; j < jj; j++) { - val = items[j]; - out[pos] = val <= min ? 0 : - val >= max ? 255 : (val + offset) >> shift; - pos += componentsCount; - } - } - } - resultImages.push(result); - } - return resultImages; - } - function initializeTile(context, tileIndex) { - var siz = context.SIZ; - var componentsCount = siz.Csiz; - var tile = context.tiles[tileIndex]; - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ? - context.currentTile.QCC[c] : context.currentTile.QCD); - component.quantizationParameters = qcdOrQcc; - var codOrCoc = (context.currentTile.COC[c] !== undefined ? - context.currentTile.COC[c] : context.currentTile.COD); - component.codingStyleParameters = codOrCoc; - } - tile.codingStyleDefaultParameters = context.currentTile.COD; - } - - // Section B.10.2 Tag trees - var TagTree = (function TagTreeClosure() { - function TagTree(width, height) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var level = { - width: width, - height: height, - items: [] - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - TagTree.prototype = { - reset: function TagTree_reset(i, j) { - var currentLevel = 0, value = 0, level; - while (currentLevel < this.levels.length) { - level = this.levels[currentLevel]; - var index = i + j * level.width; - if (level.items[index] !== undefined) { - value = level.items[index]; - break; - } - level.index = index; - i >>= 1; - j >>= 1; - currentLevel++; - } - currentLevel--; - level = this.levels[currentLevel]; - level.items[level.index] = value; - this.currentLevel = currentLevel; - delete this.value; - }, - incrementValue: function TagTree_incrementValue() { - var level = this.levels[this.currentLevel]; - level.items[level.index]++; - }, - nextLevel: function TagTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - currentLevel--; - if (currentLevel < 0) { - this.value = value; - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return TagTree; - })(); - - var InclusionTree = (function InclusionTreeClosure() { - function InclusionTree(width, height, defaultValue) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var items = new Uint8Array(width * height); - for (var j = 0, jj = items.length; j < jj; j++) { - items[j] = defaultValue; - } - - var level = { - width: width, - height: height, - items: items - }; - this.levels.push(level); - - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - InclusionTree.prototype = { - reset: function InclusionTree_reset(i, j, stopValue) { - var currentLevel = 0; - while (currentLevel < this.levels.length) { - var level = this.levels[currentLevel]; - var index = i + j * level.width; - level.index = index; - var value = level.items[index]; - - if (value === 0xFF) { - break; - } - - if (value > stopValue) { - this.currentLevel = currentLevel; - // already know about this one, propagating the value to top levels - this.propagateValues(); - return false; - } - - i >>= 1; - j >>= 1; - currentLevel++; - } - this.currentLevel = currentLevel - 1; - return true; - }, - incrementValue: function InclusionTree_incrementValue(stopValue) { - var level = this.levels[this.currentLevel]; - level.items[level.index] = stopValue + 1; - this.propagateValues(); - }, - propagateValues: function InclusionTree_propagateValues() { - var levelIndex = this.currentLevel; - var level = this.levels[levelIndex]; - var currentValue = level.items[level.index]; - while (--levelIndex >= 0) { - level = this.levels[levelIndex]; - level.items[level.index] = currentValue; - } - }, - nextLevel: function InclusionTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - level.items[level.index] = 0xFF; - currentLevel--; - if (currentLevel < 0) { - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return InclusionTree; - })(); - - // Section D. Coefficient bit modeling - var BitModel = (function BitModelClosure() { - var UNIFORM_CONTEXT = 17; - var RUNLENGTH_CONTEXT = 18; - // Table D-1 - // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4), - // vv - sum of Vi (0..2), and hh - sum of Hi (0..2) - var LLAndLHContextsLabel = new Uint8Array([ - 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, - 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, - 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 - ]); - var HLContextLabel = new Uint8Array([ - 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, - 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, - 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 - ]); - var HHContextLabel = new Uint8Array([ - 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, - 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, - 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 - ]); - - function BitModel(width, height, subband, zeroBitPlanes, mb) { - this.width = width; - this.height = height; - - this.contextLabelTable = (subband === 'HH' ? HHContextLabel : - (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel)); - - var coefficientCount = width * height; - - // coefficients outside the encoding region treated as insignificant - // add border state cells for significanceState - this.neighborsSignificance = new Uint8Array(coefficientCount); - this.coefficentsSign = new Uint8Array(coefficientCount); - this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : - mb > 6 ? new Uint16Array(coefficientCount) : - new Uint8Array(coefficientCount); - this.processingFlags = new Uint8Array(coefficientCount); - - var bitsDecoded = new Uint8Array(coefficientCount); - if (zeroBitPlanes !== 0) { - for (var i = 0; i < coefficientCount; i++) { - bitsDecoded[i] = zeroBitPlanes; - } - } - this.bitsDecoded = bitsDecoded; - - this.reset(); - } - - BitModel.prototype = { - setDecoder: function BitModel_setDecoder(decoder) { - this.decoder = decoder; - }, - reset: function BitModel_reset() { - // We have 17 contexts that are accessed via context labels, - // plus the uniform and runlength context. - this.contexts = new Int8Array(19); - - // Contexts are packed into 1 byte: - // highest 7 bits carry the index, lowest bit carries mps - this.contexts[0] = (4 << 1) | 0; - this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0; - this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0; - }, - setNeighborsSignificance: - function BitModel_setNeighborsSignificance(row, column, index) { - var neighborsSignificance = this.neighborsSignificance; - var width = this.width, height = this.height; - var left = (column > 0); - var right = (column + 1 < width); - var i; - - if (row > 0) { - i = index - width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (row + 1 < height) { - i = index + width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (left) { - neighborsSignificance[index - 1] += 0x01; - } - if (right) { - neighborsSignificance[index + 1] += 0x01; - } - neighborsSignificance[index] |= 0x80; - }, - runSignificancePropagationPass: - function BitModel_runSignificancePropagationPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var neighborsSignificance = this.neighborsSignificance; - var processingFlags = this.processingFlags; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processedInverseMask = ~1; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - - for (var i0 = 0; i0 < height; i0 += 4) { - for (var j = 0; j < width; j++) { - var index = i0 * width + j; - for (var i1 = 0; i1 < 4; i1++, index += width) { - var i = i0 + i1; - if (i >= height) { - break; - } - // clear processed flag first - processingFlags[index] &= processedInverseMask; - - if (coefficentsMagnitude[index] || - !neighborsSignificance[index]) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision) { - var sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - decodeSignBit: function BitModel_decodeSignBit(row, column, index) { - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contribution, sign0, sign1, significance1; - var contextLabel, decoded; - - // calculate horizontal contribution - significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0); - if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { - sign1 = coefficentsSign[index + 1]; - if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign1 - sign0; - } else { - contribution = 1 - sign1 - sign1; - } - } else if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign0 - sign0; - } else { - contribution = 0; - } - var horizontalContribution = 3 * contribution; - - // calculate vertical contribution and combine with the horizontal - significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0); - if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { - sign1 = coefficentsSign[index + width]; - if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign1 - sign0 + horizontalContribution; - } else { - contribution = 1 - sign1 - sign1 + horizontalContribution; - } - } else if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign0 - sign0 + horizontalContribution; - } else { - contribution = horizontalContribution; - } - - if (contribution >= 0) { - contextLabel = 9 + contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel); - } else { - contextLabel = 9 - contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; - } - return decoded; - }, - runMagnitudeRefinementPass: - function BitModel_runMagnitudeRefinementPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var neighborsSignificance = this.neighborsSignificance; - var contexts = this.contexts; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var length = width * height; - var width4 = width * 4; - - for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { - indexNext = Math.min(length, index0 + width4); - for (var j = 0; j < width; j++) { - for (var index = index0 + j; index < indexNext; index += width) { - - // significant but not those that have just become - if (!coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = 16; - if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { - processingFlags[index] ^= firstMagnitudeBitMask; - // first refinement - var significance = neighborsSignificance[index] & 127; - contextLabel = significance === 0 ? 15 : 14; - } - - var bit = decoder.readBit(contexts, contextLabel); - coefficentsMagnitude[index] = - (coefficentsMagnitude[index] << 1) | bit; - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - runCleanupPass: function BitModel_runCleanupPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var neighborsSignificance = this.neighborsSignificance; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var oneRowDown = width; - var twoRowsDown = width * 2; - var threeRowsDown = width * 3; - var iNext; - for (var i0 = 0; i0 < height; i0 = iNext) { - iNext = Math.min(i0 + 4, height); - var indexBase = i0 * width; - var checkAllEmpty = i0 + 3 < height; - for (var j = 0; j < width; j++) { - var index0 = indexBase + j; - // using the property: labels[neighborsSignificance[index]] === 0 - // when neighborsSignificance[index] === 0 - var allEmpty = (checkAllEmpty && - processingFlags[index0] === 0 && - processingFlags[index0 + oneRowDown] === 0 && - processingFlags[index0 + twoRowsDown] === 0 && - processingFlags[index0 + threeRowsDown] === 0 && - neighborsSignificance[index0] === 0 && - neighborsSignificance[index0 + oneRowDown] === 0 && - neighborsSignificance[index0 + twoRowsDown] === 0 && - neighborsSignificance[index0 + threeRowsDown] === 0); - var i1 = 0, index = index0; - var i = i0, sign; - if (allEmpty) { - var hasSignificantCoefficent = - decoder.readBit(contexts, RUNLENGTH_CONTEXT); - if (!hasSignificantCoefficent) { - bitsDecoded[index0]++; - bitsDecoded[index0 + oneRowDown]++; - bitsDecoded[index0 + twoRowsDown]++; - bitsDecoded[index0 + threeRowsDown]++; - continue; // next column - } - i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (i1 !== 0) { - i = i0 + i1; - index += i1 * width; - } - - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - - index = index0; - for (var i2 = i0; i2 <= i; i2++, index += width) { - bitsDecoded[index]++; - } - - i1++; - } - for (i = i0 + i1; i < iNext; i++, index += width) { - if (coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision === 1) { - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - } - } - } - }, - checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { - var decoder = this.decoder; - var contexts = this.contexts; - var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (symbol !== 0xA) { - error('JPX Error: Invalid segmentation symbol'); - } - } - }; - - return BitModel; - })(); - - // Section F, Discrete wavelet transformation - var Transform = (function TransformClosure() { - function Transform() {} - - Transform.prototype.calculate = - function transformCalculate(subbands, u0, v0) { - var ll = subbands[0]; - for (var i = 1, ii = subbands.length; i < ii; i++) { - ll = this.iterate(ll, subbands[i], u0, v0); - } - return ll; - }; - Transform.prototype.extend = function extend(buffer, offset, size) { - // Section F.3.7 extending... using max extension of 4 - var i1 = offset - 1, j1 = offset + 1; - var i2 = offset + size - 2, j2 = offset + size; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1] = buffer[j1]; - buffer[j2] = buffer[i2]; - }; - Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, - u0, v0) { - var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; - var width = hl_lh_hh.width; - var height = hl_lh_hh.height; - var items = hl_lh_hh.items; - var i, j, k, l, u, v; - - // Interleave LL according to Section F.3.3 - for (k = 0, i = 0; i < llHeight; i++) { - l = i * 2 * width; - for (j = 0; j < llWidth; j++, k++, l += 2) { - items[l] = llItems[k]; - } - } - // The LL band is not needed anymore. - llItems = ll.items = null; - - var bufferPadding = 4; - var rowBuffer = new Float32Array(width + 2 * bufferPadding); - - // Section F.3.4 HOR_SR - if (width === 1) { - // if width = 1, when u0 even keep items as is, when odd divide by 2 - if ((u0 & 1) !== 0) { - for (v = 0, k = 0; v < height; v++, k += width) { - items[k] *= 0.5; - } - } - } else { - for (v = 0, k = 0; v < height; v++, k += width) { - rowBuffer.set(items.subarray(k, k + width), bufferPadding); - - this.extend(rowBuffer, bufferPadding, width); - this.filter(rowBuffer, bufferPadding, width); - - items.set( - rowBuffer.subarray(bufferPadding, bufferPadding + width), - k); - } - } - - // Accesses to the items array can take long, because it may not fit into - // CPU cache and has to be fetched from main memory. Since subsequent - // accesses to the items array are not local when reading columns, we - // have a cache miss every time. To reduce cache misses, get up to - // 'numBuffers' items at a time and store them into the individual - // buffers. The colBuffers should be small enough to fit into CPU cache. - var numBuffers = 16; - var colBuffers = []; - for (i = 0; i < numBuffers; i++) { - colBuffers.push(new Float32Array(height + 2 * bufferPadding)); - } - var b, currentBuffer = 0; - ll = bufferPadding + height; - - // Section F.3.5 VER_SR - if (height === 1) { - // if height = 1, when v0 even keep items as is, when odd divide by 2 - if ((v0 & 1) !== 0) { - for (u = 0; u < width; u++) { - items[u] *= 0.5; - } - } - } else { - for (u = 0; u < width; u++) { - // if we ran out of buffers, copy several image columns at once - if (currentBuffer === 0) { - numBuffers = Math.min(width - u, numBuffers); - for (k = u, l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - colBuffers[b][l] = items[k + b]; - } - } - currentBuffer = numBuffers; - } - - currentBuffer--; - var buffer = colBuffers[currentBuffer]; - this.extend(buffer, bufferPadding, height); - this.filter(buffer, bufferPadding, height); - - // If this is last buffer in this group of buffers, flush all buffers. - if (currentBuffer === 0) { - k = u - numBuffers + 1; - for (l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - items[k + b] = colBuffers[b][l]; - } - } - } - } - } - - return { - width: width, - height: height, - items: items - }; - }; - return Transform; - })(); - - // Section 3.8.2 Irreversible 9-7 filter - var IrreversibleTransform = (function IrreversibleTransformClosure() { - function IrreversibleTransform() { - Transform.call(this); - } - - IrreversibleTransform.prototype = Object.create(Transform.prototype); - IrreversibleTransform.prototype.filter = - function irreversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n, current, next; - - var alpha = -1.586134342059924; - var beta = -0.052980118572961; - var gamma = 0.882911075530934; - var delta = 0.443506852043971; - var K = 1.230174104914001; - var K_ = 1 / K; - - // step 1 is combined with step 3 - - // step 2 - j = offset - 3; - for (n = len + 4; n--; j += 2) { - x[j] *= K_; - } - - // step 1 & 3 - j = offset - 2; - current = delta * x[j -1]; - for (n = len + 3; n--; j += 2) { - next = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - if (n--) { - j += 2; - current = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - } else { - break; - } - } - - // step 4 - j = offset - 1; - current = gamma * x[j - 1]; - for (n = len + 2; n--; j += 2) { - next = gamma * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = gamma * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 5 - j = offset; - current = beta * x[j - 1]; - for (n = len + 1; n--; j += 2) { - next = beta * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = beta * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 6 - if (len !== 0) { - j = offset + 1; - current = alpha * x[j - 1]; - for (n = len; n--; j += 2) { - next = alpha * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = alpha * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - } - }; - - return IrreversibleTransform; - })(); - - // Section 3.8.1 Reversible 5-3 filter - var ReversibleTransform = (function ReversibleTransformClosure() { - function ReversibleTransform() { - Transform.call(this); - } - - ReversibleTransform.prototype = Object.create(Transform.prototype); - ReversibleTransform.prototype.filter = - function reversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n; - - for (j = offset, n = len + 1; n--; j += 2) { - x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2; - } - - for (j = offset + 1, n = len; n--; j += 2) { - x[j] += (x[j - 1] + x[j + 1]) >> 1; - } - }; - - return ReversibleTransform; - })(); - - return JpxImage; -})(); - -exports.JpxImage = JpxImage; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreMetrics = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { -var getLookupTableFactory = sharedUtil.getLookupTableFactory; - -// The Metrics object contains glyph widths (in glyph space units). -// As per PDF spec, for most fonts (Type 3 being an exception) a glyph -// space unit corresponds to 1/1000th of text space unit. -var getMetrics = getLookupTableFactory(function (t) { - t['Courier'] = 600; - t['Courier-Bold'] = 600; - t['Courier-BoldOblique'] = 600; - t['Courier-Oblique'] = 600; - t['Helvetica'] = getLookupTableFactory(function (t) { - t['space'] = 278; - t['exclam'] = 278; - t['quotedbl'] = 355; - t['numbersign'] = 556; - t['dollar'] = 556; - t['percent'] = 889; - t['ampersand'] = 667; - t['quoteright'] = 222; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 389; - t['plus'] = 584; - t['comma'] = 278; - t['hyphen'] = 333; - t['period'] = 278; - t['slash'] = 278; - t['zero'] = 556; - t['one'] = 556; - t['two'] = 556; - t['three'] = 556; - t['four'] = 556; - t['five'] = 556; - t['six'] = 556; - t['seven'] = 556; - t['eight'] = 556; - t['nine'] = 556; - t['colon'] = 278; - t['semicolon'] = 278; - t['less'] = 584; - t['equal'] = 584; - t['greater'] = 584; - t['question'] = 556; - t['at'] = 1015; - t['A'] = 667; - t['B'] = 667; - t['C'] = 722; - t['D'] = 722; - t['E'] = 667; - t['F'] = 611; - t['G'] = 778; - t['H'] = 722; - t['I'] = 278; - t['J'] = 500; - t['K'] = 667; - t['L'] = 556; - t['M'] = 833; - t['N'] = 722; - t['O'] = 778; - t['P'] = 667; - t['Q'] = 778; - t['R'] = 722; - t['S'] = 667; - t['T'] = 611; - t['U'] = 722; - t['V'] = 667; - t['W'] = 944; - t['X'] = 667; - t['Y'] = 667; - t['Z'] = 611; - t['bracketleft'] = 278; - t['backslash'] = 278; - t['bracketright'] = 278; - t['asciicircum'] = 469; - t['underscore'] = 556; - t['quoteleft'] = 222; - t['a'] = 556; - t['b'] = 556; - t['c'] = 500; - t['d'] = 556; - t['e'] = 556; - t['f'] = 278; - t['g'] = 556; - t['h'] = 556; - t['i'] = 222; - t['j'] = 222; - t['k'] = 500; - t['l'] = 222; - t['m'] = 833; - t['n'] = 556; - t['o'] = 556; - t['p'] = 556; - t['q'] = 556; - t['r'] = 333; - t['s'] = 500; - t['t'] = 278; - t['u'] = 556; - t['v'] = 500; - t['w'] = 722; - t['x'] = 500; - t['y'] = 500; - t['z'] = 500; - t['braceleft'] = 334; - t['bar'] = 260; - t['braceright'] = 334; - t['asciitilde'] = 584; - t['exclamdown'] = 333; - t['cent'] = 556; - t['sterling'] = 556; - t['fraction'] = 167; - t['yen'] = 556; - t['florin'] = 556; - t['section'] = 556; - t['currency'] = 556; - t['quotesingle'] = 191; - t['quotedblleft'] = 333; - t['guillemotleft'] = 556; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 500; - t['fl'] = 500; - t['endash'] = 556; - t['dagger'] = 556; - t['daggerdbl'] = 556; - t['periodcentered'] = 278; - t['paragraph'] = 537; - t['bullet'] = 350; - t['quotesinglbase'] = 222; - t['quotedblbase'] = 333; - t['quotedblright'] = 333; - t['guillemotright'] = 556; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 611; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 1000; - t['ordfeminine'] = 370; - t['Lslash'] = 556; - t['Oslash'] = 778; - t['OE'] = 1000; - t['ordmasculine'] = 365; - t['ae'] = 889; - t['dotlessi'] = 278; - t['lslash'] = 222; - t['oslash'] = 611; - t['oe'] = 944; - t['germandbls'] = 611; - t['Idieresis'] = 278; - t['eacute'] = 556; - t['abreve'] = 556; - t['uhungarumlaut'] = 556; - t['ecaron'] = 556; - t['Ydieresis'] = 667; - t['divide'] = 584; - t['Yacute'] = 667; - t['Acircumflex'] = 667; - t['aacute'] = 556; - t['Ucircumflex'] = 722; - t['yacute'] = 500; - t['scommaaccent'] = 500; - t['ecircumflex'] = 556; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 556; - t['Uacute'] = 722; - t['uogonek'] = 556; - t['Edieresis'] = 667; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 737; - t['Emacron'] = 667; - t['ccaron'] = 500; - t['aring'] = 556; - t['Ncommaaccent'] = 722; - t['lacute'] = 222; - t['agrave'] = 556; - t['Tcommaaccent'] = 611; - t['Cacute'] = 722; - t['atilde'] = 556; - t['Edotaccent'] = 667; - t['scaron'] = 500; - t['scedilla'] = 500; - t['iacute'] = 278; - t['lozenge'] = 471; - t['Rcaron'] = 722; - t['Gcommaaccent'] = 778; - t['ucircumflex'] = 556; - t['acircumflex'] = 556; - t['Amacron'] = 667; - t['rcaron'] = 333; - t['ccedilla'] = 500; - t['Zdotaccent'] = 611; - t['Thorn'] = 667; - t['Omacron'] = 778; - t['Racute'] = 722; - t['Sacute'] = 667; - t['dcaron'] = 643; - t['Umacron'] = 722; - t['uring'] = 556; - t['threesuperior'] = 333; - t['Ograve'] = 778; - t['Agrave'] = 667; - t['Abreve'] = 667; - t['multiply'] = 584; - t['uacute'] = 556; - t['Tcaron'] = 611; - t['partialdiff'] = 476; - t['ydieresis'] = 500; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 667; - t['adieresis'] = 556; - t['edieresis'] = 556; - t['cacute'] = 500; - t['nacute'] = 556; - t['umacron'] = 556; - t['Ncaron'] = 722; - t['Iacute'] = 278; - t['plusminus'] = 584; - t['brokenbar'] = 260; - t['registered'] = 737; - t['Gbreve'] = 778; - t['Idotaccent'] = 278; - t['summation'] = 600; - t['Egrave'] = 667; - t['racute'] = 333; - t['omacron'] = 556; - t['Zacute'] = 611; - t['Zcaron'] = 611; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 722; - t['lcommaaccent'] = 222; - t['tcaron'] = 317; - t['eogonek'] = 556; - t['Uogonek'] = 722; - t['Aacute'] = 667; - t['Adieresis'] = 667; - t['egrave'] = 556; - t['zacute'] = 500; - t['iogonek'] = 222; - t['Oacute'] = 778; - t['oacute'] = 556; - t['amacron'] = 556; - t['sacute'] = 500; - t['idieresis'] = 278; - t['Ocircumflex'] = 778; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 556; - t['twosuperior'] = 333; - t['Odieresis'] = 778; - t['mu'] = 556; - t['igrave'] = 278; - t['ohungarumlaut'] = 556; - t['Eogonek'] = 667; - t['dcroat'] = 556; - t['threequarters'] = 834; - t['Scedilla'] = 667; - t['lcaron'] = 299; - t['Kcommaaccent'] = 667; - t['Lacute'] = 556; - t['trademark'] = 1000; - t['edotaccent'] = 556; - t['Igrave'] = 278; - t['Imacron'] = 278; - t['Lcaron'] = 556; - t['onehalf'] = 834; - t['lessequal'] = 549; - t['ocircumflex'] = 556; - t['ntilde'] = 556; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 667; - t['emacron'] = 556; - t['gbreve'] = 556; - t['onequarter'] = 834; - t['Scaron'] = 667; - t['Scommaaccent'] = 667; - t['Ohungarumlaut'] = 778; - t['degree'] = 400; - t['ograve'] = 556; - t['Ccaron'] = 722; - t['ugrave'] = 556; - t['radical'] = 453; - t['Dcaron'] = 722; - t['rcommaaccent'] = 333; - t['Ntilde'] = 722; - t['otilde'] = 556; - t['Rcommaaccent'] = 722; - t['Lcommaaccent'] = 556; - t['Atilde'] = 667; - t['Aogonek'] = 667; - t['Aring'] = 667; - t['Otilde'] = 778; - t['zdotaccent'] = 500; - t['Ecaron'] = 667; - t['Iogonek'] = 278; - t['kcommaaccent'] = 500; - t['minus'] = 584; - t['Icircumflex'] = 278; - t['ncaron'] = 556; - t['tcommaaccent'] = 278; - t['logicalnot'] = 584; - t['odieresis'] = 556; - t['udieresis'] = 556; - t['notequal'] = 549; - t['gcommaaccent'] = 556; - t['eth'] = 556; - t['zcaron'] = 500; - t['ncommaaccent'] = 556; - t['onesuperior'] = 333; - t['imacron'] = 278; - t['Euro'] = 556; - }); - t['Helvetica-Bold'] = getLookupTableFactory(function (t) { - t['space'] = 278; - t['exclam'] = 333; - t['quotedbl'] = 474; - t['numbersign'] = 556; - t['dollar'] = 556; - t['percent'] = 889; - t['ampersand'] = 722; - t['quoteright'] = 278; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 389; - t['plus'] = 584; - t['comma'] = 278; - t['hyphen'] = 333; - t['period'] = 278; - t['slash'] = 278; - t['zero'] = 556; - t['one'] = 556; - t['two'] = 556; - t['three'] = 556; - t['four'] = 556; - t['five'] = 556; - t['six'] = 556; - t['seven'] = 556; - t['eight'] = 556; - t['nine'] = 556; - t['colon'] = 333; - t['semicolon'] = 333; - t['less'] = 584; - t['equal'] = 584; - t['greater'] = 584; - t['question'] = 611; - t['at'] = 975; - t['A'] = 722; - t['B'] = 722; - t['C'] = 722; - t['D'] = 722; - t['E'] = 667; - t['F'] = 611; - t['G'] = 778; - t['H'] = 722; - t['I'] = 278; - t['J'] = 556; - t['K'] = 722; - t['L'] = 611; - t['M'] = 833; - t['N'] = 722; - t['O'] = 778; - t['P'] = 667; - t['Q'] = 778; - t['R'] = 722; - t['S'] = 667; - t['T'] = 611; - t['U'] = 722; - t['V'] = 667; - t['W'] = 944; - t['X'] = 667; - t['Y'] = 667; - t['Z'] = 611; - t['bracketleft'] = 333; - t['backslash'] = 278; - t['bracketright'] = 333; - t['asciicircum'] = 584; - t['underscore'] = 556; - t['quoteleft'] = 278; - t['a'] = 556; - t['b'] = 611; - t['c'] = 556; - t['d'] = 611; - t['e'] = 556; - t['f'] = 333; - t['g'] = 611; - t['h'] = 611; - t['i'] = 278; - t['j'] = 278; - t['k'] = 556; - t['l'] = 278; - t['m'] = 889; - t['n'] = 611; - t['o'] = 611; - t['p'] = 611; - t['q'] = 611; - t['r'] = 389; - t['s'] = 556; - t['t'] = 333; - t['u'] = 611; - t['v'] = 556; - t['w'] = 778; - t['x'] = 556; - t['y'] = 556; - t['z'] = 500; - t['braceleft'] = 389; - t['bar'] = 280; - t['braceright'] = 389; - t['asciitilde'] = 584; - t['exclamdown'] = 333; - t['cent'] = 556; - t['sterling'] = 556; - t['fraction'] = 167; - t['yen'] = 556; - t['florin'] = 556; - t['section'] = 556; - t['currency'] = 556; - t['quotesingle'] = 238; - t['quotedblleft'] = 500; - t['guillemotleft'] = 556; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 611; - t['fl'] = 611; - t['endash'] = 556; - t['dagger'] = 556; - t['daggerdbl'] = 556; - t['periodcentered'] = 278; - t['paragraph'] = 556; - t['bullet'] = 350; - t['quotesinglbase'] = 278; - t['quotedblbase'] = 500; - t['quotedblright'] = 500; - t['guillemotright'] = 556; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 611; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 1000; - t['ordfeminine'] = 370; - t['Lslash'] = 611; - t['Oslash'] = 778; - t['OE'] = 1000; - t['ordmasculine'] = 365; - t['ae'] = 889; - t['dotlessi'] = 278; - t['lslash'] = 278; - t['oslash'] = 611; - t['oe'] = 944; - t['germandbls'] = 611; - t['Idieresis'] = 278; - t['eacute'] = 556; - t['abreve'] = 556; - t['uhungarumlaut'] = 611; - t['ecaron'] = 556; - t['Ydieresis'] = 667; - t['divide'] = 584; - t['Yacute'] = 667; - t['Acircumflex'] = 722; - t['aacute'] = 556; - t['Ucircumflex'] = 722; - t['yacute'] = 556; - t['scommaaccent'] = 556; - t['ecircumflex'] = 556; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 556; - t['Uacute'] = 722; - t['uogonek'] = 611; - t['Edieresis'] = 667; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 737; - t['Emacron'] = 667; - t['ccaron'] = 556; - t['aring'] = 556; - t['Ncommaaccent'] = 722; - t['lacute'] = 278; - t['agrave'] = 556; - t['Tcommaaccent'] = 611; - t['Cacute'] = 722; - t['atilde'] = 556; - t['Edotaccent'] = 667; - t['scaron'] = 556; - t['scedilla'] = 556; - t['iacute'] = 278; - t['lozenge'] = 494; - t['Rcaron'] = 722; - t['Gcommaaccent'] = 778; - t['ucircumflex'] = 611; - t['acircumflex'] = 556; - t['Amacron'] = 722; - t['rcaron'] = 389; - t['ccedilla'] = 556; - t['Zdotaccent'] = 611; - t['Thorn'] = 667; - t['Omacron'] = 778; - t['Racute'] = 722; - t['Sacute'] = 667; - t['dcaron'] = 743; - t['Umacron'] = 722; - t['uring'] = 611; - t['threesuperior'] = 333; - t['Ograve'] = 778; - t['Agrave'] = 722; - t['Abreve'] = 722; - t['multiply'] = 584; - t['uacute'] = 611; - t['Tcaron'] = 611; - t['partialdiff'] = 494; - t['ydieresis'] = 556; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 667; - t['adieresis'] = 556; - t['edieresis'] = 556; - t['cacute'] = 556; - t['nacute'] = 611; - t['umacron'] = 611; - t['Ncaron'] = 722; - t['Iacute'] = 278; - t['plusminus'] = 584; - t['brokenbar'] = 280; - t['registered'] = 737; - t['Gbreve'] = 778; - t['Idotaccent'] = 278; - t['summation'] = 600; - t['Egrave'] = 667; - t['racute'] = 389; - t['omacron'] = 611; - t['Zacute'] = 611; - t['Zcaron'] = 611; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 722; - t['lcommaaccent'] = 278; - t['tcaron'] = 389; - t['eogonek'] = 556; - t['Uogonek'] = 722; - t['Aacute'] = 722; - t['Adieresis'] = 722; - t['egrave'] = 556; - t['zacute'] = 500; - t['iogonek'] = 278; - t['Oacute'] = 778; - t['oacute'] = 611; - t['amacron'] = 556; - t['sacute'] = 556; - t['idieresis'] = 278; - t['Ocircumflex'] = 778; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 611; - t['twosuperior'] = 333; - t['Odieresis'] = 778; - t['mu'] = 611; - t['igrave'] = 278; - t['ohungarumlaut'] = 611; - t['Eogonek'] = 667; - t['dcroat'] = 611; - t['threequarters'] = 834; - t['Scedilla'] = 667; - t['lcaron'] = 400; - t['Kcommaaccent'] = 722; - t['Lacute'] = 611; - t['trademark'] = 1000; - t['edotaccent'] = 556; - t['Igrave'] = 278; - t['Imacron'] = 278; - t['Lcaron'] = 611; - t['onehalf'] = 834; - t['lessequal'] = 549; - t['ocircumflex'] = 611; - t['ntilde'] = 611; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 667; - t['emacron'] = 556; - t['gbreve'] = 611; - t['onequarter'] = 834; - t['Scaron'] = 667; - t['Scommaaccent'] = 667; - t['Ohungarumlaut'] = 778; - t['degree'] = 400; - t['ograve'] = 611; - t['Ccaron'] = 722; - t['ugrave'] = 611; - t['radical'] = 549; - t['Dcaron'] = 722; - t['rcommaaccent'] = 389; - t['Ntilde'] = 722; - t['otilde'] = 611; - t['Rcommaaccent'] = 722; - t['Lcommaaccent'] = 611; - t['Atilde'] = 722; - t['Aogonek'] = 722; - t['Aring'] = 722; - t['Otilde'] = 778; - t['zdotaccent'] = 500; - t['Ecaron'] = 667; - t['Iogonek'] = 278; - t['kcommaaccent'] = 556; - t['minus'] = 584; - t['Icircumflex'] = 278; - t['ncaron'] = 611; - t['tcommaaccent'] = 333; - t['logicalnot'] = 584; - t['odieresis'] = 611; - t['udieresis'] = 611; - t['notequal'] = 549; - t['gcommaaccent'] = 611; - t['eth'] = 611; - t['zcaron'] = 500; - t['ncommaaccent'] = 611; - t['onesuperior'] = 333; - t['imacron'] = 278; - t['Euro'] = 556; - }); - t['Helvetica-BoldOblique'] = getLookupTableFactory(function (t) { - t['space'] = 278; - t['exclam'] = 333; - t['quotedbl'] = 474; - t['numbersign'] = 556; - t['dollar'] = 556; - t['percent'] = 889; - t['ampersand'] = 722; - t['quoteright'] = 278; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 389; - t['plus'] = 584; - t['comma'] = 278; - t['hyphen'] = 333; - t['period'] = 278; - t['slash'] = 278; - t['zero'] = 556; - t['one'] = 556; - t['two'] = 556; - t['three'] = 556; - t['four'] = 556; - t['five'] = 556; - t['six'] = 556; - t['seven'] = 556; - t['eight'] = 556; - t['nine'] = 556; - t['colon'] = 333; - t['semicolon'] = 333; - t['less'] = 584; - t['equal'] = 584; - t['greater'] = 584; - t['question'] = 611; - t['at'] = 975; - t['A'] = 722; - t['B'] = 722; - t['C'] = 722; - t['D'] = 722; - t['E'] = 667; - t['F'] = 611; - t['G'] = 778; - t['H'] = 722; - t['I'] = 278; - t['J'] = 556; - t['K'] = 722; - t['L'] = 611; - t['M'] = 833; - t['N'] = 722; - t['O'] = 778; - t['P'] = 667; - t['Q'] = 778; - t['R'] = 722; - t['S'] = 667; - t['T'] = 611; - t['U'] = 722; - t['V'] = 667; - t['W'] = 944; - t['X'] = 667; - t['Y'] = 667; - t['Z'] = 611; - t['bracketleft'] = 333; - t['backslash'] = 278; - t['bracketright'] = 333; - t['asciicircum'] = 584; - t['underscore'] = 556; - t['quoteleft'] = 278; - t['a'] = 556; - t['b'] = 611; - t['c'] = 556; - t['d'] = 611; - t['e'] = 556; - t['f'] = 333; - t['g'] = 611; - t['h'] = 611; - t['i'] = 278; - t['j'] = 278; - t['k'] = 556; - t['l'] = 278; - t['m'] = 889; - t['n'] = 611; - t['o'] = 611; - t['p'] = 611; - t['q'] = 611; - t['r'] = 389; - t['s'] = 556; - t['t'] = 333; - t['u'] = 611; - t['v'] = 556; - t['w'] = 778; - t['x'] = 556; - t['y'] = 556; - t['z'] = 500; - t['braceleft'] = 389; - t['bar'] = 280; - t['braceright'] = 389; - t['asciitilde'] = 584; - t['exclamdown'] = 333; - t['cent'] = 556; - t['sterling'] = 556; - t['fraction'] = 167; - t['yen'] = 556; - t['florin'] = 556; - t['section'] = 556; - t['currency'] = 556; - t['quotesingle'] = 238; - t['quotedblleft'] = 500; - t['guillemotleft'] = 556; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 611; - t['fl'] = 611; - t['endash'] = 556; - t['dagger'] = 556; - t['daggerdbl'] = 556; - t['periodcentered'] = 278; - t['paragraph'] = 556; - t['bullet'] = 350; - t['quotesinglbase'] = 278; - t['quotedblbase'] = 500; - t['quotedblright'] = 500; - t['guillemotright'] = 556; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 611; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 1000; - t['ordfeminine'] = 370; - t['Lslash'] = 611; - t['Oslash'] = 778; - t['OE'] = 1000; - t['ordmasculine'] = 365; - t['ae'] = 889; - t['dotlessi'] = 278; - t['lslash'] = 278; - t['oslash'] = 611; - t['oe'] = 944; - t['germandbls'] = 611; - t['Idieresis'] = 278; - t['eacute'] = 556; - t['abreve'] = 556; - t['uhungarumlaut'] = 611; - t['ecaron'] = 556; - t['Ydieresis'] = 667; - t['divide'] = 584; - t['Yacute'] = 667; - t['Acircumflex'] = 722; - t['aacute'] = 556; - t['Ucircumflex'] = 722; - t['yacute'] = 556; - t['scommaaccent'] = 556; - t['ecircumflex'] = 556; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 556; - t['Uacute'] = 722; - t['uogonek'] = 611; - t['Edieresis'] = 667; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 737; - t['Emacron'] = 667; - t['ccaron'] = 556; - t['aring'] = 556; - t['Ncommaaccent'] = 722; - t['lacute'] = 278; - t['agrave'] = 556; - t['Tcommaaccent'] = 611; - t['Cacute'] = 722; - t['atilde'] = 556; - t['Edotaccent'] = 667; - t['scaron'] = 556; - t['scedilla'] = 556; - t['iacute'] = 278; - t['lozenge'] = 494; - t['Rcaron'] = 722; - t['Gcommaaccent'] = 778; - t['ucircumflex'] = 611; - t['acircumflex'] = 556; - t['Amacron'] = 722; - t['rcaron'] = 389; - t['ccedilla'] = 556; - t['Zdotaccent'] = 611; - t['Thorn'] = 667; - t['Omacron'] = 778; - t['Racute'] = 722; - t['Sacute'] = 667; - t['dcaron'] = 743; - t['Umacron'] = 722; - t['uring'] = 611; - t['threesuperior'] = 333; - t['Ograve'] = 778; - t['Agrave'] = 722; - t['Abreve'] = 722; - t['multiply'] = 584; - t['uacute'] = 611; - t['Tcaron'] = 611; - t['partialdiff'] = 494; - t['ydieresis'] = 556; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 667; - t['adieresis'] = 556; - t['edieresis'] = 556; - t['cacute'] = 556; - t['nacute'] = 611; - t['umacron'] = 611; - t['Ncaron'] = 722; - t['Iacute'] = 278; - t['plusminus'] = 584; - t['brokenbar'] = 280; - t['registered'] = 737; - t['Gbreve'] = 778; - t['Idotaccent'] = 278; - t['summation'] = 600; - t['Egrave'] = 667; - t['racute'] = 389; - t['omacron'] = 611; - t['Zacute'] = 611; - t['Zcaron'] = 611; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 722; - t['lcommaaccent'] = 278; - t['tcaron'] = 389; - t['eogonek'] = 556; - t['Uogonek'] = 722; - t['Aacute'] = 722; - t['Adieresis'] = 722; - t['egrave'] = 556; - t['zacute'] = 500; - t['iogonek'] = 278; - t['Oacute'] = 778; - t['oacute'] = 611; - t['amacron'] = 556; - t['sacute'] = 556; - t['idieresis'] = 278; - t['Ocircumflex'] = 778; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 611; - t['twosuperior'] = 333; - t['Odieresis'] = 778; - t['mu'] = 611; - t['igrave'] = 278; - t['ohungarumlaut'] = 611; - t['Eogonek'] = 667; - t['dcroat'] = 611; - t['threequarters'] = 834; - t['Scedilla'] = 667; - t['lcaron'] = 400; - t['Kcommaaccent'] = 722; - t['Lacute'] = 611; - t['trademark'] = 1000; - t['edotaccent'] = 556; - t['Igrave'] = 278; - t['Imacron'] = 278; - t['Lcaron'] = 611; - t['onehalf'] = 834; - t['lessequal'] = 549; - t['ocircumflex'] = 611; - t['ntilde'] = 611; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 667; - t['emacron'] = 556; - t['gbreve'] = 611; - t['onequarter'] = 834; - t['Scaron'] = 667; - t['Scommaaccent'] = 667; - t['Ohungarumlaut'] = 778; - t['degree'] = 400; - t['ograve'] = 611; - t['Ccaron'] = 722; - t['ugrave'] = 611; - t['radical'] = 549; - t['Dcaron'] = 722; - t['rcommaaccent'] = 389; - t['Ntilde'] = 722; - t['otilde'] = 611; - t['Rcommaaccent'] = 722; - t['Lcommaaccent'] = 611; - t['Atilde'] = 722; - t['Aogonek'] = 722; - t['Aring'] = 722; - t['Otilde'] = 778; - t['zdotaccent'] = 500; - t['Ecaron'] = 667; - t['Iogonek'] = 278; - t['kcommaaccent'] = 556; - t['minus'] = 584; - t['Icircumflex'] = 278; - t['ncaron'] = 611; - t['tcommaaccent'] = 333; - t['logicalnot'] = 584; - t['odieresis'] = 611; - t['udieresis'] = 611; - t['notequal'] = 549; - t['gcommaaccent'] = 611; - t['eth'] = 611; - t['zcaron'] = 500; - t['ncommaaccent'] = 611; - t['onesuperior'] = 333; - t['imacron'] = 278; - t['Euro'] = 556; - }); - t['Helvetica-Oblique'] = getLookupTableFactory(function (t) { - t['space'] = 278; - t['exclam'] = 278; - t['quotedbl'] = 355; - t['numbersign'] = 556; - t['dollar'] = 556; - t['percent'] = 889; - t['ampersand'] = 667; - t['quoteright'] = 222; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 389; - t['plus'] = 584; - t['comma'] = 278; - t['hyphen'] = 333; - t['period'] = 278; - t['slash'] = 278; - t['zero'] = 556; - t['one'] = 556; - t['two'] = 556; - t['three'] = 556; - t['four'] = 556; - t['five'] = 556; - t['six'] = 556; - t['seven'] = 556; - t['eight'] = 556; - t['nine'] = 556; - t['colon'] = 278; - t['semicolon'] = 278; - t['less'] = 584; - t['equal'] = 584; - t['greater'] = 584; - t['question'] = 556; - t['at'] = 1015; - t['A'] = 667; - t['B'] = 667; - t['C'] = 722; - t['D'] = 722; - t['E'] = 667; - t['F'] = 611; - t['G'] = 778; - t['H'] = 722; - t['I'] = 278; - t['J'] = 500; - t['K'] = 667; - t['L'] = 556; - t['M'] = 833; - t['N'] = 722; - t['O'] = 778; - t['P'] = 667; - t['Q'] = 778; - t['R'] = 722; - t['S'] = 667; - t['T'] = 611; - t['U'] = 722; - t['V'] = 667; - t['W'] = 944; - t['X'] = 667; - t['Y'] = 667; - t['Z'] = 611; - t['bracketleft'] = 278; - t['backslash'] = 278; - t['bracketright'] = 278; - t['asciicircum'] = 469; - t['underscore'] = 556; - t['quoteleft'] = 222; - t['a'] = 556; - t['b'] = 556; - t['c'] = 500; - t['d'] = 556; - t['e'] = 556; - t['f'] = 278; - t['g'] = 556; - t['h'] = 556; - t['i'] = 222; - t['j'] = 222; - t['k'] = 500; - t['l'] = 222; - t['m'] = 833; - t['n'] = 556; - t['o'] = 556; - t['p'] = 556; - t['q'] = 556; - t['r'] = 333; - t['s'] = 500; - t['t'] = 278; - t['u'] = 556; - t['v'] = 500; - t['w'] = 722; - t['x'] = 500; - t['y'] = 500; - t['z'] = 500; - t['braceleft'] = 334; - t['bar'] = 260; - t['braceright'] = 334; - t['asciitilde'] = 584; - t['exclamdown'] = 333; - t['cent'] = 556; - t['sterling'] = 556; - t['fraction'] = 167; - t['yen'] = 556; - t['florin'] = 556; - t['section'] = 556; - t['currency'] = 556; - t['quotesingle'] = 191; - t['quotedblleft'] = 333; - t['guillemotleft'] = 556; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 500; - t['fl'] = 500; - t['endash'] = 556; - t['dagger'] = 556; - t['daggerdbl'] = 556; - t['periodcentered'] = 278; - t['paragraph'] = 537; - t['bullet'] = 350; - t['quotesinglbase'] = 222; - t['quotedblbase'] = 333; - t['quotedblright'] = 333; - t['guillemotright'] = 556; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 611; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 1000; - t['ordfeminine'] = 370; - t['Lslash'] = 556; - t['Oslash'] = 778; - t['OE'] = 1000; - t['ordmasculine'] = 365; - t['ae'] = 889; - t['dotlessi'] = 278; - t['lslash'] = 222; - t['oslash'] = 611; - t['oe'] = 944; - t['germandbls'] = 611; - t['Idieresis'] = 278; - t['eacute'] = 556; - t['abreve'] = 556; - t['uhungarumlaut'] = 556; - t['ecaron'] = 556; - t['Ydieresis'] = 667; - t['divide'] = 584; - t['Yacute'] = 667; - t['Acircumflex'] = 667; - t['aacute'] = 556; - t['Ucircumflex'] = 722; - t['yacute'] = 500; - t['scommaaccent'] = 500; - t['ecircumflex'] = 556; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 556; - t['Uacute'] = 722; - t['uogonek'] = 556; - t['Edieresis'] = 667; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 737; - t['Emacron'] = 667; - t['ccaron'] = 500; - t['aring'] = 556; - t['Ncommaaccent'] = 722; - t['lacute'] = 222; - t['agrave'] = 556; - t['Tcommaaccent'] = 611; - t['Cacute'] = 722; - t['atilde'] = 556; - t['Edotaccent'] = 667; - t['scaron'] = 500; - t['scedilla'] = 500; - t['iacute'] = 278; - t['lozenge'] = 471; - t['Rcaron'] = 722; - t['Gcommaaccent'] = 778; - t['ucircumflex'] = 556; - t['acircumflex'] = 556; - t['Amacron'] = 667; - t['rcaron'] = 333; - t['ccedilla'] = 500; - t['Zdotaccent'] = 611; - t['Thorn'] = 667; - t['Omacron'] = 778; - t['Racute'] = 722; - t['Sacute'] = 667; - t['dcaron'] = 643; - t['Umacron'] = 722; - t['uring'] = 556; - t['threesuperior'] = 333; - t['Ograve'] = 778; - t['Agrave'] = 667; - t['Abreve'] = 667; - t['multiply'] = 584; - t['uacute'] = 556; - t['Tcaron'] = 611; - t['partialdiff'] = 476; - t['ydieresis'] = 500; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 667; - t['adieresis'] = 556; - t['edieresis'] = 556; - t['cacute'] = 500; - t['nacute'] = 556; - t['umacron'] = 556; - t['Ncaron'] = 722; - t['Iacute'] = 278; - t['plusminus'] = 584; - t['brokenbar'] = 260; - t['registered'] = 737; - t['Gbreve'] = 778; - t['Idotaccent'] = 278; - t['summation'] = 600; - t['Egrave'] = 667; - t['racute'] = 333; - t['omacron'] = 556; - t['Zacute'] = 611; - t['Zcaron'] = 611; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 722; - t['lcommaaccent'] = 222; - t['tcaron'] = 317; - t['eogonek'] = 556; - t['Uogonek'] = 722; - t['Aacute'] = 667; - t['Adieresis'] = 667; - t['egrave'] = 556; - t['zacute'] = 500; - t['iogonek'] = 222; - t['Oacute'] = 778; - t['oacute'] = 556; - t['amacron'] = 556; - t['sacute'] = 500; - t['idieresis'] = 278; - t['Ocircumflex'] = 778; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 556; - t['twosuperior'] = 333; - t['Odieresis'] = 778; - t['mu'] = 556; - t['igrave'] = 278; - t['ohungarumlaut'] = 556; - t['Eogonek'] = 667; - t['dcroat'] = 556; - t['threequarters'] = 834; - t['Scedilla'] = 667; - t['lcaron'] = 299; - t['Kcommaaccent'] = 667; - t['Lacute'] = 556; - t['trademark'] = 1000; - t['edotaccent'] = 556; - t['Igrave'] = 278; - t['Imacron'] = 278; - t['Lcaron'] = 556; - t['onehalf'] = 834; - t['lessequal'] = 549; - t['ocircumflex'] = 556; - t['ntilde'] = 556; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 667; - t['emacron'] = 556; - t['gbreve'] = 556; - t['onequarter'] = 834; - t['Scaron'] = 667; - t['Scommaaccent'] = 667; - t['Ohungarumlaut'] = 778; - t['degree'] = 400; - t['ograve'] = 556; - t['Ccaron'] = 722; - t['ugrave'] = 556; - t['radical'] = 453; - t['Dcaron'] = 722; - t['rcommaaccent'] = 333; - t['Ntilde'] = 722; - t['otilde'] = 556; - t['Rcommaaccent'] = 722; - t['Lcommaaccent'] = 556; - t['Atilde'] = 667; - t['Aogonek'] = 667; - t['Aring'] = 667; - t['Otilde'] = 778; - t['zdotaccent'] = 500; - t['Ecaron'] = 667; - t['Iogonek'] = 278; - t['kcommaaccent'] = 500; - t['minus'] = 584; - t['Icircumflex'] = 278; - t['ncaron'] = 556; - t['tcommaaccent'] = 278; - t['logicalnot'] = 584; - t['odieresis'] = 556; - t['udieresis'] = 556; - t['notequal'] = 549; - t['gcommaaccent'] = 556; - t['eth'] = 556; - t['zcaron'] = 500; - t['ncommaaccent'] = 556; - t['onesuperior'] = 333; - t['imacron'] = 278; - t['Euro'] = 556; - }); - t['Symbol'] = getLookupTableFactory(function (t) { - t['space'] = 250; - t['exclam'] = 333; - t['universal'] = 713; - t['numbersign'] = 500; - t['existential'] = 549; - t['percent'] = 833; - t['ampersand'] = 778; - t['suchthat'] = 439; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asteriskmath'] = 500; - t['plus'] = 549; - t['comma'] = 250; - t['minus'] = 549; - t['period'] = 250; - t['slash'] = 278; - t['zero'] = 500; - t['one'] = 500; - t['two'] = 500; - t['three'] = 500; - t['four'] = 500; - t['five'] = 500; - t['six'] = 500; - t['seven'] = 500; - t['eight'] = 500; - t['nine'] = 500; - t['colon'] = 278; - t['semicolon'] = 278; - t['less'] = 549; - t['equal'] = 549; - t['greater'] = 549; - t['question'] = 444; - t['congruent'] = 549; - t['Alpha'] = 722; - t['Beta'] = 667; - t['Chi'] = 722; - t['Delta'] = 612; - t['Epsilon'] = 611; - t['Phi'] = 763; - t['Gamma'] = 603; - t['Eta'] = 722; - t['Iota'] = 333; - t['theta1'] = 631; - t['Kappa'] = 722; - t['Lambda'] = 686; - t['Mu'] = 889; - t['Nu'] = 722; - t['Omicron'] = 722; - t['Pi'] = 768; - t['Theta'] = 741; - t['Rho'] = 556; - t['Sigma'] = 592; - t['Tau'] = 611; - t['Upsilon'] = 690; - t['sigma1'] = 439; - t['Omega'] = 768; - t['Xi'] = 645; - t['Psi'] = 795; - t['Zeta'] = 611; - t['bracketleft'] = 333; - t['therefore'] = 863; - t['bracketright'] = 333; - t['perpendicular'] = 658; - t['underscore'] = 500; - t['radicalex'] = 500; - t['alpha'] = 631; - t['beta'] = 549; - t['chi'] = 549; - t['delta'] = 494; - t['epsilon'] = 439; - t['phi'] = 521; - t['gamma'] = 411; - t['eta'] = 603; - t['iota'] = 329; - t['phi1'] = 603; - t['kappa'] = 549; - t['lambda'] = 549; - t['mu'] = 576; - t['nu'] = 521; - t['omicron'] = 549; - t['pi'] = 549; - t['theta'] = 521; - t['rho'] = 549; - t['sigma'] = 603; - t['tau'] = 439; - t['upsilon'] = 576; - t['omega1'] = 713; - t['omega'] = 686; - t['xi'] = 493; - t['psi'] = 686; - t['zeta'] = 494; - t['braceleft'] = 480; - t['bar'] = 200; - t['braceright'] = 480; - t['similar'] = 549; - t['Euro'] = 750; - t['Upsilon1'] = 620; - t['minute'] = 247; - t['lessequal'] = 549; - t['fraction'] = 167; - t['infinity'] = 713; - t['florin'] = 500; - t['club'] = 753; - t['diamond'] = 753; - t['heart'] = 753; - t['spade'] = 753; - t['arrowboth'] = 1042; - t['arrowleft'] = 987; - t['arrowup'] = 603; - t['arrowright'] = 987; - t['arrowdown'] = 603; - t['degree'] = 400; - t['plusminus'] = 549; - t['second'] = 411; - t['greaterequal'] = 549; - t['multiply'] = 549; - t['proportional'] = 713; - t['partialdiff'] = 494; - t['bullet'] = 460; - t['divide'] = 549; - t['notequal'] = 549; - t['equivalence'] = 549; - t['approxequal'] = 549; - t['ellipsis'] = 1000; - t['arrowvertex'] = 603; - t['arrowhorizex'] = 1000; - t['carriagereturn'] = 658; - t['aleph'] = 823; - t['Ifraktur'] = 686; - t['Rfraktur'] = 795; - t['weierstrass'] = 987; - t['circlemultiply'] = 768; - t['circleplus'] = 768; - t['emptyset'] = 823; - t['intersection'] = 768; - t['union'] = 768; - t['propersuperset'] = 713; - t['reflexsuperset'] = 713; - t['notsubset'] = 713; - t['propersubset'] = 713; - t['reflexsubset'] = 713; - t['element'] = 713; - t['notelement'] = 713; - t['angle'] = 768; - t['gradient'] = 713; - t['registerserif'] = 790; - t['copyrightserif'] = 790; - t['trademarkserif'] = 890; - t['product'] = 823; - t['radical'] = 549; - t['dotmath'] = 250; - t['logicalnot'] = 713; - t['logicaland'] = 603; - t['logicalor'] = 603; - t['arrowdblboth'] = 1042; - t['arrowdblleft'] = 987; - t['arrowdblup'] = 603; - t['arrowdblright'] = 987; - t['arrowdbldown'] = 603; - t['lozenge'] = 494; - t['angleleft'] = 329; - t['registersans'] = 790; - t['copyrightsans'] = 790; - t['trademarksans'] = 786; - t['summation'] = 713; - t['parenlefttp'] = 384; - t['parenleftex'] = 384; - t['parenleftbt'] = 384; - t['bracketlefttp'] = 384; - t['bracketleftex'] = 384; - t['bracketleftbt'] = 384; - t['bracelefttp'] = 494; - t['braceleftmid'] = 494; - t['braceleftbt'] = 494; - t['braceex'] = 494; - t['angleright'] = 329; - t['integral'] = 274; - t['integraltp'] = 686; - t['integralex'] = 686; - t['integralbt'] = 686; - t['parenrighttp'] = 384; - t['parenrightex'] = 384; - t['parenrightbt'] = 384; - t['bracketrighttp'] = 384; - t['bracketrightex'] = 384; - t['bracketrightbt'] = 384; - t['bracerighttp'] = 494; - t['bracerightmid'] = 494; - t['bracerightbt'] = 494; - t['apple'] = 790; - }); - t['Times-Roman'] = getLookupTableFactory(function (t) { - t['space'] = 250; - t['exclam'] = 333; - t['quotedbl'] = 408; - t['numbersign'] = 500; - t['dollar'] = 500; - t['percent'] = 833; - t['ampersand'] = 778; - t['quoteright'] = 333; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 500; - t['plus'] = 564; - t['comma'] = 250; - t['hyphen'] = 333; - t['period'] = 250; - t['slash'] = 278; - t['zero'] = 500; - t['one'] = 500; - t['two'] = 500; - t['three'] = 500; - t['four'] = 500; - t['five'] = 500; - t['six'] = 500; - t['seven'] = 500; - t['eight'] = 500; - t['nine'] = 500; - t['colon'] = 278; - t['semicolon'] = 278; - t['less'] = 564; - t['equal'] = 564; - t['greater'] = 564; - t['question'] = 444; - t['at'] = 921; - t['A'] = 722; - t['B'] = 667; - t['C'] = 667; - t['D'] = 722; - t['E'] = 611; - t['F'] = 556; - t['G'] = 722; - t['H'] = 722; - t['I'] = 333; - t['J'] = 389; - t['K'] = 722; - t['L'] = 611; - t['M'] = 889; - t['N'] = 722; - t['O'] = 722; - t['P'] = 556; - t['Q'] = 722; - t['R'] = 667; - t['S'] = 556; - t['T'] = 611; - t['U'] = 722; - t['V'] = 722; - t['W'] = 944; - t['X'] = 722; - t['Y'] = 722; - t['Z'] = 611; - t['bracketleft'] = 333; - t['backslash'] = 278; - t['bracketright'] = 333; - t['asciicircum'] = 469; - t['underscore'] = 500; - t['quoteleft'] = 333; - t['a'] = 444; - t['b'] = 500; - t['c'] = 444; - t['d'] = 500; - t['e'] = 444; - t['f'] = 333; - t['g'] = 500; - t['h'] = 500; - t['i'] = 278; - t['j'] = 278; - t['k'] = 500; - t['l'] = 278; - t['m'] = 778; - t['n'] = 500; - t['o'] = 500; - t['p'] = 500; - t['q'] = 500; - t['r'] = 333; - t['s'] = 389; - t['t'] = 278; - t['u'] = 500; - t['v'] = 500; - t['w'] = 722; - t['x'] = 500; - t['y'] = 500; - t['z'] = 444; - t['braceleft'] = 480; - t['bar'] = 200; - t['braceright'] = 480; - t['asciitilde'] = 541; - t['exclamdown'] = 333; - t['cent'] = 500; - t['sterling'] = 500; - t['fraction'] = 167; - t['yen'] = 500; - t['florin'] = 500; - t['section'] = 500; - t['currency'] = 500; - t['quotesingle'] = 180; - t['quotedblleft'] = 444; - t['guillemotleft'] = 500; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 556; - t['fl'] = 556; - t['endash'] = 500; - t['dagger'] = 500; - t['daggerdbl'] = 500; - t['periodcentered'] = 250; - t['paragraph'] = 453; - t['bullet'] = 350; - t['quotesinglbase'] = 333; - t['quotedblbase'] = 444; - t['quotedblright'] = 444; - t['guillemotright'] = 500; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 444; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 889; - t['ordfeminine'] = 276; - t['Lslash'] = 611; - t['Oslash'] = 722; - t['OE'] = 889; - t['ordmasculine'] = 310; - t['ae'] = 667; - t['dotlessi'] = 278; - t['lslash'] = 278; - t['oslash'] = 500; - t['oe'] = 722; - t['germandbls'] = 500; - t['Idieresis'] = 333; - t['eacute'] = 444; - t['abreve'] = 444; - t['uhungarumlaut'] = 500; - t['ecaron'] = 444; - t['Ydieresis'] = 722; - t['divide'] = 564; - t['Yacute'] = 722; - t['Acircumflex'] = 722; - t['aacute'] = 444; - t['Ucircumflex'] = 722; - t['yacute'] = 500; - t['scommaaccent'] = 389; - t['ecircumflex'] = 444; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 444; - t['Uacute'] = 722; - t['uogonek'] = 500; - t['Edieresis'] = 611; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 760; - t['Emacron'] = 611; - t['ccaron'] = 444; - t['aring'] = 444; - t['Ncommaaccent'] = 722; - t['lacute'] = 278; - t['agrave'] = 444; - t['Tcommaaccent'] = 611; - t['Cacute'] = 667; - t['atilde'] = 444; - t['Edotaccent'] = 611; - t['scaron'] = 389; - t['scedilla'] = 389; - t['iacute'] = 278; - t['lozenge'] = 471; - t['Rcaron'] = 667; - t['Gcommaaccent'] = 722; - t['ucircumflex'] = 500; - t['acircumflex'] = 444; - t['Amacron'] = 722; - t['rcaron'] = 333; - t['ccedilla'] = 444; - t['Zdotaccent'] = 611; - t['Thorn'] = 556; - t['Omacron'] = 722; - t['Racute'] = 667; - t['Sacute'] = 556; - t['dcaron'] = 588; - t['Umacron'] = 722; - t['uring'] = 500; - t['threesuperior'] = 300; - t['Ograve'] = 722; - t['Agrave'] = 722; - t['Abreve'] = 722; - t['multiply'] = 564; - t['uacute'] = 500; - t['Tcaron'] = 611; - t['partialdiff'] = 476; - t['ydieresis'] = 500; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 611; - t['adieresis'] = 444; - t['edieresis'] = 444; - t['cacute'] = 444; - t['nacute'] = 500; - t['umacron'] = 500; - t['Ncaron'] = 722; - t['Iacute'] = 333; - t['plusminus'] = 564; - t['brokenbar'] = 200; - t['registered'] = 760; - t['Gbreve'] = 722; - t['Idotaccent'] = 333; - t['summation'] = 600; - t['Egrave'] = 611; - t['racute'] = 333; - t['omacron'] = 500; - t['Zacute'] = 611; - t['Zcaron'] = 611; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 667; - t['lcommaaccent'] = 278; - t['tcaron'] = 326; - t['eogonek'] = 444; - t['Uogonek'] = 722; - t['Aacute'] = 722; - t['Adieresis'] = 722; - t['egrave'] = 444; - t['zacute'] = 444; - t['iogonek'] = 278; - t['Oacute'] = 722; - t['oacute'] = 500; - t['amacron'] = 444; - t['sacute'] = 389; - t['idieresis'] = 278; - t['Ocircumflex'] = 722; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 500; - t['twosuperior'] = 300; - t['Odieresis'] = 722; - t['mu'] = 500; - t['igrave'] = 278; - t['ohungarumlaut'] = 500; - t['Eogonek'] = 611; - t['dcroat'] = 500; - t['threequarters'] = 750; - t['Scedilla'] = 556; - t['lcaron'] = 344; - t['Kcommaaccent'] = 722; - t['Lacute'] = 611; - t['trademark'] = 980; - t['edotaccent'] = 444; - t['Igrave'] = 333; - t['Imacron'] = 333; - t['Lcaron'] = 611; - t['onehalf'] = 750; - t['lessequal'] = 549; - t['ocircumflex'] = 500; - t['ntilde'] = 500; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 611; - t['emacron'] = 444; - t['gbreve'] = 500; - t['onequarter'] = 750; - t['Scaron'] = 556; - t['Scommaaccent'] = 556; - t['Ohungarumlaut'] = 722; - t['degree'] = 400; - t['ograve'] = 500; - t['Ccaron'] = 667; - t['ugrave'] = 500; - t['radical'] = 453; - t['Dcaron'] = 722; - t['rcommaaccent'] = 333; - t['Ntilde'] = 722; - t['otilde'] = 500; - t['Rcommaaccent'] = 667; - t['Lcommaaccent'] = 611; - t['Atilde'] = 722; - t['Aogonek'] = 722; - t['Aring'] = 722; - t['Otilde'] = 722; - t['zdotaccent'] = 444; - t['Ecaron'] = 611; - t['Iogonek'] = 333; - t['kcommaaccent'] = 500; - t['minus'] = 564; - t['Icircumflex'] = 333; - t['ncaron'] = 500; - t['tcommaaccent'] = 278; - t['logicalnot'] = 564; - t['odieresis'] = 500; - t['udieresis'] = 500; - t['notequal'] = 549; - t['gcommaaccent'] = 500; - t['eth'] = 500; - t['zcaron'] = 444; - t['ncommaaccent'] = 500; - t['onesuperior'] = 300; - t['imacron'] = 278; - t['Euro'] = 500; - }); - t['Times-Bold'] = getLookupTableFactory(function (t) { - t['space'] = 250; - t['exclam'] = 333; - t['quotedbl'] = 555; - t['numbersign'] = 500; - t['dollar'] = 500; - t['percent'] = 1000; - t['ampersand'] = 833; - t['quoteright'] = 333; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 500; - t['plus'] = 570; - t['comma'] = 250; - t['hyphen'] = 333; - t['period'] = 250; - t['slash'] = 278; - t['zero'] = 500; - t['one'] = 500; - t['two'] = 500; - t['three'] = 500; - t['four'] = 500; - t['five'] = 500; - t['six'] = 500; - t['seven'] = 500; - t['eight'] = 500; - t['nine'] = 500; - t['colon'] = 333; - t['semicolon'] = 333; - t['less'] = 570; - t['equal'] = 570; - t['greater'] = 570; - t['question'] = 500; - t['at'] = 930; - t['A'] = 722; - t['B'] = 667; - t['C'] = 722; - t['D'] = 722; - t['E'] = 667; - t['F'] = 611; - t['G'] = 778; - t['H'] = 778; - t['I'] = 389; - t['J'] = 500; - t['K'] = 778; - t['L'] = 667; - t['M'] = 944; - t['N'] = 722; - t['O'] = 778; - t['P'] = 611; - t['Q'] = 778; - t['R'] = 722; - t['S'] = 556; - t['T'] = 667; - t['U'] = 722; - t['V'] = 722; - t['W'] = 1000; - t['X'] = 722; - t['Y'] = 722; - t['Z'] = 667; - t['bracketleft'] = 333; - t['backslash'] = 278; - t['bracketright'] = 333; - t['asciicircum'] = 581; - t['underscore'] = 500; - t['quoteleft'] = 333; - t['a'] = 500; - t['b'] = 556; - t['c'] = 444; - t['d'] = 556; - t['e'] = 444; - t['f'] = 333; - t['g'] = 500; - t['h'] = 556; - t['i'] = 278; - t['j'] = 333; - t['k'] = 556; - t['l'] = 278; - t['m'] = 833; - t['n'] = 556; - t['o'] = 500; - t['p'] = 556; - t['q'] = 556; - t['r'] = 444; - t['s'] = 389; - t['t'] = 333; - t['u'] = 556; - t['v'] = 500; - t['w'] = 722; - t['x'] = 500; - t['y'] = 500; - t['z'] = 444; - t['braceleft'] = 394; - t['bar'] = 220; - t['braceright'] = 394; - t['asciitilde'] = 520; - t['exclamdown'] = 333; - t['cent'] = 500; - t['sterling'] = 500; - t['fraction'] = 167; - t['yen'] = 500; - t['florin'] = 500; - t['section'] = 500; - t['currency'] = 500; - t['quotesingle'] = 278; - t['quotedblleft'] = 500; - t['guillemotleft'] = 500; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 556; - t['fl'] = 556; - t['endash'] = 500; - t['dagger'] = 500; - t['daggerdbl'] = 500; - t['periodcentered'] = 250; - t['paragraph'] = 540; - t['bullet'] = 350; - t['quotesinglbase'] = 333; - t['quotedblbase'] = 500; - t['quotedblright'] = 500; - t['guillemotright'] = 500; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 500; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 1000; - t['ordfeminine'] = 300; - t['Lslash'] = 667; - t['Oslash'] = 778; - t['OE'] = 1000; - t['ordmasculine'] = 330; - t['ae'] = 722; - t['dotlessi'] = 278; - t['lslash'] = 278; - t['oslash'] = 500; - t['oe'] = 722; - t['germandbls'] = 556; - t['Idieresis'] = 389; - t['eacute'] = 444; - t['abreve'] = 500; - t['uhungarumlaut'] = 556; - t['ecaron'] = 444; - t['Ydieresis'] = 722; - t['divide'] = 570; - t['Yacute'] = 722; - t['Acircumflex'] = 722; - t['aacute'] = 500; - t['Ucircumflex'] = 722; - t['yacute'] = 500; - t['scommaaccent'] = 389; - t['ecircumflex'] = 444; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 500; - t['Uacute'] = 722; - t['uogonek'] = 556; - t['Edieresis'] = 667; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 747; - t['Emacron'] = 667; - t['ccaron'] = 444; - t['aring'] = 500; - t['Ncommaaccent'] = 722; - t['lacute'] = 278; - t['agrave'] = 500; - t['Tcommaaccent'] = 667; - t['Cacute'] = 722; - t['atilde'] = 500; - t['Edotaccent'] = 667; - t['scaron'] = 389; - t['scedilla'] = 389; - t['iacute'] = 278; - t['lozenge'] = 494; - t['Rcaron'] = 722; - t['Gcommaaccent'] = 778; - t['ucircumflex'] = 556; - t['acircumflex'] = 500; - t['Amacron'] = 722; - t['rcaron'] = 444; - t['ccedilla'] = 444; - t['Zdotaccent'] = 667; - t['Thorn'] = 611; - t['Omacron'] = 778; - t['Racute'] = 722; - t['Sacute'] = 556; - t['dcaron'] = 672; - t['Umacron'] = 722; - t['uring'] = 556; - t['threesuperior'] = 300; - t['Ograve'] = 778; - t['Agrave'] = 722; - t['Abreve'] = 722; - t['multiply'] = 570; - t['uacute'] = 556; - t['Tcaron'] = 667; - t['partialdiff'] = 494; - t['ydieresis'] = 500; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 667; - t['adieresis'] = 500; - t['edieresis'] = 444; - t['cacute'] = 444; - t['nacute'] = 556; - t['umacron'] = 556; - t['Ncaron'] = 722; - t['Iacute'] = 389; - t['plusminus'] = 570; - t['brokenbar'] = 220; - t['registered'] = 747; - t['Gbreve'] = 778; - t['Idotaccent'] = 389; - t['summation'] = 600; - t['Egrave'] = 667; - t['racute'] = 444; - t['omacron'] = 500; - t['Zacute'] = 667; - t['Zcaron'] = 667; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 722; - t['lcommaaccent'] = 278; - t['tcaron'] = 416; - t['eogonek'] = 444; - t['Uogonek'] = 722; - t['Aacute'] = 722; - t['Adieresis'] = 722; - t['egrave'] = 444; - t['zacute'] = 444; - t['iogonek'] = 278; - t['Oacute'] = 778; - t['oacute'] = 500; - t['amacron'] = 500; - t['sacute'] = 389; - t['idieresis'] = 278; - t['Ocircumflex'] = 778; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 556; - t['twosuperior'] = 300; - t['Odieresis'] = 778; - t['mu'] = 556; - t['igrave'] = 278; - t['ohungarumlaut'] = 500; - t['Eogonek'] = 667; - t['dcroat'] = 556; - t['threequarters'] = 750; - t['Scedilla'] = 556; - t['lcaron'] = 394; - t['Kcommaaccent'] = 778; - t['Lacute'] = 667; - t['trademark'] = 1000; - t['edotaccent'] = 444; - t['Igrave'] = 389; - t['Imacron'] = 389; - t['Lcaron'] = 667; - t['onehalf'] = 750; - t['lessequal'] = 549; - t['ocircumflex'] = 500; - t['ntilde'] = 556; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 667; - t['emacron'] = 444; - t['gbreve'] = 500; - t['onequarter'] = 750; - t['Scaron'] = 556; - t['Scommaaccent'] = 556; - t['Ohungarumlaut'] = 778; - t['degree'] = 400; - t['ograve'] = 500; - t['Ccaron'] = 722; - t['ugrave'] = 556; - t['radical'] = 549; - t['Dcaron'] = 722; - t['rcommaaccent'] = 444; - t['Ntilde'] = 722; - t['otilde'] = 500; - t['Rcommaaccent'] = 722; - t['Lcommaaccent'] = 667; - t['Atilde'] = 722; - t['Aogonek'] = 722; - t['Aring'] = 722; - t['Otilde'] = 778; - t['zdotaccent'] = 444; - t['Ecaron'] = 667; - t['Iogonek'] = 389; - t['kcommaaccent'] = 556; - t['minus'] = 570; - t['Icircumflex'] = 389; - t['ncaron'] = 556; - t['tcommaaccent'] = 333; - t['logicalnot'] = 570; - t['odieresis'] = 500; - t['udieresis'] = 556; - t['notequal'] = 549; - t['gcommaaccent'] = 500; - t['eth'] = 500; - t['zcaron'] = 444; - t['ncommaaccent'] = 556; - t['onesuperior'] = 300; - t['imacron'] = 278; - t['Euro'] = 500; - }); - t['Times-BoldItalic'] = getLookupTableFactory(function (t) { - t['space'] = 250; - t['exclam'] = 389; - t['quotedbl'] = 555; - t['numbersign'] = 500; - t['dollar'] = 500; - t['percent'] = 833; - t['ampersand'] = 778; - t['quoteright'] = 333; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 500; - t['plus'] = 570; - t['comma'] = 250; - t['hyphen'] = 333; - t['period'] = 250; - t['slash'] = 278; - t['zero'] = 500; - t['one'] = 500; - t['two'] = 500; - t['three'] = 500; - t['four'] = 500; - t['five'] = 500; - t['six'] = 500; - t['seven'] = 500; - t['eight'] = 500; - t['nine'] = 500; - t['colon'] = 333; - t['semicolon'] = 333; - t['less'] = 570; - t['equal'] = 570; - t['greater'] = 570; - t['question'] = 500; - t['at'] = 832; - t['A'] = 667; - t['B'] = 667; - t['C'] = 667; - t['D'] = 722; - t['E'] = 667; - t['F'] = 667; - t['G'] = 722; - t['H'] = 778; - t['I'] = 389; - t['J'] = 500; - t['K'] = 667; - t['L'] = 611; - t['M'] = 889; - t['N'] = 722; - t['O'] = 722; - t['P'] = 611; - t['Q'] = 722; - t['R'] = 667; - t['S'] = 556; - t['T'] = 611; - t['U'] = 722; - t['V'] = 667; - t['W'] = 889; - t['X'] = 667; - t['Y'] = 611; - t['Z'] = 611; - t['bracketleft'] = 333; - t['backslash'] = 278; - t['bracketright'] = 333; - t['asciicircum'] = 570; - t['underscore'] = 500; - t['quoteleft'] = 333; - t['a'] = 500; - t['b'] = 500; - t['c'] = 444; - t['d'] = 500; - t['e'] = 444; - t['f'] = 333; - t['g'] = 500; - t['h'] = 556; - t['i'] = 278; - t['j'] = 278; - t['k'] = 500; - t['l'] = 278; - t['m'] = 778; - t['n'] = 556; - t['o'] = 500; - t['p'] = 500; - t['q'] = 500; - t['r'] = 389; - t['s'] = 389; - t['t'] = 278; - t['u'] = 556; - t['v'] = 444; - t['w'] = 667; - t['x'] = 500; - t['y'] = 444; - t['z'] = 389; - t['braceleft'] = 348; - t['bar'] = 220; - t['braceright'] = 348; - t['asciitilde'] = 570; - t['exclamdown'] = 389; - t['cent'] = 500; - t['sterling'] = 500; - t['fraction'] = 167; - t['yen'] = 500; - t['florin'] = 500; - t['section'] = 500; - t['currency'] = 500; - t['quotesingle'] = 278; - t['quotedblleft'] = 500; - t['guillemotleft'] = 500; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 556; - t['fl'] = 556; - t['endash'] = 500; - t['dagger'] = 500; - t['daggerdbl'] = 500; - t['periodcentered'] = 250; - t['paragraph'] = 500; - t['bullet'] = 350; - t['quotesinglbase'] = 333; - t['quotedblbase'] = 500; - t['quotedblright'] = 500; - t['guillemotright'] = 500; - t['ellipsis'] = 1000; - t['perthousand'] = 1000; - t['questiondown'] = 500; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 1000; - t['AE'] = 944; - t['ordfeminine'] = 266; - t['Lslash'] = 611; - t['Oslash'] = 722; - t['OE'] = 944; - t['ordmasculine'] = 300; - t['ae'] = 722; - t['dotlessi'] = 278; - t['lslash'] = 278; - t['oslash'] = 500; - t['oe'] = 722; - t['germandbls'] = 500; - t['Idieresis'] = 389; - t['eacute'] = 444; - t['abreve'] = 500; - t['uhungarumlaut'] = 556; - t['ecaron'] = 444; - t['Ydieresis'] = 611; - t['divide'] = 570; - t['Yacute'] = 611; - t['Acircumflex'] = 667; - t['aacute'] = 500; - t['Ucircumflex'] = 722; - t['yacute'] = 444; - t['scommaaccent'] = 389; - t['ecircumflex'] = 444; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 500; - t['Uacute'] = 722; - t['uogonek'] = 556; - t['Edieresis'] = 667; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 747; - t['Emacron'] = 667; - t['ccaron'] = 444; - t['aring'] = 500; - t['Ncommaaccent'] = 722; - t['lacute'] = 278; - t['agrave'] = 500; - t['Tcommaaccent'] = 611; - t['Cacute'] = 667; - t['atilde'] = 500; - t['Edotaccent'] = 667; - t['scaron'] = 389; - t['scedilla'] = 389; - t['iacute'] = 278; - t['lozenge'] = 494; - t['Rcaron'] = 667; - t['Gcommaaccent'] = 722; - t['ucircumflex'] = 556; - t['acircumflex'] = 500; - t['Amacron'] = 667; - t['rcaron'] = 389; - t['ccedilla'] = 444; - t['Zdotaccent'] = 611; - t['Thorn'] = 611; - t['Omacron'] = 722; - t['Racute'] = 667; - t['Sacute'] = 556; - t['dcaron'] = 608; - t['Umacron'] = 722; - t['uring'] = 556; - t['threesuperior'] = 300; - t['Ograve'] = 722; - t['Agrave'] = 667; - t['Abreve'] = 667; - t['multiply'] = 570; - t['uacute'] = 556; - t['Tcaron'] = 611; - t['partialdiff'] = 494; - t['ydieresis'] = 444; - t['Nacute'] = 722; - t['icircumflex'] = 278; - t['Ecircumflex'] = 667; - t['adieresis'] = 500; - t['edieresis'] = 444; - t['cacute'] = 444; - t['nacute'] = 556; - t['umacron'] = 556; - t['Ncaron'] = 722; - t['Iacute'] = 389; - t['plusminus'] = 570; - t['brokenbar'] = 220; - t['registered'] = 747; - t['Gbreve'] = 722; - t['Idotaccent'] = 389; - t['summation'] = 600; - t['Egrave'] = 667; - t['racute'] = 389; - t['omacron'] = 500; - t['Zacute'] = 611; - t['Zcaron'] = 611; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 667; - t['lcommaaccent'] = 278; - t['tcaron'] = 366; - t['eogonek'] = 444; - t['Uogonek'] = 722; - t['Aacute'] = 667; - t['Adieresis'] = 667; - t['egrave'] = 444; - t['zacute'] = 389; - t['iogonek'] = 278; - t['Oacute'] = 722; - t['oacute'] = 500; - t['amacron'] = 500; - t['sacute'] = 389; - t['idieresis'] = 278; - t['Ocircumflex'] = 722; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 500; - t['twosuperior'] = 300; - t['Odieresis'] = 722; - t['mu'] = 576; - t['igrave'] = 278; - t['ohungarumlaut'] = 500; - t['Eogonek'] = 667; - t['dcroat'] = 500; - t['threequarters'] = 750; - t['Scedilla'] = 556; - t['lcaron'] = 382; - t['Kcommaaccent'] = 667; - t['Lacute'] = 611; - t['trademark'] = 1000; - t['edotaccent'] = 444; - t['Igrave'] = 389; - t['Imacron'] = 389; - t['Lcaron'] = 611; - t['onehalf'] = 750; - t['lessequal'] = 549; - t['ocircumflex'] = 500; - t['ntilde'] = 556; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 667; - t['emacron'] = 444; - t['gbreve'] = 500; - t['onequarter'] = 750; - t['Scaron'] = 556; - t['Scommaaccent'] = 556; - t['Ohungarumlaut'] = 722; - t['degree'] = 400; - t['ograve'] = 500; - t['Ccaron'] = 667; - t['ugrave'] = 556; - t['radical'] = 549; - t['Dcaron'] = 722; - t['rcommaaccent'] = 389; - t['Ntilde'] = 722; - t['otilde'] = 500; - t['Rcommaaccent'] = 667; - t['Lcommaaccent'] = 611; - t['Atilde'] = 667; - t['Aogonek'] = 667; - t['Aring'] = 667; - t['Otilde'] = 722; - t['zdotaccent'] = 389; - t['Ecaron'] = 667; - t['Iogonek'] = 389; - t['kcommaaccent'] = 500; - t['minus'] = 606; - t['Icircumflex'] = 389; - t['ncaron'] = 556; - t['tcommaaccent'] = 278; - t['logicalnot'] = 606; - t['odieresis'] = 500; - t['udieresis'] = 556; - t['notequal'] = 549; - t['gcommaaccent'] = 500; - t['eth'] = 500; - t['zcaron'] = 389; - t['ncommaaccent'] = 556; - t['onesuperior'] = 300; - t['imacron'] = 278; - t['Euro'] = 500; - }); - t['Times-Italic'] = getLookupTableFactory(function (t) { - t['space'] = 250; - t['exclam'] = 333; - t['quotedbl'] = 420; - t['numbersign'] = 500; - t['dollar'] = 500; - t['percent'] = 833; - t['ampersand'] = 778; - t['quoteright'] = 333; - t['parenleft'] = 333; - t['parenright'] = 333; - t['asterisk'] = 500; - t['plus'] = 675; - t['comma'] = 250; - t['hyphen'] = 333; - t['period'] = 250; - t['slash'] = 278; - t['zero'] = 500; - t['one'] = 500; - t['two'] = 500; - t['three'] = 500; - t['four'] = 500; - t['five'] = 500; - t['six'] = 500; - t['seven'] = 500; - t['eight'] = 500; - t['nine'] = 500; - t['colon'] = 333; - t['semicolon'] = 333; - t['less'] = 675; - t['equal'] = 675; - t['greater'] = 675; - t['question'] = 500; - t['at'] = 920; - t['A'] = 611; - t['B'] = 611; - t['C'] = 667; - t['D'] = 722; - t['E'] = 611; - t['F'] = 611; - t['G'] = 722; - t['H'] = 722; - t['I'] = 333; - t['J'] = 444; - t['K'] = 667; - t['L'] = 556; - t['M'] = 833; - t['N'] = 667; - t['O'] = 722; - t['P'] = 611; - t['Q'] = 722; - t['R'] = 611; - t['S'] = 500; - t['T'] = 556; - t['U'] = 722; - t['V'] = 611; - t['W'] = 833; - t['X'] = 611; - t['Y'] = 556; - t['Z'] = 556; - t['bracketleft'] = 389; - t['backslash'] = 278; - t['bracketright'] = 389; - t['asciicircum'] = 422; - t['underscore'] = 500; - t['quoteleft'] = 333; - t['a'] = 500; - t['b'] = 500; - t['c'] = 444; - t['d'] = 500; - t['e'] = 444; - t['f'] = 278; - t['g'] = 500; - t['h'] = 500; - t['i'] = 278; - t['j'] = 278; - t['k'] = 444; - t['l'] = 278; - t['m'] = 722; - t['n'] = 500; - t['o'] = 500; - t['p'] = 500; - t['q'] = 500; - t['r'] = 389; - t['s'] = 389; - t['t'] = 278; - t['u'] = 500; - t['v'] = 444; - t['w'] = 667; - t['x'] = 444; - t['y'] = 444; - t['z'] = 389; - t['braceleft'] = 400; - t['bar'] = 275; - t['braceright'] = 400; - t['asciitilde'] = 541; - t['exclamdown'] = 389; - t['cent'] = 500; - t['sterling'] = 500; - t['fraction'] = 167; - t['yen'] = 500; - t['florin'] = 500; - t['section'] = 500; - t['currency'] = 500; - t['quotesingle'] = 214; - t['quotedblleft'] = 556; - t['guillemotleft'] = 500; - t['guilsinglleft'] = 333; - t['guilsinglright'] = 333; - t['fi'] = 500; - t['fl'] = 500; - t['endash'] = 500; - t['dagger'] = 500; - t['daggerdbl'] = 500; - t['periodcentered'] = 250; - t['paragraph'] = 523; - t['bullet'] = 350; - t['quotesinglbase'] = 333; - t['quotedblbase'] = 556; - t['quotedblright'] = 556; - t['guillemotright'] = 500; - t['ellipsis'] = 889; - t['perthousand'] = 1000; - t['questiondown'] = 500; - t['grave'] = 333; - t['acute'] = 333; - t['circumflex'] = 333; - t['tilde'] = 333; - t['macron'] = 333; - t['breve'] = 333; - t['dotaccent'] = 333; - t['dieresis'] = 333; - t['ring'] = 333; - t['cedilla'] = 333; - t['hungarumlaut'] = 333; - t['ogonek'] = 333; - t['caron'] = 333; - t['emdash'] = 889; - t['AE'] = 889; - t['ordfeminine'] = 276; - t['Lslash'] = 556; - t['Oslash'] = 722; - t['OE'] = 944; - t['ordmasculine'] = 310; - t['ae'] = 667; - t['dotlessi'] = 278; - t['lslash'] = 278; - t['oslash'] = 500; - t['oe'] = 667; - t['germandbls'] = 500; - t['Idieresis'] = 333; - t['eacute'] = 444; - t['abreve'] = 500; - t['uhungarumlaut'] = 500; - t['ecaron'] = 444; - t['Ydieresis'] = 556; - t['divide'] = 675; - t['Yacute'] = 556; - t['Acircumflex'] = 611; - t['aacute'] = 500; - t['Ucircumflex'] = 722; - t['yacute'] = 444; - t['scommaaccent'] = 389; - t['ecircumflex'] = 444; - t['Uring'] = 722; - t['Udieresis'] = 722; - t['aogonek'] = 500; - t['Uacute'] = 722; - t['uogonek'] = 500; - t['Edieresis'] = 611; - t['Dcroat'] = 722; - t['commaaccent'] = 250; - t['copyright'] = 760; - t['Emacron'] = 611; - t['ccaron'] = 444; - t['aring'] = 500; - t['Ncommaaccent'] = 667; - t['lacute'] = 278; - t['agrave'] = 500; - t['Tcommaaccent'] = 556; - t['Cacute'] = 667; - t['atilde'] = 500; - t['Edotaccent'] = 611; - t['scaron'] = 389; - t['scedilla'] = 389; - t['iacute'] = 278; - t['lozenge'] = 471; - t['Rcaron'] = 611; - t['Gcommaaccent'] = 722; - t['ucircumflex'] = 500; - t['acircumflex'] = 500; - t['Amacron'] = 611; - t['rcaron'] = 389; - t['ccedilla'] = 444; - t['Zdotaccent'] = 556; - t['Thorn'] = 611; - t['Omacron'] = 722; - t['Racute'] = 611; - t['Sacute'] = 500; - t['dcaron'] = 544; - t['Umacron'] = 722; - t['uring'] = 500; - t['threesuperior'] = 300; - t['Ograve'] = 722; - t['Agrave'] = 611; - t['Abreve'] = 611; - t['multiply'] = 675; - t['uacute'] = 500; - t['Tcaron'] = 556; - t['partialdiff'] = 476; - t['ydieresis'] = 444; - t['Nacute'] = 667; - t['icircumflex'] = 278; - t['Ecircumflex'] = 611; - t['adieresis'] = 500; - t['edieresis'] = 444; - t['cacute'] = 444; - t['nacute'] = 500; - t['umacron'] = 500; - t['Ncaron'] = 667; - t['Iacute'] = 333; - t['plusminus'] = 675; - t['brokenbar'] = 275; - t['registered'] = 760; - t['Gbreve'] = 722; - t['Idotaccent'] = 333; - t['summation'] = 600; - t['Egrave'] = 611; - t['racute'] = 389; - t['omacron'] = 500; - t['Zacute'] = 556; - t['Zcaron'] = 556; - t['greaterequal'] = 549; - t['Eth'] = 722; - t['Ccedilla'] = 667; - t['lcommaaccent'] = 278; - t['tcaron'] = 300; - t['eogonek'] = 444; - t['Uogonek'] = 722; - t['Aacute'] = 611; - t['Adieresis'] = 611; - t['egrave'] = 444; - t['zacute'] = 389; - t['iogonek'] = 278; - t['Oacute'] = 722; - t['oacute'] = 500; - t['amacron'] = 500; - t['sacute'] = 389; - t['idieresis'] = 278; - t['Ocircumflex'] = 722; - t['Ugrave'] = 722; - t['Delta'] = 612; - t['thorn'] = 500; - t['twosuperior'] = 300; - t['Odieresis'] = 722; - t['mu'] = 500; - t['igrave'] = 278; - t['ohungarumlaut'] = 500; - t['Eogonek'] = 611; - t['dcroat'] = 500; - t['threequarters'] = 750; - t['Scedilla'] = 500; - t['lcaron'] = 300; - t['Kcommaaccent'] = 667; - t['Lacute'] = 556; - t['trademark'] = 980; - t['edotaccent'] = 444; - t['Igrave'] = 333; - t['Imacron'] = 333; - t['Lcaron'] = 611; - t['onehalf'] = 750; - t['lessequal'] = 549; - t['ocircumflex'] = 500; - t['ntilde'] = 500; - t['Uhungarumlaut'] = 722; - t['Eacute'] = 611; - t['emacron'] = 444; - t['gbreve'] = 500; - t['onequarter'] = 750; - t['Scaron'] = 500; - t['Scommaaccent'] = 500; - t['Ohungarumlaut'] = 722; - t['degree'] = 400; - t['ograve'] = 500; - t['Ccaron'] = 667; - t['ugrave'] = 500; - t['radical'] = 453; - t['Dcaron'] = 722; - t['rcommaaccent'] = 389; - t['Ntilde'] = 667; - t['otilde'] = 500; - t['Rcommaaccent'] = 611; - t['Lcommaaccent'] = 556; - t['Atilde'] = 611; - t['Aogonek'] = 611; - t['Aring'] = 611; - t['Otilde'] = 722; - t['zdotaccent'] = 389; - t['Ecaron'] = 611; - t['Iogonek'] = 333; - t['kcommaaccent'] = 444; - t['minus'] = 675; - t['Icircumflex'] = 333; - t['ncaron'] = 500; - t['tcommaaccent'] = 278; - t['logicalnot'] = 675; - t['odieresis'] = 500; - t['udieresis'] = 500; - t['notequal'] = 549; - t['gcommaaccent'] = 500; - t['eth'] = 500; - t['zcaron'] = 389; - t['ncommaaccent'] = 500; - t['onesuperior'] = 300; - t['imacron'] = 278; - t['Euro'] = 500; - }); - t['ZapfDingbats'] = getLookupTableFactory(function (t) { - t['space'] = 278; - t['a1'] = 974; - t['a2'] = 961; - t['a202'] = 974; - t['a3'] = 980; - t['a4'] = 719; - t['a5'] = 789; - t['a119'] = 790; - t['a118'] = 791; - t['a117'] = 690; - t['a11'] = 960; - t['a12'] = 939; - t['a13'] = 549; - t['a14'] = 855; - t['a15'] = 911; - t['a16'] = 933; - t['a105'] = 911; - t['a17'] = 945; - t['a18'] = 974; - t['a19'] = 755; - t['a20'] = 846; - t['a21'] = 762; - t['a22'] = 761; - t['a23'] = 571; - t['a24'] = 677; - t['a25'] = 763; - t['a26'] = 760; - t['a27'] = 759; - t['a28'] = 754; - t['a6'] = 494; - t['a7'] = 552; - t['a8'] = 537; - t['a9'] = 577; - t['a10'] = 692; - t['a29'] = 786; - t['a30'] = 788; - t['a31'] = 788; - t['a32'] = 790; - t['a33'] = 793; - t['a34'] = 794; - t['a35'] = 816; - t['a36'] = 823; - t['a37'] = 789; - t['a38'] = 841; - t['a39'] = 823; - t['a40'] = 833; - t['a41'] = 816; - t['a42'] = 831; - t['a43'] = 923; - t['a44'] = 744; - t['a45'] = 723; - t['a46'] = 749; - t['a47'] = 790; - t['a48'] = 792; - t['a49'] = 695; - t['a50'] = 776; - t['a51'] = 768; - t['a52'] = 792; - t['a53'] = 759; - t['a54'] = 707; - t['a55'] = 708; - t['a56'] = 682; - t['a57'] = 701; - t['a58'] = 826; - t['a59'] = 815; - t['a60'] = 789; - t['a61'] = 789; - t['a62'] = 707; - t['a63'] = 687; - t['a64'] = 696; - t['a65'] = 689; - t['a66'] = 786; - t['a67'] = 787; - t['a68'] = 713; - t['a69'] = 791; - t['a70'] = 785; - t['a71'] = 791; - t['a72'] = 873; - t['a73'] = 761; - t['a74'] = 762; - t['a203'] = 762; - t['a75'] = 759; - t['a204'] = 759; - t['a76'] = 892; - t['a77'] = 892; - t['a78'] = 788; - t['a79'] = 784; - t['a81'] = 438; - t['a82'] = 138; - t['a83'] = 277; - t['a84'] = 415; - t['a97'] = 392; - t['a98'] = 392; - t['a99'] = 668; - t['a100'] = 668; - t['a89'] = 390; - t['a90'] = 390; - t['a93'] = 317; - t['a94'] = 317; - t['a91'] = 276; - t['a92'] = 276; - t['a205'] = 509; - t['a85'] = 509; - t['a206'] = 410; - t['a86'] = 410; - t['a87'] = 234; - t['a88'] = 234; - t['a95'] = 334; - t['a96'] = 334; - t['a101'] = 732; - t['a102'] = 544; - t['a103'] = 544; - t['a104'] = 910; - t['a106'] = 667; - t['a107'] = 760; - t['a108'] = 760; - t['a112'] = 776; - t['a111'] = 595; - t['a110'] = 694; - t['a109'] = 626; - t['a120'] = 788; - t['a121'] = 788; - t['a122'] = 788; - t['a123'] = 788; - t['a124'] = 788; - t['a125'] = 788; - t['a126'] = 788; - t['a127'] = 788; - t['a128'] = 788; - t['a129'] = 788; - t['a130'] = 788; - t['a131'] = 788; - t['a132'] = 788; - t['a133'] = 788; - t['a134'] = 788; - t['a135'] = 788; - t['a136'] = 788; - t['a137'] = 788; - t['a138'] = 788; - t['a139'] = 788; - t['a140'] = 788; - t['a141'] = 788; - t['a142'] = 788; - t['a143'] = 788; - t['a144'] = 788; - t['a145'] = 788; - t['a146'] = 788; - t['a147'] = 788; - t['a148'] = 788; - t['a149'] = 788; - t['a150'] = 788; - t['a151'] = 788; - t['a152'] = 788; - t['a153'] = 788; - t['a154'] = 788; - t['a155'] = 788; - t['a156'] = 788; - t['a157'] = 788; - t['a158'] = 788; - t['a159'] = 788; - t['a160'] = 894; - t['a161'] = 838; - t['a163'] = 1016; - t['a164'] = 458; - t['a196'] = 748; - t['a165'] = 924; - t['a192'] = 748; - t['a166'] = 918; - t['a167'] = 927; - t['a168'] = 928; - t['a169'] = 928; - t['a170'] = 834; - t['a171'] = 873; - t['a172'] = 828; - t['a173'] = 924; - t['a162'] = 924; - t['a174'] = 917; - t['a175'] = 930; - t['a176'] = 931; - t['a177'] = 463; - t['a178'] = 883; - t['a179'] = 836; - t['a193'] = 836; - t['a180'] = 867; - t['a199'] = 867; - t['a181'] = 696; - t['a200'] = 696; - t['a182'] = 874; - t['a201'] = 874; - t['a183'] = 760; - t['a184'] = 946; - t['a197'] = 771; - t['a185'] = 865; - t['a194'] = 771; - t['a198'] = 888; - t['a186'] = 967; - t['a195'] = 888; - t['a187'] = 831; - t['a188'] = 873; - t['a189'] = 927; - t['a190'] = 970; - t['a191'] = 918; - }); -}); - -exports.getMetrics = getMetrics; -})); - - - -(function (root, factory) { - { - factory((root.pdfjsCoreMurmurHash3 = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var Uint32ArrayView = sharedUtil.Uint32ArrayView; - -var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) { - // Workaround for missing math precision in JS. - var MASK_HIGH = 0xffff0000; - var MASK_LOW = 0xffff; - - function MurmurHash3_64 (seed) { - var SEED = 0xc3d2e1f0; - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; - } - - var alwaysUseUint32ArrayView = false; - // old webkits have issues with non-aligned arrays - try { - new Uint32Array(new Uint8Array(5).buffer, 0, 1); - } catch (e) { - alwaysUseUint32ArrayView = true; - } - - MurmurHash3_64.prototype = { - update: function MurmurHash3_64_update(input) { - var useUint32ArrayView = alwaysUseUint32ArrayView; - var i; - if (typeof input === 'string') { - var data = new Uint8Array(input.length * 2); - var length = 0; - for (i = 0; i < input.length; i++) { - var code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; - } - else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; - } - } - } else if (input instanceof Uint8Array) { - data = input; - length = data.length; - } else if (typeof input === 'object' && ('length' in input)) { - // processing regular arrays as well, e.g. for IE9 - data = input; - length = data.length; - useUint32ArrayView = true; - } else { - throw new Error('Wrong data format in MurmurHash3_64_update. ' + - 'Input must be a string or array.'); - } - - var blockCounts = length >> 2; - var tailLength = length - blockCounts * 4; - // we don't care about endianness here - var dataUint32 = useUint32ArrayView ? - new Uint32ArrayView(data, blockCounts) : - new Uint32Array(data.buffer, 0, blockCounts); - var k1 = 0; - var k2 = 0; - var h1 = this.h1; - var h2 = this.h2; - var C1 = 0xcc9e2d51; - var C2 = 0x1b873593; - var C1_LOW = C1 & MASK_LOW; - var C2_LOW = C2 & MASK_LOW; - - for (i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW); - k2 = k2 << 15 | k2 >>> 17; - k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW); - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; - } - } - - k1 = 0; - - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - /* falls through */ - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - /* falls through */ - case 1: - k1 ^= data[blockCounts * 4]; - /* falls through */ - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } - } - - this.h1 = h1; - this.h2 = h2; - return this; - }, - - hexdigest: function MurmurHash3_64_hexdigest () { - var h1 = this.h1; - var h2 = this.h2; - - h1 ^= h2 >>> 1; - h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW); - h2 = (h2 * 0xff51afd7 & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW); - h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - - for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) { - var hex = (arr[i] >>> 0).toString(16); - while (hex.length < 8) { - hex = '0' + hex; - } - str += hex; - } - - return str; - } - }; - - return MurmurHash3_64; -})(); - -exports.MurmurHash3_64 = MurmurHash3_64; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePrimitives = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var isArray = sharedUtil.isArray; - -var Name = (function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - - var nameCache = Object.create(null); - - Name.get = function Name_get(name) { - var nameValue = nameCache[name]; - return (nameValue ? nameValue : (nameCache[name] = new Name(name))); - }; - - return Name; -})(); - -var Cmd = (function CmdClosure() { - function Cmd(cmd) { - this.cmd = cmd; - } - - Cmd.prototype = {}; - - var cmdCache = Object.create(null); - - Cmd.get = function Cmd_get(cmd) { - var cmdValue = cmdCache[cmd]; - return (cmdValue ? cmdValue : (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.objId = null; - 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 xref = this.xref; - if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || - typeof key2 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || - typeof key3 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - value = this.map[key3] || null; - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - }, - - // Same as get(), but dereferences all elements if the result is an Array. - getArray: function Dict_getArray(key1, key2, key3) { - var value = this.get(key1, key2, key3); - var xref = this.xref; - if (!isArray(value) || !xref) { - return value; - } - value = value.slice(); // Ensure that we don't modify the Dict data. - for (var i = 0, ii = value.length; i < ii; i++) { - if (!isRef(value[i])) { - continue; - } - value[i] = xref.fetch(value[i]); - } - return value; - }, - - // no dereferencing - getRaw: function Dict_getRaw(key) { - return this.map[key]; - }, - - getKeys: function Dict_getKeys() { - return Object.keys(this.map); - }, - - 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)); - } - } - }; - - Dict.empty = new Dict(null); - - Dict.merge = function Dict_merge(xref, dictArray) { - var mergedDict = new Dict(xref); - - for (var i = 0, ii = dictArray.length; i < ii; i++) { - var dict = dictArray[i]; - if (!isDict(dict)) { - continue; - } - for (var keyName in dict.map) { - if (mergedDict.map[keyName]) { - continue; - } - mergedDict.map[keyName] = dict.map[keyName]; - } - } - return mergedDict; - }; - - return Dict; -})(); - -var Ref = (function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = { - toString: function Ref_toString() { - // This function is hot, so we make the string as compact as possible. - // |this.gen| is almost always zero, so we treat that case specially. - var str = this.num + 'R'; - if (this.gen !== 0) { - str += this.gen; - } - return str; - } - }; - - 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 = Object.create(null); - } - - RefSet.prototype = { - has: function RefSet_has(ref) { - return ref.toString() in this.dict; - }, - - put: function RefSet_put(ref) { - this.dict[ref.toString()] = true; - }, - - remove: function RefSet_remove(ref) { - delete this.dict[ref.toString()]; - } - }; - - return RefSet; -})(); - -var RefSetCache = (function RefSetCacheClosure() { - function RefSetCache() { - this.dict = Object.create(null); - } - - RefSetCache.prototype = { - get: function RefSetCache_get(ref) { - return this.dict[ref.toString()]; - }, - - has: function RefSetCache_has(ref) { - return ref.toString() in this.dict; - }, - - put: function RefSetCache_put(ref, obj) { - this.dict[ref.toString()] = obj; - }, - - putAlias: function RefSetCache_putAlias(ref, aliasRef) { - this.dict[ref.toString()] = this.get(aliasRef); - }, - - forEach: function RefSetCache_forEach(fn, thisArg) { - for (var i in this.dict) { - fn.call(thisArg, this.dict[i]); - } - }, - - clear: function RefSetCache_clear() { - this.dict = Object.create(null); - } - }; - - return RefSetCache; -})(); - -function isName(v, name) { - return v instanceof Name && (name === undefined || v.name === name); -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - return v instanceof Dict && - (type === undefined || isName(v.get('Type'), type)); -} - -function isRef(v) { - return v instanceof Ref; -} - -function isRefsEqual(v1, v2) { - return v1.num === v2.num && v1.gen === v2.gen; -} - -function isStream(v) { - return typeof v === 'object' && v !== null && v.getBytes !== undefined; -} - -exports.Cmd = Cmd; -exports.Dict = Dict; -exports.Name = Name; -exports.Ref = Ref; -exports.RefSet = RefSet; -exports.RefSetCache = RefSetCache; -exports.isCmd = isCmd; -exports.isDict = isDict; -exports.isName = isName; -exports.isRef = isRef; -exports.isRefsEqual = isRefsEqual; -exports.isStream = isStream; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreStandardFonts = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - var getLookupTableFactory = sharedUtil.getLookupTableFactory; - - /** - * Hold a map of decoded fonts and of the standard fourteen Type1 - * fonts and their acronyms. - */ - var getStdFontMap = getLookupTableFactory(function (t) { - t['ArialNarrow'] = 'Helvetica'; - t['ArialNarrow-Bold'] = 'Helvetica-Bold'; - t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique'; - t['ArialNarrow-Italic'] = 'Helvetica-Oblique'; - t['ArialBlack'] = 'Helvetica'; - t['ArialBlack-Bold'] = 'Helvetica-Bold'; - t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique'; - t['ArialBlack-Italic'] = 'Helvetica-Oblique'; - t['Arial'] = 'Helvetica'; - t['Arial-Bold'] = 'Helvetica-Bold'; - t['Arial-BoldItalic'] = 'Helvetica-BoldOblique'; - t['Arial-Italic'] = 'Helvetica-Oblique'; - t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique'; - t['Arial-BoldMT'] = 'Helvetica-Bold'; - t['Arial-ItalicMT'] = 'Helvetica-Oblique'; - t['ArialMT'] = 'Helvetica'; - t['Courier-Bold'] = 'Courier-Bold'; - t['Courier-BoldItalic'] = 'Courier-BoldOblique'; - t['Courier-Italic'] = 'Courier-Oblique'; - t['CourierNew'] = 'Courier'; - t['CourierNew-Bold'] = 'Courier-Bold'; - t['CourierNew-BoldItalic'] = 'Courier-BoldOblique'; - t['CourierNew-Italic'] = 'Courier-Oblique'; - t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique'; - t['CourierNewPS-BoldMT'] = 'Courier-Bold'; - t['CourierNewPS-ItalicMT'] = 'Courier-Oblique'; - t['CourierNewPSMT'] = 'Courier'; - t['Helvetica'] = 'Helvetica'; - t['Helvetica-Bold'] = 'Helvetica-Bold'; - t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique'; - t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique'; - t['Helvetica-Italic'] = 'Helvetica-Oblique'; - t['Helvetica-Oblique'] = 'Helvetica-Oblique'; - t['Symbol-Bold'] = 'Symbol'; - t['Symbol-BoldItalic'] = 'Symbol'; - t['Symbol-Italic'] = 'Symbol'; - t['TimesNewRoman'] = 'Times-Roman'; - t['TimesNewRoman-Bold'] = 'Times-Bold'; - t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic'; - t['TimesNewRoman-Italic'] = 'Times-Italic'; - t['TimesNewRomanPS'] = 'Times-Roman'; - t['TimesNewRomanPS-Bold'] = 'Times-Bold'; - t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic'; - t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic'; - t['TimesNewRomanPS-BoldMT'] = 'Times-Bold'; - t['TimesNewRomanPS-Italic'] = 'Times-Italic'; - t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic'; - t['TimesNewRomanPSMT'] = 'Times-Roman'; - t['TimesNewRomanPSMT-Bold'] = 'Times-Bold'; - t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic'; - t['TimesNewRomanPSMT-Italic'] = 'Times-Italic'; - }); - - /** - * Holds the map of the non-standard fonts that might be included as - * a standard fonts without glyph data. - */ - var getNonStdFontMap = getLookupTableFactory(function (t) { - t['CenturyGothic'] = 'Helvetica'; - t['CenturyGothic-Bold'] = 'Helvetica-Bold'; - t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique'; - t['CenturyGothic-Italic'] = 'Helvetica-Oblique'; - t['ComicSansMS'] = 'Comic Sans MS'; - t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold'; - t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic'; - t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic'; - t['LucidaConsole'] = 'Courier'; - t['LucidaConsole-Bold'] = 'Courier-Bold'; - t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique'; - t['LucidaConsole-Italic'] = 'Courier-Oblique'; - t['MS-Gothic'] = 'MS Gothic'; - t['MS-Gothic-Bold'] = 'MS Gothic-Bold'; - t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic'; - t['MS-Gothic-Italic'] = 'MS Gothic-Italic'; - t['MS-Mincho'] = 'MS Mincho'; - t['MS-Mincho-Bold'] = 'MS Mincho-Bold'; - t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic'; - t['MS-Mincho-Italic'] = 'MS Mincho-Italic'; - t['MS-PGothic'] = 'MS PGothic'; - t['MS-PGothic-Bold'] = 'MS PGothic-Bold'; - t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic'; - t['MS-PGothic-Italic'] = 'MS PGothic-Italic'; - t['MS-PMincho'] = 'MS PMincho'; - t['MS-PMincho-Bold'] = 'MS PMincho-Bold'; - t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic'; - t['MS-PMincho-Italic'] = 'MS PMincho-Italic'; - t['Wingdings'] = 'ZapfDingbats'; - }); - - var getSerifFonts = getLookupTableFactory(function (t) { - t['Adobe Jenson'] = true; - t['Adobe Text'] = true; - t['Albertus'] = true; - t['Aldus'] = true; - t['Alexandria'] = true; - t['Algerian'] = true; - t['American Typewriter'] = true; - t['Antiqua'] = true; - t['Apex'] = true; - t['Arno'] = true; - t['Aster'] = true; - t['Aurora'] = true; - t['Baskerville'] = true; - t['Bell'] = true; - t['Bembo'] = true; - t['Bembo Schoolbook'] = true; - t['Benguiat'] = true; - t['Berkeley Old Style'] = true; - t['Bernhard Modern'] = true; - t['Berthold City'] = true; - t['Bodoni'] = true; - t['Bauer Bodoni'] = true; - t['Book Antiqua'] = true; - t['Bookman'] = true; - t['Bordeaux Roman'] = true; - t['Californian FB'] = true; - t['Calisto'] = true; - t['Calvert'] = true; - t['Capitals'] = true; - t['Cambria'] = true; - t['Cartier'] = true; - t['Caslon'] = true; - t['Catull'] = true; - t['Centaur'] = true; - t['Century Old Style'] = true; - t['Century Schoolbook'] = true; - t['Chaparral'] = true; - t['Charis SIL'] = true; - t['Cheltenham'] = true; - t['Cholla Slab'] = true; - t['Clarendon'] = true; - t['Clearface'] = true; - t['Cochin'] = true; - t['Colonna'] = true; - t['Computer Modern'] = true; - t['Concrete Roman'] = true; - t['Constantia'] = true; - t['Cooper Black'] = true; - t['Corona'] = true; - t['Ecotype'] = true; - t['Egyptienne'] = true; - t['Elephant'] = true; - t['Excelsior'] = true; - t['Fairfield'] = true; - t['FF Scala'] = true; - t['Folkard'] = true; - t['Footlight'] = true; - t['FreeSerif'] = true; - t['Friz Quadrata'] = true; - t['Garamond'] = true; - t['Gentium'] = true; - t['Georgia'] = true; - t['Gloucester'] = true; - t['Goudy Old Style'] = true; - t['Goudy Schoolbook'] = true; - t['Goudy Pro Font'] = true; - t['Granjon'] = true; - t['Guardian Egyptian'] = true; - t['Heather'] = true; - t['Hercules'] = true; - t['High Tower Text'] = true; - t['Hiroshige'] = true; - t['Hoefler Text'] = true; - t['Humana Serif'] = true; - t['Imprint'] = true; - t['Ionic No. 5'] = true; - t['Janson'] = true; - t['Joanna'] = true; - t['Korinna'] = true; - t['Lexicon'] = true; - t['Liberation Serif'] = true; - t['Linux Libertine'] = true; - t['Literaturnaya'] = true; - t['Lucida'] = true; - t['Lucida Bright'] = true; - t['Melior'] = true; - t['Memphis'] = true; - t['Miller'] = true; - t['Minion'] = true; - t['Modern'] = true; - t['Mona Lisa'] = true; - t['Mrs Eaves'] = true; - t['MS Serif'] = true; - t['Museo Slab'] = true; - t['New York'] = true; - t['Nimbus Roman'] = true; - t['NPS Rawlinson Roadway'] = true; - t['Palatino'] = true; - t['Perpetua'] = true; - t['Plantin'] = true; - t['Plantin Schoolbook'] = true; - t['Playbill'] = true; - t['Poor Richard'] = true; - t['Rawlinson Roadway'] = true; - t['Renault'] = true; - t['Requiem'] = true; - t['Rockwell'] = true; - t['Roman'] = true; - t['Rotis Serif'] = true; - t['Sabon'] = true; - t['Scala'] = true; - t['Seagull'] = true; - t['Sistina'] = true; - t['Souvenir'] = true; - t['STIX'] = true; - t['Stone Informal'] = true; - t['Stone Serif'] = true; - t['Sylfaen'] = true; - t['Times'] = true; - t['Trajan'] = true; - t['Trinité'] = true; - t['Trump Mediaeval'] = true; - t['Utopia'] = true; - t['Vale Type'] = true; - t['Bitstream Vera'] = true; - t['Vera Serif'] = true; - t['Versailles'] = true; - t['Wanted'] = true; - t['Weiss'] = true; - t['Wide Latin'] = true; - t['Windsor'] = true; - t['XITS'] = true; - }); - - var getSymbolsFonts = getLookupTableFactory(function (t) { - t['Dingbats'] = true; - t['Symbol'] = true; - t['ZapfDingbats'] = true; - }); - - // Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID - // fonts, but does not embed the CID to GID mapping. The mapping is incomplete - // for all glyphs, but common for some set of the standard fonts. - var getGlyphMapForStandardFonts = getLookupTableFactory(function (t) { - t[2] = 10; t[3] = 32; t[4] = 33; t[5] = 34; t[6] = 35; t[7] = 36; t[8] = 37; - t[9] = 38; t[10] = 39; t[11] = 40; t[12] = 41; t[13] = 42; t[14] = 43; - t[15] = 44; t[16] = 45; t[17] = 46; t[18] = 47; t[19] = 48; t[20] = 49; - t[21] = 50; t[22] = 51; t[23] = 52; t[24] = 53; t[25] = 54; t[26] = 55; - t[27] = 56; t[28] = 57; t[29] = 58; t[30] = 894; t[31] = 60; t[32] = 61; - t[33] = 62; t[34] = 63; t[35] = 64; t[36] = 65; t[37] = 66; t[38] = 67; - t[39] = 68; t[40] = 69; t[41] = 70; t[42] = 71; t[43] = 72; t[44] = 73; - t[45] = 74; t[46] = 75; t[47] = 76; t[48] = 77; t[49] = 78; t[50] = 79; - t[51] = 80; t[52] = 81; t[53] = 82; t[54] = 83; t[55] = 84; t[56] = 85; - t[57] = 86; t[58] = 87; t[59] = 88; t[60] = 89; t[61] = 90; t[62] = 91; - t[63] = 92; t[64] = 93; t[65] = 94; t[66] = 95; t[67] = 96; t[68] = 97; - t[69] = 98; t[70] = 99; t[71] = 100; t[72] = 101; t[73] = 102; t[74] = 103; - t[75] = 104; t[76] = 105; t[77] = 106; t[78] = 107; t[79] = 108; - t[80] = 109; t[81] = 110; t[82] = 111; t[83] = 112; t[84] = 113; - t[85] = 114; t[86] = 115; t[87] = 116; t[88] = 117; t[89] = 118; - t[90] = 119; t[91] = 120; t[92] = 121; t[93] = 122; t[94] = 123; - t[95] = 124; t[96] = 125; t[97] = 126; t[98] = 196; t[99] = 197; - t[100] = 199; t[101] = 201; t[102] = 209; t[103] = 214; t[104] = 220; - t[105] = 225; t[106] = 224; t[107] = 226; t[108] = 228; t[109] = 227; - t[110] = 229; t[111] = 231; t[112] = 233; t[113] = 232; t[114] = 234; - t[115] = 235; t[116] = 237; t[117] = 236; t[118] = 238; t[119] = 239; - t[120] = 241; t[121] = 243; t[122] = 242; t[123] = 244; t[124] = 246; - t[125] = 245; t[126] = 250; t[127] = 249; t[128] = 251; t[129] = 252; - t[130] = 8224; t[131] = 176; t[132] = 162; t[133] = 163; t[134] = 167; - t[135] = 8226; t[136] = 182; t[137] = 223; t[138] = 174; t[139] = 169; - t[140] = 8482; t[141] = 180; t[142] = 168; t[143] = 8800; t[144] = 198; - t[145] = 216; t[146] = 8734; t[147] = 177; t[148] = 8804; t[149] = 8805; - t[150] = 165; t[151] = 181; t[152] = 8706; t[153] = 8721; t[154] = 8719; - t[156] = 8747; t[157] = 170; t[158] = 186; t[159] = 8486; t[160] = 230; - t[161] = 248; t[162] = 191; t[163] = 161; t[164] = 172; t[165] = 8730; - t[166] = 402; t[167] = 8776; t[168] = 8710; t[169] = 171; t[170] = 187; - t[171] = 8230; t[210] = 218; t[223] = 711; t[224] = 321; t[225] = 322; - t[227] = 353; t[229] = 382; t[234] = 253; t[252] = 263; t[253] = 268; - t[254] = 269; t[258] = 258; t[260] = 260; t[261] = 261; t[265] = 280; - t[266] = 281; t[268] = 283; t[269] = 313; t[275] = 323; t[276] = 324; - t[278] = 328; t[284] = 345; t[285] = 346; t[286] = 347; t[292] = 367; - t[295] = 377; t[296] = 378; t[298] = 380; t[305] = 963; t[306] = 964; - t[307] = 966; t[308] = 8215; t[309] = 8252; t[310] = 8319; t[311] = 8359; - t[312] = 8592; t[313] = 8593; t[337] = 9552; t[493] = 1039; - t[494] = 1040; t[705] = 1524; t[706] = 8362; t[710] = 64288; t[711] = 64298; - t[759] = 1617; t[761] = 1776; t[763] = 1778; t[775] = 1652; t[777] = 1764; - t[778] = 1780; t[779] = 1781; t[780] = 1782; t[782] = 771; t[783] = 64726; - t[786] = 8363; t[788] = 8532; t[790] = 768; t[791] = 769; t[792] = 768; - t[795] = 803; t[797] = 64336; t[798] = 64337; t[799] = 64342; - t[800] = 64343; t[801] = 64344; t[802] = 64345; t[803] = 64362; - t[804] = 64363; t[805] = 64364; t[2424] = 7821; t[2425] = 7822; - t[2426] = 7823; t[2427] = 7824; t[2428] = 7825; t[2429] = 7826; - t[2430] = 7827; t[2433] = 7682; t[2678] = 8045; t[2679] = 8046; - t[2830] = 1552; t[2838] = 686; t[2840] = 751; t[2842] = 753; t[2843] = 754; - t[2844] = 755; t[2846] = 757; t[2856] = 767; t[2857] = 848; t[2858] = 849; - t[2862] = 853; t[2863] = 854; t[2864] = 855; t[2865] = 861; t[2866] = 862; - t[2906] = 7460; t[2908] = 7462; t[2909] = 7463; t[2910] = 7464; - t[2912] = 7466; t[2913] = 7467; t[2914] = 7468; t[2916] = 7470; - t[2917] = 7471; t[2918] = 7472; t[2920] = 7474; t[2921] = 7475; - t[2922] = 7476; t[2924] = 7478; t[2925] = 7479; t[2926] = 7480; - t[2928] = 7482; t[2929] = 7483; t[2930] = 7484; t[2932] = 7486; - t[2933] = 7487; t[2934] = 7488; t[2936] = 7490; t[2937] = 7491; - t[2938] = 7492; t[2940] = 7494; t[2941] = 7495; t[2942] = 7496; - t[2944] = 7498; t[2946] = 7500; t[2948] = 7502; t[2950] = 7504; - t[2951] = 7505; t[2952] = 7506; t[2954] = 7508; t[2955] = 7509; - t[2956] = 7510; t[2958] = 7512; t[2959] = 7513; t[2960] = 7514; - t[2962] = 7516; t[2963] = 7517; t[2964] = 7518; t[2966] = 7520; - t[2967] = 7521; t[2968] = 7522; t[2970] = 7524; t[2971] = 7525; - t[2972] = 7526; t[2974] = 7528; t[2975] = 7529; t[2976] = 7530; - t[2978] = 1537; t[2979] = 1538; t[2980] = 1539; t[2982] = 1549; - t[2983] = 1551; t[2984] = 1552; t[2986] = 1554; t[2987] = 1555; - t[2988] = 1556; t[2990] = 1623; t[2991] = 1624; t[2995] = 1775; - t[2999] = 1791; t[3002] = 64290; t[3003] = 64291; t[3004] = 64292; - t[3006] = 64294; t[3007] = 64295; t[3008] = 64296; t[3011] = 1900; - t[3014] = 8223; t[3015] = 8244; t[3017] = 7532; t[3018] = 7533; - t[3019] = 7534; t[3075] = 7590; t[3076] = 7591; t[3079] = 7594; - t[3080] = 7595; t[3083] = 7598; t[3084] = 7599; t[3087] = 7602; - t[3088] = 7603; t[3091] = 7606; t[3092] = 7607; t[3095] = 7610; - t[3096] = 7611; t[3099] = 7614; t[3100] = 7615; t[3103] = 7618; - t[3104] = 7619; t[3107] = 8337; t[3108] = 8338; t[3116] = 1884; - t[3119] = 1885; t[3120] = 1885; t[3123] = 1886; t[3124] = 1886; - t[3127] = 1887; t[3128] = 1887; t[3131] = 1888; t[3132] = 1888; - t[3135] = 1889; t[3136] = 1889; t[3139] = 1890; t[3140] = 1890; - t[3143] = 1891; t[3144] = 1891; t[3147] = 1892; t[3148] = 1892; - t[3153] = 580; t[3154] = 581; t[3157] = 584; t[3158] = 585; t[3161] = 588; - t[3162] = 589; t[3165] = 891; t[3166] = 892; t[3169] = 1274; t[3170] = 1275; - t[3173] = 1278; t[3174] = 1279; t[3181] = 7622; t[3182] = 7623; - t[3282] = 11799; t[3316] = 578; t[3379] = 42785; t[3393] = 1159; - t[3416] = 8377; - }); - - // The glyph map for ArialBlack differs slightly from the glyph map used for - // other well-known standard fonts. Hence we use this (incomplete) CID to GID - // mapping to adjust the glyph map for non-embedded ArialBlack fonts. - var getSupplementalGlyphMapForArialBlack = - getLookupTableFactory(function (t) { - t[227] = 322; t[264] = 261; t[291] = 346; - }); - - exports.getStdFontMap = getStdFontMap; - exports.getNonStdFontMap = getNonStdFontMap; - exports.getSerifFonts = getSerifFonts; - exports.getSymbolsFonts = getSymbolsFonts; - exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts; - exports.getSupplementalGlyphMapForArialBlack = - getSupplementalGlyphMapForArialBlack; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreUnicode = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - var getLookupTableFactory = sharedUtil.getLookupTableFactory; - - // Some characters, e.g. copyrightserif, are mapped to the private use area - // and might not be displayed using standard fonts. Mapping/hacking well-known - // chars to the similar equivalents in the normal characters range. - var getSpecialPUASymbols = getLookupTableFactory(function (t) { - t[63721] = 0x00A9; // copyrightsans (0xF8E9) => copyright - t[63193] = 0x00A9; // copyrightserif (0xF6D9) => copyright - t[63720] = 0x00AE; // registersans (0xF8E8) => registered - t[63194] = 0x00AE; // registerserif (0xF6DA) => registered - t[63722] = 0x2122; // trademarksans (0xF8EA) => trademark - t[63195] = 0x2122; // trademarkserif (0xF6DB) => trademark - t[63729] = 0x23A7; // bracelefttp (0xF8F1) - t[63730] = 0x23A8; // braceleftmid (0xF8F2) - t[63731] = 0x23A9; // braceleftbt (0xF8F3) - t[63740] = 0x23AB; // bracerighttp (0xF8FC) - t[63741] = 0x23AC; // bracerightmid (0xF8FD) - t[63742] = 0x23AD; // bracerightbt (0xF8FE) - t[63726] = 0x23A1; // bracketlefttp (0xF8EE) - t[63727] = 0x23A2; // bracketleftex (0xF8EF) - t[63728] = 0x23A3; // bracketleftbt (0xF8F0) - t[63737] = 0x23A4; // bracketrighttp (0xF8F9) - t[63738] = 0x23A5; // bracketrightex (0xF8FA) - t[63739] = 0x23A6; // bracketrightbt (0xF8FB) - t[63723] = 0x239B; // parenlefttp (0xF8EB) - t[63724] = 0x239C; // parenleftex (0xF8EC) - t[63725] = 0x239D; // parenleftbt (0xF8ED) - t[63734] = 0x239E; // parenrighttp (0xF8F6) - t[63735] = 0x239F; // parenrightex (0xF8F7) - t[63736] = 0x23A0; // parenrightbt (0xF8F8) - }); - - function mapSpecialUnicodeValues(code) { - if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block. - return 0; - } else if (code >= 0xF600 && code <= 0xF8FF) { - return (getSpecialPUASymbols()[code] || code); - } - return code; - } - - function getUnicodeForGlyph(name, glyphsUnicodeMap) { - var unicode = glyphsUnicodeMap[name]; - if (unicode !== undefined) { - return unicode; - } - if (!name) { - return -1; - } - // Try to recover valid Unicode values from 'uniXXXX'/'uXXXX{XX}' glyphs. - if (name[0] === 'u') { - var nameLen = name.length, hexStr; - - if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') { // 'uniXXXX' - hexStr = name.substr(3); - } else if (nameLen >= 5 && nameLen <= 7) { // 'uXXXX{XX}' - hexStr = name.substr(1); - } else { - return -1; - } - // Check for upper-case hexadecimal characters, to avoid false positives. - if (hexStr === hexStr.toUpperCase()) { - unicode = parseInt(hexStr, 16); - if (unicode >= 0) { - return unicode; - } - } - } - return -1; - } - - var UnicodeRanges = [ - { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin - { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement - { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A - { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B - { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions - { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters - { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks - { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic - { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic - { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic - { 'begin': 0x0530, 'end': 0x058F }, // Armenian - { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew - { 'begin': 0xA500, 'end': 0xA63F }, // Vai - { 'begin': 0x0600, 'end': 0x06FF }, // Arabic - { 'begin': 0x07C0, 'end': 0x07FF }, // NKo - { 'begin': 0x0900, 'end': 0x097F }, // Devanagari - { 'begin': 0x0980, 'end': 0x09FF }, // Bengali - { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi - { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati - { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya - { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil - { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu - { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada - { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam - { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai - { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao - { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian - { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese - { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo - { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional - { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended - { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation - { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts - { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol - { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks - { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols - { 'begin': 0x2150, 'end': 0x218F }, // Number Forms - { 'begin': 0x2190, 'end': 0x21FF }, // Arrows - { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators - { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical - { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures - { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition - { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics - { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing - { 'begin': 0x2580, 'end': 0x259F }, // Block Elements - { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes - { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols - { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats - { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation - { 'begin': 0x3040, 'end': 0x309F }, // Hiragana - { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana - { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo - { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo - { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa - { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months - { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility - { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables - { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 * - { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia - { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs - { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0) - { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes - { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms - { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A - { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks - { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms - { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants - { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B - { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms - { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials - { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan - { 'begin': 0x0700, 'end': 0x074F }, // Syriac - { 'begin': 0x0780, 'end': 0x07BF }, // Thaana - { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala - { 'begin': 0x1000, 'end': 0x109F }, // Myanmar - { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic - { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee - { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics - { 'begin': 0x1680, 'end': 0x169F }, // Ogham - { 'begin': 0x16A0, 'end': 0x16FF }, // Runic - { 'begin': 0x1780, 'end': 0x17FF }, // Khmer - { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian - { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns - { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables - { 'begin': 0x1700, 'end': 0x171F }, // Tagalog - { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic - { 'begin': 0x10330, 'end': 0x1034F }, // Gothic - { 'begin': 0x10400, 'end': 0x1044F }, // Deseret - { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols - { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols - { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15) - { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors - { 'begin': 0xE0000, 'end': 0xE007F }, // Tags - { 'begin': 0x1900, 'end': 0x194F }, // Limbu - { 'begin': 0x1950, 'end': 0x197F }, // Tai Le - { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue - { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese - { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic - { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh - { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols - { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri - { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary - { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers - { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic - { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian - { 'begin': 0x10450, 'end': 0x1047F }, // Shavian - { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya - { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary - { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi - { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols - { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform - { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals - { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese - { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha - { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki - { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra - { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li - { 'begin': 0xA930, 'end': 0xA95F }, // Rejang - { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham - { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols - { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc - { 'begin': 0x102A0, 'end': 0x102DF }, // Carian - { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles - ]; - - function getUnicodeRangeFor(value) { - for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { - var range = UnicodeRanges[i]; - if (value >= range.begin && value < range.end) { - return i; - } - } - return -1; - } - - function isRTLRangeFor(value) { - var range = UnicodeRanges[13]; - if (value >= range.begin && value < range.end) { - return true; - } - range = UnicodeRanges[11]; - if (value >= range.begin && value < range.end) { - return true; - } - return false; - } - - // The normalization table is obtained by filtering the Unicode characters - // database with entries. - var getNormalizedUnicodes = getLookupTableFactory(function (t) { - t['\u00A8'] = '\u0020\u0308'; - t['\u00AF'] = '\u0020\u0304'; - t['\u00B4'] = '\u0020\u0301'; - t['\u00B5'] = '\u03BC'; - t['\u00B8'] = '\u0020\u0327'; - t['\u0132'] = '\u0049\u004A'; - t['\u0133'] = '\u0069\u006A'; - t['\u013F'] = '\u004C\u00B7'; - t['\u0140'] = '\u006C\u00B7'; - t['\u0149'] = '\u02BC\u006E'; - t['\u017F'] = '\u0073'; - t['\u01C4'] = '\u0044\u017D'; - t['\u01C5'] = '\u0044\u017E'; - t['\u01C6'] = '\u0064\u017E'; - t['\u01C7'] = '\u004C\u004A'; - t['\u01C8'] = '\u004C\u006A'; - t['\u01C9'] = '\u006C\u006A'; - t['\u01CA'] = '\u004E\u004A'; - t['\u01CB'] = '\u004E\u006A'; - t['\u01CC'] = '\u006E\u006A'; - t['\u01F1'] = '\u0044\u005A'; - t['\u01F2'] = '\u0044\u007A'; - t['\u01F3'] = '\u0064\u007A'; - t['\u02D8'] = '\u0020\u0306'; - t['\u02D9'] = '\u0020\u0307'; - t['\u02DA'] = '\u0020\u030A'; - t['\u02DB'] = '\u0020\u0328'; - t['\u02DC'] = '\u0020\u0303'; - t['\u02DD'] = '\u0020\u030B'; - t['\u037A'] = '\u0020\u0345'; - t['\u0384'] = '\u0020\u0301'; - t['\u03D0'] = '\u03B2'; - t['\u03D1'] = '\u03B8'; - t['\u03D2'] = '\u03A5'; - t['\u03D5'] = '\u03C6'; - t['\u03D6'] = '\u03C0'; - t['\u03F0'] = '\u03BA'; - t['\u03F1'] = '\u03C1'; - t['\u03F2'] = '\u03C2'; - t['\u03F4'] = '\u0398'; - t['\u03F5'] = '\u03B5'; - t['\u03F9'] = '\u03A3'; - t['\u0587'] = '\u0565\u0582'; - t['\u0675'] = '\u0627\u0674'; - t['\u0676'] = '\u0648\u0674'; - t['\u0677'] = '\u06C7\u0674'; - t['\u0678'] = '\u064A\u0674'; - t['\u0E33'] = '\u0E4D\u0E32'; - t['\u0EB3'] = '\u0ECD\u0EB2'; - t['\u0EDC'] = '\u0EAB\u0E99'; - t['\u0EDD'] = '\u0EAB\u0EA1'; - t['\u0F77'] = '\u0FB2\u0F81'; - t['\u0F79'] = '\u0FB3\u0F81'; - t['\u1E9A'] = '\u0061\u02BE'; - t['\u1FBD'] = '\u0020\u0313'; - t['\u1FBF'] = '\u0020\u0313'; - t['\u1FC0'] = '\u0020\u0342'; - t['\u1FFE'] = '\u0020\u0314'; - t['\u2002'] = '\u0020'; - t['\u2003'] = '\u0020'; - t['\u2004'] = '\u0020'; - t['\u2005'] = '\u0020'; - t['\u2006'] = '\u0020'; - t['\u2008'] = '\u0020'; - t['\u2009'] = '\u0020'; - t['\u200A'] = '\u0020'; - t['\u2017'] = '\u0020\u0333'; - t['\u2024'] = '\u002E'; - t['\u2025'] = '\u002E\u002E'; - t['\u2026'] = '\u002E\u002E\u002E'; - t['\u2033'] = '\u2032\u2032'; - t['\u2034'] = '\u2032\u2032\u2032'; - t['\u2036'] = '\u2035\u2035'; - t['\u2037'] = '\u2035\u2035\u2035'; - t['\u203C'] = '\u0021\u0021'; - t['\u203E'] = '\u0020\u0305'; - t['\u2047'] = '\u003F\u003F'; - t['\u2048'] = '\u003F\u0021'; - t['\u2049'] = '\u0021\u003F'; - t['\u2057'] = '\u2032\u2032\u2032\u2032'; - t['\u205F'] = '\u0020'; - t['\u20A8'] = '\u0052\u0073'; - t['\u2100'] = '\u0061\u002F\u0063'; - t['\u2101'] = '\u0061\u002F\u0073'; - t['\u2103'] = '\u00B0\u0043'; - t['\u2105'] = '\u0063\u002F\u006F'; - t['\u2106'] = '\u0063\u002F\u0075'; - t['\u2107'] = '\u0190'; - t['\u2109'] = '\u00B0\u0046'; - t['\u2116'] = '\u004E\u006F'; - t['\u2121'] = '\u0054\u0045\u004C'; - t['\u2135'] = '\u05D0'; - t['\u2136'] = '\u05D1'; - t['\u2137'] = '\u05D2'; - t['\u2138'] = '\u05D3'; - t['\u213B'] = '\u0046\u0041\u0058'; - t['\u2160'] = '\u0049'; - t['\u2161'] = '\u0049\u0049'; - t['\u2162'] = '\u0049\u0049\u0049'; - t['\u2163'] = '\u0049\u0056'; - t['\u2164'] = '\u0056'; - t['\u2165'] = '\u0056\u0049'; - t['\u2166'] = '\u0056\u0049\u0049'; - t['\u2167'] = '\u0056\u0049\u0049\u0049'; - t['\u2168'] = '\u0049\u0058'; - t['\u2169'] = '\u0058'; - t['\u216A'] = '\u0058\u0049'; - t['\u216B'] = '\u0058\u0049\u0049'; - t['\u216C'] = '\u004C'; - t['\u216D'] = '\u0043'; - t['\u216E'] = '\u0044'; - t['\u216F'] = '\u004D'; - t['\u2170'] = '\u0069'; - t['\u2171'] = '\u0069\u0069'; - t['\u2172'] = '\u0069\u0069\u0069'; - t['\u2173'] = '\u0069\u0076'; - t['\u2174'] = '\u0076'; - t['\u2175'] = '\u0076\u0069'; - t['\u2176'] = '\u0076\u0069\u0069'; - t['\u2177'] = '\u0076\u0069\u0069\u0069'; - t['\u2178'] = '\u0069\u0078'; - t['\u2179'] = '\u0078'; - t['\u217A'] = '\u0078\u0069'; - t['\u217B'] = '\u0078\u0069\u0069'; - t['\u217C'] = '\u006C'; - t['\u217D'] = '\u0063'; - t['\u217E'] = '\u0064'; - t['\u217F'] = '\u006D'; - t['\u222C'] = '\u222B\u222B'; - t['\u222D'] = '\u222B\u222B\u222B'; - t['\u222F'] = '\u222E\u222E'; - t['\u2230'] = '\u222E\u222E\u222E'; - t['\u2474'] = '\u0028\u0031\u0029'; - t['\u2475'] = '\u0028\u0032\u0029'; - t['\u2476'] = '\u0028\u0033\u0029'; - t['\u2477'] = '\u0028\u0034\u0029'; - t['\u2478'] = '\u0028\u0035\u0029'; - t['\u2479'] = '\u0028\u0036\u0029'; - t['\u247A'] = '\u0028\u0037\u0029'; - t['\u247B'] = '\u0028\u0038\u0029'; - t['\u247C'] = '\u0028\u0039\u0029'; - t['\u247D'] = '\u0028\u0031\u0030\u0029'; - t['\u247E'] = '\u0028\u0031\u0031\u0029'; - t['\u247F'] = '\u0028\u0031\u0032\u0029'; - t['\u2480'] = '\u0028\u0031\u0033\u0029'; - t['\u2481'] = '\u0028\u0031\u0034\u0029'; - t['\u2482'] = '\u0028\u0031\u0035\u0029'; - t['\u2483'] = '\u0028\u0031\u0036\u0029'; - t['\u2484'] = '\u0028\u0031\u0037\u0029'; - t['\u2485'] = '\u0028\u0031\u0038\u0029'; - t['\u2486'] = '\u0028\u0031\u0039\u0029'; - t['\u2487'] = '\u0028\u0032\u0030\u0029'; - t['\u2488'] = '\u0031\u002E'; - t['\u2489'] = '\u0032\u002E'; - t['\u248A'] = '\u0033\u002E'; - t['\u248B'] = '\u0034\u002E'; - t['\u248C'] = '\u0035\u002E'; - t['\u248D'] = '\u0036\u002E'; - t['\u248E'] = '\u0037\u002E'; - t['\u248F'] = '\u0038\u002E'; - t['\u2490'] = '\u0039\u002E'; - t['\u2491'] = '\u0031\u0030\u002E'; - t['\u2492'] = '\u0031\u0031\u002E'; - t['\u2493'] = '\u0031\u0032\u002E'; - t['\u2494'] = '\u0031\u0033\u002E'; - t['\u2495'] = '\u0031\u0034\u002E'; - t['\u2496'] = '\u0031\u0035\u002E'; - t['\u2497'] = '\u0031\u0036\u002E'; - t['\u2498'] = '\u0031\u0037\u002E'; - t['\u2499'] = '\u0031\u0038\u002E'; - t['\u249A'] = '\u0031\u0039\u002E'; - t['\u249B'] = '\u0032\u0030\u002E'; - t['\u249C'] = '\u0028\u0061\u0029'; - t['\u249D'] = '\u0028\u0062\u0029'; - t['\u249E'] = '\u0028\u0063\u0029'; - t['\u249F'] = '\u0028\u0064\u0029'; - t['\u24A0'] = '\u0028\u0065\u0029'; - t['\u24A1'] = '\u0028\u0066\u0029'; - t['\u24A2'] = '\u0028\u0067\u0029'; - t['\u24A3'] = '\u0028\u0068\u0029'; - t['\u24A4'] = '\u0028\u0069\u0029'; - t['\u24A5'] = '\u0028\u006A\u0029'; - t['\u24A6'] = '\u0028\u006B\u0029'; - t['\u24A7'] = '\u0028\u006C\u0029'; - t['\u24A8'] = '\u0028\u006D\u0029'; - t['\u24A9'] = '\u0028\u006E\u0029'; - t['\u24AA'] = '\u0028\u006F\u0029'; - t['\u24AB'] = '\u0028\u0070\u0029'; - t['\u24AC'] = '\u0028\u0071\u0029'; - t['\u24AD'] = '\u0028\u0072\u0029'; - t['\u24AE'] = '\u0028\u0073\u0029'; - t['\u24AF'] = '\u0028\u0074\u0029'; - t['\u24B0'] = '\u0028\u0075\u0029'; - t['\u24B1'] = '\u0028\u0076\u0029'; - t['\u24B2'] = '\u0028\u0077\u0029'; - t['\u24B3'] = '\u0028\u0078\u0029'; - t['\u24B4'] = '\u0028\u0079\u0029'; - t['\u24B5'] = '\u0028\u007A\u0029'; - t['\u2A0C'] = '\u222B\u222B\u222B\u222B'; - t['\u2A74'] = '\u003A\u003A\u003D'; - t['\u2A75'] = '\u003D\u003D'; - t['\u2A76'] = '\u003D\u003D\u003D'; - t['\u2E9F'] = '\u6BCD'; - t['\u2EF3'] = '\u9F9F'; - t['\u2F00'] = '\u4E00'; - t['\u2F01'] = '\u4E28'; - t['\u2F02'] = '\u4E36'; - t['\u2F03'] = '\u4E3F'; - t['\u2F04'] = '\u4E59'; - t['\u2F05'] = '\u4E85'; - t['\u2F06'] = '\u4E8C'; - t['\u2F07'] = '\u4EA0'; - t['\u2F08'] = '\u4EBA'; - t['\u2F09'] = '\u513F'; - t['\u2F0A'] = '\u5165'; - t['\u2F0B'] = '\u516B'; - t['\u2F0C'] = '\u5182'; - t['\u2F0D'] = '\u5196'; - t['\u2F0E'] = '\u51AB'; - t['\u2F0F'] = '\u51E0'; - t['\u2F10'] = '\u51F5'; - t['\u2F11'] = '\u5200'; - t['\u2F12'] = '\u529B'; - t['\u2F13'] = '\u52F9'; - t['\u2F14'] = '\u5315'; - t['\u2F15'] = '\u531A'; - t['\u2F16'] = '\u5338'; - t['\u2F17'] = '\u5341'; - t['\u2F18'] = '\u535C'; - t['\u2F19'] = '\u5369'; - t['\u2F1A'] = '\u5382'; - t['\u2F1B'] = '\u53B6'; - t['\u2F1C'] = '\u53C8'; - t['\u2F1D'] = '\u53E3'; - t['\u2F1E'] = '\u56D7'; - t['\u2F1F'] = '\u571F'; - t['\u2F20'] = '\u58EB'; - t['\u2F21'] = '\u5902'; - t['\u2F22'] = '\u590A'; - t['\u2F23'] = '\u5915'; - t['\u2F24'] = '\u5927'; - t['\u2F25'] = '\u5973'; - t['\u2F26'] = '\u5B50'; - t['\u2F27'] = '\u5B80'; - t['\u2F28'] = '\u5BF8'; - t['\u2F29'] = '\u5C0F'; - t['\u2F2A'] = '\u5C22'; - t['\u2F2B'] = '\u5C38'; - t['\u2F2C'] = '\u5C6E'; - t['\u2F2D'] = '\u5C71'; - t['\u2F2E'] = '\u5DDB'; - t['\u2F2F'] = '\u5DE5'; - t['\u2F30'] = '\u5DF1'; - t['\u2F31'] = '\u5DFE'; - t['\u2F32'] = '\u5E72'; - t['\u2F33'] = '\u5E7A'; - t['\u2F34'] = '\u5E7F'; - t['\u2F35'] = '\u5EF4'; - t['\u2F36'] = '\u5EFE'; - t['\u2F37'] = '\u5F0B'; - t['\u2F38'] = '\u5F13'; - t['\u2F39'] = '\u5F50'; - t['\u2F3A'] = '\u5F61'; - t['\u2F3B'] = '\u5F73'; - t['\u2F3C'] = '\u5FC3'; - t['\u2F3D'] = '\u6208'; - t['\u2F3E'] = '\u6236'; - t['\u2F3F'] = '\u624B'; - t['\u2F40'] = '\u652F'; - t['\u2F41'] = '\u6534'; - t['\u2F42'] = '\u6587'; - t['\u2F43'] = '\u6597'; - t['\u2F44'] = '\u65A4'; - t['\u2F45'] = '\u65B9'; - t['\u2F46'] = '\u65E0'; - t['\u2F47'] = '\u65E5'; - t['\u2F48'] = '\u66F0'; - t['\u2F49'] = '\u6708'; - t['\u2F4A'] = '\u6728'; - t['\u2F4B'] = '\u6B20'; - t['\u2F4C'] = '\u6B62'; - t['\u2F4D'] = '\u6B79'; - t['\u2F4E'] = '\u6BB3'; - t['\u2F4F'] = '\u6BCB'; - t['\u2F50'] = '\u6BD4'; - t['\u2F51'] = '\u6BDB'; - t['\u2F52'] = '\u6C0F'; - t['\u2F53'] = '\u6C14'; - t['\u2F54'] = '\u6C34'; - t['\u2F55'] = '\u706B'; - t['\u2F56'] = '\u722A'; - t['\u2F57'] = '\u7236'; - t['\u2F58'] = '\u723B'; - t['\u2F59'] = '\u723F'; - t['\u2F5A'] = '\u7247'; - t['\u2F5B'] = '\u7259'; - t['\u2F5C'] = '\u725B'; - t['\u2F5D'] = '\u72AC'; - t['\u2F5E'] = '\u7384'; - t['\u2F5F'] = '\u7389'; - t['\u2F60'] = '\u74DC'; - t['\u2F61'] = '\u74E6'; - t['\u2F62'] = '\u7518'; - t['\u2F63'] = '\u751F'; - t['\u2F64'] = '\u7528'; - t['\u2F65'] = '\u7530'; - t['\u2F66'] = '\u758B'; - t['\u2F67'] = '\u7592'; - t['\u2F68'] = '\u7676'; - t['\u2F69'] = '\u767D'; - t['\u2F6A'] = '\u76AE'; - t['\u2F6B'] = '\u76BF'; - t['\u2F6C'] = '\u76EE'; - t['\u2F6D'] = '\u77DB'; - t['\u2F6E'] = '\u77E2'; - t['\u2F6F'] = '\u77F3'; - t['\u2F70'] = '\u793A'; - t['\u2F71'] = '\u79B8'; - t['\u2F72'] = '\u79BE'; - t['\u2F73'] = '\u7A74'; - t['\u2F74'] = '\u7ACB'; - t['\u2F75'] = '\u7AF9'; - t['\u2F76'] = '\u7C73'; - t['\u2F77'] = '\u7CF8'; - t['\u2F78'] = '\u7F36'; - t['\u2F79'] = '\u7F51'; - t['\u2F7A'] = '\u7F8A'; - t['\u2F7B'] = '\u7FBD'; - t['\u2F7C'] = '\u8001'; - t['\u2F7D'] = '\u800C'; - t['\u2F7E'] = '\u8012'; - t['\u2F7F'] = '\u8033'; - t['\u2F80'] = '\u807F'; - t['\u2F81'] = '\u8089'; - t['\u2F82'] = '\u81E3'; - t['\u2F83'] = '\u81EA'; - t['\u2F84'] = '\u81F3'; - t['\u2F85'] = '\u81FC'; - t['\u2F86'] = '\u820C'; - t['\u2F87'] = '\u821B'; - t['\u2F88'] = '\u821F'; - t['\u2F89'] = '\u826E'; - t['\u2F8A'] = '\u8272'; - t['\u2F8B'] = '\u8278'; - t['\u2F8C'] = '\u864D'; - t['\u2F8D'] = '\u866B'; - t['\u2F8E'] = '\u8840'; - t['\u2F8F'] = '\u884C'; - t['\u2F90'] = '\u8863'; - t['\u2F91'] = '\u897E'; - t['\u2F92'] = '\u898B'; - t['\u2F93'] = '\u89D2'; - t['\u2F94'] = '\u8A00'; - t['\u2F95'] = '\u8C37'; - t['\u2F96'] = '\u8C46'; - t['\u2F97'] = '\u8C55'; - t['\u2F98'] = '\u8C78'; - t['\u2F99'] = '\u8C9D'; - t['\u2F9A'] = '\u8D64'; - t['\u2F9B'] = '\u8D70'; - t['\u2F9C'] = '\u8DB3'; - t['\u2F9D'] = '\u8EAB'; - t['\u2F9E'] = '\u8ECA'; - t['\u2F9F'] = '\u8F9B'; - t['\u2FA0'] = '\u8FB0'; - t['\u2FA1'] = '\u8FB5'; - t['\u2FA2'] = '\u9091'; - t['\u2FA3'] = '\u9149'; - t['\u2FA4'] = '\u91C6'; - t['\u2FA5'] = '\u91CC'; - t['\u2FA6'] = '\u91D1'; - t['\u2FA7'] = '\u9577'; - t['\u2FA8'] = '\u9580'; - t['\u2FA9'] = '\u961C'; - t['\u2FAA'] = '\u96B6'; - t['\u2FAB'] = '\u96B9'; - t['\u2FAC'] = '\u96E8'; - t['\u2FAD'] = '\u9751'; - t['\u2FAE'] = '\u975E'; - t['\u2FAF'] = '\u9762'; - t['\u2FB0'] = '\u9769'; - t['\u2FB1'] = '\u97CB'; - t['\u2FB2'] = '\u97ED'; - t['\u2FB3'] = '\u97F3'; - t['\u2FB4'] = '\u9801'; - t['\u2FB5'] = '\u98A8'; - t['\u2FB6'] = '\u98DB'; - t['\u2FB7'] = '\u98DF'; - t['\u2FB8'] = '\u9996'; - t['\u2FB9'] = '\u9999'; - t['\u2FBA'] = '\u99AC'; - t['\u2FBB'] = '\u9AA8'; - t['\u2FBC'] = '\u9AD8'; - t['\u2FBD'] = '\u9ADF'; - t['\u2FBE'] = '\u9B25'; - t['\u2FBF'] = '\u9B2F'; - t['\u2FC0'] = '\u9B32'; - t['\u2FC1'] = '\u9B3C'; - t['\u2FC2'] = '\u9B5A'; - t['\u2FC3'] = '\u9CE5'; - t['\u2FC4'] = '\u9E75'; - t['\u2FC5'] = '\u9E7F'; - t['\u2FC6'] = '\u9EA5'; - t['\u2FC7'] = '\u9EBB'; - t['\u2FC8'] = '\u9EC3'; - t['\u2FC9'] = '\u9ECD'; - t['\u2FCA'] = '\u9ED1'; - t['\u2FCB'] = '\u9EF9'; - t['\u2FCC'] = '\u9EFD'; - t['\u2FCD'] = '\u9F0E'; - t['\u2FCE'] = '\u9F13'; - t['\u2FCF'] = '\u9F20'; - t['\u2FD0'] = '\u9F3B'; - t['\u2FD1'] = '\u9F4A'; - t['\u2FD2'] = '\u9F52'; - t['\u2FD3'] = '\u9F8D'; - t['\u2FD4'] = '\u9F9C'; - t['\u2FD5'] = '\u9FA0'; - t['\u3036'] = '\u3012'; - t['\u3038'] = '\u5341'; - t['\u3039'] = '\u5344'; - t['\u303A'] = '\u5345'; - t['\u309B'] = '\u0020\u3099'; - t['\u309C'] = '\u0020\u309A'; - t['\u3131'] = '\u1100'; - t['\u3132'] = '\u1101'; - t['\u3133'] = '\u11AA'; - t['\u3134'] = '\u1102'; - t['\u3135'] = '\u11AC'; - t['\u3136'] = '\u11AD'; - t['\u3137'] = '\u1103'; - t['\u3138'] = '\u1104'; - t['\u3139'] = '\u1105'; - t['\u313A'] = '\u11B0'; - t['\u313B'] = '\u11B1'; - t['\u313C'] = '\u11B2'; - t['\u313D'] = '\u11B3'; - t['\u313E'] = '\u11B4'; - t['\u313F'] = '\u11B5'; - t['\u3140'] = '\u111A'; - t['\u3141'] = '\u1106'; - t['\u3142'] = '\u1107'; - t['\u3143'] = '\u1108'; - t['\u3144'] = '\u1121'; - t['\u3145'] = '\u1109'; - t['\u3146'] = '\u110A'; - t['\u3147'] = '\u110B'; - t['\u3148'] = '\u110C'; - t['\u3149'] = '\u110D'; - t['\u314A'] = '\u110E'; - t['\u314B'] = '\u110F'; - t['\u314C'] = '\u1110'; - t['\u314D'] = '\u1111'; - t['\u314E'] = '\u1112'; - t['\u314F'] = '\u1161'; - t['\u3150'] = '\u1162'; - t['\u3151'] = '\u1163'; - t['\u3152'] = '\u1164'; - t['\u3153'] = '\u1165'; - t['\u3154'] = '\u1166'; - t['\u3155'] = '\u1167'; - t['\u3156'] = '\u1168'; - t['\u3157'] = '\u1169'; - t['\u3158'] = '\u116A'; - t['\u3159'] = '\u116B'; - t['\u315A'] = '\u116C'; - t['\u315B'] = '\u116D'; - t['\u315C'] = '\u116E'; - t['\u315D'] = '\u116F'; - t['\u315E'] = '\u1170'; - t['\u315F'] = '\u1171'; - t['\u3160'] = '\u1172'; - t['\u3161'] = '\u1173'; - t['\u3162'] = '\u1174'; - t['\u3163'] = '\u1175'; - t['\u3164'] = '\u1160'; - t['\u3165'] = '\u1114'; - t['\u3166'] = '\u1115'; - t['\u3167'] = '\u11C7'; - t['\u3168'] = '\u11C8'; - t['\u3169'] = '\u11CC'; - t['\u316A'] = '\u11CE'; - t['\u316B'] = '\u11D3'; - t['\u316C'] = '\u11D7'; - t['\u316D'] = '\u11D9'; - t['\u316E'] = '\u111C'; - t['\u316F'] = '\u11DD'; - t['\u3170'] = '\u11DF'; - t['\u3171'] = '\u111D'; - t['\u3172'] = '\u111E'; - t['\u3173'] = '\u1120'; - t['\u3174'] = '\u1122'; - t['\u3175'] = '\u1123'; - t['\u3176'] = '\u1127'; - t['\u3177'] = '\u1129'; - t['\u3178'] = '\u112B'; - t['\u3179'] = '\u112C'; - t['\u317A'] = '\u112D'; - t['\u317B'] = '\u112E'; - t['\u317C'] = '\u112F'; - t['\u317D'] = '\u1132'; - t['\u317E'] = '\u1136'; - t['\u317F'] = '\u1140'; - t['\u3180'] = '\u1147'; - t['\u3181'] = '\u114C'; - t['\u3182'] = '\u11F1'; - t['\u3183'] = '\u11F2'; - t['\u3184'] = '\u1157'; - t['\u3185'] = '\u1158'; - t['\u3186'] = '\u1159'; - t['\u3187'] = '\u1184'; - t['\u3188'] = '\u1185'; - t['\u3189'] = '\u1188'; - t['\u318A'] = '\u1191'; - t['\u318B'] = '\u1192'; - t['\u318C'] = '\u1194'; - t['\u318D'] = '\u119E'; - t['\u318E'] = '\u11A1'; - t['\u3200'] = '\u0028\u1100\u0029'; - t['\u3201'] = '\u0028\u1102\u0029'; - t['\u3202'] = '\u0028\u1103\u0029'; - t['\u3203'] = '\u0028\u1105\u0029'; - t['\u3204'] = '\u0028\u1106\u0029'; - t['\u3205'] = '\u0028\u1107\u0029'; - t['\u3206'] = '\u0028\u1109\u0029'; - t['\u3207'] = '\u0028\u110B\u0029'; - t['\u3208'] = '\u0028\u110C\u0029'; - t['\u3209'] = '\u0028\u110E\u0029'; - t['\u320A'] = '\u0028\u110F\u0029'; - t['\u320B'] = '\u0028\u1110\u0029'; - t['\u320C'] = '\u0028\u1111\u0029'; - t['\u320D'] = '\u0028\u1112\u0029'; - t['\u320E'] = '\u0028\u1100\u1161\u0029'; - t['\u320F'] = '\u0028\u1102\u1161\u0029'; - t['\u3210'] = '\u0028\u1103\u1161\u0029'; - t['\u3211'] = '\u0028\u1105\u1161\u0029'; - t['\u3212'] = '\u0028\u1106\u1161\u0029'; - t['\u3213'] = '\u0028\u1107\u1161\u0029'; - t['\u3214'] = '\u0028\u1109\u1161\u0029'; - t['\u3215'] = '\u0028\u110B\u1161\u0029'; - t['\u3216'] = '\u0028\u110C\u1161\u0029'; - t['\u3217'] = '\u0028\u110E\u1161\u0029'; - t['\u3218'] = '\u0028\u110F\u1161\u0029'; - t['\u3219'] = '\u0028\u1110\u1161\u0029'; - t['\u321A'] = '\u0028\u1111\u1161\u0029'; - t['\u321B'] = '\u0028\u1112\u1161\u0029'; - t['\u321C'] = '\u0028\u110C\u116E\u0029'; - t['\u321D'] = '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029'; - t['\u321E'] = '\u0028\u110B\u1169\u1112\u116E\u0029'; - t['\u3220'] = '\u0028\u4E00\u0029'; - t['\u3221'] = '\u0028\u4E8C\u0029'; - t['\u3222'] = '\u0028\u4E09\u0029'; - t['\u3223'] = '\u0028\u56DB\u0029'; - t['\u3224'] = '\u0028\u4E94\u0029'; - t['\u3225'] = '\u0028\u516D\u0029'; - t['\u3226'] = '\u0028\u4E03\u0029'; - t['\u3227'] = '\u0028\u516B\u0029'; - t['\u3228'] = '\u0028\u4E5D\u0029'; - t['\u3229'] = '\u0028\u5341\u0029'; - t['\u322A'] = '\u0028\u6708\u0029'; - t['\u322B'] = '\u0028\u706B\u0029'; - t['\u322C'] = '\u0028\u6C34\u0029'; - t['\u322D'] = '\u0028\u6728\u0029'; - t['\u322E'] = '\u0028\u91D1\u0029'; - t['\u322F'] = '\u0028\u571F\u0029'; - t['\u3230'] = '\u0028\u65E5\u0029'; - t['\u3231'] = '\u0028\u682A\u0029'; - t['\u3232'] = '\u0028\u6709\u0029'; - t['\u3233'] = '\u0028\u793E\u0029'; - t['\u3234'] = '\u0028\u540D\u0029'; - t['\u3235'] = '\u0028\u7279\u0029'; - t['\u3236'] = '\u0028\u8CA1\u0029'; - t['\u3237'] = '\u0028\u795D\u0029'; - t['\u3238'] = '\u0028\u52B4\u0029'; - t['\u3239'] = '\u0028\u4EE3\u0029'; - t['\u323A'] = '\u0028\u547C\u0029'; - t['\u323B'] = '\u0028\u5B66\u0029'; - t['\u323C'] = '\u0028\u76E3\u0029'; - t['\u323D'] = '\u0028\u4F01\u0029'; - t['\u323E'] = '\u0028\u8CC7\u0029'; - t['\u323F'] = '\u0028\u5354\u0029'; - t['\u3240'] = '\u0028\u796D\u0029'; - t['\u3241'] = '\u0028\u4F11\u0029'; - t['\u3242'] = '\u0028\u81EA\u0029'; - t['\u3243'] = '\u0028\u81F3\u0029'; - t['\u32C0'] = '\u0031\u6708'; - t['\u32C1'] = '\u0032\u6708'; - t['\u32C2'] = '\u0033\u6708'; - t['\u32C3'] = '\u0034\u6708'; - t['\u32C4'] = '\u0035\u6708'; - t['\u32C5'] = '\u0036\u6708'; - t['\u32C6'] = '\u0037\u6708'; - t['\u32C7'] = '\u0038\u6708'; - t['\u32C8'] = '\u0039\u6708'; - t['\u32C9'] = '\u0031\u0030\u6708'; - t['\u32CA'] = '\u0031\u0031\u6708'; - t['\u32CB'] = '\u0031\u0032\u6708'; - t['\u3358'] = '\u0030\u70B9'; - t['\u3359'] = '\u0031\u70B9'; - t['\u335A'] = '\u0032\u70B9'; - t['\u335B'] = '\u0033\u70B9'; - t['\u335C'] = '\u0034\u70B9'; - t['\u335D'] = '\u0035\u70B9'; - t['\u335E'] = '\u0036\u70B9'; - t['\u335F'] = '\u0037\u70B9'; - t['\u3360'] = '\u0038\u70B9'; - t['\u3361'] = '\u0039\u70B9'; - t['\u3362'] = '\u0031\u0030\u70B9'; - t['\u3363'] = '\u0031\u0031\u70B9'; - t['\u3364'] = '\u0031\u0032\u70B9'; - t['\u3365'] = '\u0031\u0033\u70B9'; - t['\u3366'] = '\u0031\u0034\u70B9'; - t['\u3367'] = '\u0031\u0035\u70B9'; - t['\u3368'] = '\u0031\u0036\u70B9'; - t['\u3369'] = '\u0031\u0037\u70B9'; - t['\u336A'] = '\u0031\u0038\u70B9'; - t['\u336B'] = '\u0031\u0039\u70B9'; - t['\u336C'] = '\u0032\u0030\u70B9'; - t['\u336D'] = '\u0032\u0031\u70B9'; - t['\u336E'] = '\u0032\u0032\u70B9'; - t['\u336F'] = '\u0032\u0033\u70B9'; - t['\u3370'] = '\u0032\u0034\u70B9'; - t['\u33E0'] = '\u0031\u65E5'; - t['\u33E1'] = '\u0032\u65E5'; - t['\u33E2'] = '\u0033\u65E5'; - t['\u33E3'] = '\u0034\u65E5'; - t['\u33E4'] = '\u0035\u65E5'; - t['\u33E5'] = '\u0036\u65E5'; - t['\u33E6'] = '\u0037\u65E5'; - t['\u33E7'] = '\u0038\u65E5'; - t['\u33E8'] = '\u0039\u65E5'; - t['\u33E9'] = '\u0031\u0030\u65E5'; - t['\u33EA'] = '\u0031\u0031\u65E5'; - t['\u33EB'] = '\u0031\u0032\u65E5'; - t['\u33EC'] = '\u0031\u0033\u65E5'; - t['\u33ED'] = '\u0031\u0034\u65E5'; - t['\u33EE'] = '\u0031\u0035\u65E5'; - t['\u33EF'] = '\u0031\u0036\u65E5'; - t['\u33F0'] = '\u0031\u0037\u65E5'; - t['\u33F1'] = '\u0031\u0038\u65E5'; - t['\u33F2'] = '\u0031\u0039\u65E5'; - t['\u33F3'] = '\u0032\u0030\u65E5'; - t['\u33F4'] = '\u0032\u0031\u65E5'; - t['\u33F5'] = '\u0032\u0032\u65E5'; - t['\u33F6'] = '\u0032\u0033\u65E5'; - t['\u33F7'] = '\u0032\u0034\u65E5'; - t['\u33F8'] = '\u0032\u0035\u65E5'; - t['\u33F9'] = '\u0032\u0036\u65E5'; - t['\u33FA'] = '\u0032\u0037\u65E5'; - t['\u33FB'] = '\u0032\u0038\u65E5'; - t['\u33FC'] = '\u0032\u0039\u65E5'; - t['\u33FD'] = '\u0033\u0030\u65E5'; - t['\u33FE'] = '\u0033\u0031\u65E5'; - t['\uFB00'] = '\u0066\u0066'; - t['\uFB01'] = '\u0066\u0069'; - t['\uFB02'] = '\u0066\u006C'; - t['\uFB03'] = '\u0066\u0066\u0069'; - t['\uFB04'] = '\u0066\u0066\u006C'; - t['\uFB05'] = '\u017F\u0074'; - t['\uFB06'] = '\u0073\u0074'; - t['\uFB13'] = '\u0574\u0576'; - t['\uFB14'] = '\u0574\u0565'; - t['\uFB15'] = '\u0574\u056B'; - t['\uFB16'] = '\u057E\u0576'; - t['\uFB17'] = '\u0574\u056D'; - t['\uFB4F'] = '\u05D0\u05DC'; - t['\uFB50'] = '\u0671'; - t['\uFB51'] = '\u0671'; - t['\uFB52'] = '\u067B'; - t['\uFB53'] = '\u067B'; - t['\uFB54'] = '\u067B'; - t['\uFB55'] = '\u067B'; - t['\uFB56'] = '\u067E'; - t['\uFB57'] = '\u067E'; - t['\uFB58'] = '\u067E'; - t['\uFB59'] = '\u067E'; - t['\uFB5A'] = '\u0680'; - t['\uFB5B'] = '\u0680'; - t['\uFB5C'] = '\u0680'; - t['\uFB5D'] = '\u0680'; - t['\uFB5E'] = '\u067A'; - t['\uFB5F'] = '\u067A'; - t['\uFB60'] = '\u067A'; - t['\uFB61'] = '\u067A'; - t['\uFB62'] = '\u067F'; - t['\uFB63'] = '\u067F'; - t['\uFB64'] = '\u067F'; - t['\uFB65'] = '\u067F'; - t['\uFB66'] = '\u0679'; - t['\uFB67'] = '\u0679'; - t['\uFB68'] = '\u0679'; - t['\uFB69'] = '\u0679'; - t['\uFB6A'] = '\u06A4'; - t['\uFB6B'] = '\u06A4'; - t['\uFB6C'] = '\u06A4'; - t['\uFB6D'] = '\u06A4'; - t['\uFB6E'] = '\u06A6'; - t['\uFB6F'] = '\u06A6'; - t['\uFB70'] = '\u06A6'; - t['\uFB71'] = '\u06A6'; - t['\uFB72'] = '\u0684'; - t['\uFB73'] = '\u0684'; - t['\uFB74'] = '\u0684'; - t['\uFB75'] = '\u0684'; - t['\uFB76'] = '\u0683'; - t['\uFB77'] = '\u0683'; - t['\uFB78'] = '\u0683'; - t['\uFB79'] = '\u0683'; - t['\uFB7A'] = '\u0686'; - t['\uFB7B'] = '\u0686'; - t['\uFB7C'] = '\u0686'; - t['\uFB7D'] = '\u0686'; - t['\uFB7E'] = '\u0687'; - t['\uFB7F'] = '\u0687'; - t['\uFB80'] = '\u0687'; - t['\uFB81'] = '\u0687'; - t['\uFB82'] = '\u068D'; - t['\uFB83'] = '\u068D'; - t['\uFB84'] = '\u068C'; - t['\uFB85'] = '\u068C'; - t['\uFB86'] = '\u068E'; - t['\uFB87'] = '\u068E'; - t['\uFB88'] = '\u0688'; - t['\uFB89'] = '\u0688'; - t['\uFB8A'] = '\u0698'; - t['\uFB8B'] = '\u0698'; - t['\uFB8C'] = '\u0691'; - t['\uFB8D'] = '\u0691'; - t['\uFB8E'] = '\u06A9'; - t['\uFB8F'] = '\u06A9'; - t['\uFB90'] = '\u06A9'; - t['\uFB91'] = '\u06A9'; - t['\uFB92'] = '\u06AF'; - t['\uFB93'] = '\u06AF'; - t['\uFB94'] = '\u06AF'; - t['\uFB95'] = '\u06AF'; - t['\uFB96'] = '\u06B3'; - t['\uFB97'] = '\u06B3'; - t['\uFB98'] = '\u06B3'; - t['\uFB99'] = '\u06B3'; - t['\uFB9A'] = '\u06B1'; - t['\uFB9B'] = '\u06B1'; - t['\uFB9C'] = '\u06B1'; - t['\uFB9D'] = '\u06B1'; - t['\uFB9E'] = '\u06BA'; - t['\uFB9F'] = '\u06BA'; - t['\uFBA0'] = '\u06BB'; - t['\uFBA1'] = '\u06BB'; - t['\uFBA2'] = '\u06BB'; - t['\uFBA3'] = '\u06BB'; - t['\uFBA4'] = '\u06C0'; - t['\uFBA5'] = '\u06C0'; - t['\uFBA6'] = '\u06C1'; - t['\uFBA7'] = '\u06C1'; - t['\uFBA8'] = '\u06C1'; - t['\uFBA9'] = '\u06C1'; - t['\uFBAA'] = '\u06BE'; - t['\uFBAB'] = '\u06BE'; - t['\uFBAC'] = '\u06BE'; - t['\uFBAD'] = '\u06BE'; - t['\uFBAE'] = '\u06D2'; - t['\uFBAF'] = '\u06D2'; - t['\uFBB0'] = '\u06D3'; - t['\uFBB1'] = '\u06D3'; - t['\uFBD3'] = '\u06AD'; - t['\uFBD4'] = '\u06AD'; - t['\uFBD5'] = '\u06AD'; - t['\uFBD6'] = '\u06AD'; - t['\uFBD7'] = '\u06C7'; - t['\uFBD8'] = '\u06C7'; - t['\uFBD9'] = '\u06C6'; - t['\uFBDA'] = '\u06C6'; - t['\uFBDB'] = '\u06C8'; - t['\uFBDC'] = '\u06C8'; - t['\uFBDD'] = '\u0677'; - t['\uFBDE'] = '\u06CB'; - t['\uFBDF'] = '\u06CB'; - t['\uFBE0'] = '\u06C5'; - t['\uFBE1'] = '\u06C5'; - t['\uFBE2'] = '\u06C9'; - t['\uFBE3'] = '\u06C9'; - t['\uFBE4'] = '\u06D0'; - t['\uFBE5'] = '\u06D0'; - t['\uFBE6'] = '\u06D0'; - t['\uFBE7'] = '\u06D0'; - t['\uFBE8'] = '\u0649'; - t['\uFBE9'] = '\u0649'; - t['\uFBEA'] = '\u0626\u0627'; - t['\uFBEB'] = '\u0626\u0627'; - t['\uFBEC'] = '\u0626\u06D5'; - t['\uFBED'] = '\u0626\u06D5'; - t['\uFBEE'] = '\u0626\u0648'; - t['\uFBEF'] = '\u0626\u0648'; - t['\uFBF0'] = '\u0626\u06C7'; - t['\uFBF1'] = '\u0626\u06C7'; - t['\uFBF2'] = '\u0626\u06C6'; - t['\uFBF3'] = '\u0626\u06C6'; - t['\uFBF4'] = '\u0626\u06C8'; - t['\uFBF5'] = '\u0626\u06C8'; - t['\uFBF6'] = '\u0626\u06D0'; - t['\uFBF7'] = '\u0626\u06D0'; - t['\uFBF8'] = '\u0626\u06D0'; - t['\uFBF9'] = '\u0626\u0649'; - t['\uFBFA'] = '\u0626\u0649'; - t['\uFBFB'] = '\u0626\u0649'; - t['\uFBFC'] = '\u06CC'; - t['\uFBFD'] = '\u06CC'; - t['\uFBFE'] = '\u06CC'; - t['\uFBFF'] = '\u06CC'; - t['\uFC00'] = '\u0626\u062C'; - t['\uFC01'] = '\u0626\u062D'; - t['\uFC02'] = '\u0626\u0645'; - t['\uFC03'] = '\u0626\u0649'; - t['\uFC04'] = '\u0626\u064A'; - t['\uFC05'] = '\u0628\u062C'; - t['\uFC06'] = '\u0628\u062D'; - t['\uFC07'] = '\u0628\u062E'; - t['\uFC08'] = '\u0628\u0645'; - t['\uFC09'] = '\u0628\u0649'; - t['\uFC0A'] = '\u0628\u064A'; - t['\uFC0B'] = '\u062A\u062C'; - t['\uFC0C'] = '\u062A\u062D'; - t['\uFC0D'] = '\u062A\u062E'; - t['\uFC0E'] = '\u062A\u0645'; - t['\uFC0F'] = '\u062A\u0649'; - t['\uFC10'] = '\u062A\u064A'; - t['\uFC11'] = '\u062B\u062C'; - t['\uFC12'] = '\u062B\u0645'; - t['\uFC13'] = '\u062B\u0649'; - t['\uFC14'] = '\u062B\u064A'; - t['\uFC15'] = '\u062C\u062D'; - t['\uFC16'] = '\u062C\u0645'; - t['\uFC17'] = '\u062D\u062C'; - t['\uFC18'] = '\u062D\u0645'; - t['\uFC19'] = '\u062E\u062C'; - t['\uFC1A'] = '\u062E\u062D'; - t['\uFC1B'] = '\u062E\u0645'; - t['\uFC1C'] = '\u0633\u062C'; - t['\uFC1D'] = '\u0633\u062D'; - t['\uFC1E'] = '\u0633\u062E'; - t['\uFC1F'] = '\u0633\u0645'; - t['\uFC20'] = '\u0635\u062D'; - t['\uFC21'] = '\u0635\u0645'; - t['\uFC22'] = '\u0636\u062C'; - t['\uFC23'] = '\u0636\u062D'; - t['\uFC24'] = '\u0636\u062E'; - t['\uFC25'] = '\u0636\u0645'; - t['\uFC26'] = '\u0637\u062D'; - t['\uFC27'] = '\u0637\u0645'; - t['\uFC28'] = '\u0638\u0645'; - t['\uFC29'] = '\u0639\u062C'; - t['\uFC2A'] = '\u0639\u0645'; - t['\uFC2B'] = '\u063A\u062C'; - t['\uFC2C'] = '\u063A\u0645'; - t['\uFC2D'] = '\u0641\u062C'; - t['\uFC2E'] = '\u0641\u062D'; - t['\uFC2F'] = '\u0641\u062E'; - t['\uFC30'] = '\u0641\u0645'; - t['\uFC31'] = '\u0641\u0649'; - t['\uFC32'] = '\u0641\u064A'; - t['\uFC33'] = '\u0642\u062D'; - t['\uFC34'] = '\u0642\u0645'; - t['\uFC35'] = '\u0642\u0649'; - t['\uFC36'] = '\u0642\u064A'; - t['\uFC37'] = '\u0643\u0627'; - t['\uFC38'] = '\u0643\u062C'; - t['\uFC39'] = '\u0643\u062D'; - t['\uFC3A'] = '\u0643\u062E'; - t['\uFC3B'] = '\u0643\u0644'; - t['\uFC3C'] = '\u0643\u0645'; - t['\uFC3D'] = '\u0643\u0649'; - t['\uFC3E'] = '\u0643\u064A'; - t['\uFC3F'] = '\u0644\u062C'; - t['\uFC40'] = '\u0644\u062D'; - t['\uFC41'] = '\u0644\u062E'; - t['\uFC42'] = '\u0644\u0645'; - t['\uFC43'] = '\u0644\u0649'; - t['\uFC44'] = '\u0644\u064A'; - t['\uFC45'] = '\u0645\u062C'; - t['\uFC46'] = '\u0645\u062D'; - t['\uFC47'] = '\u0645\u062E'; - t['\uFC48'] = '\u0645\u0645'; - t['\uFC49'] = '\u0645\u0649'; - t['\uFC4A'] = '\u0645\u064A'; - t['\uFC4B'] = '\u0646\u062C'; - t['\uFC4C'] = '\u0646\u062D'; - t['\uFC4D'] = '\u0646\u062E'; - t['\uFC4E'] = '\u0646\u0645'; - t['\uFC4F'] = '\u0646\u0649'; - t['\uFC50'] = '\u0646\u064A'; - t['\uFC51'] = '\u0647\u062C'; - t['\uFC52'] = '\u0647\u0645'; - t['\uFC53'] = '\u0647\u0649'; - t['\uFC54'] = '\u0647\u064A'; - t['\uFC55'] = '\u064A\u062C'; - t['\uFC56'] = '\u064A\u062D'; - t['\uFC57'] = '\u064A\u062E'; - t['\uFC58'] = '\u064A\u0645'; - t['\uFC59'] = '\u064A\u0649'; - t['\uFC5A'] = '\u064A\u064A'; - t['\uFC5B'] = '\u0630\u0670'; - t['\uFC5C'] = '\u0631\u0670'; - t['\uFC5D'] = '\u0649\u0670'; - t['\uFC5E'] = '\u0020\u064C\u0651'; - t['\uFC5F'] = '\u0020\u064D\u0651'; - t['\uFC60'] = '\u0020\u064E\u0651'; - t['\uFC61'] = '\u0020\u064F\u0651'; - t['\uFC62'] = '\u0020\u0650\u0651'; - t['\uFC63'] = '\u0020\u0651\u0670'; - t['\uFC64'] = '\u0626\u0631'; - t['\uFC65'] = '\u0626\u0632'; - t['\uFC66'] = '\u0626\u0645'; - t['\uFC67'] = '\u0626\u0646'; - t['\uFC68'] = '\u0626\u0649'; - t['\uFC69'] = '\u0626\u064A'; - t['\uFC6A'] = '\u0628\u0631'; - t['\uFC6B'] = '\u0628\u0632'; - t['\uFC6C'] = '\u0628\u0645'; - t['\uFC6D'] = '\u0628\u0646'; - t['\uFC6E'] = '\u0628\u0649'; - t['\uFC6F'] = '\u0628\u064A'; - t['\uFC70'] = '\u062A\u0631'; - t['\uFC71'] = '\u062A\u0632'; - t['\uFC72'] = '\u062A\u0645'; - t['\uFC73'] = '\u062A\u0646'; - t['\uFC74'] = '\u062A\u0649'; - t['\uFC75'] = '\u062A\u064A'; - t['\uFC76'] = '\u062B\u0631'; - t['\uFC77'] = '\u062B\u0632'; - t['\uFC78'] = '\u062B\u0645'; - t['\uFC79'] = '\u062B\u0646'; - t['\uFC7A'] = '\u062B\u0649'; - t['\uFC7B'] = '\u062B\u064A'; - t['\uFC7C'] = '\u0641\u0649'; - t['\uFC7D'] = '\u0641\u064A'; - t['\uFC7E'] = '\u0642\u0649'; - t['\uFC7F'] = '\u0642\u064A'; - t['\uFC80'] = '\u0643\u0627'; - t['\uFC81'] = '\u0643\u0644'; - t['\uFC82'] = '\u0643\u0645'; - t['\uFC83'] = '\u0643\u0649'; - t['\uFC84'] = '\u0643\u064A'; - t['\uFC85'] = '\u0644\u0645'; - t['\uFC86'] = '\u0644\u0649'; - t['\uFC87'] = '\u0644\u064A'; - t['\uFC88'] = '\u0645\u0627'; - t['\uFC89'] = '\u0645\u0645'; - t['\uFC8A'] = '\u0646\u0631'; - t['\uFC8B'] = '\u0646\u0632'; - t['\uFC8C'] = '\u0646\u0645'; - t['\uFC8D'] = '\u0646\u0646'; - t['\uFC8E'] = '\u0646\u0649'; - t['\uFC8F'] = '\u0646\u064A'; - t['\uFC90'] = '\u0649\u0670'; - t['\uFC91'] = '\u064A\u0631'; - t['\uFC92'] = '\u064A\u0632'; - t['\uFC93'] = '\u064A\u0645'; - t['\uFC94'] = '\u064A\u0646'; - t['\uFC95'] = '\u064A\u0649'; - t['\uFC96'] = '\u064A\u064A'; - t['\uFC97'] = '\u0626\u062C'; - t['\uFC98'] = '\u0626\u062D'; - t['\uFC99'] = '\u0626\u062E'; - t['\uFC9A'] = '\u0626\u0645'; - t['\uFC9B'] = '\u0626\u0647'; - t['\uFC9C'] = '\u0628\u062C'; - t['\uFC9D'] = '\u0628\u062D'; - t['\uFC9E'] = '\u0628\u062E'; - t['\uFC9F'] = '\u0628\u0645'; - t['\uFCA0'] = '\u0628\u0647'; - t['\uFCA1'] = '\u062A\u062C'; - t['\uFCA2'] = '\u062A\u062D'; - t['\uFCA3'] = '\u062A\u062E'; - t['\uFCA4'] = '\u062A\u0645'; - t['\uFCA5'] = '\u062A\u0647'; - t['\uFCA6'] = '\u062B\u0645'; - t['\uFCA7'] = '\u062C\u062D'; - t['\uFCA8'] = '\u062C\u0645'; - t['\uFCA9'] = '\u062D\u062C'; - t['\uFCAA'] = '\u062D\u0645'; - t['\uFCAB'] = '\u062E\u062C'; - t['\uFCAC'] = '\u062E\u0645'; - t['\uFCAD'] = '\u0633\u062C'; - t['\uFCAE'] = '\u0633\u062D'; - t['\uFCAF'] = '\u0633\u062E'; - t['\uFCB0'] = '\u0633\u0645'; - t['\uFCB1'] = '\u0635\u062D'; - t['\uFCB2'] = '\u0635\u062E'; - t['\uFCB3'] = '\u0635\u0645'; - t['\uFCB4'] = '\u0636\u062C'; - t['\uFCB5'] = '\u0636\u062D'; - t['\uFCB6'] = '\u0636\u062E'; - t['\uFCB7'] = '\u0636\u0645'; - t['\uFCB8'] = '\u0637\u062D'; - t['\uFCB9'] = '\u0638\u0645'; - t['\uFCBA'] = '\u0639\u062C'; - t['\uFCBB'] = '\u0639\u0645'; - t['\uFCBC'] = '\u063A\u062C'; - t['\uFCBD'] = '\u063A\u0645'; - t['\uFCBE'] = '\u0641\u062C'; - t['\uFCBF'] = '\u0641\u062D'; - t['\uFCC0'] = '\u0641\u062E'; - t['\uFCC1'] = '\u0641\u0645'; - t['\uFCC2'] = '\u0642\u062D'; - t['\uFCC3'] = '\u0642\u0645'; - t['\uFCC4'] = '\u0643\u062C'; - t['\uFCC5'] = '\u0643\u062D'; - t['\uFCC6'] = '\u0643\u062E'; - t['\uFCC7'] = '\u0643\u0644'; - t['\uFCC8'] = '\u0643\u0645'; - t['\uFCC9'] = '\u0644\u062C'; - t['\uFCCA'] = '\u0644\u062D'; - t['\uFCCB'] = '\u0644\u062E'; - t['\uFCCC'] = '\u0644\u0645'; - t['\uFCCD'] = '\u0644\u0647'; - t['\uFCCE'] = '\u0645\u062C'; - t['\uFCCF'] = '\u0645\u062D'; - t['\uFCD0'] = '\u0645\u062E'; - t['\uFCD1'] = '\u0645\u0645'; - t['\uFCD2'] = '\u0646\u062C'; - t['\uFCD3'] = '\u0646\u062D'; - t['\uFCD4'] = '\u0646\u062E'; - t['\uFCD5'] = '\u0646\u0645'; - t['\uFCD6'] = '\u0646\u0647'; - t['\uFCD7'] = '\u0647\u062C'; - t['\uFCD8'] = '\u0647\u0645'; - t['\uFCD9'] = '\u0647\u0670'; - t['\uFCDA'] = '\u064A\u062C'; - t['\uFCDB'] = '\u064A\u062D'; - t['\uFCDC'] = '\u064A\u062E'; - t['\uFCDD'] = '\u064A\u0645'; - t['\uFCDE'] = '\u064A\u0647'; - t['\uFCDF'] = '\u0626\u0645'; - t['\uFCE0'] = '\u0626\u0647'; - t['\uFCE1'] = '\u0628\u0645'; - t['\uFCE2'] = '\u0628\u0647'; - t['\uFCE3'] = '\u062A\u0645'; - t['\uFCE4'] = '\u062A\u0647'; - t['\uFCE5'] = '\u062B\u0645'; - t['\uFCE6'] = '\u062B\u0647'; - t['\uFCE7'] = '\u0633\u0645'; - t['\uFCE8'] = '\u0633\u0647'; - t['\uFCE9'] = '\u0634\u0645'; - t['\uFCEA'] = '\u0634\u0647'; - t['\uFCEB'] = '\u0643\u0644'; - t['\uFCEC'] = '\u0643\u0645'; - t['\uFCED'] = '\u0644\u0645'; - t['\uFCEE'] = '\u0646\u0645'; - t['\uFCEF'] = '\u0646\u0647'; - t['\uFCF0'] = '\u064A\u0645'; - t['\uFCF1'] = '\u064A\u0647'; - t['\uFCF2'] = '\u0640\u064E\u0651'; - t['\uFCF3'] = '\u0640\u064F\u0651'; - t['\uFCF4'] = '\u0640\u0650\u0651'; - t['\uFCF5'] = '\u0637\u0649'; - t['\uFCF6'] = '\u0637\u064A'; - t['\uFCF7'] = '\u0639\u0649'; - t['\uFCF8'] = '\u0639\u064A'; - t['\uFCF9'] = '\u063A\u0649'; - t['\uFCFA'] = '\u063A\u064A'; - t['\uFCFB'] = '\u0633\u0649'; - t['\uFCFC'] = '\u0633\u064A'; - t['\uFCFD'] = '\u0634\u0649'; - t['\uFCFE'] = '\u0634\u064A'; - t['\uFCFF'] = '\u062D\u0649'; - t['\uFD00'] = '\u062D\u064A'; - t['\uFD01'] = '\u062C\u0649'; - t['\uFD02'] = '\u062C\u064A'; - t['\uFD03'] = '\u062E\u0649'; - t['\uFD04'] = '\u062E\u064A'; - t['\uFD05'] = '\u0635\u0649'; - t['\uFD06'] = '\u0635\u064A'; - t['\uFD07'] = '\u0636\u0649'; - t['\uFD08'] = '\u0636\u064A'; - t['\uFD09'] = '\u0634\u062C'; - t['\uFD0A'] = '\u0634\u062D'; - t['\uFD0B'] = '\u0634\u062E'; - t['\uFD0C'] = '\u0634\u0645'; - t['\uFD0D'] = '\u0634\u0631'; - t['\uFD0E'] = '\u0633\u0631'; - t['\uFD0F'] = '\u0635\u0631'; - t['\uFD10'] = '\u0636\u0631'; - t['\uFD11'] = '\u0637\u0649'; - t['\uFD12'] = '\u0637\u064A'; - t['\uFD13'] = '\u0639\u0649'; - t['\uFD14'] = '\u0639\u064A'; - t['\uFD15'] = '\u063A\u0649'; - t['\uFD16'] = '\u063A\u064A'; - t['\uFD17'] = '\u0633\u0649'; - t['\uFD18'] = '\u0633\u064A'; - t['\uFD19'] = '\u0634\u0649'; - t['\uFD1A'] = '\u0634\u064A'; - t['\uFD1B'] = '\u062D\u0649'; - t['\uFD1C'] = '\u062D\u064A'; - t['\uFD1D'] = '\u062C\u0649'; - t['\uFD1E'] = '\u062C\u064A'; - t['\uFD1F'] = '\u062E\u0649'; - t['\uFD20'] = '\u062E\u064A'; - t['\uFD21'] = '\u0635\u0649'; - t['\uFD22'] = '\u0635\u064A'; - t['\uFD23'] = '\u0636\u0649'; - t['\uFD24'] = '\u0636\u064A'; - t['\uFD25'] = '\u0634\u062C'; - t['\uFD26'] = '\u0634\u062D'; - t['\uFD27'] = '\u0634\u062E'; - t['\uFD28'] = '\u0634\u0645'; - t['\uFD29'] = '\u0634\u0631'; - t['\uFD2A'] = '\u0633\u0631'; - t['\uFD2B'] = '\u0635\u0631'; - t['\uFD2C'] = '\u0636\u0631'; - t['\uFD2D'] = '\u0634\u062C'; - t['\uFD2E'] = '\u0634\u062D'; - t['\uFD2F'] = '\u0634\u062E'; - t['\uFD30'] = '\u0634\u0645'; - t['\uFD31'] = '\u0633\u0647'; - t['\uFD32'] = '\u0634\u0647'; - t['\uFD33'] = '\u0637\u0645'; - t['\uFD34'] = '\u0633\u062C'; - t['\uFD35'] = '\u0633\u062D'; - t['\uFD36'] = '\u0633\u062E'; - t['\uFD37'] = '\u0634\u062C'; - t['\uFD38'] = '\u0634\u062D'; - t['\uFD39'] = '\u0634\u062E'; - t['\uFD3A'] = '\u0637\u0645'; - t['\uFD3B'] = '\u0638\u0645'; - t['\uFD3C'] = '\u0627\u064B'; - t['\uFD3D'] = '\u0627\u064B'; - t['\uFD50'] = '\u062A\u062C\u0645'; - t['\uFD51'] = '\u062A\u062D\u062C'; - t['\uFD52'] = '\u062A\u062D\u062C'; - t['\uFD53'] = '\u062A\u062D\u0645'; - t['\uFD54'] = '\u062A\u062E\u0645'; - t['\uFD55'] = '\u062A\u0645\u062C'; - t['\uFD56'] = '\u062A\u0645\u062D'; - t['\uFD57'] = '\u062A\u0645\u062E'; - t['\uFD58'] = '\u062C\u0645\u062D'; - t['\uFD59'] = '\u062C\u0645\u062D'; - t['\uFD5A'] = '\u062D\u0645\u064A'; - t['\uFD5B'] = '\u062D\u0645\u0649'; - t['\uFD5C'] = '\u0633\u062D\u062C'; - t['\uFD5D'] = '\u0633\u062C\u062D'; - t['\uFD5E'] = '\u0633\u062C\u0649'; - t['\uFD5F'] = '\u0633\u0645\u062D'; - t['\uFD60'] = '\u0633\u0645\u062D'; - t['\uFD61'] = '\u0633\u0645\u062C'; - t['\uFD62'] = '\u0633\u0645\u0645'; - t['\uFD63'] = '\u0633\u0645\u0645'; - t['\uFD64'] = '\u0635\u062D\u062D'; - t['\uFD65'] = '\u0635\u062D\u062D'; - t['\uFD66'] = '\u0635\u0645\u0645'; - t['\uFD67'] = '\u0634\u062D\u0645'; - t['\uFD68'] = '\u0634\u062D\u0645'; - t['\uFD69'] = '\u0634\u062C\u064A'; - t['\uFD6A'] = '\u0634\u0645\u062E'; - t['\uFD6B'] = '\u0634\u0645\u062E'; - t['\uFD6C'] = '\u0634\u0645\u0645'; - t['\uFD6D'] = '\u0634\u0645\u0645'; - t['\uFD6E'] = '\u0636\u062D\u0649'; - t['\uFD6F'] = '\u0636\u062E\u0645'; - t['\uFD70'] = '\u0636\u062E\u0645'; - t['\uFD71'] = '\u0637\u0645\u062D'; - t['\uFD72'] = '\u0637\u0645\u062D'; - t['\uFD73'] = '\u0637\u0645\u0645'; - t['\uFD74'] = '\u0637\u0645\u064A'; - t['\uFD75'] = '\u0639\u062C\u0645'; - t['\uFD76'] = '\u0639\u0645\u0645'; - t['\uFD77'] = '\u0639\u0645\u0645'; - t['\uFD78'] = '\u0639\u0645\u0649'; - t['\uFD79'] = '\u063A\u0645\u0645'; - t['\uFD7A'] = '\u063A\u0645\u064A'; - t['\uFD7B'] = '\u063A\u0645\u0649'; - t['\uFD7C'] = '\u0641\u062E\u0645'; - t['\uFD7D'] = '\u0641\u062E\u0645'; - t['\uFD7E'] = '\u0642\u0645\u062D'; - t['\uFD7F'] = '\u0642\u0645\u0645'; - t['\uFD80'] = '\u0644\u062D\u0645'; - t['\uFD81'] = '\u0644\u062D\u064A'; - t['\uFD82'] = '\u0644\u062D\u0649'; - t['\uFD83'] = '\u0644\u062C\u062C'; - t['\uFD84'] = '\u0644\u062C\u062C'; - t['\uFD85'] = '\u0644\u062E\u0645'; - t['\uFD86'] = '\u0644\u062E\u0645'; - t['\uFD87'] = '\u0644\u0645\u062D'; - t['\uFD88'] = '\u0644\u0645\u062D'; - t['\uFD89'] = '\u0645\u062D\u062C'; - t['\uFD8A'] = '\u0645\u062D\u0645'; - t['\uFD8B'] = '\u0645\u062D\u064A'; - t['\uFD8C'] = '\u0645\u062C\u062D'; - t['\uFD8D'] = '\u0645\u062C\u0645'; - t['\uFD8E'] = '\u0645\u062E\u062C'; - t['\uFD8F'] = '\u0645\u062E\u0645'; - t['\uFD92'] = '\u0645\u062C\u062E'; - t['\uFD93'] = '\u0647\u0645\u062C'; - t['\uFD94'] = '\u0647\u0645\u0645'; - t['\uFD95'] = '\u0646\u062D\u0645'; - t['\uFD96'] = '\u0646\u062D\u0649'; - t['\uFD97'] = '\u0646\u062C\u0645'; - t['\uFD98'] = '\u0646\u062C\u0645'; - t['\uFD99'] = '\u0646\u062C\u0649'; - t['\uFD9A'] = '\u0646\u0645\u064A'; - t['\uFD9B'] = '\u0646\u0645\u0649'; - t['\uFD9C'] = '\u064A\u0645\u0645'; - t['\uFD9D'] = '\u064A\u0645\u0645'; - t['\uFD9E'] = '\u0628\u062E\u064A'; - t['\uFD9F'] = '\u062A\u062C\u064A'; - t['\uFDA0'] = '\u062A\u062C\u0649'; - t['\uFDA1'] = '\u062A\u062E\u064A'; - t['\uFDA2'] = '\u062A\u062E\u0649'; - t['\uFDA3'] = '\u062A\u0645\u064A'; - t['\uFDA4'] = '\u062A\u0645\u0649'; - t['\uFDA5'] = '\u062C\u0645\u064A'; - t['\uFDA6'] = '\u062C\u062D\u0649'; - t['\uFDA7'] = '\u062C\u0645\u0649'; - t['\uFDA8'] = '\u0633\u062E\u0649'; - t['\uFDA9'] = '\u0635\u062D\u064A'; - t['\uFDAA'] = '\u0634\u062D\u064A'; - t['\uFDAB'] = '\u0636\u062D\u064A'; - t['\uFDAC'] = '\u0644\u062C\u064A'; - t['\uFDAD'] = '\u0644\u0645\u064A'; - t['\uFDAE'] = '\u064A\u062D\u064A'; - t['\uFDAF'] = '\u064A\u062C\u064A'; - t['\uFDB0'] = '\u064A\u0645\u064A'; - t['\uFDB1'] = '\u0645\u0645\u064A'; - t['\uFDB2'] = '\u0642\u0645\u064A'; - t['\uFDB3'] = '\u0646\u062D\u064A'; - t['\uFDB4'] = '\u0642\u0645\u062D'; - t['\uFDB5'] = '\u0644\u062D\u0645'; - t['\uFDB6'] = '\u0639\u0645\u064A'; - t['\uFDB7'] = '\u0643\u0645\u064A'; - t['\uFDB8'] = '\u0646\u062C\u062D'; - t['\uFDB9'] = '\u0645\u062E\u064A'; - t['\uFDBA'] = '\u0644\u062C\u0645'; - t['\uFDBB'] = '\u0643\u0645\u0645'; - t['\uFDBC'] = '\u0644\u062C\u0645'; - t['\uFDBD'] = '\u0646\u062C\u062D'; - t['\uFDBE'] = '\u062C\u062D\u064A'; - t['\uFDBF'] = '\u062D\u062C\u064A'; - t['\uFDC0'] = '\u0645\u062C\u064A'; - t['\uFDC1'] = '\u0641\u0645\u064A'; - t['\uFDC2'] = '\u0628\u062D\u064A'; - t['\uFDC3'] = '\u0643\u0645\u0645'; - t['\uFDC4'] = '\u0639\u062C\u0645'; - t['\uFDC5'] = '\u0635\u0645\u0645'; - t['\uFDC6'] = '\u0633\u062E\u064A'; - t['\uFDC7'] = '\u0646\u062C\u064A'; - t['\uFE49'] = '\u203E'; - t['\uFE4A'] = '\u203E'; - t['\uFE4B'] = '\u203E'; - t['\uFE4C'] = '\u203E'; - t['\uFE4D'] = '\u005F'; - t['\uFE4E'] = '\u005F'; - t['\uFE4F'] = '\u005F'; - t['\uFE80'] = '\u0621'; - t['\uFE81'] = '\u0622'; - t['\uFE82'] = '\u0622'; - t['\uFE83'] = '\u0623'; - t['\uFE84'] = '\u0623'; - t['\uFE85'] = '\u0624'; - t['\uFE86'] = '\u0624'; - t['\uFE87'] = '\u0625'; - t['\uFE88'] = '\u0625'; - t['\uFE89'] = '\u0626'; - t['\uFE8A'] = '\u0626'; - t['\uFE8B'] = '\u0626'; - t['\uFE8C'] = '\u0626'; - t['\uFE8D'] = '\u0627'; - t['\uFE8E'] = '\u0627'; - t['\uFE8F'] = '\u0628'; - t['\uFE90'] = '\u0628'; - t['\uFE91'] = '\u0628'; - t['\uFE92'] = '\u0628'; - t['\uFE93'] = '\u0629'; - t['\uFE94'] = '\u0629'; - t['\uFE95'] = '\u062A'; - t['\uFE96'] = '\u062A'; - t['\uFE97'] = '\u062A'; - t['\uFE98'] = '\u062A'; - t['\uFE99'] = '\u062B'; - t['\uFE9A'] = '\u062B'; - t['\uFE9B'] = '\u062B'; - t['\uFE9C'] = '\u062B'; - t['\uFE9D'] = '\u062C'; - t['\uFE9E'] = '\u062C'; - t['\uFE9F'] = '\u062C'; - t['\uFEA0'] = '\u062C'; - t['\uFEA1'] = '\u062D'; - t['\uFEA2'] = '\u062D'; - t['\uFEA3'] = '\u062D'; - t['\uFEA4'] = '\u062D'; - t['\uFEA5'] = '\u062E'; - t['\uFEA6'] = '\u062E'; - t['\uFEA7'] = '\u062E'; - t['\uFEA8'] = '\u062E'; - t['\uFEA9'] = '\u062F'; - t['\uFEAA'] = '\u062F'; - t['\uFEAB'] = '\u0630'; - t['\uFEAC'] = '\u0630'; - t['\uFEAD'] = '\u0631'; - t['\uFEAE'] = '\u0631'; - t['\uFEAF'] = '\u0632'; - t['\uFEB0'] = '\u0632'; - t['\uFEB1'] = '\u0633'; - t['\uFEB2'] = '\u0633'; - t['\uFEB3'] = '\u0633'; - t['\uFEB4'] = '\u0633'; - t['\uFEB5'] = '\u0634'; - t['\uFEB6'] = '\u0634'; - t['\uFEB7'] = '\u0634'; - t['\uFEB8'] = '\u0634'; - t['\uFEB9'] = '\u0635'; - t['\uFEBA'] = '\u0635'; - t['\uFEBB'] = '\u0635'; - t['\uFEBC'] = '\u0635'; - t['\uFEBD'] = '\u0636'; - t['\uFEBE'] = '\u0636'; - t['\uFEBF'] = '\u0636'; - t['\uFEC0'] = '\u0636'; - t['\uFEC1'] = '\u0637'; - t['\uFEC2'] = '\u0637'; - t['\uFEC3'] = '\u0637'; - t['\uFEC4'] = '\u0637'; - t['\uFEC5'] = '\u0638'; - t['\uFEC6'] = '\u0638'; - t['\uFEC7'] = '\u0638'; - t['\uFEC8'] = '\u0638'; - t['\uFEC9'] = '\u0639'; - t['\uFECA'] = '\u0639'; - t['\uFECB'] = '\u0639'; - t['\uFECC'] = '\u0639'; - t['\uFECD'] = '\u063A'; - t['\uFECE'] = '\u063A'; - t['\uFECF'] = '\u063A'; - t['\uFED0'] = '\u063A'; - t['\uFED1'] = '\u0641'; - t['\uFED2'] = '\u0641'; - t['\uFED3'] = '\u0641'; - t['\uFED4'] = '\u0641'; - t['\uFED5'] = '\u0642'; - t['\uFED6'] = '\u0642'; - t['\uFED7'] = '\u0642'; - t['\uFED8'] = '\u0642'; - t['\uFED9'] = '\u0643'; - t['\uFEDA'] = '\u0643'; - t['\uFEDB'] = '\u0643'; - t['\uFEDC'] = '\u0643'; - t['\uFEDD'] = '\u0644'; - t['\uFEDE'] = '\u0644'; - t['\uFEDF'] = '\u0644'; - t['\uFEE0'] = '\u0644'; - t['\uFEE1'] = '\u0645'; - t['\uFEE2'] = '\u0645'; - t['\uFEE3'] = '\u0645'; - t['\uFEE4'] = '\u0645'; - t['\uFEE5'] = '\u0646'; - t['\uFEE6'] = '\u0646'; - t['\uFEE7'] = '\u0646'; - t['\uFEE8'] = '\u0646'; - t['\uFEE9'] = '\u0647'; - t['\uFEEA'] = '\u0647'; - t['\uFEEB'] = '\u0647'; - t['\uFEEC'] = '\u0647'; - t['\uFEED'] = '\u0648'; - t['\uFEEE'] = '\u0648'; - t['\uFEEF'] = '\u0649'; - t['\uFEF0'] = '\u0649'; - t['\uFEF1'] = '\u064A'; - t['\uFEF2'] = '\u064A'; - t['\uFEF3'] = '\u064A'; - t['\uFEF4'] = '\u064A'; - t['\uFEF5'] = '\u0644\u0622'; - t['\uFEF6'] = '\u0644\u0622'; - t['\uFEF7'] = '\u0644\u0623'; - t['\uFEF8'] = '\u0644\u0623'; - t['\uFEF9'] = '\u0644\u0625'; - t['\uFEFA'] = '\u0644\u0625'; - t['\uFEFB'] = '\u0644\u0627'; - t['\uFEFC'] = '\u0644\u0627'; - }); - - function reverseIfRtl(chars) { - var charsLength = chars.length; - //reverse an arabic ligature - if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { - return chars; - } - var s = ''; - for (var ii = charsLength - 1; ii >= 0; ii--) { - s += chars[ii]; - } - return s; - } - - exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues; - exports.reverseIfRtl = reverseIfRtl; - exports.getUnicodeRangeFor = getUnicodeRangeFor; - exports.getNormalizedUnicodes = getNormalizedUnicodes; - exports.getUnicodeForGlyph = getUnicodeForGlyph; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreStream = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreJbig2, root.pdfjsCoreJpg, - root.pdfjsCoreJpx); - } -}(this, function (exports, sharedUtil, corePrimitives, coreJbig2, coreJpg, - coreJpx) { - -var Util = sharedUtil.Util; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isInt = sharedUtil.isInt; -var isArray = sharedUtil.isArray; -var createObjectURL = sharedUtil.createObjectURL; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; -var isSpace = sharedUtil.isSpace; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var Jbig2Image = coreJbig2.Jbig2Image; -var JpegImage = coreJpg.JpegImage; -var JpxImage = coreJpx.JpxImage; - -var Stream = (function StreamClosure() { - function Stream(arrayBuffer, start, length, dict) { - this.bytes = (arrayBuffer instanceof Uint8Array ? - arrayBuffer : new Uint8Array(arrayBuffer)); - this.start = start || 0; - this.pos = this.start; - this.end = (start + length) || this.bytes.length; - this.dict = dict; - } - - // required methods for a stream. if a particular stream does not - // implement these, an error should be thrown - Stream.prototype = { - get length() { - return this.end - this.start; - }, - get isEmpty() { - return this.length === 0; - }, - getByte: function Stream_getByte() { - if (this.pos >= this.end) { - return -1; - } - return this.bytes[this.pos++]; - }, - getUint16: function Stream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function Stream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - // returns subarray of original buffer - // should only be read - getBytes: function Stream_getBytes(length) { - var bytes = this.bytes; - var pos = this.pos; - var strEnd = this.end; - - if (!length) { - return bytes.subarray(pos, strEnd); - } - var end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.pos = end; - return bytes.subarray(pos, end); - }, - peekByte: function Stream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function Stream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - skip: function Stream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function Stream_reset() { - this.pos = this.start; - }, - moveStart: function Stream_moveStart() { - this.start = this.pos; - }, - makeSubStream: function Stream_makeSubStream(start, length, dict) { - return new Stream(this.bytes.buffer, start, length, dict); - }, - isStream: true - }; - - return Stream; -})(); - -var StringStream = (function StringStreamClosure() { - function StringStream(str) { - var length = str.length; - var bytes = new Uint8Array(length); - for (var n = 0; n < length; ++n) { - bytes[n] = str.charCodeAt(n); - } - Stream.call(this, bytes); - } - - StringStream.prototype = Stream.prototype; - - return StringStream; -})(); - -// super class for the decoding streams -var DecodeStream = (function DecodeStreamClosure() { - // Lots of DecodeStreams are created whose buffers are never used. For these - // we share a single empty buffer. This is (a) space-efficient and (b) avoids - // having special cases that would be required if we used |null| for an empty - // buffer. - var emptyBuffer = new Uint8Array(0); - - function DecodeStream(maybeMinBufferLength) { - this.pos = 0; - this.bufferLength = 0; - this.eof = false; - this.buffer = emptyBuffer; - this.minBufferLength = 512; - if (maybeMinBufferLength) { - // Compute the first power of two that is as big as maybeMinBufferLength. - while (this.minBufferLength < maybeMinBufferLength) { - this.minBufferLength *= 2; - } - } - } - - DecodeStream.prototype = { - get isEmpty() { - while (!this.eof && this.bufferLength === 0) { - this.readBlock(); - } - return this.bufferLength === 0; - }, - ensureBuffer: function DecodeStream_ensureBuffer(requested) { - var buffer = this.buffer; - if (requested <= buffer.byteLength) { - return buffer; - } - var size = this.minBufferLength; - while (size < requested) { - size *= 2; - } - var buffer2 = new Uint8Array(size); - buffer2.set(buffer); - return (this.buffer = buffer2); - }, - getByte: function DecodeStream_getByte() { - var pos = this.pos; - while (this.bufferLength <= pos) { - if (this.eof) { - return -1; - } - this.readBlock(); - } - return this.buffer[this.pos++]; - }, - getUint16: function DecodeStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function DecodeStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - getBytes: function DecodeStream_getBytes(length) { - var end, pos = this.pos; - - if (length) { - this.ensureBuffer(pos + length); - end = pos + length; - - while (!this.eof && this.bufferLength < end) { - this.readBlock(); - } - var bufEnd = this.bufferLength; - if (end > bufEnd) { - end = bufEnd; - } - } else { - while (!this.eof) { - this.readBlock(); - } - end = this.bufferLength; - } - - this.pos = end; - return this.buffer.subarray(pos, end); - }, - peekByte: function DecodeStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function DecodeStream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { - var end = start + length; - while (this.bufferLength <= end && !this.eof) { - this.readBlock(); - } - return new Stream(this.buffer, start, length, dict); - }, - skip: function DecodeStream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function DecodeStream_reset() { - this.pos = 0; - }, - getBaseStreams: function DecodeStream_getBaseStreams() { - if (this.str && this.str.getBaseStreams) { - return this.str.getBaseStreams(); - } - return []; - } - }; - - return DecodeStream; -})(); - -var StreamsSequenceStream = (function StreamsSequenceStreamClosure() { - function StreamsSequenceStream(streams) { - this.streams = streams; - DecodeStream.call(this, /* maybeLength = */ null); - } - - StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); - - StreamsSequenceStream.prototype.readBlock = - function streamSequenceStreamReadBlock() { - - var streams = this.streams; - if (streams.length === 0) { - this.eof = true; - return; - } - var stream = streams.shift(); - var chunk = stream.getBytes(); - var bufferLength = this.bufferLength; - var newLength = bufferLength + chunk.length; - var buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - }; - - StreamsSequenceStream.prototype.getBaseStreams = - function StreamsSequenceStream_getBaseStreams() { - - var baseStreams = []; - for (var i = 0, ii = this.streams.length; i < ii; i++) { - var stream = this.streams[i]; - if (stream.getBaseStreams) { - Util.appendToArray(baseStreams, stream.getBaseStreams()); - } - } - return baseStreams; - }; - - return StreamsSequenceStream; -})(); - -var FlateStream = (function FlateStreamClosure() { - var codeLenCodeMap = new Int32Array([ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - ]); - - var lengthDecode = new Int32Array([ - 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, - 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, - 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, - 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 - ]); - - var distDecode = new Int32Array([ - 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, - 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, - 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, - 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 - ]); - - var fixedLitCodeTab = [new Int32Array([ - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, - 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, - 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, - 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, - 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, - 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, - 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, - 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, - 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, - 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, - 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, - 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, - 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, - 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, - 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, - 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, - 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, - 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, - 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, - 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, - 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, - 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, - 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, - 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, - 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, - 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, - 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, - 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, - 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, - 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, - 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, - 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, - 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, - 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, - 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, - 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, - 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, - 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, - 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, - 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, - 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, - 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, - 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, - 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, - 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, - 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, - 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, - 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, - 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff - ]), 9]; - - var fixedDistCodeTab = [new Int32Array([ - 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, - 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, - 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, - 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 - ]), 5]; - - function FlateStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - var cmf = str.getByte(); - var flg = str.getByte(); - if (cmf === -1 || flg === -1) { - error('Invalid header in flate stream: ' + cmf + ', ' + flg); - } - if ((cmf & 0x0f) !== 0x08) { - error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); - } - if ((((cmf << 8) + flg) % 31) !== 0) { - error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); - } - if (flg & 0x20) { - error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); - } - - this.codeSize = 0; - this.codeBuf = 0; - - DecodeStream.call(this, maybeLength); - } - - FlateStream.prototype = Object.create(DecodeStream.prototype); - - FlateStream.prototype.getBits = function FlateStream_getBits(bits) { - var str = this.str; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < bits) { - if ((b = str.getByte()) === -1) { - error('Bad encoding in flate stream'); - } - codeBuf |= b << codeSize; - codeSize += 8; - } - b = codeBuf & ((1 << bits) - 1); - this.codeBuf = codeBuf >> bits; - this.codeSize = codeSize -= bits; - - return b; - }; - - FlateStream.prototype.getCode = function FlateStream_getCode(table) { - var str = this.str; - var codes = table[0]; - var maxLen = table[1]; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < maxLen) { - if ((b = str.getByte()) === -1) { - // premature end of stream. code might however still be valid. - // codeSize < codeLen check below guards against incomplete codeVal. - break; - } - codeBuf |= (b << codeSize); - codeSize += 8; - } - var code = codes[codeBuf & ((1 << maxLen) - 1)]; - var codeLen = code >> 16; - var codeVal = code & 0xffff; - if (codeLen < 1 || codeSize < codeLen) { - error('Bad encoding in flate stream'); - } - this.codeBuf = (codeBuf >> codeLen); - this.codeSize = (codeSize - codeLen); - return codeVal; - }; - - FlateStream.prototype.generateHuffmanTable = - function flateStreamGenerateHuffmanTable(lengths) { - var n = lengths.length; - - // find max code length - var maxLen = 0; - var i; - for (i = 0; i < n; ++i) { - if (lengths[i] > maxLen) { - maxLen = lengths[i]; - } - } - - // build the table - var size = 1 << maxLen; - var codes = new Int32Array(size); - for (var len = 1, code = 0, skip = 2; - len <= maxLen; - ++len, code <<= 1, skip <<= 1) { - for (var val = 0; val < n; ++val) { - if (lengths[val] === len) { - // bit-reverse the code - var code2 = 0; - var t = code; - for (i = 0; i < len; ++i) { - code2 = (code2 << 1) | (t & 1); - t >>= 1; - } - - // fill the table entries - for (i = code2; i < size; i += skip) { - codes[i] = (len << 16) | val; - } - ++code; - } - } - } - - return [codes, maxLen]; - }; - - FlateStream.prototype.readBlock = function FlateStream_readBlock() { - var buffer, len; - var str = this.str; - // read block header - var hdr = this.getBits(3); - if (hdr & 1) { - this.eof = true; - } - hdr >>= 1; - - if (hdr === 0) { // uncompressed block - var b; - - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var blockLen = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - blockLen |= (b << 8); - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var check = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - check |= (b << 8); - if (check !== (~blockLen & 0xffff) && - (blockLen !== 0 || check !== 0)) { - // Ignoring error for bad "empty" block (see issue 1277) - error('Bad uncompressed block length in flate stream'); - } - - this.codeBuf = 0; - this.codeSize = 0; - - var bufferLength = this.bufferLength; - buffer = this.ensureBuffer(bufferLength + blockLen); - var end = bufferLength + blockLen; - this.bufferLength = end; - if (blockLen === 0) { - if (str.peekByte() === -1) { - this.eof = true; - } - } else { - for (var n = bufferLength; n < end; ++n) { - if ((b = str.getByte()) === -1) { - this.eof = true; - break; - } - buffer[n] = b; - } - } - return; - } - - var litCodeTable; - var distCodeTable; - if (hdr === 1) { // compressed block, fixed codes - litCodeTable = fixedLitCodeTab; - distCodeTable = fixedDistCodeTab; - } else if (hdr === 2) { // compressed block, dynamic codes - var numLitCodes = this.getBits(5) + 257; - var numDistCodes = this.getBits(5) + 1; - var numCodeLenCodes = this.getBits(4) + 4; - - // build the code lengths code table - var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); - - var i; - for (i = 0; i < numCodeLenCodes; ++i) { - codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); - } - var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); - - // build the literal and distance code tables - len = 0; - i = 0; - var codes = numLitCodes + numDistCodes; - var codeLengths = new Uint8Array(codes); - var bitsLength, bitsOffset, what; - while (i < codes) { - var code = this.getCode(codeLenCodeTab); - if (code === 16) { - bitsLength = 2; bitsOffset = 3; what = len; - } else if (code === 17) { - bitsLength = 3; bitsOffset = 3; what = (len = 0); - } else if (code === 18) { - bitsLength = 7; bitsOffset = 11; what = (len = 0); - } else { - codeLengths[i++] = len = code; - continue; - } - - var repeatLength = this.getBits(bitsLength) + bitsOffset; - while (repeatLength-- > 0) { - codeLengths[i++] = what; - } - } - - litCodeTable = - this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); - distCodeTable = - this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); - } else { - error('Unknown block type in flate stream'); - } - - buffer = this.buffer; - var limit = buffer ? buffer.length : 0; - var pos = this.bufferLength; - while (true) { - var code1 = this.getCode(litCodeTable); - if (code1 < 256) { - if (pos + 1 >= limit) { - buffer = this.ensureBuffer(pos + 1); - limit = buffer.length; - } - buffer[pos++] = code1; - continue; - } - if (code1 === 256) { - this.bufferLength = pos; - return; - } - code1 -= 257; - code1 = lengthDecode[code1]; - var code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - var dist = (code1 & 0xffff) + code2; - if (pos + len >= limit) { - buffer = this.ensureBuffer(pos + len); - limit = buffer.length; - } - for (var k = 0; k < len; ++k, ++pos) { - buffer[pos] = buffer[pos - dist]; - } - } - }; - - return FlateStream; -})(); - -var PredictorStream = (function PredictorStreamClosure() { - function PredictorStream(str, maybeLength, params) { - if (!isDict(params)) { - return str; // no prediction - } - var predictor = this.predictor = params.get('Predictor') || 1; - - if (predictor <= 1) { - return str; // no prediction - } - if (predictor !== 2 && (predictor < 10 || predictor > 15)) { - error('Unsupported predictor: ' + predictor); - } - - if (predictor === 2) { - this.readBlock = this.readBlockTiff; - } else { - this.readBlock = this.readBlockPng; - } - - this.str = str; - this.dict = str.dict; - - var colors = this.colors = params.get('Colors') || 1; - var bits = this.bits = params.get('BitsPerComponent') || 8; - var columns = this.columns = params.get('Columns') || 1; - - this.pixBytes = (colors * bits + 7) >> 3; - this.rowBytes = (columns * colors * bits + 7) >> 3; - - DecodeStream.call(this, maybeLength); - return this; - } - - PredictorStream.prototype = Object.create(DecodeStream.prototype); - - PredictorStream.prototype.readBlockTiff = - function predictorStreamReadBlockTiff() { - var rowBytes = this.rowBytes; - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var bits = this.bits; - var colors = this.colors; - - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var inbuf = 0, outbuf = 0; - var inbits = 0, outbits = 0; - var pos = bufferLength; - var i; - - if (bits === 1) { - for (i = 0; i < rowBytes; ++i) { - var c = rawBytes[i]; - inbuf = (inbuf << 8) | c; - // bitwise addition is exclusive or - // first shift inbuf and then add - buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF; - // truncate inbuf (assumes colors < 16) - inbuf &= 0xFFFF; - } - } else if (bits === 8) { - for (i = 0; i < colors; ++i) { - buffer[pos++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[pos] = buffer[pos - colors] + rawBytes[i]; - pos++; - } - } else { - var compArray = new Uint8Array(colors + 1); - var bitMask = (1 << bits) - 1; - var j = 0, k = bufferLength; - var columns = this.columns; - for (i = 0; i < columns; ++i) { - for (var kk = 0; kk < colors; ++kk) { - if (inbits < bits) { - inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF); - inbits += 8; - } - compArray[kk] = (compArray[kk] + - (inbuf >> (inbits - bits))) & bitMask; - inbits -= bits; - outbuf = (outbuf << bits) | compArray[kk]; - outbits += bits; - if (outbits >= 8) { - buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF; - outbits -= 8; - } - } - } - if (outbits > 0) { - buffer[k++] = (outbuf << (8 - outbits)) + - (inbuf & ((1 << (8 - outbits)) - 1)); - } - } - this.bufferLength += rowBytes; - }; - - PredictorStream.prototype.readBlockPng = - function predictorStreamReadBlockPng() { - - var rowBytes = this.rowBytes; - var pixBytes = this.pixBytes; - - var predictor = this.str.getByte(); - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); - if (prevRow.length === 0) { - prevRow = new Uint8Array(rowBytes); - } - - var i, j = bufferLength, up, c; - switch (predictor) { - case 0: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - break; - case 1: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF; - j++; - } - break; - case 2: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF; - } - break; - case 3: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) + - rawBytes[i]) & 0xFF; - j++; - } - break; - case 4: - // we need to save the up left pixels values. the simplest way - // is to create a new buffer - for (i = 0; i < pixBytes; ++i) { - up = prevRow[i]; - c = rawBytes[i]; - buffer[j++] = up + c; - } - for (; i < rowBytes; ++i) { - up = prevRow[i]; - var upLeft = prevRow[i - pixBytes]; - var left = buffer[j - pixBytes]; - var p = left + up - upLeft; - - var pa = p - left; - if (pa < 0) { - pa = -pa; - } - var pb = p - up; - if (pb < 0) { - pb = -pb; - } - var pc = p - upLeft; - if (pc < 0) { - pc = -pc; - } - - c = rawBytes[i]; - if (pa <= pb && pa <= pc) { - buffer[j++] = left + c; - } else if (pb <= pc) { - buffer[j++] = up + c; - } else { - buffer[j++] = upLeft + c; - } - } - break; - default: - error('Unsupported predictor: ' + predictor); - } - this.bufferLength += rowBytes; - }; - - return PredictorStream; -})(); - -/** - * Depending on the type of JPEG a JpegStream is handled in different ways. For - * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image - * data is stored and then loaded by the browser. For unsupported JPEG's we use - * a library to decode these images and the stream behaves like all the other - * DecodeStreams. - */ -var JpegStream = (function JpegStreamClosure() { - function JpegStream(stream, maybeLength, dict) { - // Some images may contain 'junk' before the SOI (start-of-image) marker. - // Note: this seems to mainly affect inline images. - var ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8). - stream.skip(-1); // Reset the stream position to the SOI. - break; - } - } - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpegStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpegStream.prototype, 'bytes', { - get: function JpegStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - var jpegImage = new JpegImage(); - - // Checking if values need to be transformed before conversion. - var decodeArr = this.dict.getArray('Decode', 'D'); - if (this.forceRGB && isArray(decodeArr)) { - var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; - var decodeArrLength = decodeArr.length; - var transform = new Int32Array(decodeArrLength); - var transformNeeded = false; - var maxValue = (1 << bitsPerComponent) - 1; - for (var i = 0; i < decodeArrLength; i += 2) { - transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0; - transform[i + 1] = (decodeArr[i] * maxValue) | 0; - if (transform[i] !== 256 || transform[i + 1] !== 0) { - transformNeeded = true; - } - } - if (transformNeeded) { - jpegImage.decodeTransform = transform; - } - } - // Fetching the 'ColorTransform' entry, if it exists. - var decodeParams = this.dict.get('DecodeParms', 'DP'); - if (isDict(decodeParams)) { - var colorTransform = decodeParams.get('ColorTransform'); - if (isInt(colorTransform)) { - jpegImage.colorTransform = colorTransform; - } - } - - jpegImage.parse(this.bytes); - var data = jpegImage.getData(this.drawWidth, this.drawHeight, - this.forceRGB); - this.buffer = data; - this.bufferLength = data.length; - this.eof = true; - }; - - JpegStream.prototype.getBytes = function JpegStream_getBytes(length) { - this.ensureBuffer(); - return this.buffer; - }; - - JpegStream.prototype.getIR = function JpegStream_getIR(forceDataSchema) { - return createObjectURL(this.bytes, 'image/jpeg', forceDataSchema); - }; - - return JpegStream; -})(); - -/** - * For JPEG 2000's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var JpxStream = (function JpxStreamClosure() { - function JpxStream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpxStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpxStream.prototype, 'bytes', { - get: function JpxStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jpxImage = new JpxImage(); - jpxImage.parse(this.bytes); - - var width = jpxImage.width; - var height = jpxImage.height; - var componentsCount = jpxImage.componentsCount; - var tileCount = jpxImage.tiles.length; - if (tileCount === 1) { - this.buffer = jpxImage.tiles[0].items; - } else { - var data = new Uint8Array(width * height * componentsCount); - - for (var k = 0; k < tileCount; k++) { - var tileComponents = jpxImage.tiles[k]; - var tileWidth = tileComponents.width; - var tileHeight = tileComponents.height; - var tileLeft = tileComponents.left; - var tileTop = tileComponents.top; - - var src = tileComponents.items; - var srcPosition = 0; - var dataPosition = (width * tileTop + tileLeft) * componentsCount; - var imgRowSize = width * componentsCount; - var tileRowSize = tileWidth * componentsCount; - - for (var j = 0; j < tileHeight; j++) { - var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); - data.set(rowBytes, dataPosition); - srcPosition += tileRowSize; - dataPosition += imgRowSize; - } - } - this.buffer = data; - } - this.bufferLength = this.buffer.length; - this.eof = true; - }; - - return JpxStream; -})(); - -/** - * For JBIG2's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var Jbig2Stream = (function Jbig2StreamClosure() { - function Jbig2Stream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - Jbig2Stream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(Jbig2Stream.prototype, 'bytes', { - get: function Jbig2Stream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jbig2Image = new Jbig2Image(); - - var chunks = []; - var decodeParams = this.dict.getArray('DecodeParms', 'DP'); - - // According to the PDF specification, DecodeParms can be either - // a dictionary, or an array whose elements are dictionaries. - if (isArray(decodeParams)) { - if (decodeParams.length > 1) { - warn('JBIG2 - \'DecodeParms\' array with multiple elements ' + - 'not supported.'); - } - decodeParams = decodeParams[0]; - } - if (decodeParams && decodeParams.has('JBIG2Globals')) { - var globalsStream = decodeParams.get('JBIG2Globals'); - var globals = globalsStream.getBytes(); - chunks.push({data: globals, start: 0, end: globals.length}); - } - chunks.push({data: this.bytes, start: 0, end: this.bytes.length}); - var data = jbig2Image.parseChunks(chunks); - var dataLength = data.length; - - // JBIG2 had black as 1 and white as 0, inverting the colors - for (var i = 0; i < dataLength; i++) { - data[i] ^= 0xFF; - } - - this.buffer = data; - this.bufferLength = dataLength; - this.eof = true; - }; - - return Jbig2Stream; -})(); - -var DecryptStream = (function DecryptStreamClosure() { - function DecryptStream(str, maybeLength, decrypt) { - this.str = str; - this.dict = str.dict; - this.decrypt = decrypt; - this.nextChunk = null; - this.initialized = false; - - DecodeStream.call(this, maybeLength); - } - - var chunkSize = 512; - - DecryptStream.prototype = Object.create(DecodeStream.prototype); - - DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { - var chunk; - if (this.initialized) { - chunk = this.nextChunk; - } else { - chunk = this.str.getBytes(chunkSize); - this.initialized = true; - } - if (!chunk || chunk.length === 0) { - this.eof = true; - return; - } - this.nextChunk = this.str.getBytes(chunkSize); - var hasMoreData = this.nextChunk && this.nextChunk.length > 0; - - var decrypt = this.decrypt; - chunk = decrypt(chunk, !hasMoreData); - - var bufferLength = this.bufferLength; - var i, n = chunk.length; - var buffer = this.ensureBuffer(bufferLength + n); - for (i = 0; i < n; i++) { - buffer[bufferLength++] = chunk[i]; - } - this.bufferLength = bufferLength; - }; - - return DecryptStream; -})(); - -var Ascii85Stream = (function Ascii85StreamClosure() { - function Ascii85Stream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - this.input = new Uint8Array(5); - - // Most streams increase in size when decoded, but Ascii85 streams - // typically shrink by ~20%. - if (maybeLength) { - maybeLength = 0.8 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - Ascii85Stream.prototype = Object.create(DecodeStream.prototype); - - Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { - var TILDA_CHAR = 0x7E; // '~' - var Z_LOWER_CHAR = 0x7A; // 'z' - var EOF = -1; - - var str = this.str; - - var c = str.getByte(); - while (isSpace(c)) { - c = str.getByte(); - } - - if (c === EOF || c === TILDA_CHAR) { - this.eof = true; - return; - } - - var bufferLength = this.bufferLength, buffer; - var i; - - // special code for z - if (c === Z_LOWER_CHAR) { - buffer = this.ensureBuffer(bufferLength + 4); - for (i = 0; i < 4; ++i) { - buffer[bufferLength + i] = 0; - } - this.bufferLength += 4; - } else { - var input = this.input; - input[0] = c; - for (i = 1; i < 5; ++i) { - c = str.getByte(); - while (isSpace(c)) { - c = str.getByte(); - } - - input[i] = c; - - if (c === EOF || c === TILDA_CHAR) { - break; - } - } - buffer = this.ensureBuffer(bufferLength + i - 1); - this.bufferLength += i - 1; - - // partial ending; - if (i < 5) { - for (; i < 5; ++i) { - input[i] = 0x21 + 84; - } - this.eof = true; - } - var t = 0; - for (i = 0; i < 5; ++i) { - t = t * 85 + (input[i] - 0x21); - } - - for (i = 3; i >= 0; --i) { - buffer[bufferLength + i] = t & 0xFF; - t >>= 8; - } - } - }; - - return Ascii85Stream; -})(); - -var AsciiHexStream = (function AsciiHexStreamClosure() { - function AsciiHexStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - this.firstDigit = -1; - - // Most streams increase in size when decoded, but AsciiHex streams shrink - // by 50%. - if (maybeLength) { - maybeLength = 0.5 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - AsciiHexStream.prototype = Object.create(DecodeStream.prototype); - - AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { - var UPSTREAM_BLOCK_SIZE = 8000; - var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - - var maxDecodeLength = (bytes.length + 1) >> 1; - var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - var bufferLength = this.bufferLength; - - var firstDigit = this.firstDigit; - for (var i = 0, ii = bytes.length; i < ii; i++) { - var ch = bytes[i], digit; - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - digit = ch & 0x0F; - } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'Z', 'a'-'z' - digit = (ch & 0x0F) + 9; - } else if (ch === 0x3E) { // '>' - this.eof = true; - break; - } else { // probably whitespace - continue; // ignoring - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = (firstDigit << 4) | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - // incomplete byte - buffer[bufferLength++] = (firstDigit << 4); - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - }; - - return AsciiHexStream; -})(); - -var RunLengthStream = (function RunLengthStreamClosure() { - function RunLengthStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - DecodeStream.call(this, maybeLength); - } - - RunLengthStream.prototype = Object.create(DecodeStream.prototype); - - RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { - // The repeatHeader has following format. The first byte defines type of run - // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes - // (in addition to the second byte from the header), n = 129 through 255 - - // duplicate the second byte from the header (257 - n) times, n = 128 - end. - var repeatHeader = this.str.getBytes(2); - if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { - this.eof = true; - return; - } - - var buffer; - var bufferLength = this.bufferLength; - var n = repeatHeader[0]; - if (n < 128) { - // copy n bytes - buffer = this.ensureBuffer(bufferLength + n + 1); - buffer[bufferLength++] = repeatHeader[1]; - if (n > 0) { - var source = this.str.getBytes(n); - buffer.set(source, bufferLength); - bufferLength += n; - } - } else { - n = 257 - n; - var b = repeatHeader[1]; - buffer = this.ensureBuffer(bufferLength + n + 1); - for (var i = 0; i < n; i++) { - buffer[bufferLength++] = b; - } - } - this.bufferLength = bufferLength; - }; - - return RunLengthStream; -})(); - -var CCITTFaxStream = (function CCITTFaxStreamClosure() { - - var ccittEOL = -2; - var ccittEOF = -1; - var twoDimPass = 0; - var twoDimHoriz = 1; - var twoDimVert0 = 2; - var twoDimVertR1 = 3; - var twoDimVertL1 = 4; - var twoDimVertR2 = 5; - var twoDimVertL2 = 6; - var twoDimVertR3 = 7; - var twoDimVertL3 = 8; - - var twoDimTable = [ - [-1, -1], [-1, -1], // 000000x - [7, twoDimVertL3], // 0000010 - [7, twoDimVertR3], // 0000011 - [6, twoDimVertL2], [6, twoDimVertL2], // 000010x - [6, twoDimVertR2], [6, twoDimVertR2], // 000011x - [4, twoDimPass], [4, twoDimPass], // 0001xxx - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0] - ]; - - var whiteTable1 = [ - [-1, -1], // 00000 - [12, ccittEOL], // 00001 - [-1, -1], [-1, -1], // 0001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx - [11, 1792], [11, 1792], // 1000x - [12, 1984], // 10010 - [12, 2048], // 10011 - [12, 2112], // 10100 - [12, 2176], // 10101 - [12, 2240], // 10110 - [12, 2304], // 10111 - [11, 1856], [11, 1856], // 1100x - [11, 1920], [11, 1920], // 1101x - [12, 2368], // 11100 - [12, 2432], // 11101 - [12, 2496], // 11110 - [12, 2560] // 11111 - ]; - - var whiteTable2 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx - [8, 29], [8, 29], // 00000010x - [8, 30], [8, 30], // 00000011x - [8, 45], [8, 45], // 00000100x - [8, 46], [8, 46], // 00000101x - [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx - [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx - [8, 47], [8, 47], // 00001010x - [8, 48], [8, 48], // 00001011x - [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx - [6, 13], [6, 13], [6, 13], [6, 13], - [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx - [8, 33], [8, 33], // 00010010x - [8, 34], [8, 34], // 00010011x - [8, 35], [8, 35], // 00010100x - [8, 36], [8, 36], // 00010101x - [8, 37], [8, 37], // 00010110x - [8, 38], [8, 38], // 00010111x - [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx - [8, 31], [8, 31], // 00011010x - [8, 32], [8, 32], // 00011011x - [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx - [6, 1], [6, 1], [6, 1], [6, 1], - [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx - [6, 12], [6, 12], [6, 12], [6, 12], - [8, 53], [8, 53], // 00100100x - [8, 54], [8, 54], // 00100101x - [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx - [8, 39], [8, 39], // 00101000x - [8, 40], [8, 40], // 00101001x - [8, 41], [8, 41], // 00101010x - [8, 42], [8, 42], // 00101011x - [8, 43], [8, 43], // 00101100x - [8, 44], [8, 44], // 00101101x - [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx - [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx - [8, 61], [8, 61], // 00110010x - [8, 62], [8, 62], // 00110011x - [8, 63], [8, 63], // 00110100x - [8, 0], [8, 0], // 00110101x - [8, 320], [8, 320], // 00110110x - [8, 384], [8, 384], // 00110111x - [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx - [8, 59], [8, 59], // 01001010x - [8, 60], [8, 60], // 01001011x - [9, 1472], // 010011000 - [9, 1536], // 010011001 - [9, 1600], // 010011010 - [9, 1728], // 010011011 - [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx - [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx - [8, 49], [8, 49], // 01010010x - [8, 50], [8, 50], // 01010011x - [8, 51], [8, 51], // 01010100x - [8, 52], [8, 52], // 01010101x - [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx - [8, 55], [8, 55], // 01011000x - [8, 56], [8, 56], // 01011001x - [8, 57], [8, 57], // 01011010x - [8, 58], [8, 58], // 01011011x - [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx - [6, 192], [6, 192], [6, 192], [6, 192], - [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx - [6, 1664], [6, 1664], [6, 1664], [6, 1664], - [8, 448], [8, 448], // 01100100x - [8, 512], [8, 512], // 01100101x - [9, 704], // 011001100 - [9, 768], // 011001101 - [8, 640], [8, 640], // 01100111x - [8, 576], [8, 576], // 01101000x - [9, 832], // 011010010 - [9, 896], // 011010011 - [9, 960], // 011010100 - [9, 1024], // 011010101 - [9, 1088], // 011010110 - [9, 1152], // 011010111 - [9, 1216], // 011011000 - [9, 1280], // 011011001 - [9, 1344], // 011011010 - [9, 1408], // 011011011 - [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx - [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx - [6, 16], [6, 16], [6, 16], [6, 16], - [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx - [6, 17], [6, 17], [6, 17], [6, 17], - [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx - [6, 14], [6, 14], [6, 14], [6, 14], - [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx - [6, 15], [6, 15], [6, 15], [6, 15], - [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7] - ]; - - var blackTable1 = [ - [-1, -1], [-1, -1], // 000000000000x - [12, ccittEOL], [12, ccittEOL], // 000000000001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx - [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx - [12, 1984], [12, 1984], // 000000010010x - [12, 2048], [12, 2048], // 000000010011x - [12, 2112], [12, 2112], // 000000010100x - [12, 2176], [12, 2176], // 000000010101x - [12, 2240], [12, 2240], // 000000010110x - [12, 2304], [12, 2304], // 000000010111x - [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx - [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx - [12, 2368], [12, 2368], // 000000011100x - [12, 2432], [12, 2432], // 000000011101x - [12, 2496], [12, 2496], // 000000011110x - [12, 2560], [12, 2560], // 000000011111x - [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx - [10, 18], [10, 18], [10, 18], [10, 18], - [12, 52], [12, 52], // 000000100100x - [13, 640], // 0000001001010 - [13, 704], // 0000001001011 - [13, 768], // 0000001001100 - [13, 832], // 0000001001101 - [12, 55], [12, 55], // 000000100111x - [12, 56], [12, 56], // 000000101000x - [13, 1280], // 0000001010010 - [13, 1344], // 0000001010011 - [13, 1408], // 0000001010100 - [13, 1472], // 0000001010101 - [12, 59], [12, 59], // 000000101011x - [12, 60], [12, 60], // 000000101100x - [13, 1536], // 0000001011010 - [13, 1600], // 0000001011011 - [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx - [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx - [13, 1664], // 0000001100100 - [13, 1728], // 0000001100101 - [12, 320], [12, 320], // 000000110011x - [12, 384], [12, 384], // 000000110100x - [12, 448], [12, 448], // 000000110101x - [13, 512], // 0000001101100 - [13, 576], // 0000001101101 - [12, 53], [12, 53], // 000000110111x - [12, 54], [12, 54], // 000000111000x - [13, 896], // 0000001110010 - [13, 960], // 0000001110011 - [13, 1024], // 0000001110100 - [13, 1088], // 0000001110101 - [13, 1152], // 0000001110110 - [13, 1216], // 0000001110111 - [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx - [10, 64], [10, 64], [10, 64], [10, 64] - ]; - - var blackTable2 = [ - [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [11, 23], [11, 23], // 00000101000x - [12, 50], // 000001010010 - [12, 51], // 000001010011 - [12, 44], // 000001010100 - [12, 45], // 000001010101 - [12, 46], // 000001010110 - [12, 47], // 000001010111 - [12, 57], // 000001011000 - [12, 58], // 000001011001 - [12, 61], // 000001011010 - [12, 256], // 000001011011 - [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx - [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx - [12, 48], // 000001100100 - [12, 49], // 000001100101 - [12, 62], // 000001100110 - [12, 63], // 000001100111 - [12, 30], // 000001101000 - [12, 31], // 000001101001 - [12, 32], // 000001101010 - [12, 33], // 000001101011 - [12, 40], // 000001101100 - [12, 41], // 000001101101 - [11, 22], [11, 22], // 00000110111x - [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx - [9, 15], [9, 15], [9, 15], [9, 15], - [12, 128], // 000011001000 - [12, 192], // 000011001001 - [12, 26], // 000011001010 - [12, 27], // 000011001011 - [12, 28], // 000011001100 - [12, 29], // 000011001101 - [11, 19], [11, 19], // 00001100111x - [11, 20], [11, 20], // 00001101000x - [12, 34], // 000011010010 - [12, 35], // 000011010011 - [12, 36], // 000011010100 - [12, 37], // 000011010101 - [12, 38], // 000011010110 - [12, 39], // 000011010111 - [11, 21], [11, 21], // 00001101100x - [12, 42], // 000011011010 - [12, 43], // 000011011011 - [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx - [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12] - ]; - - var blackTable3 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx - [6, 9], // 000100 - [6, 8], // 000101 - [5, 7], [5, 7], // 00011x - [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx - [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx - [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx - [3, 1], [3, 1], [3, 1], [3, 1], - [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx - [3, 4], [3, 4], [3, 4], [3, 4], - [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2] - ]; - - function CCITTFaxStream(str, maybeLength, params) { - this.str = str; - this.dict = str.dict; - - params = params || Dict.empty; - - this.encoding = params.get('K') || 0; - this.eoline = params.get('EndOfLine') || false; - this.byteAlign = params.get('EncodedByteAlign') || false; - this.columns = params.get('Columns') || 1728; - this.rows = params.get('Rows') || 0; - var eoblock = params.get('EndOfBlock'); - if (eoblock === null || eoblock === undefined) { - eoblock = true; - } - this.eoblock = eoblock; - this.black = params.get('BlackIs1') || false; - - this.codingLine = new Uint32Array(this.columns + 1); - this.refLine = new Uint32Array(this.columns + 2); - - this.codingLine[0] = this.columns; - this.codingPos = 0; - - this.row = 0; - this.nextLine2D = this.encoding < 0; - this.inputBits = 0; - this.inputBuf = 0; - this.outputBits = 0; - - var code1; - while ((code1 = this.lookBits(12)) === 0) { - this.eatBits(1); - } - if (code1 === 1) { - this.eatBits(12); - } - if (this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - DecodeStream.call(this, maybeLength); - } - - CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); - - CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { - while (!this.eof) { - var c = this.lookChar(); - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } - }; - - CCITTFaxStream.prototype.addPixels = - function ccittFaxStreamAddPixels(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.addPixelsNeg = - function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } else if (a1 < codingLine[codingPos]) { - if (a1 < 0) { - info('invalid code'); - this.err = true; - a1 = 0; - } - while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { - --codingPos; - } - codingLine[codingPos] = a1; - } - - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { - var refLine = this.refLine; - var codingLine = this.codingLine; - var columns = this.columns; - - var refPos, blackPixels, bits, i; - - if (this.outputBits === 0) { - if (this.eof) { - return null; - } - this.err = false; - - var code1, code2, code3; - if (this.nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - this.codingPos = 0; - refPos = 0; - blackPixels = 0; - - while (codingLine[this.codingPos] < columns) { - code1 = this.getTwoDimCode(); - switch (code1) { - case twoDimPass: - this.addPixels(refLine[refPos + 1], blackPixels); - if (refLine[refPos + 1] < columns) { - refPos += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + - code1, blackPixels); - if (codingLine[this.codingPos] < columns) { - this.addPixels(codingLine[this.codingPos] + code2, - blackPixels ^ 1); - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - break; - case twoDimVertR3: - this.addPixels(refLine[refPos] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR2: - this.addPixels(refLine[refPos] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR1: - this.addPixels(refLine[refPos] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVert0: - this.addPixels(refLine[refPos], blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL3: - this.addPixelsNeg(refLine[refPos] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL2: - this.addPixelsNeg(refLine[refPos] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL1: - this.addPixelsNeg(refLine[refPos] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case ccittEOF: - this.addPixels(columns, 0); - this.eof = true; - break; - default: - info('bad 2d code'); - this.addPixels(columns, 0); - this.err = true; - } - } - } else { - codingLine[0] = 0; - this.codingPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + code1, blackPixels); - blackPixels ^= 1; - } - } - - var gotEOL = false; - - if (this.byteAlign) { - this.inputBits &= ~7; - } - - if (!this.eoblock && this.row === this.rows - 1) { - this.eof = true; - } else { - code1 = this.lookBits(12); - if (this.eoline) { - while (code1 !== ccittEOF && code1 !== 1) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } else { - while (code1 === 0) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } - if (code1 === 1) { - this.eatBits(12); - gotEOL = true; - } else if (code1 === ccittEOF) { - this.eof = true; - } - } - - if (!this.eof && this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - if (this.eoblock && gotEOL && this.byteAlign) { - code1 = this.lookBits(12); - if (code1 === 1) { - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - if (this.encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = this.lookBits(12); - if (code1 !== 1) { - info('bad rtc code: ' + code1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - } - } - this.eof = true; - } - } else if (this.err && this.eoline) { - while (true) { - code1 = this.lookBits(13); - if (code1 === ccittEOF) { - this.eof = true; - return null; - } - if ((code1 >> 1) === 1) { - break; - } - this.eatBits(1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.eatBits(1); - this.nextLine2D = !(code1 & 1); - } - } - - if (codingLine[0] > 0) { - this.outputBits = codingLine[this.codingPos = 0]; - } else { - this.outputBits = codingLine[this.codingPos = 1]; - } - this.row++; - } - - var c; - if (this.outputBits >= 8) { - c = (this.codingPos & 1) ? 0 : 0xFF; - this.outputBits -= 8; - if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } - } else { - bits = 8; - c = 0; - do { - if (this.outputBits > bits) { - c <<= bits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - bits); - } - this.outputBits -= bits; - bits = 0; - } else { - c <<= this.outputBits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - this.outputBits); - } - bits -= this.outputBits; - this.outputBits = 0; - if (codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } else if (bits > 0) { - c <<= bits; - bits = 0; - } - } - } while (bits); - } - if (this.black) { - c ^= 0xFF; - } - return c; - }; - - // This functions returns the code found from the table. - // The start and end parameters set the boundaries for searching the table. - // The limit parameter is optional. Function returns an array with three - // values. The first array element indicates whether a valid code is being - // returned. The second array element is the actual code. The third array - // element indicates whether EOF was reached. - CCITTFaxStream.prototype.findTableCode = - function ccittFaxStreamFindTableCode(start, end, table, limit) { - - var limitValue = limit || 0; - for (var i = start; i <= end; ++i) { - var code = this.lookBits(i); - if (code === ccittEOF) { - return [true, 1, false]; - } - if (i < end) { - code <<= end - i; - } - if (!limitValue || code >= limitValue) { - var p = table[code - limitValue]; - if (p[0] === i) { - this.eatBits(i); - return [true, p[1], true]; - } - } - } - return [false, 0, false]; - }; - - CCITTFaxStream.prototype.getTwoDimCode = - function ccittFaxStreamGetTwoDimCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(7); - p = twoDimTable[code]; - if (p && p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 7, twoDimTable); - if (result[0] && result[2]) { - return result[1]; - } - } - info('Bad two dim code'); - return ccittEOF; - }; - - CCITTFaxStream.prototype.getWhiteCode = - function ccittFaxStreamGetWhiteCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(12); - if (code === ccittEOF) { - return 1; - } - - if ((code >> 5) === 0) { - p = whiteTable1[code]; - } else { - p = whiteTable2[code >> 3]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 9, whiteTable2); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(11, 12, whiteTable1); - if (result[0]) { - return result[1]; - } - } - info('bad white code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.getBlackCode = - function ccittFaxStreamGetBlackCode() { - - var code, p; - if (this.eoblock) { - code = this.lookBits(13); - if (code === ccittEOF) { - return 1; - } - if ((code >> 7) === 0) { - p = blackTable1[code]; - } else if ((code >> 9) === 0 && (code >> 7) !== 0) { - p = blackTable2[(code >> 1) - 64]; - } else { - p = blackTable3[code >> 7]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(2, 6, blackTable3); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(7, 12, blackTable2, 64); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(10, 13, blackTable1); - if (result[0]) { - return result[1]; - } - } - info('bad black code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { - var c; - while (this.inputBits < n) { - if ((c = this.str.getByte()) === -1) { - if (this.inputBits === 0) { - return ccittEOF; - } - return ((this.inputBuf << (n - this.inputBits)) & - (0xFFFF >> (16 - n))); - } - this.inputBuf = (this.inputBuf << 8) | c; - this.inputBits += 8; - } - return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n)); - }; - - CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { - if ((this.inputBits -= n) < 0) { - this.inputBits = 0; - } - }; - - return CCITTFaxStream; -})(); - -var LZWStream = (function LZWStreamClosure() { - function LZWStream(str, maybeLength, earlyChange) { - this.str = str; - this.dict = str.dict; - this.cachedData = 0; - this.bitsCached = 0; - - var maxLzwDictionarySize = 4096; - var lzwState = { - earlyChange: earlyChange, - codeLength: 9, - nextCode: 258, - dictionaryValues: new Uint8Array(maxLzwDictionarySize), - dictionaryLengths: new Uint16Array(maxLzwDictionarySize), - dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), - currentSequence: new Uint8Array(maxLzwDictionarySize), - currentSequenceLength: 0 - }; - for (var i = 0; i < 256; ++i) { - lzwState.dictionaryValues[i] = i; - lzwState.dictionaryLengths[i] = 1; - } - this.lzwState = lzwState; - - DecodeStream.call(this, maybeLength); - } - - LZWStream.prototype = Object.create(DecodeStream.prototype); - - LZWStream.prototype.readBits = function LZWStream_readBits(n) { - var bitsCached = this.bitsCached; - var cachedData = this.cachedData; - while (bitsCached < n) { - var c = this.str.getByte(); - if (c === -1) { - this.eof = true; - return null; - } - cachedData = (cachedData << 8) | c; - bitsCached += 8; - } - this.bitsCached = (bitsCached -= n); - this.cachedData = cachedData; - this.lastCode = null; - return (cachedData >>> bitsCached) & ((1 << n) - 1); - }; - - LZWStream.prototype.readBlock = function LZWStream_readBlock() { - var blockSize = 512; - var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; - var i, j, q; - - var lzwState = this.lzwState; - if (!lzwState) { - return; // eof was found - } - - var earlyChange = lzwState.earlyChange; - var nextCode = lzwState.nextCode; - var dictionaryValues = lzwState.dictionaryValues; - var dictionaryLengths = lzwState.dictionaryLengths; - var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; - var codeLength = lzwState.codeLength; - var prevCode = lzwState.prevCode; - var currentSequence = lzwState.currentSequence; - var currentSequenceLength = lzwState.currentSequenceLength; - - var decodedLength = 0; - var currentBufferLength = this.bufferLength; - var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - - for (i = 0; i < blockSize; i++) { - var code = this.readBits(codeLength); - var hasPrev = currentSequenceLength > 0; - if (code < 256) { - currentSequence[0] = code; - currentSequenceLength = 1; - } else if (code >= 258) { - if (code < nextCode) { - currentSequenceLength = dictionaryLengths[code]; - for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { - currentSequence[j] = dictionaryValues[q]; - q = dictionaryPrevCodes[q]; - } - } else { - currentSequence[currentSequenceLength++] = currentSequence[0]; - } - } else if (code === 256) { - codeLength = 9; - nextCode = 258; - currentSequenceLength = 0; - continue; - } else { - this.eof = true; - delete this.lzwState; - break; - } - - if (hasPrev) { - dictionaryPrevCodes[nextCode] = prevCode; - dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; - dictionaryValues[nextCode] = currentSequence[0]; - nextCode++; - codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ? - codeLength : Math.min(Math.log(nextCode + earlyChange) / - 0.6931471805599453 + 1, 12) | 0; - } - prevCode = code; - - decodedLength += currentSequenceLength; - if (estimatedDecodedSize < decodedLength) { - do { - estimatedDecodedSize += decodedSizeDelta; - } while (estimatedDecodedSize < decodedLength); - buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - } - for (j = 0; j < currentSequenceLength; j++) { - buffer[currentBufferLength++] = currentSequence[j]; - } - } - lzwState.nextCode = nextCode; - lzwState.codeLength = codeLength; - lzwState.prevCode = prevCode; - lzwState.currentSequenceLength = currentSequenceLength; - - this.bufferLength = currentBufferLength; - }; - - return LZWStream; -})(); - -var NullStream = (function NullStreamClosure() { - function NullStream() { - Stream.call(this, new Uint8Array(0)); - } - - NullStream.prototype = Stream.prototype; - - return NullStream; -})(); - -exports.Ascii85Stream = Ascii85Stream; -exports.AsciiHexStream = AsciiHexStream; -exports.CCITTFaxStream = CCITTFaxStream; -exports.DecryptStream = DecryptStream; -exports.DecodeStream = DecodeStream; -exports.FlateStream = FlateStream; -exports.Jbig2Stream = Jbig2Stream; -exports.JpegStream = JpegStream; -exports.JpxStream = JpxStream; -exports.NullStream = NullStream; -exports.PredictorStream = PredictorStream; -exports.RunLengthStream = RunLengthStream; -exports.Stream = Stream; -exports.StreamsSequenceStream = StreamsSequenceStream; -exports.StringStream = StringStream; -exports.LZWStream = LZWStream; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCrypto = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream) { - -var PasswordException = sharedUtil.PasswordException; -var PasswordResponses = sharedUtil.PasswordResponses; -var bytesToString = sharedUtil.bytesToString; -var error = sharedUtil.error; -var isInt = sharedUtil.isInt; -var stringToBytes = sharedUtil.stringToBytes; -var utf8StringToString = sharedUtil.utf8StringToString; -var warn = sharedUtil.warn; -var Name = corePrimitives.Name; -var isName = corePrimitives.isName; -var isDict = corePrimitives.isDict; -var DecryptStream = coreStream.DecryptStream; - -var ARCFourCipher = (function ARCFourCipherClosure() { - function ARCFourCipher(key) { - this.a = 0; - this.b = 0; - var s = new Uint8Array(256); - var i, j = 0, tmp, keyLength = key.length; - for (i = 0; i < 256; ++i) { - s[i] = i; - } - for (i = 0; i < 256; ++i) { - tmp = s[i]; - j = (j + tmp + key[i % keyLength]) & 0xFF; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - - ARCFourCipher.prototype = { - encryptBlock: function ARCFourCipher_encryptBlock(data) { - var i, n = data.length, tmp, tmp2; - var a = this.a, b = this.b, s = this.s; - var output = new Uint8Array(n); - for (i = 0; i < n; ++i) { - a = (a + 1) & 0xFF; - tmp = s[a]; - b = (b + tmp) & 0xFF; - tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; - } - this.a = a; - this.b = b; - return output; - } - }; - ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; - - return ARCFourCipher; -})(); - -var calculateMD5 = (function calculateMD5Closure() { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551]); - - function hash(data, offset, length) { - var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, b = h1, c = h2, d = h3, f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - - return hash; -})(); -var Word64 = (function Word64Closure() { - function Word64(highInteger, lowInteger) { - this.high = highInteger | 0; - this.low = lowInteger | 0; - } - Word64.prototype = { - and: function Word64_and(word) { - this.high &= word.high; - this.low &= word.low; - }, - xor: function Word64_xor(word) { - this.high ^= word.high; - this.low ^= word.low; - }, - - or: function Word64_or(word) { - this.high |= word.high; - this.low |= word.low; - }, - - shiftRight: function Word64_shiftRight(places) { - if (places >= 32) { - this.low = (this.high >>> (places - 32)) | 0; - this.high = 0; - } else { - this.low = (this.low >>> places) | (this.high << (32 - places)); - this.high = (this.high >>> places) | 0; - } - }, - - shiftLeft: function Word64_shiftLeft(places) { - if (places >= 32) { - this.high = this.low << (places - 32); - this.low = 0; - } else { - this.high = (this.high << places) | (this.low >>> (32 - places)); - this.low = this.low << places; - } - }, - - rotateRight: function Word64_rotateRight(places) { - var low, high; - if (places & 32) { - high = this.low; - low = this.high; - } else { - low = this.low; - high = this.high; - } - places &= 31; - this.low = (low >>> places) | (high << (32 - places)); - this.high = (high >>> places) | (low << (32 - places)); - }, - - not: function Word64_not() { - this.high = ~this.high; - this.low = ~this.low; - }, - - add: function Word64_add(word) { - var lowAdd = (this.low >>> 0) + (word.low >>> 0); - var highAdd = (this.high >>> 0) + (word.high >>> 0); - if (lowAdd > 0xFFFFFFFF) { - highAdd += 1; - } - this.low = lowAdd | 0; - this.high = highAdd | 0; - }, - - copyTo: function Word64_copyTo(bytes, offset) { - bytes[offset] = (this.high >>> 24) & 0xFF; - bytes[offset + 1] = (this.high >> 16) & 0xFF; - bytes[offset + 2] = (this.high >> 8) & 0xFF; - bytes[offset + 3] = this.high & 0xFF; - bytes[offset + 4] = (this.low >>> 24) & 0xFF; - bytes[offset + 5] = (this.low >> 16) & 0xFF; - bytes[offset + 6] = (this.low >> 8) & 0xFF; - bytes[offset + 7] = this.low & 0xFF; - }, - - assign: function Word64_assign(word) { - this.high = word.high; - this.low = word.low; - } - }; - return Word64; -})(); - -var calculateSHA256 = (function calculateSHA256Closure() { - function rotr(x, n) { - return (x >>> n) | (x << 32 - n); - } - - function ch(x, y, z) { - return (x & y) ^ (~x & z); - } - - function maj(x, y, z) { - return (x & y) ^ (x & z) ^ (y & z); - } - - function sigma(x) { - return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); - } - - function sigmaPrime(x) { - return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); - } - - function littleSigma(x) { - return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; - } - - function littleSigmaPrime(x) { - return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; - } - - var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; - - function hash(data, offset, length) { - // initial hash values - var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, - h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, - h6 = 0x1f83d9ab, h7 = 0x5be0cd19; - // pre-processing - var paddedLength = Math.ceil((length + 9) / 64) * 64; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - var w = new Uint32Array(64); - // for each 512 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j] = (padded[i] << 24 | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3])); - i += 4; - } - - for (j = 16; j < 64; ++j) { - w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + - littleSigma(w[j - 15]) + w[j - 16] | 0; - } - var a = h0, b = h1, c = h2, d = h3, e = h4, - f = h5, g = h6, h = h7, t1, t2; - for (j = 0; j < 64; ++j) { - t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; - t2 = sigma(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - h4 = (h4 + e) | 0; - h5 = (h5 + f) | 0; - h6 = (h6 + g) | 0; - h7 = (h7 + h) | 0; - } - return new Uint8Array([ - (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF, - (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF, - (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF, - (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF, - (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF, - (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF, - (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF, - (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF - ]); - } - - return hash; -})(); - -var calculateSHA512 = (function calculateSHA512Closure() { - function ch(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.not(); - tmp.and(z); - result.xor(tmp); - } - - function maj(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.and(z); - result.xor(tmp); - tmp.assign(y); - tmp.and(z); - result.xor(tmp); - } - - function sigma(result, x, tmp) { - result.assign(x); - result.rotateRight(28); - tmp.assign(x); - tmp.rotateRight(34); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(39); - result.xor(tmp); - } - - function sigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(14); - tmp.assign(x); - tmp.rotateRight(18); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(41); - result.xor(tmp); - } - - function littleSigma(result, x, tmp) { - result.assign(x); - result.rotateRight(1); - tmp.assign(x); - tmp.rotateRight(8); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(7); - result.xor(tmp); - } - - function littleSigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(19); - tmp.assign(x); - tmp.rotateRight(61); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(6); - result.xor(tmp); - } - - var k = [ - new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), - new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), - new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), - new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), - new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), - new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), - new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), - new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), - new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), - new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), - new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), - new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), - new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), - new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), - new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), - new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), - new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), - new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), - new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), - new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), - new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), - new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), - new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), - new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), - new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), - new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), - new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), - new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), - new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), - new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), - new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), - new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), - new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), - new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), - new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), - new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), - new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), - new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), - new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), - new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; - - function hash(data, offset, length, mode384) { - mode384 = !!mode384; - // initial hash values - var h0, h1, h2, h3, h4, h5, h6, h7; - if (!mode384) { - h0 = new Word64(0x6a09e667, 0xf3bcc908); - h1 = new Word64(0xbb67ae85, 0x84caa73b); - h2 = new Word64(0x3c6ef372, 0xfe94f82b); - h3 = new Word64(0xa54ff53a, 0x5f1d36f1); - h4 = new Word64(0x510e527f, 0xade682d1); - h5 = new Word64(0x9b05688c, 0x2b3e6c1f); - h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); - h7 = new Word64(0x5be0cd19, 0x137e2179); - } - else { - // SHA384 is exactly the same - // except with different starting values and a trimmed result - h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); - h1 = new Word64(0x629a292a, 0x367cd507); - h2 = new Word64(0x9159015a, 0x3070dd17); - h3 = new Word64(0x152fecd8, 0xf70e5939); - h4 = new Word64(0x67332667, 0xffc00b31); - h5 = new Word64(0x8eb44a87, 0x68581511); - h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); - h7 = new Word64(0x47b5481d, 0xbefa4fa4); - } - - // pre-processing - var paddedLength = Math.ceil((length + 17) / 128) * 128; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 16; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - - var w = new Array(80); - for (i = 0; i < 80; i++) { - w[i] = new Word64(0, 0); - } - var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0); - var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0); - var g = new Word64(0, 0), h = new Word64(0, 0); - var t1 = new Word64(0, 0), t2 = new Word64(0, 0); - var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3; - - // for each 1024 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3]); - w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 | - (padded[i + 6]) << 8 | (padded[i + 7]); - i += 8; - } - for (j = 16; j < 80; ++j) { - tmp3 = w[j]; - littleSigmaPrime(tmp3, w[j - 2], tmp2); - tmp3.add(w[j - 7]); - littleSigma(tmp1, w[j - 15], tmp2); - tmp3.add(tmp1); - tmp3.add(w[j - 16]); - } - - a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3); - e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7); - for (j = 0; j < 80; ++j) { - t1.assign(h); - sigmaPrime(tmp1, e, tmp2); - t1.add(tmp1); - ch(tmp1, e, f, g, tmp2); - t1.add(tmp1); - t1.add(k[j]); - t1.add(w[j]); - - sigma(t2, a, tmp2); - maj(tmp1, a, b, c, tmp2); - t2.add(tmp1); - - tmp3 = h; - h = g; - g = f; - f = e; - d.add(t1); - e = d; - d = c; - c = b; - b = a; - tmp3.assign(t1); - tmp3.add(t2); - a = tmp3; - } - h0.add(a); - h1.add(b); - h2.add(c); - h3.add(d); - h4.add(e); - h5.add(f); - h6.add(g); - h7.add(h); - } - - var result; - if (!mode384) { - result = new Uint8Array(64); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - h6.copyTo(result,48); - h7.copyTo(result,56); - } - else { - result = new Uint8Array(48); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - } - return result; - } - - return hash; -})(); -var calculateSHA384 = (function calculateSHA384Closure() { - function hash(data, offset, length) { - return calculateSHA512(data, offset, length, true); - } - - return hash; -})(); -var NullCipher = (function NullCipherClosure() { - function NullCipher() { - } - - NullCipher.prototype = { - decryptBlock: function NullCipher_decryptBlock(data) { - return data; - } - }; - - return NullCipher; -})(); - -var AES128Cipher = (function AES128CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey128(cipherKey) { - var b = 176, result = new Uint8Array(b); - result.set(cipherKey); - for (var j = 16, i = 1; j < b; ++i) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ rcon[i]; - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 16]); - j++; - result[j] = (t2 ^= result[j - 16]); - j++; - result[j] = (t3 ^= result[j - 16]); - j++; - result[j] = (t4 ^= result[j - 16]); - j++; - } - } - return result; - } - - function decrypt128(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 9; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt128(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 10; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - return state; - } - - function AES128Cipher(key) { - this.key = expandKey128(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt128(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - - AES128Cipher.prototype = { - decryptBlock: function AES128Cipher_decryptBlock(data, finalize) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // waiting for IV values -- they are at the start of the stream - for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - // need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data.subarray(16), finalize); - }, - encrypt: function AES128Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt128(buffer, this.key); - iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES128Cipher; -})(); - -var AES256Cipher = (function AES256CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey256(cipherKey) { - var b = 240, result = new Uint8Array(b); - var r = 1; - - result.set(cipherKey); - for (var j = 32, i = 1; j < b; ++i) { - if (j % 32 === 16) { - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - } else if (j % 32 === 0) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ r; - if ((r <<= 1) >= 256) { - r = (r ^ 0x1b) & 0xFF; - } - } - - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 32]); - j++; - result[j] = (t2 ^= result[j - 32]); - j++; - result[j] = (t3 ^= result[j - 32]); - j++; - result[j] = (t4 ^= result[j - 32]); - j++; - } - } - return result; - } - - function decrypt256(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 13; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt256(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 14; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - - return state; - - } - - function AES256Cipher(key) { - this.key = expandKey256(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt256(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - - } - - AES256Cipher.prototype = { - decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // if not supplied an IV wait for IV values - // they are at the start of the stream - if (iv) { - this.iv = iv; - } else { - for (i = 0; bufferLength < 16 && - i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - //need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - data = data.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data, finalize); - }, - encrypt: function AES256Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt256(buffer, this.key); - this.iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES256Cipher; -})(); - -var PDF17 = (function PDF17Closure() { - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - function PDF17() { - } - - PDF17.prototype = { - checkOwnerPassword: function PDF17_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF17_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF17_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF17; -})(); - -var PDF20 = (function PDF20Closure() { - - function concatArrays(array1, array2) { - var t = new Uint8Array(array1.length + array2.length); - t.set(array1, 0); - t.set(array2, array1.length); - return t; - } - - function calculatePDF20Hash(password, input, userBytes) { - //This refers to Algorithm 2.B as defined in ISO 32000-2 - var k = calculateSHA256(input, 0, input.length).subarray(0, 32); - var e = [0]; - var i = 0; - while (i < 64 || e[e.length - 1] > i - 32) { - var arrayLength = password.length + k.length + userBytes.length; - - var k1 = new Uint8Array(arrayLength * 64); - var array = concatArrays(password, k); - array = concatArrays(array, userBytes); - for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) { - k1.set(array, pos); - } - //AES128 CBC NO PADDING with - //first 16 bytes of k as the key and the second 16 as the iv. - var cipher = new AES128Cipher(k.subarray(0, 16)); - e = cipher.encrypt(k1, k.subarray(16, 32)); - //Now we have to take the first 16 bytes of an unsigned - //big endian integer... and compute the remainder - //modulo 3.... That is a fairly large number and - //JavaScript isn't going to handle that well... - //So we're using a trick that allows us to perform - //modulo math byte by byte - var remainder = 0; - for (var z = 0; z < 16; z++) { - remainder *= (256 % 3); - remainder %= 3; - remainder += ((e[z] >>> 0) % 3); - remainder %= 3; - } - if (remainder === 0) { - k = calculateSHA256(e, 0, e.length); - } - else if (remainder === 1) { - k = calculateSHA384(e, 0, e.length); - } - else if (remainder === 2) { - k = calculateSHA512(e, 0, e.length); - } - i++; - } - return k.subarray(0, 32); - } - - function PDF20() { - } - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - PDF20.prototype = { - hash: function PDF20_hash(password, concatBytes, userBytes) { - return calculatePDF20Hash(password, concatBytes, userBytes); - }, - checkOwnerPassword: function PDF20_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculatePDF20Hash(password, hashData, userBytes); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF20_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculatePDF20Hash(password, hashData, []); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculatePDF20Hash(password, hashData, userBytes); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF20_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculatePDF20Hash(password, hashData, []); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF20; -})(); - -var CipherTransform = (function CipherTransformClosure() { - function CipherTransform(stringCipherConstructor, streamCipherConstructor) { - this.stringCipherConstructor = stringCipherConstructor; - this.streamCipherConstructor = streamCipherConstructor; - } - - CipherTransform.prototype = { - createStream: function CipherTransform_createStream(stream, length) { - var cipher = new this.streamCipherConstructor(); - return new DecryptStream(stream, length, - function cipherTransformDecryptStream(data, finalize) { - return cipher.decryptBlock(data, finalize); - } - ); - }, - decryptString: function CipherTransform_decryptString(s) { - var cipher = new this.stringCipherConstructor(); - var data = stringToBytes(s); - data = cipher.decryptBlock(data, true); - return bytesToString(data); - } - }; - return CipherTransform; -})(); - -var CipherTransformFactory = (function CipherTransformFactoryClosure() { - var defaultPasswordBytes = new Uint8Array([ - 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, - 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, - 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, - 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); - - function createEncryptionKey20(revision, password, ownerPassword, - ownerValidationSalt, ownerKeySalt, uBytes, - userPassword, userValidationSalt, userKeySalt, - ownerEncryption, userEncryption, perms) { - if (password) { - var passwordLength = Math.min(127, password.length); - password = password.subarray(0, passwordLength); - } else { - password = []; - } - var pdfAlgorithm; - if (revision === 6) { - pdfAlgorithm = new PDF20(); - } else { - pdfAlgorithm = new PDF17(); - } - - if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, - userPassword)) { - return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); - } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, - ownerValidationSalt, - uBytes, - ownerPassword)) { - return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, - ownerEncryption); - } - - return null; - } - - function prepareKeyData(fileId, password, ownerPassword, userPassword, - flags, revision, keyLength, encryptMetadata) { - var hashDataSize = 40 + ownerPassword.length + fileId.length; - var hashData = new Uint8Array(hashDataSize), i = 0, j, n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - // as now the padded password in the hashData[0..i] - for (j = 0, n = ownerPassword.length; j < n; ++j) { - hashData[i++] = ownerPassword[j]; - } - hashData[i++] = flags & 0xFF; - hashData[i++] = (flags >> 8) & 0xFF; - hashData[i++] = (flags >> 16) & 0xFF; - hashData[i++] = (flags >>> 24) & 0xFF; - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - if (revision >= 4 && !encryptMetadata) { - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } - } - var encryptionKey = hash.subarray(0, keyLengthInBytes); - var cipher, checkData; - - if (revision >= 3) { - for (i = 0; i < 32; ++i) { - hashData[i] = defaultPasswordBytes[i]; - } - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - var derivedKey = new Uint8Array(n), k; - for (j = 1; j <= 19; ++j) { - for (k = 0; k < n; ++k) { - derivedKey[k] = encryptionKey[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(defaultPasswordBytes); - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } - return encryptionKey; - } - - function decodeUserPassword(password, ownerPassword, revision, keyLength) { - var hashData = new Uint8Array(32), i = 0, j, n; - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); - } - } - - var cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - var derivedKey = new Uint8Array(keyLengthInBytes), k; - for (j = 19; j >= 0; j--) { - for (k = 0; k < keyLengthInBytes; ++k) { - derivedKey[k] = hash[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); - } - } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); - } - return userPassword; - } - - var identityName = Name.get('Identity'); - - function CipherTransformFactory(dict, fileId, password) { - var filter = dict.get('Filter'); - if (!isName(filter, 'Standard')) { - error('unknown encryption method'); - } - this.dict = dict; - var algorithm = dict.get('V'); - if (!isInt(algorithm) || - (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && - algorithm !== 5)) { - error('unsupported encryption algorithm'); - } - this.algorithm = algorithm; - var keyLength = dict.get('Length'); - if (!keyLength) { - // Spec asks to rely on encryption dictionary's Length entry, however - // some PDFs don't have it. Trying to recover. - if (algorithm <= 3) { - // For 1 and 2 it's fixed to 40-bit, for 3 40-bit is a minimal value. - keyLength = 40; - } else { - // Trying to find default handler -- it usually has Length. - var cfDict = dict.get('CF'); - var streamCryptoName = dict.get('StmF'); - if (isDict(cfDict) && isName(streamCryptoName)) { - var handlerDict = cfDict.get(streamCryptoName.name); - keyLength = (handlerDict && handlerDict.get('Length')) || 128; - if (keyLength < 40) { - // Sometimes it's incorrect value of bits, generators specify bytes. - keyLength <<= 3; - } - } - } - } - if (!isInt(keyLength) || - keyLength < 40 || (keyLength % 8) !== 0) { - error('invalid key length'); - } - - // prepare keys - var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32); - var userPassword = stringToBytes(dict.get('U')).subarray(0, 32); - var flags = dict.get('P'); - var revision = dict.get('R'); - // meaningful when V is 4 or 5 - var encryptMetadata = ((algorithm === 4 || algorithm === 5) && - dict.get('EncryptMetadata') !== false); - this.encryptMetadata = encryptMetadata; - - var fileIdBytes = stringToBytes(fileId); - var passwordBytes; - if (password) { - if (revision === 6) { - try { - password = utf8StringToString(password); - } catch (ex) { - warn('CipherTransformFactory: ' + - 'Unable to convert UTF8 encoded password.'); - } - } - passwordBytes = stringToBytes(password); - } - - var encryptionKey; - if (algorithm !== 5) { - encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - else { - var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40); - var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48); - var uBytes = stringToBytes(dict.get('U')).subarray(0, 48); - var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40); - var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48); - var ownerEncryption = stringToBytes(dict.get('OE')); - var userEncryption = stringToBytes(dict.get('UE')); - var perms = stringToBytes(dict.get('Perms')); - encryptionKey = - createEncryptionKey20(revision, passwordBytes, - ownerPassword, ownerValidationSalt, - ownerKeySalt, uBytes, - userPassword, userValidationSalt, - userKeySalt, ownerEncryption, - userEncryption, perms); - } - if (!encryptionKey && !password) { - throw new PasswordException('No password given', - PasswordResponses.NEED_PASSWORD); - } else if (!encryptionKey && password) { - // Attempting use the password as an owner password - var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, - revision, keyLength); - encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - - if (!encryptionKey) { - throw new PasswordException('Incorrect Password', - PasswordResponses.INCORRECT_PASSWORD); - } - - this.encryptionKey = encryptionKey; - - if (algorithm >= 4) { - this.cf = dict.get('CF'); - this.stmf = dict.get('StmF') || identityName; - this.strf = dict.get('StrF') || identityName; - this.eff = dict.get('EFF') || this.stmf; - } - } - - function buildObjectKey(num, gen, encryptionKey, isAes) { - var key = new Uint8Array(encryptionKey.length + 9), i, n; - for (i = 0, n = encryptionKey.length; i < n; ++i) { - key[i] = encryptionKey[i]; - } - key[i++] = num & 0xFF; - key[i++] = (num >> 8) & 0xFF; - key[i++] = (num >> 16) & 0xFF; - key[i++] = gen & 0xFF; - key[i++] = (gen >> 8) & 0xFF; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6C; - key[i++] = 0x54; - } - var hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); - } - - function buildCipherConstructor(cf, name, num, gen, key) { - var cryptFilter = cf.get(name.name); - var cfm; - if (cryptFilter !== null && cryptFilter !== undefined) { - cfm = cryptFilter.get('CFM'); - } - if (!cfm || cfm.name === 'None') { - return function cipherTransformFactoryBuildCipherConstructorNone() { - return new NullCipher(); - }; - } - if ('V2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorV2() { - return new ARCFourCipher(buildObjectKey(num, gen, key, false)); - }; - } - if ('AESV2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV2() { - return new AES128Cipher(buildObjectKey(num, gen, key, true)); - }; - } - if ('AESV3' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV3() { - return new AES256Cipher(key); - }; - } - error('Unknown crypto method'); - } - - CipherTransformFactory.prototype = { - createCipherTransform: - function CipherTransformFactory_createCipherTransform(num, gen) { - if (this.algorithm === 4 || this.algorithm === 5) { - return new CipherTransform( - buildCipherConstructor(this.cf, this.stmf, - num, gen, this.encryptionKey), - buildCipherConstructor(this.cf, this.strf, - num, gen, this.encryptionKey)); - } - // algorithms 1 and 2 - var key = buildObjectKey(num, gen, this.encryptionKey, false); - var cipherConstructor = function buildCipherCipherConstructor() { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); - } - }; - - return CipherTransformFactory; -})(); - -exports.AES128Cipher = AES128Cipher; -exports.AES256Cipher = AES256Cipher; -exports.ARCFourCipher = ARCFourCipher; -exports.CipherTransformFactory = CipherTransformFactory; -exports.PDF17 = PDF17; -exports.PDF20 = PDF20; -exports.calculateMD5 = calculateMD5; -exports.calculateSHA256 = calculateSHA256; -exports.calculateSHA384 = calculateSHA384; -exports.calculateSHA512 = calculateSHA512; -})); - -(function (root, factory) { - { - factory((root.pdfjsCoreFontRenderer = {}), root.pdfjsSharedUtil, - root.pdfjsCoreStream, root.pdfjsCoreGlyphList, root.pdfjsCoreEncodings, - root.pdfjsCoreCFFParser); - } -}(this, function (exports, sharedUtil, coreStream, coreGlyphList, - coreEncodings, coreCFFParser) { - -var Util = sharedUtil.Util; -var bytesToString = sharedUtil.bytesToString; -var error = sharedUtil.error; -var Stream = coreStream.Stream; -var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; -var StandardEncoding = coreEncodings.StandardEncoding; -var CFFParser = coreCFFParser.CFFParser; - -var FontRendererFactory = (function FontRendererFactoryClosure() { - function getLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - } - - function getUshort(data, offset) { - return (data[offset] << 8) | data[offset + 1]; - } - - function parseCmap(data, start, end) { - var offset = (getUshort(data, start + 2) === 1 ? - getLong(data, start + 8) : getLong(data, start + 16)); - var format = getUshort(data, start + offset); - var length, ranges, p, i; - if (format === 4) { - length = getUshort(data, start + offset + 2); - var segCount = getUshort(data, start + offset + 6) >> 1; - p = start + offset + 14; - ranges = []; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i] = {end: getUshort(data, p)}; - } - p += 2; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].start = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].idDelta = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - var idOffset = getUshort(data, p); - if (idOffset === 0) { - continue; - } - ranges[i].ids = []; - for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { - ranges[i].ids[j] = getUshort(data, p + idOffset); - idOffset += 2; - } - } - return ranges; - } else if (format === 12) { - length = getLong(data, start + offset + 4); - var groups = getLong(data, start + offset + 12); - p = start + offset + 16; - ranges = []; - for (i = 0; i < groups; i++) { - ranges.push({ - start: getLong(data, p), - end: getLong(data, p + 4), - idDelta: getLong(data, p + 8) - getLong(data, p) - }); - p += 12; - } - return ranges; - } - error('not supported cmap: ' + format); - } - - function parseCff(data, start, end, seacAnalysisEnabled) { - var properties = {}; - var parser = new CFFParser(new Stream(data, start, end - start), - properties, seacAnalysisEnabled); - var cff = parser.parse(); - return { - glyphs: cff.charStrings.objects, - subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && - cff.topDict.privateDict.subrsIndex.objects), - gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects - }; - } - - function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { - var itemSize, itemDecode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - } - var glyphs = []; - var startOffset = itemDecode(loca, 0); - for (var j = itemSize; j < loca.length; j += itemSize) { - var endOffset = itemDecode(loca, j); - glyphs.push(glyf.subarray(startOffset, endOffset)); - startOffset = endOffset; - } - return glyphs; - } - - function lookupCmap(ranges, unicode) { - var code = unicode.charCodeAt(0), gid = 0; - var l = 0, r = ranges.length - 1; - while (l < r) { - var c = (l + r + 1) >> 1; - if (code < ranges[c].start) { - r = c - 1; - } else { - l = c; - } - } - if (ranges[l].start <= code && code <= ranges[l].end) { - gid = (ranges[l].idDelta + (ranges[l].ids ? - ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF; - } - return { - charCode: code, - glyphId: gid, - }; - } - - function compileGlyf(code, cmds, font) { - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function quadraticCurveTo(xa, ya, x, y) { - cmds.push({cmd: 'quadraticCurveTo', args: [xa, ya, x, y]}); - } - - var i = 0; - var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - var flags; - var x = 0, y = 0; - i += 10; - if (numberOfContours < 0) { - // composite glyph - do { - flags = (code[i] << 8) | code[i + 1]; - var glyphIndex = (code[i + 2] << 8) | code[i + 3]; - i += 4; - var arg1, arg2; - if ((flags & 0x01)) { - arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16; - i += 4; - } else { - arg1 = code[i++]; arg2 = code[i++]; - } - if ((flags & 0x02)) { - x = arg1; - y = arg2; - } else { - x = 0; y = 0; // TODO "they are points" ? - } - var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0; - if ((flags & 0x08)) { - scaleX = - scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - i += 2; - } else if ((flags & 0x40)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - i += 4; - } else if ((flags & 0x80)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824; - scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824; - i += 8; - } - var subglyph = font.glyphs[glyphIndex]; - if (subglyph) { - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', - args: [scaleX, scale01, scale10, scaleY, x, y]}); - compileGlyf(subglyph, cmds, font); - cmds.push({cmd: 'restore'}); - } - } while ((flags & 0x20)); - } else { - // simple glyph - var endPtsOfContours = []; - var j, jj; - for (j = 0; j < numberOfContours; j++) { - endPtsOfContours.push((code[i] << 8) | code[i + 1]); - i += 2; - } - var instructionLength = (code[i] << 8) | code[i + 1]; - i += 2 + instructionLength; // skipping the instructions - var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1; - var points = []; - while (points.length < numberOfPoints) { - flags = code[i++]; - var repeat = 1; - if ((flags & 0x08)) { - repeat += code[i++]; - } - while (repeat-- > 0) { - points.push({flags: flags}); - } - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x12) { - case 0x00: - x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x02: - x -= code[i++]; - break; - case 0x12: - x += code[i++]; - break; - } - points[j].x = x; - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x24) { - case 0x00: - y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x04: - y -= code[i++]; - break; - case 0x24: - y += code[i++]; - break; - } - points[j].y = y; - } - - var startPoint = 0; - for (i = 0; i < numberOfContours; i++) { - var endPoint = endPtsOfContours[i]; - // contours might have implicit points, which is located in the middle - // between two neighboring off-curve points - var contour = points.slice(startPoint, endPoint + 1); - if ((contour[0].flags & 1)) { - contour.push(contour[0]); // using start point at the contour end - } else if ((contour[contour.length - 1].flags & 1)) { - // first is off-curve point, trying to use one from the end - contour.unshift(contour[contour.length - 1]); - } else { - // start and end are off-curve points, creating implicit one - var p = { - flags: 1, - x: (contour[0].x + contour[contour.length - 1].x) / 2, - y: (contour[0].y + contour[contour.length - 1].y) / 2 - }; - contour.unshift(p); - contour.push(p); - } - moveTo(contour[0].x, contour[0].y); - for (j = 1, jj = contour.length; j < jj; j++) { - if ((contour[j].flags & 1)) { - lineTo(contour[j].x, contour[j].y); - } else if ((contour[j + 1].flags & 1)){ - quadraticCurveTo(contour[j].x, contour[j].y, - contour[j + 1].x, contour[j + 1].y); - j++; - } else { - quadraticCurveTo(contour[j].x, contour[j].y, - (contour[j].x + contour[j + 1].x) / 2, - (contour[j].y + contour[j + 1].y) / 2); - } - } - startPoint = endPoint + 1; - } - } - } - - function compileCharString(code, cmds, font) { - var stack = []; - var x = 0, y = 0; - var stems = 0; - - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.push({cmd: 'bezierCurveTo', args: [x1, y1, x2, y2, x, y]}); - } - - function parse(code) { - var i = 0; - while (i < code.length) { - var stackClean = false; - var v = code[i++]; - var xa, xb, ya, yb, y1, y2, y3, n, subrCode; - switch (v) { - case 1: // hstem - stems += stack.length >> 1; - stackClean = true; - break; - case 3: // vstem - stems += stack.length >> 1; - stackClean = true; - break; - case 4: // vmoveto - y += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 5: // rlineto - while (stack.length > 0) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - break; - case 6: // hlineto - while (stack.length > 0) { - x += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - y += stack.shift(); - lineTo(x, y); - } - break; - case 7: // vlineto - while (stack.length > 0) { - y += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - x += stack.shift(); - lineTo(x, y); - } - break; - case 8: // rrcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 10: // callsubr - n = stack.pop() + font.subrsBias; - subrCode = font.subrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 11: // return - return; - case 12: - v = code[i++]; - switch (v) { - case 34: // flex - xa = x + stack.shift(); - xb = xa + stack.shift(); y1 = y + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y, xb, y1, x, y1); - xa = x + stack.shift(); - xb = xa + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y, x, y); - break; - case 35: // flex - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - stack.pop(); // fd - break; - case 36: // hflex1 - xa = x + stack.shift(); y1 = y + stack.shift(); - xb = xa + stack.shift(); y2 = y1 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y2, x, y2); - xa = x + stack.shift(); - xb = xa + stack.shift(); y3 = y2 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y2, xb, y3, x, y); - break; - case 37: // flex1 - var x0 = x, y0 = y; - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb; - if (Math.abs(x - x0) > Math.abs(y - y0)) { - x += stack.shift(); - } else { - y += stack.shift(); - } - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - default: - error('unknown operator: 12 ' + v); - } - break; - case 14: // endchar - if (stack.length >= 4) { - var achar = stack.pop(); - var bchar = stack.pop(); - y = stack.pop(); - x = stack.pop(); - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'translate', args: [x, y]}); - var cmap = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[StandardEncoding[achar]])); - compileCharString(font.glyphs[cmap.glyphId], cmds, font); - cmds.push({cmd: 'restore'}); - - cmap = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[StandardEncoding[bchar]])); - compileCharString(font.glyphs[cmap.glyphId], cmds, font); - } - return; - case 18: // hstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 19: // hintmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 20: // cntrmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 21: // rmoveto - y += stack.pop(); - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 22: // hmoveto - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 23: // vstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 24: // rcurveline - while (stack.length > 2) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - break; - case 25: // rlinecurve - while (stack.length > 6) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - case 26: // vvcurveto - if (stack.length % 2) { - x += stack.shift(); - } - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 27: // hhcurveto - if (stack.length % 2) { - y += stack.shift(); - } - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb; - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 28: - stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16); - i += 2; - break; - case 29: // callgsubr - n = stack.pop() + font.gsubrsBias; - subrCode = font.gsubrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 30: // vhcurveto - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 31: // hvcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - default: - if (v < 32) { - error('unknown operator: ' + v); - } - if (v < 247) { - stack.push(v - 139); - } else if (v < 251) { - stack.push((v - 247) * 256 + code[i++] + 108); - } else if (v < 255) { - stack.push(-(v - 251) * 256 - code[i++] - 108); - } else { - stack.push(((code[i] << 24) | (code[i + 1] << 16) | - (code[i + 2] << 8) | code[i + 3]) / 65536); - i += 4; - } - break; - } - if (stackClean) { - stack.length = 0; - } - } - } - parse(code); - } - - var noop = ''; - - function CompiledFont(fontMatrix) { - this.compiledGlyphs = Object.create(null); - this.compiledCharCodeToGlyphId = Object.create(null); - this.fontMatrix = fontMatrix; - } - CompiledFont.prototype = { - getPathJs: function (unicode) { - var cmap = lookupCmap(this.cmap, unicode); - var fn = this.compiledGlyphs[cmap.glyphId]; - if (!fn) { - fn = this.compileGlyph(this.glyphs[cmap.glyphId]); - this.compiledGlyphs[cmap.glyphId] = fn; - } - if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) { - this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId; - } - return fn; - }, - - compileGlyph: function (code) { - if (!code || code.length === 0 || code[0] === 14) { - return noop; - } - - var cmds = []; - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', args: this.fontMatrix.slice()}); - cmds.push({cmd: 'scale', args: ['size', '-size']}); - - this.compileGlyphImpl(code, cmds); - - cmds.push({cmd: 'restore'}); - - return cmds; - }, - - compileGlyphImpl: function () { - error('Children classes should implement this.'); - }, - - hasBuiltPath: function (unicode) { - var cmap = lookupCmap(this.cmap, unicode); - return (this.compiledGlyphs[cmap.glyphId] !== undefined && - this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined); - } - }; - - function TrueTypeCompiled(glyphs, cmap, fontMatrix) { - fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]; - CompiledFont.call(this, fontMatrix); - - this.glyphs = glyphs; - this.cmap = cmap; - } - - Util.inherit(TrueTypeCompiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileGlyf(code, cmds, this); - } - }); - - function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) { - fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0]; - CompiledFont.call(this, fontMatrix); - - this.glyphs = cffInfo.glyphs; - this.gsubrs = cffInfo.gsubrs || []; - this.subrs = cffInfo.subrs || []; - this.cmap = cmap; - this.glyphNameMap = glyphNameMap || getGlyphsUnicode(); - - this.gsubrsBias = (this.gsubrs.length < 1240 ? - 107 : (this.gsubrs.length < 33900 ? 1131 : 32768)); - this.subrsBias = (this.subrs.length < 1240 ? - 107 : (this.subrs.length < 33900 ? 1131 : 32768)); - } - - Util.inherit(Type2Compiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileCharString(code, cmds, this); - } - }); - - - return { - create: function FontRendererFactory_create(font, seacAnalysisEnabled) { - var data = new Uint8Array(font.data); - var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; - var numTables = getUshort(data, 4); - for (var i = 0, p = 12; i < numTables; i++, p += 16) { - var tag = bytesToString(data.subarray(p, p + 4)); - var offset = getLong(data, p + 8); - var length = getLong(data, p + 12); - switch (tag) { - case 'cmap': - cmap = parseCmap(data, offset, offset + length); - break; - case 'glyf': - glyf = data.subarray(offset, offset + length); - break; - case 'loca': - loca = data.subarray(offset, offset + length); - break; - case 'head': - unitsPerEm = getUshort(data, offset + 18); - indexToLocFormat = getUshort(data, offset + 50); - break; - case 'CFF ': - cff = parseCff(data, offset, offset + length, seacAnalysisEnabled); - break; - } - } - - if (glyf) { - var fontMatrix = (!unitsPerEm ? font.fontMatrix : - [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]); - return new TrueTypeCompiled( - parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); - } else { - return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); - } - } - }; -})(); - -exports.FontRendererFactory = FontRendererFactory; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreParser = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream) { - -var MissingDataException = sharedUtil.MissingDataException; -var StreamType = sharedUtil.StreamType; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isNum = sharedUtil.isNum; -var isString = sharedUtil.isString; -var warn = sharedUtil.warn; -var Cmd = corePrimitives.Cmd; -var Dict = corePrimitives.Dict; -var Name = corePrimitives.Name; -var Ref = corePrimitives.Ref; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var Ascii85Stream = coreStream.Ascii85Stream; -var AsciiHexStream = coreStream.AsciiHexStream; -var CCITTFaxStream = coreStream.CCITTFaxStream; -var FlateStream = coreStream.FlateStream; -var Jbig2Stream = coreStream.Jbig2Stream; -var JpegStream = coreStream.JpegStream; -var JpxStream = coreStream.JpxStream; -var LZWStream = coreStream.LZWStream; -var NullStream = coreStream.NullStream; -var PredictorStream = coreStream.PredictorStream; -var RunLengthStream = coreStream.RunLengthStream; - -var EOF = {}; - -function isEOF(v) { - return (v === EOF); -} - -var MAX_LENGTH_TO_CACHE = 1000; - -var Parser = (function ParserClosure() { - function Parser(lexer, allowStreams, xref, recoveryMode) { - this.lexer = lexer; - this.allowStreams = allowStreams; - this.xref = xref; - this.recoveryMode = recoveryMode || false; - this.imageCache = Object.create(null); - this.refill(); - } - - Parser.prototype = { - refill: function Parser_refill() { - this.buf1 = this.lexer.getObj(); - this.buf2 = this.lexer.getObj(); - }, - shift: function Parser_shift() { - if (isCmd(this.buf2, 'ID')) { - this.buf1 = this.buf2; - this.buf2 = null; - } else { - this.buf1 = this.buf2; - this.buf2 = this.lexer.getObj(); - } - }, - tryShift: function Parser_tryShift() { - try { - this.shift(); - return true; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - // Upon failure, the caller should reset this.lexer.pos to a known good - // state and call this.shift() twice to reset the buffers. - return false; - } - }, - getObj: function Parser_getObj(cipherTransform) { - var buf1 = this.buf1; - this.shift(); - - if (buf1 instanceof Cmd) { - switch (buf1.cmd) { - case 'BI': // inline image - return this.makeInlineImage(cipherTransform); - case '[': // array - var array = []; - while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) { - array.push(this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - if (!this.recoveryMode) { - error('End of file inside array'); - } - return array; - } - this.shift(); - return array; - case '<<': // dictionary or stream - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - info('Malformed dictionary: key must be a name object'); - this.shift(); - continue; - } - - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - if (!this.recoveryMode) { - error('End of file inside dictionary'); - } - return dict; - } - - // Stream objects are not allowed inside content streams or - // object streams. - if (isCmd(this.buf2, 'stream')) { - return (this.allowStreams ? - this.makeStream(dict, cipherTransform) : dict); - } - this.shift(); - return dict; - default: // simple object - return buf1; - } - } - - if (isInt(buf1)) { // indirect reference or integer - var num = buf1; - if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { - var ref = new Ref(num, this.buf1); - this.shift(); - this.shift(); - return ref; - } - return num; - } - - if (isString(buf1)) { // string - var str = buf1; - if (cipherTransform) { - str = cipherTransform.decryptString(str); - } - return str; - } - - // simple object - return buf1; - }, - /** - * Find the end of the stream by searching for the /EI\s/. - * @returns {number} The inline stream length. - */ - findDefaultInlineStreamEnd: - function Parser_findDefaultInlineStreamEnd(stream) { - var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD; - var startPos = stream.pos, state = 0, ch, i, n, followingBytes; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else { - assert(state === 2); - if (ch === SPACE || ch === LF || ch === CR) { - // Let's check the next five bytes are ASCII... just be sure. - n = 5; - followingBytes = stream.peekBytes(n); - for (i = 0; i < n; i++) { - ch = followingBytes[i]; - if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) { - // Not a LF, CR, SPACE or any visible ASCII character, i.e. - // it's binary stuff. Resetting the state. - state = 0; - break; - } - } - if (state === 2) { - break; // Finished! - } - } else { - state = 0; - } - } - } - return ((stream.pos - 4) - startPos); - }, - /** - * Find the EOI (end-of-image) marker 0xFFD9 of the stream. - * @returns {number} The inline stream length. - */ - findDCTDecodeInlineStreamEnd: - function Parser_findDCTDecodeInlineStreamEnd(stream) { - var startPos = stream.pos, foundEOI = false, b, markerLength, length; - while ((b = stream.getByte()) !== -1) { - if (b !== 0xFF) { // Not a valid marker. - continue; - } - switch (stream.getByte()) { - case 0x00: // Byte stuffing. - // 0xFF00 appears to be a very common byte sequence in JPEG images. - break; - - case 0xFF: // Fill byte. - // Avoid skipping a valid marker, resetting the stream position. - stream.skip(-1); - break; - - case 0xD9: // EOI - foundEOI = true; - break; - - case 0xC0: // SOF0 - case 0xC1: // SOF1 - case 0xC2: // SOF2 - case 0xC3: // SOF3 - - case 0xC5: // SOF5 - case 0xC6: // SOF6 - case 0xC7: // SOF7 - - case 0xC9: // SOF9 - case 0xCA: // SOF10 - case 0xCB: // SOF11 - - case 0xCD: // SOF13 - case 0xCE: // SOF14 - case 0xCF: // SOF15 - - case 0xC4: // DHT - case 0xCC: // DAC - - case 0xDA: // SOS - case 0xDB: // DQT - case 0xDC: // DNL - case 0xDD: // DRI - case 0xDE: // DHP - case 0xDF: // EXP - - case 0xE0: // APP0 - case 0xE1: // APP1 - case 0xE2: // APP2 - case 0xE3: // APP3 - case 0xE4: // APP4 - case 0xE5: // APP5 - case 0xE6: // APP6 - case 0xE7: // APP7 - case 0xE8: // APP8 - case 0xE9: // APP9 - case 0xEA: // APP10 - case 0xEB: // APP11 - case 0xEC: // APP12 - case 0xED: // APP13 - case 0xEE: // APP14 - case 0xEF: // APP15 - - case 0xFE: // COM - // The marker should be followed by the length of the segment. - markerLength = stream.getUint16(); - if (markerLength > 2) { - // |markerLength| contains the byte length of the marker segment, - // including its own length (2 bytes) and excluding the marker. - stream.skip(markerLength - 2); // Jump to the next marker. - } else { - // The marker length is invalid, resetting the stream position. - stream.skip(-2); - } - break; - } - if (foundEOI) { - break; - } - } - length = stream.pos - startPos; - if (b === -1) { - warn('Inline DCTDecode image stream: ' + - 'EOI marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCII85DecodeInlineStreamEnd: - function Parser_findASCII85DecodeInlineStreamEnd(stream) { - var TILDE = 0x7E, GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === TILDE && stream.peekByte() === GT) { - stream.skip(); - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCII85Decode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCIIHexDecodeInlineStreamEnd: - function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { - var GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === GT) { - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCIIHexDecode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Skip over the /EI/ for streams where we search for an EOD marker. - */ - inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { - var E = 0x45, I = 0x49; - var state = 0, ch; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else if (state === 2) { - break; - } - } - }, - makeInlineImage: function Parser_makeInlineImage(cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // Parse dictionary. - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - error('Dictionary key must be a name object'); - } - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - - // Extract the name of the first (i.e. the current) image filter. - var filter = dict.get('Filter', 'F'), filterName; - if (isName(filter)) { - filterName = filter.name; - } else if (isArray(filter) && isName(filter[0])) { - filterName = filter[0].name; - } - - // Parse image stream. - var startPos = stream.pos, length, i, ii; - if (filterName === 'DCTDecode' || filterName === 'DCT') { - length = this.findDCTDecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCII85Decide' || filterName === 'A85') { - length = this.findASCII85DecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') { - length = this.findASCIIHexDecodeInlineStreamEnd(stream); - } else { - length = this.findDefaultInlineStreamEnd(stream); - } - var imageStream = stream.makeSubStream(startPos, length, dict); - - // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their - // adler32 checksum. - var adler32; - if (length < MAX_LENGTH_TO_CACHE) { - var imageBytes = imageStream.getBytes(); - imageStream.reset(); - - var a = 1; - var b = 0; - for (i = 0, ii = imageBytes.length; i < ii; ++i) { - // No modulo required in the loop if imageBytes.length < 5552. - a += imageBytes[i] & 0xff; - b += a; - } - adler32 = ((b % 65521) << 16) | (a % 65521); - - if (this.imageCache.adler32 === adler32) { - this.buf2 = Cmd.get('EI'); - this.shift(); - - this.imageCache[adler32].reset(); - return this.imageCache[adler32]; - } - } - - if (cipherTransform) { - imageStream = cipherTransform.createStream(imageStream, length); - } - - imageStream = this.filter(imageStream, dict, length); - imageStream.dict = dict; - if (adler32 !== undefined) { - imageStream.cacheKey = 'inline_' + length + '_' + adler32; - this.imageCache[adler32] = imageStream; - } - - this.buf2 = Cmd.get('EI'); - this.shift(); - - return imageStream; - }, - makeStream: function Parser_makeStream(dict, cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // get stream start position - lexer.skipToNextLine(); - var pos = stream.pos - 1; - - // get length - var length = dict.get('Length'); - if (!isInt(length)) { - info('Bad ' + length + ' attribute in stream'); - length = 0; - } - - // skip over the stream data - stream.pos = pos + length; - lexer.nextChar(); - - // Shift '>>' and check whether the new object marks the end of the stream - if (this.tryShift() && isCmd(this.buf2, 'endstream')) { - this.shift(); // 'stream' - } else { - // bad stream length, scanning for endstream - stream.pos = pos; - var SCAN_BLOCK_SIZE = 2048; - var ENDSTREAM_SIGNATURE_LENGTH = 9; - var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6D]; - var skipped = 0, found = false, i, j; - while (stream.pos < stream.end) { - var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE); - var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH; - if (scanLength <= 0) { - break; - } - found = false; - i = 0; - while (i < scanLength) { - j = 0; - while (j < ENDSTREAM_SIGNATURE_LENGTH && - scanBytes[i + j] === ENDSTREAM_SIGNATURE[j]) { - j++; - } - if (j >= ENDSTREAM_SIGNATURE_LENGTH) { - found = true; - break; - } - i++; - } - if (found) { - skipped += i; - stream.pos += i; - break; - } - skipped += scanLength; - stream.pos += scanLength; - } - if (!found) { - error('Missing endstream'); - } - length = skipped; - - lexer.nextChar(); - this.shift(); - this.shift(); - } - this.shift(); // 'endstream' - - stream = stream.makeSubStream(pos, length, dict); - if (cipherTransform) { - stream = cipherTransform.createStream(stream, length); - } - stream = this.filter(stream, dict, length); - stream.dict = dict; - return stream; - }, - filter: function Parser_filter(stream, dict, length) { - var filter = dict.get('Filter', 'F'); - var params = dict.get('DecodeParms', 'DP'); - if (isName(filter)) { - return this.makeFilter(stream, filter.name, length, params); - } - - var maybeLength = length; - if (isArray(filter)) { - var filterArray = filter; - var paramsArray = params; - for (var i = 0, ii = filterArray.length; i < ii; ++i) { - filter = filterArray[i]; - if (!isName(filter)) { - error('Bad filter name: ' + filter); - } - - params = null; - if (isArray(paramsArray) && (i in paramsArray)) { - params = paramsArray[i]; - } - stream = this.makeFilter(stream, filter.name, maybeLength, params); - // after the first stream the length variable is invalid - maybeLength = null; - } - } - return stream; - }, - makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { - if (stream.dict.get('Length') === 0 && !maybeLength) { - warn('Empty "' + name + '" stream.'); - return new NullStream(stream); - } - try { - if (params && this.xref) { - params = this.xref.fetchIfRef(params); - } - var xrefStreamStats = this.xref.stats.streamTypes; - if (name === 'FlateDecode' || name === 'Fl') { - xrefStreamStats[StreamType.FLATE] = true; - if (params) { - return new PredictorStream(new FlateStream(stream, maybeLength), - maybeLength, params); - } - return new FlateStream(stream, maybeLength); - } - if (name === 'LZWDecode' || name === 'LZW') { - xrefStreamStats[StreamType.LZW] = true; - var earlyChange = 1; - if (params) { - if (params.has('EarlyChange')) { - earlyChange = params.get('EarlyChange'); - } - return new PredictorStream( - new LZWStream(stream, maybeLength, earlyChange), - maybeLength, params); - } - return new LZWStream(stream, maybeLength, earlyChange); - } - if (name === 'DCTDecode' || name === 'DCT') { - xrefStreamStats[StreamType.DCT] = true; - return new JpegStream(stream, maybeLength, stream.dict); - } - if (name === 'JPXDecode' || name === 'JPX') { - xrefStreamStats[StreamType.JPX] = true; - return new JpxStream(stream, maybeLength, stream.dict); - } - if (name === 'ASCII85Decode' || name === 'A85') { - xrefStreamStats[StreamType.A85] = true; - return new Ascii85Stream(stream, maybeLength); - } - if (name === 'ASCIIHexDecode' || name === 'AHx') { - xrefStreamStats[StreamType.AHX] = true; - return new AsciiHexStream(stream, maybeLength); - } - if (name === 'CCITTFaxDecode' || name === 'CCF') { - xrefStreamStats[StreamType.CCF] = true; - return new CCITTFaxStream(stream, maybeLength, params); - } - if (name === 'RunLengthDecode' || name === 'RL') { - xrefStreamStats[StreamType.RL] = true; - return new RunLengthStream(stream, maybeLength); - } - if (name === 'JBIG2Decode') { - xrefStreamStats[StreamType.JBIG] = true; - return new Jbig2Stream(stream, maybeLength, stream.dict); - } - warn('filter "' + name + '" not supported yet'); - return stream; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Invalid stream: \"' + ex + '\"'); - return new NullStream(stream); - } - } - }; - - return Parser; -})(); - -var Lexer = (function LexerClosure() { - function Lexer(stream, knownCommands) { - this.stream = stream; - this.nextChar(); - - // While lexing, we build up many strings one char at a time. Using += for - // this can result in lots of garbage strings. It's better to build an - // array of single-char strings and then join() them together at the end. - // And reusing a single array (i.e. |this.strBuf|) over and over for this - // purpose uses less memory than using a new array for each string. - this.strBuf = []; - - // The PDFs might have "glued" commands with other commands, operands or - // literals, e.g. "q1". The knownCommands is a dictionary of the valid - // commands and their prefixes. The prefixes are built the following way: - // if there a command that is a prefix of the other valid command or - // literal (e.g. 'f' and 'false') the following prefixes must be included, - // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no - // other commands or literals as a prefix. The knowCommands is optional. - this.knownCommands = knownCommands; - } - - // A '1' in this array means the character is white space. A '1' or - // '2' means the character ends a name or command. - var specialChars = [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x - 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx - ]; - - function toHexDigit(ch) { - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - return ch & 0x0F; - } - if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'F', 'a'-'f' - return (ch & 0x0F) + 9; - } - return -1; - } - - Lexer.prototype = { - nextChar: function Lexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - peekChar: function Lexer_peekChar() { - return this.stream.peekByte(); - }, - getNumber: function Lexer_getNumber() { - var ch = this.currentChar; - var eNotation = false; - var divideBy = 0; // different from 0 if it's a floating point value - var sign = 1; - - if (ch === 0x2D) { // '-' - sign = -1; - ch = this.nextChar(); - - if (ch === 0x2D) { // '-' - // Ignore double negative (this is consistent with Adobe Reader). - ch = this.nextChar(); - } - } else if (ch === 0x2B) { // '+' - ch = this.nextChar(); - } - if (ch === 0x2E) { // '.' - divideBy = 10; - ch = this.nextChar(); - } - if (ch < 0x30 || ch > 0x39) { // '0' - '9' - error('Invalid number: ' + String.fromCharCode(ch)); - return 0; - } - - var baseValue = ch - 0x30; // '0' - var powerValue = 0; - var powerValueSign = 1; - - while ((ch = this.nextChar()) >= 0) { - if (0x30 <= ch && ch <= 0x39) { // '0' - '9' - var currentDigit = ch - 0x30; // '0' - if (eNotation) { // We are after an 'e' or 'E' - powerValue = powerValue * 10 + currentDigit; - } else { - if (divideBy !== 0) { // We are after a point - divideBy *= 10; - } - baseValue = baseValue * 10 + currentDigit; - } - } else if (ch === 0x2E) { // '.' - if (divideBy === 0) { - divideBy = 1; - } else { - // A number can have only one '.' - break; - } - } else if (ch === 0x2D) { // '-' - // ignore minus signs in the middle of numbers to match - // Adobe's behavior - warn('Badly formatted number'); - } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e' - // 'E' can be either a scientific notation or the beginning of a new - // operator - ch = this.peekChar(); - if (ch === 0x2B || ch === 0x2D) { // '+', '-' - powerValueSign = (ch === 0x2D) ? -1 : 1; - this.nextChar(); // Consume the sign character - } else if (ch < 0x30 || ch > 0x39) { // '0' - '9' - // The 'E' must be the beginning of a new operator - break; - } - eNotation = true; - } else { - // the last character doesn't belong to us - break; - } - } - - if (divideBy !== 0) { - baseValue /= divideBy; - } - if (eNotation) { - baseValue *= Math.pow(10, powerValueSign * powerValue); - } - return sign * baseValue; - }, - getString: function Lexer_getString() { - var numParen = 1; - var done = false; - var strBuf = this.strBuf; - strBuf.length = 0; - - var ch = this.nextChar(); - while (true) { - var charBuffered = false; - switch (ch | 0) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x28: // '(' - ++numParen; - strBuf.push('('); - break; - case 0x29: // ')' - if (--numParen === 0) { - this.nextChar(); // consume strings ')' - done = true; - } else { - strBuf.push(')'); - } - break; - case 0x5C: // '\\' - ch = this.nextChar(); - switch (ch) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x6E: // 'n' - strBuf.push('\n'); - break; - case 0x72: // 'r' - strBuf.push('\r'); - break; - case 0x74: // 't' - strBuf.push('\t'); - break; - case 0x62: // 'b' - strBuf.push('\b'); - break; - case 0x66: // 'f' - strBuf.push('\f'); - break; - case 0x5C: // '\' - case 0x28: // '(' - case 0x29: // ')' - strBuf.push(String.fromCharCode(ch)); - break; - case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3' - case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7' - var x = ch & 0x0F; - ch = this.nextChar(); - charBuffered = true; - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - x = (x << 3) + (ch & 0x0F); - ch = this.nextChar(); - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - charBuffered = false; - x = (x << 3) + (ch & 0x0F); - } - } - strBuf.push(String.fromCharCode(x)); - break; - case 0x0D: // CR - if (this.peekChar() === 0x0A) { // LF - this.nextChar(); - } - break; - case 0x0A: // LF - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - if (done) { - break; - } - if (!charBuffered) { - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getName: function Lexer_getName() { - var ch, previousCh; - var strBuf = this.strBuf; - strBuf.length = 0; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - if (ch === 0x23) { // '#' - ch = this.nextChar(); - if (specialChars[ch]) { - warn('Lexer_getName: ' + - 'NUMBER SIGN (#) should be followed by a hexadecimal number.'); - strBuf.push('#'); - break; - } - var x = toHexDigit(ch); - if (x !== -1) { - previousCh = ch; - ch = this.nextChar(); - var x2 = toHexDigit(ch); - if (x2 === -1) { - warn('Lexer_getName: Illegal digit (' + - String.fromCharCode(ch) +') in hexadecimal number.'); - strBuf.push('#', String.fromCharCode(previousCh)); - if (specialChars[ch]) { - break; - } - strBuf.push(String.fromCharCode(ch)); - continue; - } - strBuf.push(String.fromCharCode((x << 4) | x2)); - } else { - strBuf.push('#', String.fromCharCode(ch)); - } - } else { - strBuf.push(String.fromCharCode(ch)); - } - } - if (strBuf.length > 127) { - warn('name token is longer than allowed by the spec: ' + strBuf.length); - } - return Name.get(strBuf.join('')); - }, - getHexString: function Lexer_getHexString() { - var strBuf = this.strBuf; - strBuf.length = 0; - var ch = this.currentChar; - var isFirstHex = true; - var firstDigit; - var secondDigit; - while (true) { - if (ch < 0) { - warn('Unterminated hex string'); - break; - } else if (ch === 0x3E) { // '>' - this.nextChar(); - break; - } else if (specialChars[ch] === 1) { - ch = this.nextChar(); - continue; - } else { - if (isFirstHex) { - firstDigit = toHexDigit(ch); - if (firstDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - } else { - secondDigit = toHexDigit(ch); - if (secondDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit)); - } - isFirstHex = !isFirstHex; - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getObj: function Lexer_getObj() { - // skip whitespace and comments - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0A || ch === 0x0D) { // LF, CR - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (specialChars[ch] !== 1) { - break; - } - ch = this.nextChar(); - } - - // start reading token - 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 this.getNumber(); - case 0x28: // '(' - return this.getString(); - case 0x2F: // '/' - return this.getName(); - // array punctuation - case 0x5B: // '[' - this.nextChar(); - return Cmd.get('['); - case 0x5D: // ']' - this.nextChar(); - return Cmd.get(']'); - // hex string or dict punctuation - case 0x3C: // '<' - ch = this.nextChar(); - if (ch === 0x3C) { - // dict punctuation - this.nextChar(); - return Cmd.get('<<'); - } - return this.getHexString(); - // dict punctuation - case 0x3E: // '>' - ch = this.nextChar(); - if (ch === 0x3E) { - this.nextChar(); - return Cmd.get('>>'); - } - return Cmd.get('>'); - case 0x7B: // '{' - this.nextChar(); - return Cmd.get('{'); - case 0x7D: // '}' - this.nextChar(); - return Cmd.get('}'); - case 0x29: // ')' - error('Illegal character: ' + ch); - break; - } - - // command - var str = String.fromCharCode(ch); - var knownCommands = this.knownCommands; - var knownCommandFound = knownCommands && knownCommands[str] !== undefined; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - // stop if known command is found and next character does not make - // the str a command - var possibleCommand = str + String.fromCharCode(ch); - if (knownCommandFound && knownCommands[possibleCommand] === undefined) { - break; - } - if (str.length === 128) { - error('Command token too long: ' + str.length); - } - str = possibleCommand; - knownCommandFound = knownCommands && knownCommands[str] !== undefined; - } - if (str === 'true') { - return true; - } - if (str === 'false') { - return false; - } - if (str === 'null') { - return null; - } - return Cmd.get(str); - }, - skipToNextLine: function Lexer_skipToNextLine() { - var ch = this.currentChar; - while (ch >= 0) { - if (ch === 0x0D) { // CR - ch = this.nextChar(); - if (ch === 0x0A) { // LF - this.nextChar(); - } - break; - } else if (ch === 0x0A) { // LF - this.nextChar(); - break; - } - ch = this.nextChar(); - } - } - }; - - return Lexer; -})(); - -var Linearization = { - create: function LinearizationCreate(stream) { - function getInt(name, allowZeroValue) { - var obj = linDict.get(name); - if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; - } - throw new Error('The "' + name + '" parameter in the linearization ' + - 'dictionary is invalid.'); - } - function getHints() { - var hints = linDict.get('H'), hintsLength, item; - if (isArray(hints) && - ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (var index = 0; index < hintsLength; index++) { - if (!(isInt(item = hints[index]) && item > 0)) { - throw new Error('Hint (' + index + - ') in the linearization dictionary is invalid.'); - } - } - return hints; - } - throw new Error('Hint array in the linearization dictionary is invalid.'); - } - var parser = new Parser(new Lexer(stream), false, null); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - var linDict = parser.getObj(); - var obj, length; - if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) && - isNum(obj = linDict.get('Linearized')) && obj > 0)) { - return null; // No valid linearization dictionary found. - } else if ((length = getInt('L')) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + - 'does not equal the stream length.'); - } - return { - length: length, - hints: getHints(), - objectNumberFirst: getInt('O'), - endFirst: getInt('E'), - numPages: getInt('N'), - mainXRefEntriesOffset: getInt('T'), - pageFirst: (linDict.has('P') ? getInt('P', true) : 0) - }; - } -}; - -exports.EOF = EOF; -exports.Lexer = Lexer; -exports.Linearization = Linearization; -exports.Parser = Parser; -exports.isEOF = isEOF; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreType1Parser = {}), root.pdfjsSharedUtil, - root.pdfjsCoreStream, root.pdfjsCoreEncodings); - } -}(this, function (exports, sharedUtil, coreStream, coreEncodings) { - -var warn = sharedUtil.warn; -var isSpace = sharedUtil.isSpace; -var Stream = coreStream.Stream; -var getEncoding = coreEncodings.getEncoding; - -// Hinting is currently disabled due to unknown problems on windows -// in tracemonkey and various other pdfs with type1 fonts. -var HINTING_ENABLED = false; - -/* - * CharStrings are encoded following the the CharString Encoding sequence - * describe in Chapter 6 of the "Adobe Type1 Font Format" specification. - * The value in a byte indicates a command, a number, or subsequent bytes - * that are to be interpreted in a special way. - * - * CharString Number Encoding: - * A CharString byte containing the values from 32 through 255 inclusive - * indicate an integer. These values are decoded in four ranges. - * - * 1. A CharString byte containing a value, v, between 32 and 246 inclusive, - * indicate the integer v - 139. Thus, the integer values from -107 through - * 107 inclusive may be encoded in single byte. - * - * 2. A CharString byte containing a value, v, between 247 and 250 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * [(v - 247) x 256] + w + 108 - * - * 3. A CharString byte containing a value, v, between 251 and 254 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * -[(v - 251) * 256] - w - 108 - * - * 4. A CharString containing the value 255 indicates that the next 4 bytes - * are a two complement signed integer. The first of these bytes contains the - * highest order bits, the second byte contains the next higher order bits - * and the fourth byte contain the lowest order bits. - * - * - * CharString Command Encoding: - * CharStrings commands are encoded in 1 or 2 bytes. - * - * Single byte commands are encoded in 1 byte that contains a value between - * 0 and 31 inclusive. - * If a command byte contains the value 12, then the value in the next byte - * indicates a command. This "escape" mechanism allows many extra commands - * to be encoded and this encoding technique helps to minimize the length of - * the charStrings. - */ -var Type1CharString = (function Type1CharStringClosure() { - var COMMAND_MAP = { - 'hstem': [1], - 'vstem': [3], - 'vmoveto': [4], - 'rlineto': [5], - 'hlineto': [6], - 'vlineto': [7], - 'rrcurveto': [8], - 'callsubr': [10], - 'flex': [12, 35], - 'drop' : [12, 18], - 'endchar': [14], - 'rmoveto': [21], - 'hmoveto': [22], - 'vhcurveto': [30], - 'hvcurveto': [31] - }; - - function Type1CharString() { - this.width = 0; - this.lsb = 0; - this.flexing = false; - this.output = []; - this.stack = []; - } - - Type1CharString.prototype = { - convert: function Type1CharString_convert(encoded, subrs, - seacAnalysisEnabled) { - var count = encoded.length; - var error = false; - var wx, sbx, subrNumber; - for (var i = 0; i < count; i++) { - var value = encoded[i]; - if (value < 32) { - if (value === 12) { - value = (value << 8) + encoded[++i]; - } - switch (value) { - case 1: // hstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case 3: // vstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case 4: // vmoveto - if (this.flexing) { - if (this.stack.length < 1) { - error = true; - break; - } - // Add the dx for flex and but also swap the values so they are - // the right order. - var dy = this.stack.pop(); - this.stack.push(0, dy); - break; - } - error = this.executeCommand(1, COMMAND_MAP.vmoveto); - break; - case 5: // rlineto - error = this.executeCommand(2, COMMAND_MAP.rlineto); - break; - case 6: // hlineto - error = this.executeCommand(1, COMMAND_MAP.hlineto); - break; - case 7: // vlineto - error = this.executeCommand(1, COMMAND_MAP.vlineto); - break; - case 8: // rrcurveto - error = this.executeCommand(6, COMMAND_MAP.rrcurveto); - break; - case 9: // closepath - // closepath is a Type1 command that does not take argument and is - // useless in Type2 and it can simply be ignored. - this.stack = []; - break; - case 10: // callsubr - if (this.stack.length < 1) { - error = true; - break; - } - subrNumber = this.stack.pop(); - error = this.convert(subrs[subrNumber], subrs, - seacAnalysisEnabled); - break; - case 11: // return - return error; - case 13: // hsbw - if (this.stack.length < 2) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use hmoveto with lsb. - wx = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx); - error = this.executeCommand(2, COMMAND_MAP.hmoveto); - break; - case 14: // endchar - this.output.push(COMMAND_MAP.endchar[0]); - break; - case 21: // rmoveto - if (this.flexing) { - break; - } - error = this.executeCommand(2, COMMAND_MAP.rmoveto); - break; - case 22: // hmoveto - if (this.flexing) { - // Add the dy for flex. - this.stack.push(0); - break; - } - error = this.executeCommand(1, COMMAND_MAP.hmoveto); - break; - case 30: // vhcurveto - error = this.executeCommand(4, COMMAND_MAP.vhcurveto); - break; - case 31: // hvcurveto - error = this.executeCommand(4, COMMAND_MAP.hvcurveto); - break; - case (12 << 8) + 0: // dotsection - // dotsection is a Type1 command to specify some hinting feature - // for dots that do not take a parameter and it can safely be - // ignored for Type2. - this.stack = []; - break; - case (12 << 8) + 1: // vstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // [vh]stem3 are Type1 only and Type2 supports [vh]stem with - // multiple parameters, so instead of returning [vh]stem3 take a - // shortcut and return [vhstem] instead. - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case (12 << 8) + 2: // hstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // See vstem3. - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case (12 << 8) + 6: // seac - // seac is like type 2's special endchar but it doesn't use the - // first argument asb, so remove it. - if (seacAnalysisEnabled) { - this.seac = this.stack.splice(-4, 4); - error = this.executeCommand(0, COMMAND_MAP.endchar); - } else { - error = this.executeCommand(4, COMMAND_MAP.endchar); - } - break; - case (12 << 8) + 7: // sbw - if (this.stack.length < 4) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use rmoveto with - // (dx, dy). The height argument will not be used for vmtx and - // vhea tables reconstruction -- ignoring it. - var wy = this.stack.pop(); - wx = this.stack.pop(); - var sby = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx, sby); - error = this.executeCommand(3, COMMAND_MAP.rmoveto); - break; - case (12 << 8) + 12: // div - if (this.stack.length < 2) { - error = true; - break; - } - var num2 = this.stack.pop(); - var num1 = this.stack.pop(); - this.stack.push(num1 / num2); - break; - case (12 << 8) + 16: // callothersubr - if (this.stack.length < 2) { - error = true; - break; - } - subrNumber = this.stack.pop(); - var numArgs = this.stack.pop(); - if (subrNumber === 0 && numArgs === 3) { - var flexArgs = this.stack.splice(this.stack.length - 17, 17); - this.stack.push( - flexArgs[2] + flexArgs[0], // bcp1x + rpx - flexArgs[3] + flexArgs[1], // bcp1y + rpy - flexArgs[4], // bcp2x - flexArgs[5], // bcp2y - flexArgs[6], // p2x - flexArgs[7], // p2y - flexArgs[8], // bcp3x - flexArgs[9], // bcp3y - flexArgs[10], // bcp4x - flexArgs[11], // bcp4y - flexArgs[12], // p3x - flexArgs[13], // p3y - flexArgs[14] // flexDepth - // 15 = finalx unused by flex - // 16 = finaly unused by flex - ); - error = this.executeCommand(13, COMMAND_MAP.flex, true); - this.flexing = false; - this.stack.push(flexArgs[15], flexArgs[16]); - } else if (subrNumber === 1 && numArgs === 0) { - this.flexing = true; - } - break; - case (12 << 8) + 17: // pop - // Ignore this since it is only used with othersubr. - break; - case (12 << 8) + 33: // setcurrentpoint - // Ignore for now. - this.stack = []; - break; - default: - warn('Unknown type 1 charstring command of "' + value + '"'); - break; - } - if (error) { - break; - } - continue; - } else if (value <= 246) { - value = value - 139; - } else if (value <= 250) { - value = ((value - 247) * 256) + encoded[++i] + 108; - } else if (value <= 254) { - value = -((value - 251) * 256) - encoded[++i] - 108; - } else { - value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | - (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; - } - this.stack.push(value); - } - return error; - }, - - executeCommand: function(howManyArgs, command, keepStack) { - var stackLength = this.stack.length; - if (howManyArgs > stackLength) { - return true; - } - var start = stackLength - howManyArgs; - for (var i = start; i < stackLength; i++) { - var value = this.stack[i]; - if (value === (value | 0)) { // int - this.output.push(28, (value >> 8) & 0xff, value & 0xff); - } else { // fixed point - value = (65536 * value) | 0; - this.output.push(255, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF); - } - } - this.output.push.apply(this.output, command); - if (keepStack) { - this.stack.splice(start, howManyArgs); - } else { - this.stack.length = 0; - } - return false; - } - }; - - return Type1CharString; -})(); - -/* - * Type1Parser encapsulate the needed code for parsing a Type1 font - * program. Some of its logic depends on the Type2 charstrings - * structure. - * Note: this doesn't really parse the font since that would require evaluation - * of PostScript, but it is possible in most cases to extract what we need - * without a full parse. - */ -var Type1Parser = (function Type1ParserClosure() { - /* - * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence - * of Plaintext Bytes. The function took a key as a parameter which can be - * for decrypting the eexec block of for decoding charStrings. - */ - var EEXEC_ENCRYPT_KEY = 55665; - var CHAR_STRS_ENCRYPT_KEY = 4330; - - function isHexDigit(code) { - return code >= 48 && code <= 57 || // '0'-'9' - code >= 65 && code <= 70 || // 'A'-'F' - code >= 97 && code <= 102; // 'a'-'f' - } - - function decrypt(data, key, discardNumber) { - if (discardNumber >= data.length) { - return new Uint8Array(0); - } - var r = key | 0, c1 = 52845, c2 = 22719, i, j; - for (i = 0; i < discardNumber; i++) { - r = ((data[i] + r) * c1 + c2) & ((1 << 16) - 1); - } - var count = data.length - discardNumber; - var decrypted = new Uint8Array(count); - for (i = discardNumber, j = 0; j < count; i++, j++) { - var value = data[i]; - decrypted[j] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - return decrypted; - } - - function decryptAscii(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length, maybeLength = count >>> 1; - var decrypted = new Uint8Array(maybeLength); - var i, j; - for (i = 0, j = 0; i < count; i++) { - var digit1 = data[i]; - if (!isHexDigit(digit1)) { - continue; - } - i++; - var digit2; - while (i < count && !isHexDigit(digit2 = data[i])) { - i++; - } - if (i < count) { - var value = parseInt(String.fromCharCode(digit1, digit2), 16); - decrypted[j++] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - } - return Array.prototype.slice.call(decrypted, discardNumber, j); - } - - function isSpecial(c) { - return c === 0x2F || // '/' - c === 0x5B || c === 0x5D || // '[', ']' - c === 0x7B || c === 0x7D || // '{', '}' - c === 0x28 || c === 0x29; // '(', ')' - } - - function Type1Parser(stream, encrypted, seacAnalysisEnabled) { - if (encrypted) { - var data = stream.getBytes(); - var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && - isHexDigit(data[2]) && isHexDigit(data[3])); - stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : - decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); - } - this.seacAnalysisEnabled = !!seacAnalysisEnabled; - - this.stream = stream; - this.nextChar(); - } - - Type1Parser.prototype = { - readNumberArray: function Type1Parser_readNumberArray() { - this.getToken(); // read '[' or '{' (arrays can start with either) - var array = []; - while (true) { - var token = this.getToken(); - if (token === null || token === ']' || token === '}') { - break; - } - array.push(parseFloat(token || 0)); - } - return array; - }, - - readNumber: function Type1Parser_readNumber() { - var token = this.getToken(); - return parseFloat(token || 0); - }, - - readInt: function Type1Parser_readInt() { - // Use '| 0' to prevent setting a double into length such as the double - // does not flow into the loop variable. - var token = this.getToken(); - return parseInt(token || 0, 10) | 0; - }, - - readBoolean: function Type1Parser_readBoolean() { - var token = this.getToken(); - - // Use 1 and 0 since that's what type2 charstrings use. - return token === 'true' ? 1 : 0; - }, - - nextChar : function Type1_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - - getToken: function Type1Parser_getToken() { - // Eat whitespace and comments. - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch === -1) { - return null; - } - - if (comment) { - if (ch === 0x0A || ch === 0x0D) { - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (!isSpace(ch)) { - break; - } - ch = this.nextChar(); - } - if (isSpecial(ch)) { - this.nextChar(); - return String.fromCharCode(ch); - } - var token = ''; - do { - token += String.fromCharCode(ch); - ch = this.nextChar(); - } while (ch >= 0 && !isSpace(ch) && !isSpecial(ch)); - return token; - }, - - /* - * Returns an object containing a Subrs array and a CharStrings - * array extracted from and eexec encrypted block of data - */ - extractFontProgram: function Type1Parser_extractFontProgram() { - var stream = this.stream; - - var subrs = [], charstrings = []; - var privateData = Object.create(null); - privateData['lenIV'] = 4; - var program = { - subrs: [], - charstrings: [], - properties: { - 'privateData': privateData - } - }; - var token, length, data, lenIV, encoded; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'CharStrings': - // The number immediately following CharStrings must be greater or - // equal to the number of CharStrings. - this.getToken(); - this.getToken(); // read in 'dict' - this.getToken(); // read in 'dup' - this.getToken(); // read in 'begin' - while(true) { - token = this.getToken(); - if (token === null || token === 'end') { - break; - } - - if (token !== '/') { - continue; - } - var glyph = this.getToken(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'ND' or '|-' - if (token === 'noaccess') { - this.getToken(); // read in 'def' - } - charstrings.push({ - glyph: glyph, - encoded: encoded - }); - } - break; - case 'Subrs': - var num = this.readInt(); - this.getToken(); // read in 'array' - while ((token = this.getToken()) === 'dup') { - var index = this.readInt(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'NP' or '|' - if (token === 'noaccess') { - this.getToken(); // read in 'put' - } - subrs[index] = encoded; - } - break; - case 'BlueValues': - case 'OtherBlues': - case 'FamilyBlues': - case 'FamilyOtherBlues': - var blueArray = this.readNumberArray(); - // *Blue* values may contain invalid data: disables reading of - // those values when hinting is disabled. - if (blueArray.length > 0 && (blueArray.length % 2) === 0 && - HINTING_ENABLED) { - program.properties.privateData[token] = blueArray; - } - break; - case 'StemSnapH': - case 'StemSnapV': - program.properties.privateData[token] = this.readNumberArray(); - break; - case 'StdHW': - case 'StdVW': - program.properties.privateData[token] = - this.readNumberArray()[0]; - break; - case 'BlueShift': - case 'lenIV': - case 'BlueFuzz': - case 'BlueScale': - case 'LanguageGroup': - case 'ExpansionFactor': - program.properties.privateData[token] = this.readNumber(); - break; - case 'ForceBold': - program.properties.privateData[token] = this.readBoolean(); - break; - } - } - - for (var i = 0; i < charstrings.length; i++) { - glyph = charstrings[i].glyph; - encoded = charstrings[i].encoded; - var charString = new Type1CharString(); - var error = charString.convert(encoded, subrs, - this.seacAnalysisEnabled); - var output = charString.output; - if (error) { - // It seems when FreeType encounters an error while evaluating a glyph - // that it completely ignores the glyph so we'll mimic that behaviour - // here and put an endchar to make the validator happy. - output = [14]; - } - program.charstrings.push({ - glyphName: glyph, - charstring: output, - width: charString.width, - lsb: charString.lsb, - seac: charString.seac - }); - } - - return program; - }, - - extractFontHeader: function Type1Parser_extractFontHeader(properties) { - var token; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'FontMatrix': - var matrix = this.readNumberArray(); - properties.fontMatrix = matrix; - break; - case 'Encoding': - var encodingArg = this.getToken(); - var encoding; - if (!/^\d+$/.test(encodingArg)) { - // encoding name is specified - encoding = getEncoding(encodingArg); - } else { - encoding = []; - var size = parseInt(encodingArg, 10) | 0; - this.getToken(); // read in 'array' - - for (var j = 0; j < size; j++) { - token = this.getToken(); - // skipping till first dup or def (e.g. ignoring for statement) - while (token !== 'dup' && token !== 'def') { - token = this.getToken(); - if (token === null) { - return; // invalid header - } - } - if (token === 'def') { - break; // read all array data - } - var index = this.readInt(); - this.getToken(); // read in '/' - var glyph = this.getToken(); - encoding[index] = glyph; - this.getToken(); // read the in 'put' - } - } - properties.builtInEncoding = encoding; - break; - case 'FontBBox': - var fontBBox = this.readNumberArray(); - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - break; - } - } - } - }; - - return Type1Parser; -})(); - -exports.Type1Parser = Type1Parser; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCMap = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser) { - -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var warn = sharedUtil.warn; -var error = sharedUtil.error; -var isInt = sharedUtil.isInt; -var isString = sharedUtil.isString; -var MissingDataException = sharedUtil.MissingDataException; -var isName = corePrimitives.isName; -var isCmd = corePrimitives.isCmd; -var isStream = corePrimitives.isStream; -var StringStream = coreStream.StringStream; -var Lexer = coreParser.Lexer; -var isEOF = coreParser.isEOF; - -var BUILT_IN_CMAPS = [ -// << Start unicode maps. -'Adobe-GB1-UCS2', -'Adobe-CNS1-UCS2', -'Adobe-Japan1-UCS2', -'Adobe-Korea1-UCS2', -// >> End unicode maps. -'78-EUC-H', -'78-EUC-V', -'78-H', -'78-RKSJ-H', -'78-RKSJ-V', -'78-V', -'78ms-RKSJ-H', -'78ms-RKSJ-V', -'83pv-RKSJ-H', -'90ms-RKSJ-H', -'90ms-RKSJ-V', -'90msp-RKSJ-H', -'90msp-RKSJ-V', -'90pv-RKSJ-H', -'90pv-RKSJ-V', -'Add-H', -'Add-RKSJ-H', -'Add-RKSJ-V', -'Add-V', -'Adobe-CNS1-0', -'Adobe-CNS1-1', -'Adobe-CNS1-2', -'Adobe-CNS1-3', -'Adobe-CNS1-4', -'Adobe-CNS1-5', -'Adobe-CNS1-6', -'Adobe-GB1-0', -'Adobe-GB1-1', -'Adobe-GB1-2', -'Adobe-GB1-3', -'Adobe-GB1-4', -'Adobe-GB1-5', -'Adobe-Japan1-0', -'Adobe-Japan1-1', -'Adobe-Japan1-2', -'Adobe-Japan1-3', -'Adobe-Japan1-4', -'Adobe-Japan1-5', -'Adobe-Japan1-6', -'Adobe-Korea1-0', -'Adobe-Korea1-1', -'Adobe-Korea1-2', -'B5-H', -'B5-V', -'B5pc-H', -'B5pc-V', -'CNS-EUC-H', -'CNS-EUC-V', -'CNS1-H', -'CNS1-V', -'CNS2-H', -'CNS2-V', -'ETHK-B5-H', -'ETHK-B5-V', -'ETen-B5-H', -'ETen-B5-V', -'ETenms-B5-H', -'ETenms-B5-V', -'EUC-H', -'EUC-V', -'Ext-H', -'Ext-RKSJ-H', -'Ext-RKSJ-V', -'Ext-V', -'GB-EUC-H', -'GB-EUC-V', -'GB-H', -'GB-V', -'GBK-EUC-H', -'GBK-EUC-V', -'GBK2K-H', -'GBK2K-V', -'GBKp-EUC-H', -'GBKp-EUC-V', -'GBT-EUC-H', -'GBT-EUC-V', -'GBT-H', -'GBT-V', -'GBTpc-EUC-H', -'GBTpc-EUC-V', -'GBpc-EUC-H', -'GBpc-EUC-V', -'H', -'HKdla-B5-H', -'HKdla-B5-V', -'HKdlb-B5-H', -'HKdlb-B5-V', -'HKgccs-B5-H', -'HKgccs-B5-V', -'HKm314-B5-H', -'HKm314-B5-V', -'HKm471-B5-H', -'HKm471-B5-V', -'HKscs-B5-H', -'HKscs-B5-V', -'Hankaku', -'Hiragana', -'KSC-EUC-H', -'KSC-EUC-V', -'KSC-H', -'KSC-Johab-H', -'KSC-Johab-V', -'KSC-V', -'KSCms-UHC-H', -'KSCms-UHC-HW-H', -'KSCms-UHC-HW-V', -'KSCms-UHC-V', -'KSCpc-EUC-H', -'KSCpc-EUC-V', -'Katakana', -'NWP-H', -'NWP-V', -'RKSJ-H', -'RKSJ-V', -'Roman', -'UniCNS-UCS2-H', -'UniCNS-UCS2-V', -'UniCNS-UTF16-H', -'UniCNS-UTF16-V', -'UniCNS-UTF32-H', -'UniCNS-UTF32-V', -'UniCNS-UTF8-H', -'UniCNS-UTF8-V', -'UniGB-UCS2-H', -'UniGB-UCS2-V', -'UniGB-UTF16-H', -'UniGB-UTF16-V', -'UniGB-UTF32-H', -'UniGB-UTF32-V', -'UniGB-UTF8-H', -'UniGB-UTF8-V', -'UniJIS-UCS2-H', -'UniJIS-UCS2-HW-H', -'UniJIS-UCS2-HW-V', -'UniJIS-UCS2-V', -'UniJIS-UTF16-H', -'UniJIS-UTF16-V', -'UniJIS-UTF32-H', -'UniJIS-UTF32-V', -'UniJIS-UTF8-H', -'UniJIS-UTF8-V', -'UniJIS2004-UTF16-H', -'UniJIS2004-UTF16-V', -'UniJIS2004-UTF32-H', -'UniJIS2004-UTF32-V', -'UniJIS2004-UTF8-H', -'UniJIS2004-UTF8-V', -'UniJISPro-UCS2-HW-V', -'UniJISPro-UCS2-V', -'UniJISPro-UTF8-V', -'UniJISX0213-UTF32-H', -'UniJISX0213-UTF32-V', -'UniJISX02132004-UTF32-H', -'UniJISX02132004-UTF32-V', -'UniKS-UCS2-H', -'UniKS-UCS2-V', -'UniKS-UTF16-H', -'UniKS-UTF16-V', -'UniKS-UTF32-H', -'UniKS-UTF32-V', -'UniKS-UTF8-H', -'UniKS-UTF8-V', -'V', -'WP-Symbol']; - -// CMap, not to be confused with TrueType's cmap. -var CMap = (function CMapClosure() { - function CMap(builtInCMap) { - // Codespace ranges are stored as follows: - // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]] - // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] - this.codespaceRanges = [[], [], [], []]; - this.numCodespaceRanges = 0; - // Map entries have one of two forms. - // - cid chars are 16-bit unsigned integers, stored as integers. - // - bf chars are variable-length byte sequences, stored as strings, with - // one byte per character. - this._map = []; - this.name = ''; - this.vertical = false; - this.useCMap = null; - this.builtInCMap = builtInCMap; - } - CMap.prototype = { - addCodespaceRange: function(n, low, high) { - this.codespaceRanges[n - 1].push(low, high); - this.numCodespaceRanges++; - }, - - mapCidRange: function(low, high, dstLow) { - while (low <= high) { - this._map[low++] = dstLow++; - } - }, - - mapBfRange: function(low, high, dstLow) { - var lastByte = dstLow.length - 1; - while (low <= high) { - this._map[low++] = dstLow; - // Only the last byte has to be incremented. - dstLow = dstLow.substr(0, lastByte) + - String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); - } - }, - - mapBfRangeToArray: function(low, high, array) { - var i = 0, ii = array.length; - while (low <= high && i < ii) { - this._map[low] = array[i++]; - ++low; - } - }, - - // This is used for both bf and cid chars. - mapOne: function(src, dst) { - this._map[src] = dst; - }, - - lookup: function(code) { - return this._map[code]; - }, - - contains: function(code) { - return this._map[code] !== undefined; - }, - - forEach: function(callback) { - // Most maps have fewer than 65536 entries, and for those we use normal - // array iteration. But really sparse tables are possible -- e.g. with - // indices in the *billions*. For such tables we use for..in, which isn't - // ideal because it stringifies the indices for all present elements, but - // it does avoid iterating over every undefined entry. - var map = this._map; - var length = map.length; - var i; - if (length <= 0x10000) { - for (i = 0; i < length; i++) { - if (map[i] !== undefined) { - callback(i, map[i]); - } - } - } else { - for (i in this._map) { - callback(i, map[i]); - } - } - }, - - charCodeOf: function(value) { - return this._map.indexOf(value); - }, - - getMap: function() { - return this._map; - }, - - readCharCode: function(str, offset, out) { - var c = 0; - var codespaceRanges = this.codespaceRanges; - var codespaceRangesLen = this.codespaceRanges.length; - // 9.7.6.2 CMap Mapping - // The code length is at most 4. - for (var n = 0; n < codespaceRangesLen; n++) { - c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0; - // Check each codespace range to see if it falls within. - var codespaceRange = codespaceRanges[n]; - for (var k = 0, kk = codespaceRange.length; k < kk;) { - var low = codespaceRange[k++]; - var high = codespaceRange[k++]; - if (c >= low && c <= high) { - out.charcode = c; - out.length = n + 1; - return; - } - } - } - out.charcode = 0; - out.length = 1; - }, - - get length() { - return this._map.length; - }, - - get isIdentityCMap() { - if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) { - return false; - } - if (this._map.length !== 0x10000) { - return false; - } - for (var i = 0; i < 0x10000; i++) { - if (this._map[i] !== i) { - return false; - } - } - return true; - } - }; - return CMap; -})(); - -// A special case of CMap, where the _map array implicitly has a length of -// 65536 and each element is equal to its index. -var IdentityCMap = (function IdentityCMapClosure() { - function IdentityCMap(vertical, n) { - CMap.call(this); - this.vertical = vertical; - this.addCodespaceRange(n, 0, 0xffff); - } - Util.inherit(IdentityCMap, CMap, {}); - - IdentityCMap.prototype = { - addCodespaceRange: CMap.prototype.addCodespaceRange, - - mapCidRange: function(low, high, dstLow) { - error('should not call mapCidRange'); - }, - - mapBfRange: function(low, high, dstLow) { - error('should not call mapBfRange'); - }, - - mapBfRangeToArray: function(low, high, array) { - error('should not call mapBfRangeToArray'); - }, - - mapOne: function(src, dst) { - error('should not call mapCidOne'); - }, - - lookup: function(code) { - return (isInt(code) && code <= 0xffff) ? code : undefined; - }, - - contains: function(code) { - return isInt(code) && code <= 0xffff; - }, - - forEach: function(callback) { - for (var i = 0; i <= 0xffff; i++) { - callback(i, i); - } - }, - - charCodeOf: function(value) { - return (isInt(value) && value <= 0xffff) ? value : -1; - }, - - getMap: function() { - // Sometimes identity maps must be instantiated, but it's rare. - var map = new Array(0x10000); - for (var i = 0; i <= 0xffff; i++) { - map[i] = i; - } - return map; - }, - - readCharCode: CMap.prototype.readCharCode, - - get length() { - return 0x10000; - }, - - get isIdentityCMap() { - error('should not access .isIdentityCMap'); - } - }; - - return IdentityCMap; -})(); - -var BinaryCMapReader = (function BinaryCMapReaderClosure() { - function fetchBinaryData(url) { - return new Promise(function (resolve, reject) { - var request = new XMLHttpRequest(); - request.open('GET', url, true); - request.responseType = 'arraybuffer'; - request.onreadystatechange = function () { - if (request.readyState === XMLHttpRequest.DONE) { - if (!request.response || request.status !== 200 && - request.status !== 0) { - reject(new Error('Unable to get binary cMap at: ' + url)); - } else { - resolve(new Uint8Array(request.response)); - } - } - }; - request.send(null); - }); - } - - function hexToInt(a, size) { - var n = 0; - for (var i = 0; i <= size; i++) { - n = (n << 8) | a[i]; - } - return n >>> 0; - } - - function hexToStr(a, size) { - // This code is hot. Special-case some common values to avoid creating an - // object with subarray(). - if (size === 1) { - return String.fromCharCode(a[0], a[1]); - } - if (size === 3) { - return String.fromCharCode(a[0], a[1], a[2], a[3]); - } - return String.fromCharCode.apply(null, a.subarray(0, size + 1)); - } - - function addHex(a, b, size) { - var c = 0; - for (var i = size; i >= 0; i--) { - c += a[i] + b[i]; - a[i] = c & 255; - c >>= 8; - } - } - - function incHex(a, size) { - var c = 1; - for (var i = size; i >= 0 && c > 0; i--) { - c += a[i]; - a[i] = c & 255; - c >>= 8; - } - } - - var MAX_NUM_SIZE = 16; - var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8) - - function BinaryCMapStream(data) { - this.buffer = data; - this.pos = 0; - this.end = data.length; - this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); - } - - BinaryCMapStream.prototype = { - readByte: function () { - if (this.pos >= this.end) { - return -1; - } - return this.buffer[this.pos++]; - }, - readNumber: function () { - var n = 0; - var last; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - n = (n << 7) | (b & 0x7F); - } while (!last); - return n; - }, - readSigned: function () { - var n = this.readNumber(); - return (n & 1) ? ~(n >>> 1) : n >>> 1; - }, - readHex: function (num, size) { - num.set(this.buffer.subarray(this.pos, - this.pos + size + 1)); - this.pos += size + 1; - }, - readHexNumber: function (num, size) { - var last; - var stack = this.tmpBuf, sp = 0; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - stack[sp++] = b & 0x7F; - } while (!last); - var i = size, buffer = 0, bufferSize = 0; - while (i >= 0) { - while (bufferSize < 8 && stack.length > 0) { - buffer = (stack[--sp] << bufferSize) | buffer; - bufferSize += 7; - } - num[i] = buffer & 255; - i--; - buffer >>= 8; - bufferSize -= 8; - } - }, - readHexSigned: function (num, size) { - this.readHexNumber(num, size); - var sign = num[size] & 1 ? 255 : 0; - var c = 0; - for (var i = 0; i <= size; i++) { - c = ((c & 1) << 8) | num[i]; - num[i] = (c >> 1) ^ sign; - } - }, - readString: function () { - var len = this.readNumber(); - var s = ''; - for (var i = 0; i < len; i++) { - s += String.fromCharCode(this.readNumber()); - } - return s; - } - }; - - function processBinaryCMap(url, cMap, extend) { - return fetchBinaryData(url).then(function (data) { - var stream = new BinaryCMapStream(data); - var header = stream.readByte(); - cMap.vertical = !!(header & 1); - - var useCMap = null; - var start = new Uint8Array(MAX_NUM_SIZE); - var end = new Uint8Array(MAX_NUM_SIZE); - var char = new Uint8Array(MAX_NUM_SIZE); - var charCode = new Uint8Array(MAX_NUM_SIZE); - var tmp = new Uint8Array(MAX_NUM_SIZE); - var code; - - var b; - while ((b = stream.readByte()) >= 0) { - var type = b >> 5; - if (type === 7) { // metadata, e.g. comment or usecmap - switch (b & 0x1F) { - case 0: - stream.readString(); // skipping comment - break; - case 1: - useCMap = stream.readString(); - break; - } - continue; - } - var sequence = !!(b & 0x10); - var dataSize = b & 15; - - assert(dataSize + 1 <= MAX_NUM_SIZE); - - var ucs2DataSize = 1; - var subitemsCount = stream.readNumber(); - var i; - switch (type) { - case 0: // codespacerange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - } - break; - case 1: // notdefrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // undefined range, skipping - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // nop - } - break; - case 2: // cidchar - stream.readHex(char, dataSize); - code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); - for (i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); - if (!sequence) { - stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); - } - code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); - } - break; - case 3: // cidrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - if (!sequence) { - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), - hexToInt(end, dataSize), code); - } - break; - case 4: // bfchar - stream.readHex(char, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); - } - incHex(charCode, dataSize); - stream.readHexSigned(tmp, dataSize); - addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - case 5: // bfrange - stream.readHex(start, ucs2DataSize); - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(start, ucs2DataSize); - addHex(start, end, ucs2DataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - default: - error('Unknown type: ' + type); - break; - } - } - - if (useCMap) { - return extend(useCMap); - } - return cMap; - }); - } - - function BinaryCMapReader() {} - - BinaryCMapReader.prototype = { - read: processBinaryCMap - }; - - return BinaryCMapReader; -})(); - -var CMapFactory = (function CMapFactoryClosure() { - function strToInt(str) { - var a = 0; - for (var i = 0; i < str.length; i++) { - a = (a << 8) | str.charCodeAt(i); - } - return a >>> 0; - } - - function expectString(obj) { - if (!isString(obj)) { - error('Malformed CMap: expected string.'); - } - } - - function expectInt(obj) { - if (!isInt(obj)) { - error('Malformed CMap: expected int.'); - } - } - - function parseBfChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - // TODO are /dstName used? - expectString(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseBfRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - if (isInt(obj) || isString(obj)) { - var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj; - cMap.mapBfRange(low, high, dstLow); - } else if (isCmd(obj, '[')) { - obj = lexer.getObj(); - var array = []; - while (!isCmd(obj, ']') && !isEOF(obj)) { - array.push(obj); - obj = lexer.getObj(); - } - cMap.mapBfRangeToArray(low, high, array); - } else { - break; - } - } - error('Invalid bf range.'); - } - - function parseCidChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseCidRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dstLow = obj; - cMap.mapCidRange(low, high, dstLow); - } - } - - function parseCodespaceRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcodespacerange')) { - return; - } - if (!isString(obj)) { - break; - } - var low = strToInt(obj); - obj = lexer.getObj(); - if (!isString(obj)) { - break; - } - var high = strToInt(obj); - cMap.addCodespaceRange(obj.length, low, high); - } - error('Invalid codespace range.'); - } - - function parseWMode(cMap, lexer) { - var obj = lexer.getObj(); - if (isInt(obj)) { - cMap.vertical = !!obj; - } - } - - function parseCMapName(cMap, lexer) { - var obj = lexer.getObj(); - if (isName(obj) && isString(obj.name)) { - cMap.name = obj.name; - } - } - - function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { - var previous; - var embededUseCMap; - objLoop: while (true) { - try { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } else if (isName(obj)) { - if (obj.name === 'WMode') { - parseWMode(cMap, lexer); - } else if (obj.name === 'CMapName') { - parseCMapName(cMap, lexer); - } - previous = obj; - } else if (isCmd(obj)) { - switch (obj.cmd) { - case 'endcmap': - break objLoop; - case 'usecmap': - if (isName(previous)) { - embededUseCMap = previous.name; - } - break; - case 'begincodespacerange': - parseCodespaceRange(cMap, lexer); - break; - case 'beginbfchar': - parseBfChar(cMap, lexer); - break; - case 'begincidchar': - parseCidChar(cMap, lexer); - break; - case 'beginbfrange': - parseBfRange(cMap, lexer); - break; - case 'begincidrange': - parseCidRange(cMap, lexer); - break; - } - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Invalid cMap data: ' + ex); - continue; - } - } - - if (!useCMap && embededUseCMap) { - // Load the usecmap definition from the file only if there wasn't one - // specified. - useCMap = embededUseCMap; - } - if (useCMap) { - return extendCMap(cMap, builtInCMapParams, useCMap); - } - return Promise.resolve(cMap); - } - - function extendCMap(cMap, builtInCMapParams, useCMap) { - return createBuiltInCMap(useCMap, builtInCMapParams).then( - function(newCMap) { - cMap.useCMap = newCMap; - // If there aren't any code space ranges defined clone all the parent ones - // into this cMap. - if (cMap.numCodespaceRanges === 0) { - var useCodespaceRanges = cMap.useCMap.codespaceRanges; - for (var i = 0; i < useCodespaceRanges.length; i++) { - cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); - } - cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; - } - // Merge the map into the current one, making sure not to override - // any previously defined entries. - cMap.useCMap.forEach(function(key, value) { - if (!cMap.contains(key)) { - cMap.mapOne(key, cMap.useCMap.lookup(key)); - } - }); - - return cMap; - }); - } - - function parseBinaryCMap(name, builtInCMapParams) { - var url = builtInCMapParams.url + name + '.bcmap'; - var cMap = new CMap(true); - return new BinaryCMapReader().read(url, cMap, function (useCMap) { - return extendCMap(cMap, builtInCMapParams, useCMap); - }); - } - - function createBuiltInCMap(name, builtInCMapParams) { - if (name === 'Identity-H') { - return Promise.resolve(new IdentityCMap(false, 2)); - } else if (name === 'Identity-V') { - return Promise.resolve(new IdentityCMap(true, 2)); - } - if (BUILT_IN_CMAPS.indexOf(name) === -1) { - return Promise.reject(new Error('Unknown cMap name: ' + name)); - } - assert(builtInCMapParams, 'built-in cMap parameters are not provided'); - - if (builtInCMapParams.packed) { - return parseBinaryCMap(name, builtInCMapParams); - } - - return new Promise(function (resolve, reject) { - var url = builtInCMapParams.url + name; - var request = new XMLHttpRequest(); - request.onreadystatechange = function () { - if (request.readyState === XMLHttpRequest.DONE) { - if (request.status === 200 || request.status === 0) { - var cMap = new CMap(true); - var lexer = new Lexer(new StringStream(request.responseText)); - parseCMap(cMap, lexer, builtInCMapParams, null).then( - function (parsedCMap) { - resolve(parsedCMap); - }); - } else { - reject(new Error('Unable to get cMap at: ' + url)); - } - } - }; - request.open('GET', url, true); - request.send(null); - }); - } - - return { - create: function (encoding, builtInCMapParams, useCMap) { - if (isName(encoding)) { - return createBuiltInCMap(encoding.name, builtInCMapParams); - } else if (isStream(encoding)) { - var cMap = new CMap(); - var lexer = new Lexer(encoding); - return parseCMap(cMap, lexer, builtInCMapParams, useCMap).then( - function (parsedCMap) { - if (parsedCMap.isIdentityCMap) { - return createBuiltInCMap(parsedCMap.name, builtInCMapParams); - } - return parsedCMap; - }); - } - return Promise.reject(new Error('Encoding required.')); - } - }; -})(); - -exports.CMap = CMap; -exports.CMapFactory = CMapFactory; -exports.IdentityCMap = IdentityCMap; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreFonts = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreGlyphList, - root.pdfjsCoreFontRenderer, root.pdfjsCoreEncodings, - root.pdfjsCoreStandardFonts, root.pdfjsCoreUnicode, - root.pdfjsCoreType1Parser, root.pdfjsCoreCFFParser); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, - coreGlyphList, coreFontRenderer, coreEncodings, - coreStandardFonts, coreUnicode, coreType1Parser, - coreCFFParser) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var FontType = sharedUtil.FontType; -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isNum = sharedUtil.isNum; -var readUint32 = sharedUtil.readUint32; -var shadow = sharedUtil.shadow; -var string32 = sharedUtil.string32; -var warn = sharedUtil.warn; -var MissingDataException = sharedUtil.MissingDataException; -var isSpace = sharedUtil.isSpace; -var Stream = coreStream.Stream; -var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; -var getDingbatsGlyphsUnicode = coreGlyphList.getDingbatsGlyphsUnicode; -var FontRendererFactory = coreFontRenderer.FontRendererFactory; -var StandardEncoding = coreEncodings.StandardEncoding; -var MacRomanEncoding = coreEncodings.MacRomanEncoding; -var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; -var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; -var getEncoding = coreEncodings.getEncoding; -var getStdFontMap = coreStandardFonts.getStdFontMap; -var getNonStdFontMap = coreStandardFonts.getNonStdFontMap; -var getGlyphMapForStandardFonts = coreStandardFonts.getGlyphMapForStandardFonts; -var getSupplementalGlyphMapForArialBlack = - coreStandardFonts.getSupplementalGlyphMapForArialBlack; -var getUnicodeRangeFor = coreUnicode.getUnicodeRangeFor; -var mapSpecialUnicodeValues = coreUnicode.mapSpecialUnicodeValues; -var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; -var Type1Parser = coreType1Parser.Type1Parser; -var CFFStandardStrings = coreCFFParser.CFFStandardStrings; -var CFFParser = coreCFFParser.CFFParser; -var CFFCompiler = coreCFFParser.CFFCompiler; -var CFF = coreCFFParser.CFF; -var CFFHeader = coreCFFParser.CFFHeader; -var CFFTopDict = coreCFFParser.CFFTopDict; -var CFFPrivateDict = coreCFFParser.CFFPrivateDict; -var CFFStrings = coreCFFParser.CFFStrings; -var CFFIndex = coreCFFParser.CFFIndex; -var CFFCharset = coreCFFParser.CFFCharset; - -// Unicode Private Use Area -var PRIVATE_USE_OFFSET_START = 0xE000; -var PRIVATE_USE_OFFSET_END = 0xF8FF; -var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false; - -// PDF Glyph Space Units are one Thousandth of a TextSpace Unit -// except for Type 3 fonts -var PDF_GLYPH_SPACE_UNITS = 1000; - -// Accented charactars are not displayed properly on Windows, using this flag -// to control analysis of seac charstrings. -var SEAC_ANALYSIS_ENABLED = false; - -var FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; - -var MacStandardGlyphOrdering = [ - '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', - 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', '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', 'grave', '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', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', - 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', - 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', - 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', - 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', - 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', - 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', - 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', - 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', - 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', - 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', - 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', - 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', - 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', - 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', - 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', - 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', - 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', - 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', - 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', - 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', - 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', - 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', - 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', - 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; - -function adjustWidths(properties) { - if (!properties.fontMatrix) { - return; - } - if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { - return; - } - // adjusting width to fontMatrix scale - var scale = 0.001 / properties.fontMatrix[0]; - var glyphsWidths = properties.widths; - for (var glyph in glyphsWidths) { - glyphsWidths[glyph] *= scale; - } - properties.defaultWidth *= scale; -} - -function adjustToUnicode(properties, builtInEncoding) { - if (properties.hasIncludedToUnicodeMap) { - return; // The font dictionary has a `ToUnicode` entry. - } - if (properties.hasEncoding) { - return; // The font dictionary has an `Encoding` entry. - } - if (builtInEncoding === properties.defaultEncoding) { - return; // No point in trying to adjust `toUnicode` if the encodings match. - } - if (properties.toUnicode instanceof IdentityToUnicodeMap) { - return; - } - var toUnicode = [], glyphsUnicodeMap = getGlyphsUnicode(); - for (var charCode in builtInEncoding) { - var glyphName = builtInEncoding[charCode]; - var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - toUnicode[charCode] = String.fromCharCode(unicode); - } - } - properties.toUnicode.amend(toUnicode); -} - -function getFontType(type, subtype) { - switch (type) { - case 'Type1': - return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1; - case 'CIDFontType0': - return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C : - FontType.CIDFONTTYPE0; - case 'OpenType': - return FontType.OPENTYPE; - case 'TrueType': - return FontType.TRUETYPE; - case 'CIDFontType2': - return FontType.CIDFONTTYPE2; - case 'MMType1': - return FontType.MMTYPE1; - case 'Type0': - return FontType.TYPE0; - default: - return FontType.UNKNOWN; - } -} - -// Some bad PDF generators, e.g. Scribus PDF, include glyph names -// in a 'uniXXXX' format -- attempting to recover proper ones. -function recoverGlyphName(name, glyphsUnicodeMap) { - if (glyphsUnicodeMap[name] !== undefined) { - return name; - } - // The glyph name is non-standard, trying to recover. - var unicode = getUnicodeForGlyph(name, glyphsUnicodeMap); - if (unicode !== -1) { - for (var key in glyphsUnicodeMap) { - if (glyphsUnicodeMap[key] === unicode) { - return key; - } - } - } - info('Unable to recover a standard glyph name for: ' + name); - return name; -} - -var Glyph = (function GlyphClosure() { - function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, - isSpace, isInFont) { - this.fontChar = fontChar; - this.unicode = unicode; - this.accent = accent; - this.width = width; - this.vmetric = vmetric; - this.operatorListId = operatorListId; - this.isSpace = isSpace; - this.isInFont = isInFont; - } - - Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, - vmetric, operatorListId, isSpace, - isInFont) { - return this.fontChar === fontChar && - this.unicode === unicode && - this.accent === accent && - this.width === width && - this.vmetric === vmetric && - this.operatorListId === operatorListId && - this.isSpace === isSpace && - this.isInFont === isInFont; - }; - - return Glyph; -})(); - -var ToUnicodeMap = (function ToUnicodeMapClosure() { - function ToUnicodeMap(cmap) { - // The elements of this._map can be integers or strings, depending on how - // |cmap| was created. - this._map = cmap; - } - - ToUnicodeMap.prototype = { - get length() { - return this._map.length; - }, - - forEach: function(callback) { - for (var charCode in this._map) { - callback(charCode, this._map[charCode].charCodeAt(0)); - } - }, - - has: function(i) { - return this._map[i] !== undefined; - }, - - get: function(i) { - return this._map[i]; - }, - - charCodeOf: function(v) { - return this._map.indexOf(v); - }, - - amend: function (map) { - for (var charCode in map) { - this._map[charCode] = map[charCode]; - } - }, - }; - - return ToUnicodeMap; -})(); - -var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { - function IdentityToUnicodeMap(firstChar, lastChar) { - this.firstChar = firstChar; - this.lastChar = lastChar; - } - - IdentityToUnicodeMap.prototype = { - get length() { - return (this.lastChar + 1) - this.firstChar; - }, - - forEach: function (callback) { - for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { - callback(i, i); - } - }, - - has: function (i) { - return this.firstChar <= i && i <= this.lastChar; - }, - - get: function (i) { - if (this.firstChar <= i && i <= this.lastChar) { - return String.fromCharCode(i); - } - return undefined; - }, - - charCodeOf: function (v) { - return (isInt(v) && v >= this.firstChar && v <= this.lastChar) ? v : -1; - }, - - amend: function (map) { - error('Should not call amend()'); - }, - }; - - return IdentityToUnicodeMap; -})(); - -var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { - function writeInt16(dest, offset, num) { - dest[offset] = (num >> 8) & 0xFF; - dest[offset + 1] = num & 0xFF; - } - - function writeInt32(dest, offset, num) { - dest[offset] = (num >> 24) & 0xFF; - dest[offset + 1] = (num >> 16) & 0xFF; - dest[offset + 2] = (num >> 8) & 0xFF; - dest[offset + 3] = num & 0xFF; - } - - function writeData(dest, offset, data) { - var i, ii; - if (data instanceof Uint8Array) { - dest.set(data, offset); - } else if (typeof data === 'string') { - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data.charCodeAt(i) & 0xFF; - } - } else { - // treating everything else as array - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data[i] & 0xFF; - } - } - } - - function OpenTypeFileBuilder(sfnt) { - this.sfnt = sfnt; - this.tables = Object.create(null); - } - - OpenTypeFileBuilder.getSearchParams = - function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) { - var maxPower2 = 1, log2 = 0; - while ((maxPower2 ^ entriesCount) > maxPower2) { - maxPower2 <<= 1; - log2++; - } - var searchRange = maxPower2 * entrySize; - return { - range: searchRange, - entry: log2, - rangeShift: entrySize * entriesCount - searchRange - }; - }; - - var OTF_HEADER_SIZE = 12; - var OTF_TABLE_ENTRY_SIZE = 16; - - OpenTypeFileBuilder.prototype = { - toArray: function OpenTypeFileBuilder_toArray() { - var sfnt = this.sfnt; - - // Tables needs to be written by ascendant alphabetic order - var tables = this.tables; - var tablesNames = Object.keys(tables); - tablesNames.sort(); - var numTables = tablesNames.length; - - var i, j, jj, table, tableName; - // layout the tables data - var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; - var tableOffsets = [offset]; - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - var paddedLength = ((table.length + 3) & ~3) >>> 0; - offset += paddedLength; - tableOffsets.push(offset); - } - - var file = new Uint8Array(offset); - // write the table data first (mostly for checksum) - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - writeData(file, tableOffsets[i], table); - } - - // sfnt version (4 bytes) - if (sfnt === 'true') { - // Windows hates the Mac TrueType sfnt version number - sfnt = string32(0x00010000); - } - file[0] = sfnt.charCodeAt(0) & 0xFF; - file[1] = sfnt.charCodeAt(1) & 0xFF; - file[2] = sfnt.charCodeAt(2) & 0xFF; - file[3] = sfnt.charCodeAt(3) & 0xFF; - - // numTables (2 bytes) - writeInt16(file, 4, numTables); - - var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); - - // searchRange (2 bytes) - writeInt16(file, 6, searchParams.range); - // entrySelector (2 bytes) - writeInt16(file, 8, searchParams.entry); - // rangeShift (2 bytes) - writeInt16(file, 10, searchParams.rangeShift); - - offset = OTF_HEADER_SIZE; - // writing table entries - for (i = 0; i < numTables; i++) { - tableName = tablesNames[i]; - file[offset] = tableName.charCodeAt(0) & 0xFF; - file[offset + 1] = tableName.charCodeAt(1) & 0xFF; - file[offset + 2] = tableName.charCodeAt(2) & 0xFF; - file[offset + 3] = tableName.charCodeAt(3) & 0xFF; - - // checksum - var checksum = 0; - for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { - var quad = readUint32(file, j); - checksum = (checksum + quad) >>> 0; - } - writeInt32(file, offset + 4, checksum); - - // offset - writeInt32(file, offset + 8, tableOffsets[i]); - // length - writeInt32(file, offset + 12, tables[tableName].length); - - offset += OTF_TABLE_ENTRY_SIZE; - } - return file; - }, - - addTable: function OpenTypeFileBuilder_addTable(tag, data) { - if (tag in this.tables) { - throw new Error('Table ' + tag + ' already exists'); - } - this.tables[tag] = data; - } - }; - - return OpenTypeFileBuilder; -})(); - -// Problematic Unicode characters in the fonts that needs to be moved to avoid -// issues when they are painted on the canvas, e.g. complex-script shaping or -// control/whitespace characters. The ranges are listed in pairs: the first item -// is a code of the first problematic code, the second one is the next -// non-problematic code. The ranges must be in sorted order. -var ProblematicCharRanges = new Int32Array([ - // Control characters. - 0x0000, 0x0020, - 0x007F, 0x00A1, - 0x00AD, 0x00AE, - // Chars that is used in complex-script shaping. - 0x0600, 0x0780, - 0x08A0, 0x10A0, - 0x1780, 0x1800, - 0x1C00, 0x1C50, - // General punctuation chars. - 0x2000, 0x2010, - 0x2011, 0x2012, - 0x2028, 0x2030, - 0x205F, 0x2070, - 0x25CC, 0x25CD, - 0x3000, 0x3001, - // Chars that is used in complex-script shaping. - 0xAA60, 0xAA80, - // Specials Unicode block. - 0xFFF0, 0x10000 -]); - - -/** - * 'Font' is the class the outside world should use, it encapsulate all the font - * decoding logics whatever type it is (assuming the font type is supported). - * - * For example to read a Type1 font and to attach it to the document: - * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); - * type1Font.bind(); - */ -var Font = (function FontClosure() { - function Font(name, file, properties) { - var charCode, glyphName, unicode; - - this.name = name; - this.loadedName = properties.loadedName; - this.isType3Font = properties.isType3Font; - this.sizes = []; - this.missingFile = false; - - this.glyphCache = Object.create(null); - - var names = name.split('+'); - names = names.length > 1 ? names[1] : names[0]; - names = names.split(/[-,_]/g)[0]; - this.isSerifFont = !!(properties.flags & FontFlags.Serif); - this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); - - var type = properties.type; - var subtype = properties.subtype; - this.type = type; - - this.fallbackName = (this.isMonospace ? 'monospace' : - (this.isSerifFont ? 'serif' : 'sans-serif')); - - this.differences = properties.differences; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.composite = properties.composite; - this.wideChars = properties.wideChars; - this.cMap = properties.cMap; - this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; - this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; - this.fontMatrix = properties.fontMatrix; - this.bbox = properties.bbox; - - this.toUnicode = properties.toUnicode; - - this.toFontChar = []; - - if (properties.type === 'Type3') { - for (charCode = 0; charCode < 256; charCode++) { - this.toFontChar[charCode] = (this.differences[charCode] || - properties.defaultEncoding[charCode]); - } - this.fontType = FontType.TYPE3; - return; - } - - this.cidEncoding = properties.cidEncoding; - this.vertical = properties.vertical; - if (this.vertical) { - this.vmetrics = properties.vmetrics; - this.defaultVMetrics = properties.defaultVMetrics; - } - var glyphsUnicodeMap; - if (!file || file.isEmpty) { - if (file) { - // Some bad PDF generators will include empty font files, - // attempting to recover by assuming that no file exists. - warn('Font file is empty in "' + name + '" (' + this.loadedName + ')'); - } - - this.missingFile = true; - // The file data is not specified. Trying to fix the font name - // to be used with the canvas.font. - var fontName = name.replace(/[,_]/g, '-'); - var stdFontMap = getStdFontMap(), nonStdFontMap = getNonStdFontMap(); - var isStandardFont = !!stdFontMap[fontName] || - !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); - fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; - - this.bold = (fontName.search(/bold/gi) !== -1); - this.italic = ((fontName.search(/oblique/gi) !== -1) || - (fontName.search(/italic/gi) !== -1)); - - // Use 'name' instead of 'fontName' here because the original - // name ArialBlack for example will be replaced by Helvetica. - this.black = (name.search(/Black/g) !== -1); - - // if at least one width is present, remeasure all chars when exists - this.remeasure = Object.keys(this.widths).length > 0; - if (isStandardFont && type === 'CIDFontType2' && - properties.cidEncoding.indexOf('Identity-') === 0) { - var GlyphMapForStandardFonts = getGlyphMapForStandardFonts(); - // Standard fonts might be embedded as CID font without glyph mapping. - // Building one based on GlyphMapForStandardFonts. - var map = []; - for (charCode in GlyphMapForStandardFonts) { - map[+charCode] = GlyphMapForStandardFonts[charCode]; - } - if (/ArialBlack/i.test(name)) { - var SupplementalGlyphMapForArialBlack = - getSupplementalGlyphMapForArialBlack(); - for (charCode in SupplementalGlyphMapForArialBlack) { - map[+charCode] = SupplementalGlyphMapForArialBlack[charCode]; - } - } - var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap; - if (!isIdentityUnicode) { - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - map[+charCode] = unicodeCharCode; - }); - } - this.toFontChar = map; - this.toUnicode = new ToUnicodeMap(map); - } else if (/Symbol/i.test(fontName)) { - this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(), - properties.differences); - } else if (/Dingbats/i.test(fontName)) { - if (/Wingdings/i.test(name)) { - warn('Non-embedded Wingdings font, falling back to ZapfDingbats.'); - } - this.toFontChar = buildToFontChar(ZapfDingbatsEncoding, - getDingbatsGlyphsUnicode(), - properties.differences); - } else if (isStandardFont) { - this.toFontChar = buildToFontChar(properties.defaultEncoding, - getGlyphsUnicode(), - properties.differences); - } else { - glyphsUnicodeMap = getGlyphsUnicode(); - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - if (!this.composite) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - unicodeCharCode = unicode; - } - } - this.toFontChar[charCode] = unicodeCharCode; - }.bind(this)); - } - this.loadedName = fontName.split('-')[0]; - this.loading = false; - this.fontType = getFontType(type, subtype); - return; - } - - // Some fonts might use wrong font types for Type1C or CIDFontType0C - if (subtype === 'Type1C') { - if (type !== 'Type1' && type !== 'MMType1') { - // Some TrueType fonts by mistake claim Type1C - if (isTrueTypeFile(file)) { - subtype = 'TrueType'; - } else { - type = 'Type1'; - } - } else if (isOpenTypeFile(file)) { - // Sometimes the type/subtype can be a complete lie (see issue7598.pdf). - type = subtype = 'OpenType'; - } - } - if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') { - type = 'CIDFontType0'; - } - if (subtype === 'OpenType') { - type = 'OpenType'; - } - // Some CIDFontType0C fonts by mistake claim CIDFontType0. - if (type === 'CIDFontType0') { - if (isType1File(file)) { - subtype = 'CIDFontType0'; - } else if (isOpenTypeFile(file)) { - // Sometimes the type/subtype can be a complete lie (see issue6782.pdf). - type = subtype = 'OpenType'; - } else { - subtype = 'CIDFontType0C'; - } - } - - var data; - switch (type) { - case 'MMType1': - info('MMType1 font (' + name + '), falling back to Type1.'); - /* falls through */ - case 'Type1': - case 'CIDFontType0': - this.mimetype = 'font/opentype'; - - var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ? - new CFFFont(file, properties) : new Type1Font(name, file, properties); - - adjustWidths(properties); - - // Wrap the CFF data inside an OTF font file - data = this.convert(name, cff, properties); - break; - - case 'OpenType': - case 'TrueType': - case 'CIDFontType2': - this.mimetype = 'font/opentype'; - - // Repair the TrueType file. It is can be damaged in the point of - // view of the sanitizer - data = this.checkAndRepair(name, file, properties); - if (this.isOpenType) { - adjustWidths(properties); - - type = 'OpenType'; - } - break; - - default: - error('Font ' + type + ' is not supported'); - break; - } - - this.data = data; - this.fontType = getFontType(type, subtype); - - // Transfer some properties again that could change during font conversion - this.fontMatrix = properties.fontMatrix; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.toUnicode = properties.toUnicode; - this.encoding = properties.baseEncoding; - this.seacMap = properties.seacMap; - - this.loading = true; - } - - Font.getFontID = (function () { - var ID = 1; - return function Font_getFontID() { - return String(ID++); - }; - })(); - - function int16(b0, b1) { - return (b0 << 8) + b1; - } - - function signedInt16(b0, b1) { - var value = (b0 << 8) + b1; - return value & (1 << 15) ? value - 0x10000 : value; - } - - function int32(b0, b1, b2, b3) { - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - } - - function string16(value) { - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function safeString16(value) { - // clamp value to the 16-bit int range - value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value)); - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function isTrueTypeFile(file) { - var header = file.peekBytes(4); - return readUint32(header, 0) === 0x00010000; - } - - function isOpenTypeFile(file) { - var header = file.peekBytes(4); - return bytesToString(header) === 'OTTO'; - } - - function isType1File(file) { - var header = file.peekBytes(2); - // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21). - if (header[0] === 0x25 && header[1] === 0x21) { - return true; - } - // ... obviously some fonts violate that part of the specification, - // please refer to the comment in |Type1Font| below. - if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header. - return true; - } - return false; - } - - function buildToFontChar(encoding, glyphsUnicodeMap, differences) { - var toFontChar = [], unicode; - for (var i = 0, ii = encoding.length; i < ii; i++) { - unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap); - if (unicode !== -1) { - toFontChar[i] = unicode; - } - } - for (var charCode in differences) { - unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap); - if (unicode !== -1) { - toFontChar[+charCode] = unicode; - } - } - return toFontChar; - } - - /** - * Helper function for `adjustMapping`. - * @return {boolean} - */ - function isProblematicUnicodeLocation(code) { - // Using binary search to find a range start. - var i = 0, j = ProblematicCharRanges.length - 1; - while (i < j) { - var c = (i + j + 1) >> 1; - if (code < ProblematicCharRanges[c]) { - j = c - 1; - } else { - i = c; - } - } - // Even index means code in problematic range. - return !(i & 1); - } - - /** - * Rebuilds the char code to glyph ID map by trying to replace the char codes - * with their unicode value. It also moves char codes that are in known - * problematic locations. - * @return {Object} Two properties: - * 'toFontChar' - maps original char codes(the value that will be read - * from commands such as show text) to the char codes that will be used in the - * font that we build - * 'charCodeToGlyphId' - maps the new font char codes to glyph ids - */ - function adjustMapping(charCodeToGlyphId, properties) { - var toUnicode = properties.toUnicode; - var isSymbolic = !!(properties.flags & FontFlags.Symbolic); - var isIdentityUnicode = - properties.toUnicode instanceof IdentityToUnicodeMap; - var newMap = Object.create(null); - var toFontChar = []; - var usedFontCharCodes = []; - var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START; - for (var originalCharCode in charCodeToGlyphId) { - originalCharCode |= 0; - var glyphId = charCodeToGlyphId[originalCharCode]; - var fontCharCode = originalCharCode; - // First try to map the value to a unicode position if a non identity map - // was created. - var hasUnicodeValue = false; - if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { - var unicode = toUnicode.get(fontCharCode); - // TODO: Try to map ligatures to the correct spot. - if (unicode.length === 1) { - fontCharCode = unicode.charCodeAt(0); - } - // For Symbolic fonts, we trust the `unicode` value if and only if the - // font includes either `ToUnicode` or `Encoding` data, since otherwise - // `toUnicode` may not be correct. - hasUnicodeValue = properties.hasIncludedToUnicodeMap || - properties.hasEncoding; - } - // Try to move control characters, special characters and already mapped - // characters to the private use area since they will not be drawn by - // canvas if left in their current position. Also, move characters if the - // font was symbolic and there is only an identity unicode map since the - // characters probably aren't in the correct position (fixes an issue - // with firefox and thuluthfont). - if ((usedFontCharCodes[fontCharCode] !== undefined || - isProblematicUnicodeLocation(fontCharCode) || - (isSymbolic && !hasUnicodeValue)) && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left. - // Loop to try and find a free spot in the private use area. - do { - fontCharCode = nextAvailableFontCharCode++; - - if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) { - fontCharCode = 0xF020; - nextAvailableFontCharCode = fontCharCode + 1; - } - - } while (usedFontCharCodes[fontCharCode] !== undefined && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END); - } - - newMap[fontCharCode] = glyphId; - toFontChar[originalCharCode] = fontCharCode; - usedFontCharCodes[fontCharCode] = true; - } - return { - toFontChar: toFontChar, - charCodeToGlyphId: newMap, - nextAvailableFontCharCode: nextAvailableFontCharCode - }; - } - - function getRanges(glyphs, numGlyphs) { - // Array.sort() sorts by characters, not numerically, so convert to an - // array of characters. - var codes = []; - for (var charCode in glyphs) { - // Remove an invalid glyph ID mappings to make OTS happy. - if (glyphs[charCode] >= numGlyphs) { - continue; - } - codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] }); - } - codes.sort(function fontGetRangesSort(a, b) { - return a.fontCharCode - b.fontCharCode; - }); - - // Split the sorted codes into ranges. - var ranges = []; - var length = codes.length; - for (var n = 0; n < length; ) { - var start = codes[n].fontCharCode; - var codeIndices = [codes[n].glyphId]; - ++n; - var end = start; - while (n < length && end + 1 === codes[n].fontCharCode) { - codeIndices.push(codes[n].glyphId); - ++end; - ++n; - if (end === 0xFFFF) { - break; - } - } - ranges.push([start, end, codeIndices]); - } - - return ranges; - } - - function createCmapTable(glyphs, numGlyphs) { - var ranges = getRanges(glyphs, numGlyphs); - var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; - var cmap = '\x00\x00' + // version - string16(numTables) + // numTables - '\x00\x03' + // platformID - '\x00\x01' + // encodingID - string32(4 + numTables * 8); // start of the table record - - var i, ii, j, jj; - for (i = ranges.length - 1; i >= 0; --i) { - if (ranges[i][0] <= 0xFFFF) { break; } - } - var bmpLength = i + 1; - - if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) { - ranges[i][1] = 0xFFFE; - } - var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0; - var segCount = bmpLength + trailingRangesCount; - var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); - - // Fill up the 4 parallel arrays describing the segments. - var startCount = ''; - var endCount = ''; - var idDeltas = ''; - var idRangeOffsets = ''; - var glyphsIds = ''; - var bias = 0; - - var range, start, end, codes; - for (i = 0, ii = bmpLength; i < ii; i++) { - range = ranges[i]; - start = range[0]; - end = range[1]; - startCount += string16(start); - endCount += string16(end); - codes = range[2]; - var contiguous = true; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - contiguous = false; - break; - } - } - if (!contiguous) { - var offset = (segCount - i) * 2 + bias * 2; - bias += (end - start + 1); - - idDeltas += string16(0); - idRangeOffsets += string16(offset); - - for (j = 0, jj = codes.length; j < jj; ++j) { - glyphsIds += string16(codes[j]); - } - } else { - var startCode = codes[0]; - - idDeltas += string16((startCode - start) & 0xFFFF); - idRangeOffsets += string16(0); - } - } - - if (trailingRangesCount > 0) { - endCount += '\xFF\xFF'; - startCount += '\xFF\xFF'; - idDeltas += '\x00\x01'; - idRangeOffsets += '\x00\x00'; - } - - var format314 = '\x00\x00' + // language - string16(2 * segCount) + - string16(searchParams.range) + - string16(searchParams.entry) + - string16(searchParams.rangeShift) + - endCount + '\x00\x00' + startCount + - idDeltas + idRangeOffsets + glyphsIds; - - var format31012 = ''; - var header31012 = ''; - if (numTables > 1) { - cmap += '\x00\x03' + // platformID - '\x00\x0A' + // encodingID - string32(4 + numTables * 8 + - 4 + format314.length); // start of the table record - format31012 = ''; - for (i = 0, ii = ranges.length; i < ii; i++) { - range = ranges[i]; - start = range[0]; - codes = range[2]; - var code = codes[0]; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - end = range[0] + j - 1; - format31012 += string32(start) + // startCharCode - string32(end) + // endCharCode - string32(code); // startGlyphID - start = end + 1; - code = codes[j]; - } - } - format31012 += string32(start) + // startCharCode - string32(range[1]) + // endCharCode - string32(code); // startGlyphID - } - header31012 = '\x00\x0C' + // format - '\x00\x00' + // reserved - string32(format31012.length + 16) + // length - '\x00\x00\x00\x00' + // language - string32(format31012.length / 12); // nGroups - } - - return cmap + '\x00\x04' + // format - string16(format314.length + 4) + // length - format314 + header31012 + format31012; - } - - function validateOS2Table(os2) { - var stream = new Stream(os2.data); - var version = stream.getUint16(); - // TODO verify all OS/2 tables fields, but currently we validate only those - // that give us issues - stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges - var selection = stream.getUint16(); - if (version < 4 && (selection & 0x0300)) { - return false; - } - var firstChar = stream.getUint16(); - var lastChar = stream.getUint16(); - if (firstChar > lastChar) { - return false; - } - stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap - var usWinAscent = stream.getUint16(); - if (usWinAscent === 0) { // makes font unreadable by windows - return false; - } - - // OS/2 appears to be valid, resetting some fields - os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0 - return true; - } - - function createOS2Table(properties, charstrings, override) { - override = override || { - unitsPerEm: 0, - yMax: 0, - yMin: 0, - ascent: 0, - descent: 0 - }; - - var ulUnicodeRange1 = 0; - var ulUnicodeRange2 = 0; - var ulUnicodeRange3 = 0; - var ulUnicodeRange4 = 0; - - var firstCharIndex = null; - var lastCharIndex = 0; - - if (charstrings) { - for (var code in charstrings) { - code |= 0; - if (firstCharIndex > code || !firstCharIndex) { - firstCharIndex = code; - } - if (lastCharIndex < code) { - lastCharIndex = code; - } - - var position = getUnicodeRangeFor(code); - if (position < 32) { - ulUnicodeRange1 |= 1 << position; - } else if (position < 64) { - ulUnicodeRange2 |= 1 << position - 32; - } else if (position < 96) { - ulUnicodeRange3 |= 1 << position - 64; - } else if (position < 123) { - ulUnicodeRange4 |= 1 << position - 96; - } else { - error('Unicode ranges Bits > 123 are reserved for internal usage'); - } - } - } else { - // TODO - firstCharIndex = 0; - lastCharIndex = 255; - } - - var bbox = properties.bbox || [0, 0, 0, 0]; - var unitsPerEm = (override.unitsPerEm || - 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]); - - // if the font units differ to the PDF glyph space units - // then scale up the values - var scale = (properties.ascentScaled ? 1.0 : - unitsPerEm / PDF_GLYPH_SPACE_UNITS); - - var typoAscent = (override.ascent || - Math.round(scale * (properties.ascent || bbox[3]))); - var typoDescent = (override.descent || - Math.round(scale * (properties.descent || bbox[1]))); - if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { - typoDescent = -typoDescent; // fixing incorrect descent - } - var winAscent = override.yMax || typoAscent; - var winDescent = -override.yMin || -typoDescent; - - return '\x00\x03' + // version - '\x02\x24' + // xAvgCharWidth - '\x01\xF4' + // usWeightClass - '\x00\x05' + // usWidthClass - '\x00\x00' + // fstype (0 to let the font loads via font-face on IE) - '\x02\x8A' + // ySubscriptXSize - '\x02\xBB' + // ySubscriptYSize - '\x00\x00' + // ySubscriptXOffset - '\x00\x8C' + // ySubscriptYOffset - '\x02\x8A' + // ySuperScriptXSize - '\x02\xBB' + // ySuperScriptYSize - '\x00\x00' + // ySuperScriptXOffset - '\x01\xDF' + // ySuperScriptYOffset - '\x00\x31' + // yStrikeOutSize - '\x01\x02' + // yStrikeOutPosition - '\x00\x00' + // sFamilyClass - '\x00\x00\x06' + - String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + - '\x00\x00\x00\x00\x00\x00' + // Panose - string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31) - string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63) - string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95) - string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127) - '\x2A\x32\x31\x2A' + // achVendID - string16(properties.italicAngle ? 1 : 0) + // fsSelection - string16(firstCharIndex || - properties.firstChar) + // usFirstCharIndex - string16(lastCharIndex || properties.lastChar) + // usLastCharIndex - string16(typoAscent) + // sTypoAscender - string16(typoDescent) + // sTypoDescender - '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value) - string16(winAscent) + // usWinAscent - string16(winDescent) + // usWinDescent - '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31) - '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63) - string16(properties.xHeight) + // sxHeight - string16(properties.capHeight) + // sCapHeight - string16(0) + // usDefaultChar - string16(firstCharIndex || properties.firstChar) + // usBreakChar - '\x00\x03'; // usMaxContext - } - - function createPostTable(properties) { - var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16))); - return ('\x00\x03\x00\x00' + // Version number - string32(angle) + // italicAngle - '\x00\x00' + // underlinePosition - '\x00\x00' + // underlineThickness - string32(properties.fixedPitch) + // isFixedPitch - '\x00\x00\x00\x00' + // minMemType42 - '\x00\x00\x00\x00' + // maxMemType42 - '\x00\x00\x00\x00' + // minMemType1 - '\x00\x00\x00\x00'); // maxMemType1 - } - - function createNameTable(name, proto) { - if (!proto) { - proto = [[], []]; // no strings and unicode strings - } - - var strings = [ - proto[0][0] || 'Original licence', // 0.Copyright - proto[0][1] || name, // 1.Font family - proto[0][2] || 'Unknown', // 2.Font subfamily (font weight) - proto[0][3] || 'uniqueID', // 3.Unique ID - proto[0][4] || name, // 4.Full font name - proto[0][5] || 'Version 0.11', // 5.Version - proto[0][6] || '', // 6.Postscript name - proto[0][7] || 'Unknown', // 7.Trademark - proto[0][8] || 'Unknown', // 8.Manufacturer - proto[0][9] || 'Unknown' // 9.Designer - ]; - - // Mac want 1-byte per character strings while Windows want - // 2-bytes per character, so duplicate the names table - var stringsUnicode = []; - var i, ii, j, jj, str; - for (i = 0, ii = strings.length; i < ii; i++) { - str = proto[1][i] || strings[i]; - - var strBufUnicode = []; - for (j = 0, jj = str.length; j < jj; j++) { - strBufUnicode.push(string16(str.charCodeAt(j))); - } - stringsUnicode.push(strBufUnicode.join('')); - } - - var names = [strings, stringsUnicode]; - var platforms = ['\x00\x01', '\x00\x03']; - var encodings = ['\x00\x00', '\x00\x01']; - var languages = ['\x00\x00', '\x04\x09']; - - var namesRecordCount = strings.length * platforms.length; - var nameTable = - '\x00\x00' + // format - string16(namesRecordCount) + // Number of names Record - string16(namesRecordCount * 12 + 6); // Storage - - // Build the name records field - var strOffset = 0; - for (i = 0, ii = platforms.length; i < ii; i++) { - var strs = names[i]; - for (j = 0, jj = strs.length; j < jj; j++) { - str = strs[j]; - var nameRecord = - platforms[i] + // platform ID - encodings[i] + // encoding ID - languages[i] + // language ID - string16(j) + // name ID - string16(str.length) + - string16(strOffset); - nameTable += nameRecord; - strOffset += str.length; - } - } - - nameTable += strings.join('') + stringsUnicode.join(''); - return nameTable; - } - - Font.prototype = { - name: null, - font: null, - mimetype: null, - encoding: null, - get renderer() { - var renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED); - return shadow(this, 'renderer', renderer); - }, - - exportData: function Font_exportData() { - // TODO remove enumerating of the properties, e.g. hardcode exact names. - var data = {}; - for (var i in this) { - if (this.hasOwnProperty(i)) { - data[i] = this[i]; - } - } - return data; - }, - - checkAndRepair: function Font_checkAndRepair(name, font, properties) { - function readTableEntry(file) { - var tag = bytesToString(file.getBytes(4)); - - var checksum = file.getInt32() >>> 0; - var offset = file.getInt32() >>> 0; - var length = file.getInt32() >>> 0; - - // Read the table associated data - var previousPosition = file.pos; - file.pos = file.start ? file.start : 0; - file.skip(offset); - var data = file.getBytes(length); - file.pos = previousPosition; - - if (tag === 'head') { - // clearing checksum adjustment - data[8] = data[9] = data[10] = data[11] = 0; - data[17] |= 0x20; //Set font optimized for cleartype flag - } - - return { - tag: tag, - checksum: checksum, - length: length, - offset: offset, - data: data - }; - } - - function readOpenTypeHeader(ttf) { - return { - version: bytesToString(ttf.getBytes(4)), - numTables: ttf.getUint16(), - searchRange: ttf.getUint16(), - entrySelector: ttf.getUint16(), - rangeShift: ttf.getUint16() - }; - } - - /** - * Read the appropriate subtable from the cmap according to 9.6.6.4 from - * PDF spec - */ - function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) { - if (!cmap) { - warn('No cmap table available.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - var segment; - var start = (font.start ? font.start : 0) + cmap.offset; - font.pos = start; - - var version = font.getUint16(); - var numTables = font.getUint16(); - - var potentialTable; - var canBreak = false; - // There's an order of preference in terms of which cmap subtable to - // use: - // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table - // - symbolic fonts the preference is a 3,0 table then a 1,0 table - // The following takes advantage of the fact that the tables are sorted - // to work. - for (var i = 0; i < numTables; i++) { - var platformId = font.getUint16(); - var encodingId = font.getUint16(); - var offset = font.getInt32() >>> 0; - var useTable = false; - - if (platformId === 0 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 1 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 3 && encodingId === 1 && - ((!isSymbolicFont && hasEncoding) || !potentialTable)) { - useTable = true; - if (!isSymbolicFont) { - canBreak = true; - } - } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { - useTable = true; - canBreak = true; - } - - if (useTable) { - potentialTable = { - platformId: platformId, - encodingId: encodingId, - offset: offset - }; - } - if (canBreak) { - break; - } - } - - if (potentialTable) { - font.pos = start + potentialTable.offset; - } - if (!potentialTable || font.peekByte() === -1) { - warn('Could not find a preferred cmap table.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - var format = font.getUint16(); - var length = font.getUint16(); - var language = font.getUint16(); - - var hasShortCmap = false; - var mappings = []; - var j, glyphId; - - // TODO(mack): refactor this cmap subtable reading logic out - if (format === 0) { - for (j = 0; j < 256; j++) { - var index = font.getByte(); - if (!index) { - continue; - } - mappings.push({ - charCode: j, - glyphId: index - }); - } - hasShortCmap = true; - } else if (format === 4) { - // re-creating the table in format 4 since the encoding - // might be changed - var segCount = (font.getUint16() >> 1); - font.getBytes(6); // skipping range fields - var segIndex, segments = []; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments.push({ end: font.getUint16() }); - } - font.getUint16(); - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].start = font.getUint16(); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].delta = font.getUint16(); - } - - var offsetsCount = 0; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - var rangeOffset = font.getUint16(); - if (!rangeOffset) { - segment.offsetIndex = -1; - continue; - } - - var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); - segment.offsetIndex = offsetIndex; - offsetsCount = Math.max(offsetsCount, offsetIndex + - segment.end - segment.start + 1); - } - - var offsets = []; - for (j = 0; j < offsetsCount; j++) { - offsets.push(font.getUint16()); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - start = segment.start; - var end = segment.end; - var delta = segment.delta; - offsetIndex = segment.offsetIndex; - - for (j = start; j <= end; j++) { - if (j === 0xFFFF) { - continue; - } - - glyphId = (offsetIndex < 0 ? - j : offsets[offsetIndex + j - start]); - glyphId = (glyphId + delta) & 0xFFFF; - if (glyphId === 0) { - continue; - } - mappings.push({ - charCode: j, - glyphId: glyphId - }); - } - } - } else if (format === 6) { - // Format 6 is a 2-bytes dense mapping, which means the font data - // lives glue together even if they are pretty far in the unicode - // table. (This looks weird, so I can have missed something), this - // works on Linux but seems to fails on Mac so let's rewrite the - // cmap table to a 3-1-4 style - var firstCode = font.getUint16(); - var entryCount = font.getUint16(); - - for (j = 0; j < entryCount; j++) { - glyphId = font.getUint16(); - var charCode = firstCode + j; - - mappings.push({ - charCode: charCode, - glyphId: glyphId - }); - } - } else { - warn('cmap table has unsupported format: ' + format); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - // removing duplicate entries - mappings.sort(function (a, b) { - return a.charCode - b.charCode; - }); - for (i = 1; i < mappings.length; i++) { - if (mappings[i - 1].charCode === mappings[i].charCode) { - mappings.splice(i, 1); - i--; - } - } - - return { - platformId: potentialTable.platformId, - encodingId: potentialTable.encodingId, - mappings: mappings, - hasShortCmap: hasShortCmap - }; - } - - function sanitizeMetrics(font, header, metrics, numGlyphs) { - if (!header) { - if (metrics) { - metrics.data = null; - } - return; - } - - font.pos = (font.start ? font.start : 0) + header.offset; - font.pos += header.length - 2; - var numOfMetrics = font.getUint16(); - - if (numOfMetrics > numGlyphs) { - info('The numOfMetrics (' + numOfMetrics + ') should not be ' + - 'greater than the numGlyphs (' + numGlyphs + ')'); - // Reduce numOfMetrics if it is greater than numGlyphs - numOfMetrics = numGlyphs; - header.data[34] = (numOfMetrics & 0xff00) >> 8; - header.data[35] = numOfMetrics & 0x00ff; - } - - var numOfSidebearings = numGlyphs - numOfMetrics; - var numMissing = numOfSidebearings - - ((metrics.length - numOfMetrics * 4) >> 1); - - if (numMissing > 0) { - // For each missing glyph, we set both the width and lsb to 0 (zero). - // Since we need to add two properties for each glyph, this explains - // the use of |numMissing * 2| when initializing the typed array. - var entries = new Uint8Array(metrics.length + numMissing * 2); - entries.set(metrics.data); - metrics.data = entries; - } - } - - function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, - hintsValid) { - if (sourceEnd - sourceStart <= 12) { - // glyph with data less than 12 is invalid one - return 0; - } - var glyf = source.subarray(sourceStart, sourceEnd); - var contoursCount = (glyf[0] << 8) | glyf[1]; - if (contoursCount & 0x8000) { - // complex glyph, writing as is - dest.set(glyf, destStart); - return glyf.length; - } - - var i, j = 10, flagsCount = 0; - for (i = 0; i < contoursCount; i++) { - var endPoint = (glyf[j] << 8) | glyf[j + 1]; - flagsCount = endPoint + 1; - j += 2; - } - // skipping instructions - var instructionsStart = j; - var instructionsLength = (glyf[j] << 8) | glyf[j + 1]; - j += 2 + instructionsLength; - var instructionsEnd = j; - // validating flags - var coordinatesLength = 0; - for (i = 0; i < flagsCount; i++) { - var flag = glyf[j++]; - if (flag & 0xC0) { - // reserved flags must be zero, cleaning up - glyf[j - 1] = flag & 0x3F; - } - var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) + - ((flag & 4) ? 1 : (flag & 32) ? 0 : 2); - coordinatesLength += xyLength; - if (flag & 8) { - var repeat = glyf[j++]; - i += repeat; - coordinatesLength += repeat * xyLength; - } - } - // glyph without coordinates will be rejected - if (coordinatesLength === 0) { - return 0; - } - var glyphDataLength = j + coordinatesLength; - if (glyphDataLength > glyf.length) { - // not enough data for coordinates - return 0; - } - if (!hintsValid && instructionsLength > 0) { - dest.set(glyf.subarray(0, instructionsStart), destStart); - dest.set([0, 0], destStart + instructionsStart); - dest.set(glyf.subarray(instructionsEnd, glyphDataLength), - destStart + instructionsStart + 2); - glyphDataLength -= instructionsLength; - if (glyf.length - glyphDataLength > 3) { - glyphDataLength = (glyphDataLength + 3) & ~3; - } - return glyphDataLength; - } - if (glyf.length - glyphDataLength > 3) { - // truncating and aligning to 4 bytes the long glyph data - glyphDataLength = (glyphDataLength + 3) & ~3; - dest.set(glyf.subarray(0, glyphDataLength), destStart); - return glyphDataLength; - } - // glyph data is fine - dest.set(glyf, destStart); - return glyf.length; - } - - function sanitizeHead(head, numGlyphs, locaLength) { - var data = head.data; - - // Validate version: - // Should always be 0x00010000 - var version = int32(data[0], data[1], data[2], data[3]); - if (version >> 16 !== 1) { - info('Attempting to fix invalid version in head table: ' + version); - data[0] = 0; - data[1] = 1; - data[2] = 0; - data[3] = 0; - } - - var indexToLocFormat = int16(data[50], data[51]); - if (indexToLocFormat < 0 || indexToLocFormat > 1) { - info('Attempting to fix invalid indexToLocFormat in head table: ' + - indexToLocFormat); - - // The value of indexToLocFormat should be 0 if the loca table - // consists of short offsets, and should be 1 if the loca table - // consists of long offsets. - // - // The number of entries in the loca table should be numGlyphs + 1. - // - // Using this information, we can work backwards to deduce if the - // size of each offset in the loca table, and thus figure out the - // appropriate value for indexToLocFormat. - - var numGlyphsPlusOne = numGlyphs + 1; - if (locaLength === numGlyphsPlusOne << 1) { - // 0x0000 indicates the loca table consists of short offsets - data[50] = 0; - data[51] = 0; - } else if (locaLength === numGlyphsPlusOne << 2) { - // 0x0001 indicates the loca table consists of long offsets - data[50] = 0; - data[51] = 1; - } else { - warn('Could not fix indexToLocFormat: ' + indexToLocFormat); - } - } - } - - function sanitizeGlyphLocations(loca, glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, - dupFirstEntry) { - var itemSize, itemDecode, itemEncode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - itemEncode = function fontItemEncodeLong(data, offset, value) { - data[offset] = (value >>> 24) & 0xFF; - data[offset + 1] = (value >> 16) & 0xFF; - data[offset + 2] = (value >> 8) & 0xFF; - data[offset + 3] = value & 0xFF; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - itemEncode = function fontItemEncode(data, offset, value) { - data[offset] = (value >> 9) & 0xFF; - data[offset + 1] = (value >> 1) & 0xFF; - }; - } - var locaData = loca.data; - var locaDataSize = itemSize * (1 + numGlyphs); - // is loca.data too short or long? - if (locaData.length !== locaDataSize) { - locaData = new Uint8Array(locaDataSize); - locaData.set(loca.data.subarray(0, locaDataSize)); - loca.data = locaData; - } - // removing the invalid glyphs - var oldGlyfData = glyf.data; - var oldGlyfDataLength = oldGlyfData.length; - var newGlyfData = new Uint8Array(oldGlyfDataLength); - var startOffset = itemDecode(locaData, 0); - var writeOffset = 0; - var missingGlyphData = Object.create(null); - itemEncode(locaData, 0, writeOffset); - var i, j; - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - var endOffset = itemDecode(locaData, j); - if (endOffset > oldGlyfDataLength && - ((oldGlyfDataLength + 3) & ~3) === endOffset) { - // Aspose breaks fonts by aligning the glyphs to the qword, but not - // the glyf table size, which makes last glyph out of range. - endOffset = oldGlyfDataLength; - } - if (endOffset > oldGlyfDataLength) { - // glyph end offset points outside glyf data, rejecting the glyph - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - continue; - } - - if (startOffset === endOffset) { - missingGlyphData[i] = true; - } - - var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, - newGlyfData, writeOffset, hintsValid); - writeOffset += newLength; - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - } - - if (writeOffset === 0) { - // glyf table cannot be empty -- redoing the glyf and loca tables - // to have single glyph with one point - var simpleGlyph = new Uint8Array( - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - itemEncode(locaData, j, simpleGlyph.length); - } - glyf.data = simpleGlyph; - return missingGlyphData; - } - - if (dupFirstEntry) { - var firstEntryLength = itemDecode(locaData, itemSize); - if (newGlyfData.length > firstEntryLength + writeOffset) { - glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); - } else { - glyf.data = new Uint8Array(firstEntryLength + writeOffset); - glyf.data.set(newGlyfData.subarray(0, writeOffset)); - } - glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); - itemEncode(loca.data, locaData.length - itemSize, - writeOffset + firstEntryLength); - } else { - glyf.data = newGlyfData.subarray(0, writeOffset); - } - return missingGlyphData; - } - - function readPostScriptTable(post, properties, maxpNumGlyphs) { - var start = (font.start ? font.start : 0) + post.offset; - font.pos = start; - - var length = post.length, end = start + length; - var version = font.getInt32(); - // skip rest to the tables - font.getBytes(28); - - var glyphNames; - var valid = true; - var i; - - switch (version) { - case 0x00010000: - glyphNames = MacStandardGlyphOrdering; - break; - case 0x00020000: - var numGlyphs = font.getUint16(); - if (numGlyphs !== maxpNumGlyphs) { - valid = false; - break; - } - var glyphNameIndexes = []; - for (i = 0; i < numGlyphs; ++i) { - var index = font.getUint16(); - if (index >= 32768) { - valid = false; - break; - } - glyphNameIndexes.push(index); - } - if (!valid) { - break; - } - var customNames = []; - var strBuf = []; - while (font.pos < end) { - var stringLength = font.getByte(); - strBuf.length = stringLength; - for (i = 0; i < stringLength; ++i) { - strBuf[i] = String.fromCharCode(font.getByte()); - } - customNames.push(strBuf.join('')); - } - glyphNames = []; - for (i = 0; i < numGlyphs; ++i) { - var j = glyphNameIndexes[i]; - if (j < 258) { - glyphNames.push(MacStandardGlyphOrdering[j]); - continue; - } - glyphNames.push(customNames[j - 258]); - } - break; - case 0x00030000: - break; - default: - warn('Unknown/unsupported post table version ' + version); - valid = false; - if (properties.defaultEncoding) { - glyphNames = properties.defaultEncoding; - } - break; - } - properties.glyphNames = glyphNames; - return valid; - } - - function readNameTable(nameTable) { - var start = (font.start ? font.start : 0) + nameTable.offset; - font.pos = start; - - var names = [[], []]; - var length = nameTable.length, end = start + length; - var format = font.getUint16(); - var FORMAT_0_HEADER_LENGTH = 6; - if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { - // unsupported name table format or table "too" small - return names; - } - var numRecords = font.getUint16(); - var stringsStart = font.getUint16(); - var records = []; - var NAME_RECORD_LENGTH = 12; - var i, ii; - - for (i = 0; i < numRecords && - font.pos + NAME_RECORD_LENGTH <= end; i++) { - var r = { - platform: font.getUint16(), - encoding: font.getUint16(), - language: font.getUint16(), - name: font.getUint16(), - length: font.getUint16(), - offset: font.getUint16() - }; - // using only Macintosh and Windows platform/encoding names - if ((r.platform === 1 && r.encoding === 0 && r.language === 0) || - (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) { - records.push(r); - } - } - for (i = 0, ii = records.length; i < ii; i++) { - var record = records[i]; - if (record.length <= 0) { - continue; // Nothing to process, ignoring. - } - var pos = start + stringsStart + record.offset; - if (pos + record.length > end) { - continue; // outside of name table, ignoring - } - font.pos = pos; - var nameIndex = record.name; - if (record.encoding) { - // unicode - var str = ''; - for (var j = 0, jj = record.length; j < jj; j += 2) { - str += String.fromCharCode(font.getUint16()); - } - names[1][nameIndex] = str; - } else { - names[0][nameIndex] = bytesToString(font.getBytes(record.length)); - } - } - return names; - } - - var TTOpsStackDeltas = [ - 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, - -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, - 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, - 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, - 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, - -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, - -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, - -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; - // 0xC0-DF == -1 and 0xE0-FF == -2 - - function sanitizeTTProgram(table, ttContext) { - var data = table.data; - var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0; - var stack = []; - var callstack = []; - var functionsCalled = []; - var tooComplexToFollowFunctions = - ttContext.tooComplexToFollowFunctions; - var inFDEF = false, ifLevel = 0, inELSE = 0; - for (var ii = data.length; i < ii;) { - var op = data[i++]; - // The TrueType instruction set docs can be found at - // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html - if (op === 0x40) { // NPUSHB - pushes n bytes - n = data[i++]; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if (op === 0x41) { // NPUSHW - pushes n words - n = data[i++]; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes - n = op - 0xB0 + 1; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words - n = op - 0xB8 + 1; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL - if (!inFDEF && !inELSE) { - // collecting inforamtion about which functions are used - funcId = stack[stack.length - 1]; - ttContext.functionsUsed[funcId] = true; - if (funcId in ttContext.functionsStackDeltas) { - stack.length += ttContext.functionsStackDeltas[funcId]; - } else if (funcId in ttContext.functionsDefined && - functionsCalled.indexOf(funcId) < 0) { - callstack.push({data: data, i: i, stackTop: stack.length - 1}); - functionsCalled.push(funcId); - pc = ttContext.functionsDefined[funcId]; - if (!pc) { - warn('TT: CALL non-existent function'); - ttContext.hintsValid = false; - return; - } - data = pc.data; - i = pc.i; - } - } - } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF - if (inFDEF || inELSE) { - warn('TT: nested FDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // collecting inforamtion about which functions are defined - lastDeff = i; - funcId = stack.pop(); - ttContext.functionsDefined[funcId] = {data: data, i: i}; - } else if (op === 0x2D) { // ENDF - end of function - if (inFDEF) { - inFDEF = false; - lastEndf = i; - } else { - pc = callstack.pop(); - if (!pc) { - warn('TT: ENDF bad stack'); - ttContext.hintsValid = false; - return; - } - funcId = functionsCalled.pop(); - data = pc.data; - i = pc.i; - ttContext.functionsStackDeltas[funcId] = - stack.length - pc.stackTop; - } - } else if (op === 0x89) { // IDEF - instruction definition - if (inFDEF || inELSE) { - warn('TT: nested IDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // recording it as a function to track ENDF - lastDeff = i; - } else if (op === 0x58) { // IF - ++ifLevel; - } else if (op === 0x1B) { // ELSE - inELSE = ifLevel; - } else if (op === 0x59) { // EIF - if (inELSE === ifLevel) { - inELSE = 0; - } - --ifLevel; - } else if (op === 0x1C) { // JMPR - if (!inFDEF && !inELSE) { - var offset = stack[stack.length - 1]; - // only jumping forward to prevent infinite loop - if (offset > 0) { - i += offset - 1; - } - } - } - // Adjusting stack not extactly, but just enough to get function id - if (!inFDEF && !inELSE) { - var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : - op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0; - if (op >= 0x71 && op <= 0x75) { - n = stack.pop(); - if (n === n) { - stackDelta = -n * 2; - } - } - while (stackDelta < 0 && stack.length > 0) { - stack.pop(); - stackDelta++; - } - while (stackDelta > 0) { - stack.push(NaN); // pushing any number into stack - stackDelta--; - } - } - } - ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; - var content = [data]; - if (i > data.length) { - content.push(new Uint8Array(i - data.length)); - } - if (lastDeff > lastEndf) { - warn('TT: complementing a missing function tail'); - // new function definition started, but not finished - // complete function by [CLEAR, ENDF] - content.push(new Uint8Array([0x22, 0x2D])); - } - foldTTTable(table, content); - } - - function checkInvalidFunctions(ttContext, maxFunctionDefs) { - if (ttContext.tooComplexToFollowFunctions) { - return; - } - if (ttContext.functionsDefined.length > maxFunctionDefs) { - warn('TT: more functions defined than expected'); - ttContext.hintsValid = false; - return; - } - for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { - if (j > maxFunctionDefs) { - warn('TT: invalid function id: ' + j); - ttContext.hintsValid = false; - return; - } - if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { - warn('TT: undefined function: ' + j); - ttContext.hintsValid = false; - return; - } - } - } - - function foldTTTable(table, content) { - if (content.length > 1) { - // concatenating the content items - var newLength = 0; - var j, jj; - for (j = 0, jj = content.length; j < jj; j++) { - newLength += content[j].length; - } - newLength = (newLength + 3) & ~3; - var result = new Uint8Array(newLength); - var pos = 0; - for (j = 0, jj = content.length; j < jj; j++) { - result.set(content[j], pos); - pos += content[j].length; - } - table.data = result; - table.length = newLength; - } - } - - function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) { - var ttContext = { - functionsDefined: [], - functionsUsed: [], - functionsStackDeltas: [], - tooComplexToFollowFunctions: false, - hintsValid: true - }; - if (fpgm) { - sanitizeTTProgram(fpgm, ttContext); - } - if (prep) { - sanitizeTTProgram(prep, ttContext); - } - if (fpgm) { - checkInvalidFunctions(ttContext, maxFunctionDefs); - } - if (cvt && (cvt.length & 1)) { - var cvtData = new Uint8Array(cvt.length + 1); - cvtData.set(cvt.data); - cvt.data = cvtData; - } - return ttContext.hintsValid; - } - - // The following steps modify the original font data, making copy - font = new Stream(new Uint8Array(font.getBytes())); - - var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', - 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF ']; - - var header = readOpenTypeHeader(font); - var numTables = header.numTables; - var cff, cffFile; - - var tables = Object.create(null); - tables['OS/2'] = null; - tables['cmap'] = null; - tables['head'] = null; - tables['hhea'] = null; - tables['hmtx'] = null; - tables['maxp'] = null; - tables['name'] = null; - tables['post'] = null; - - var table; - for (var i = 0; i < numTables; i++) { - table = readTableEntry(font); - if (VALID_TABLES.indexOf(table.tag) < 0) { - continue; // skipping table if it's not a required or optional table - } - if (table.length === 0) { - continue; // skipping empty tables - } - tables[table.tag] = table; - } - - var isTrueType = !tables['CFF ']; - if (!isTrueType) { - // OpenType font - if ((header.version === 'OTTO' && properties.type !== 'CIDFontType2') || - !tables['head'] || !tables['hhea'] || !tables['maxp'] || - !tables['post']) { - // no major tables: throwing everything at CFFFont - cffFile = new Stream(tables['CFF '].data); - cff = new CFFFont(cffFile, properties); - - adjustWidths(properties); - - return this.convert(name, cff, properties); - } - - delete tables['glyf']; - delete tables['loca']; - delete tables['fpgm']; - delete tables['prep']; - delete tables['cvt ']; - this.isOpenType = true; - } else { - if (!tables['loca']) { - error('Required "loca" table is not found'); - } - if (!tables['glyf']) { - warn('Required "glyf" table is not found -- trying to recover.'); - // Note: We use `sanitizeGlyphLocations` to add dummy glyf data below. - tables['glyf'] = { - tag: 'glyf', - data: new Uint8Array(0), - }; - } - this.isOpenType = false; - } - - if (!tables['maxp']) { - error('Required "maxp" table is not found'); - } - - font.pos = (font.start || 0) + tables['maxp'].offset; - var version = font.getInt32(); - var numGlyphs = font.getUint16(); - var maxFunctionDefs = 0; - if (version >= 0x00010000 && tables['maxp'].length >= 22) { - // maxZones can be invalid - font.pos += 8; - var maxZones = font.getUint16(); - if (maxZones > 2) { // reset to 2 if font has invalid maxZones - tables['maxp'].data[14] = 0; - tables['maxp'].data[15] = 2; - } - font.pos += 4; - maxFunctionDefs = font.getUint16(); - } - - var dupFirstEntry = false; - if (properties.type === 'CIDFontType2' && properties.toUnicode && - properties.toUnicode.get(0) > '\u0000') { - // oracle's defect (see 3427), duplicating first entry - dupFirstEntry = true; - numGlyphs++; - tables['maxp'].data[4] = numGlyphs >> 8; - tables['maxp'].data[5] = numGlyphs & 255; - } - - var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], - tables['cvt '], maxFunctionDefs); - if (!hintsValid) { - delete tables['fpgm']; - delete tables['prep']; - delete tables['cvt ']; - } - - // Ensure the hmtx table contains the advance width and - // sidebearings information for numGlyphs in the maxp table - sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphs); - - if (!tables['head']) { - error('Required "head" table is not found'); - } - - sanitizeHead(tables['head'], numGlyphs, - isTrueType ? tables['loca'].length : 0); - - var missingGlyphs = Object.create(null); - if (isTrueType) { - var isGlyphLocationsLong = int16(tables['head'].data[50], - tables['head'].data[51]); - missingGlyphs = sanitizeGlyphLocations(tables['loca'], tables['glyf'], - numGlyphs, isGlyphLocationsLong, - hintsValid, dupFirstEntry); - } - - if (!tables['hhea']) { - error('Required "hhea" table is not found'); - } - - // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth - // Sometimes it's 0. That needs to be fixed - if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) { - tables['hhea'].data[10] = 0xFF; - tables['hhea'].data[11] = 0xFF; - } - - // Extract some more font properties from the OpenType head and - // hhea tables; yMin and descent value are always negative. - var metricsOverride = { - unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]), - yMax: int16(tables['head'].data[42], tables['head'].data[43]), - yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]), - ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]), - descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7]) - }; - - // PDF FontDescriptor metrics lie -- using data from actual font. - this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; - this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; - - // The 'post' table has glyphs names. - if (tables['post']) { - var valid = readPostScriptTable(tables['post'], properties, numGlyphs); - if (!valid) { - tables['post'] = null; - } - } - - var charCodeToGlyphId = [], charCode; - var toUnicode = properties.toUnicode, widths = properties.widths; - var skipToUnicode = (toUnicode instanceof IdentityToUnicodeMap || - toUnicode.length === 0x10000); - - // Helper function to try to skip mapping of empty glyphs. - // Note: In some cases, just relying on the glyph data doesn't work, - // hence we also use a few heuristics to fix various PDF files. - function hasGlyph(glyphId, charCode, widthCode) { - if (!missingGlyphs[glyphId]) { - return true; - } - if (!skipToUnicode && charCode >= 0 && toUnicode.has(charCode)) { - return true; - } - if (widths && widthCode >= 0 && isNum(widths[widthCode])) { - return true; - } - return false; - } - - if (properties.type === 'CIDFontType2') { - var cidToGidMap = properties.cidToGidMap || []; - var isCidToGidMapEmpty = cidToGidMap.length === 0; - - properties.cMap.forEach(function(charCode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - var glyphId = -1; - if (isCidToGidMapEmpty) { - glyphId = cid; - } else if (cidToGidMap[cid] !== undefined) { - glyphId = cidToGidMap[cid]; - } - - if (glyphId >= 0 && glyphId < numGlyphs && - hasGlyph(glyphId, charCode, cid)) { - charCodeToGlyphId[charCode] = glyphId; - } - }); - if (dupFirstEntry && (isCidToGidMapEmpty || !charCodeToGlyphId[0])) { - // We don't duplicate the first entry in the `charCodeToGlyphId` map - // if the font has a `CIDToGIDMap` which has already mapped the first - // entry to a non-zero `glyphId` (fixes issue7544.pdf). - charCodeToGlyphId[0] = numGlyphs - 1; - } - } else { - // Most of the following logic in this code branch is based on the - // 9.6.6.4 of the PDF spec. - var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, - properties.hasEncoding); - var cmapPlatformId = cmapTable.platformId; - var cmapEncodingId = cmapTable.encodingId; - var cmapMappings = cmapTable.mappings; - var cmapMappingsLength = cmapMappings.length; - - // The spec seems to imply that if the font is symbolic the encoding - // should be ignored, this doesn't appear to work for 'preistabelle.pdf' - // where the the font is symbolic and it has an encoding. - if (properties.hasEncoding && - (cmapPlatformId === 3 && cmapEncodingId === 1 || - cmapPlatformId === 1 && cmapEncodingId === 0) || - (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack - !!getEncoding(properties.baseEncodingName))) { // Temporary hack - // When no preferred cmap table was found and |baseEncodingName| is - // one of the predefined encodings, we seem to obtain a better - // |charCodeToGlyphId| map from the code below (fixes bug 1057544). - // TODO: Note that this is a hack which should be removed as soon as - // we have proper support for more exotic cmap tables. - - var baseEncoding = []; - if (properties.baseEncodingName === 'MacRomanEncoding' || - properties.baseEncodingName === 'WinAnsiEncoding') { - baseEncoding = getEncoding(properties.baseEncodingName); - } - var glyphsUnicodeMap = getGlyphsUnicode(); - for (charCode = 0; charCode < 256; charCode++) { - var glyphName, standardGlyphName; - if (this.differences && charCode in this.differences) { - glyphName = this.differences[charCode]; - } else if (charCode in baseEncoding && - baseEncoding[charCode] !== '') { - glyphName = baseEncoding[charCode]; - } else { - glyphName = StandardEncoding[charCode]; - } - if (!glyphName) { - continue; - } - // Ensure that non-standard glyph names are resolved to valid ones. - standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); - - var unicodeOrCharCode, isUnicode = false; - if (cmapPlatformId === 3 && cmapEncodingId === 1) { - unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName]; - isUnicode = true; - } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { - // TODO: the encoding needs to be updated with mac os table. - unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName); - } - - var found = false; - for (i = 0; i < cmapMappingsLength; ++i) { - if (cmapMappings[i].charCode !== unicodeOrCharCode) { - continue; - } - var code = isUnicode ? charCode : unicodeOrCharCode; - if (hasGlyph(cmapMappings[i].glyphId, code, -1)) { - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - found = true; - break; - } - } - if (!found && properties.glyphNames) { - // Try to map using the post table. - var glyphId = properties.glyphNames.indexOf(glyphName); - // The post table ought to use the same kind of glyph names as the - // `differences` array, but check the standard ones as a fallback. - if (glyphId === -1 && standardGlyphName !== glyphName) { - glyphId = properties.glyphNames.indexOf(standardGlyphName); - } - if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) { - charCodeToGlyphId[charCode] = glyphId; - found = true; - } - } - if (!found) { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } else if (cmapPlatformId === 0 && cmapEncodingId === 0) { - // Default Unicode semantics, use the charcodes as is. - for (i = 0; i < cmapMappingsLength; ++i) { - charCodeToGlyphId[cmapMappings[i].charCode] = - cmapMappings[i].glyphId; - } - } else { - // For (3, 0) cmap tables: - // The charcode key being stored in charCodeToGlyphId is the lower - // byte of the two-byte charcodes of the cmap table since according to - // the spec: 'each byte from the string shall be prepended with the - // high byte of the range [of charcodes in the cmap table], to form - // a two-byte character, which shall be used to select the - // associated glyph description from the subtable'. - // - // For (1, 0) cmap tables: - // 'single bytes from the string shall be used to look up the - // associated glyph descriptions from the subtable'. This means - // charcodes in the cmap will be single bytes, so no-op since - // glyph.charCode & 0xFF === glyph.charCode - for (i = 0; i < cmapMappingsLength; ++i) { - charCode = cmapMappings[i].charCode & 0xFF; - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - } - } - } - - if (charCodeToGlyphId.length === 0) { - // defines at least one glyph - charCodeToGlyphId[0] = 0; - } - - // Converting glyphs and ids into font's cmap table - var newMapping = adjustMapping(charCodeToGlyphId, properties); - this.toFontChar = newMapping.toFontChar; - tables['cmap'] = { - tag: 'cmap', - data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs) - }; - - if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { - tables['OS/2'] = { - tag: 'OS/2', - data: createOS2Table(properties, newMapping.charCodeToGlyphId, - metricsOverride) - }; - } - - // Rewrite the 'post' table if needed - if (!tables['post']) { - tables['post'] = { - tag: 'post', - data: createPostTable(properties) - }; - } - - if (!isTrueType) { - try { - // Trying to repair CFF file - cffFile = new Stream(tables['CFF '].data); - var parser = new CFFParser(cffFile, properties, - SEAC_ANALYSIS_ENABLED); - cff = parser.parse(); - var compiler = new CFFCompiler(cff); - tables['CFF '].data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - } - } - - // Re-creating 'name' table - if (!tables['name']) { - tables['name'] = { - tag: 'name', - data: createNameTable(this.name) - }; - } else { - // ... using existing 'name' table as prototype - var namePrototype = readNameTable(tables['name']); - tables['name'].data = createNameTable(name, namePrototype); - } - - var builder = new OpenTypeFileBuilder(header.version); - for (var tableTag in tables) { - builder.addTable(tableTag, tables[tableTag].data); - } - return builder.toArray(); - }, - - convert: function Font_convert(fontName, font, properties) { - // TODO: Check the charstring widths to determine this. - properties.fixedPitch = false; - - if (properties.builtInEncoding) { - // For Type1 fonts that do not include either `ToUnicode` or `Encoding` - // data, attempt to use the `builtInEncoding` to improve text selection. - adjustToUnicode(properties, properties.builtInEncoding); - } - - var mapping = font.getGlyphMapping(properties); - var newMapping = adjustMapping(mapping, properties); - this.toFontChar = newMapping.toFontChar; - var numGlyphs = font.numGlyphs; - - function getCharCodes(charCodeToGlyphId, glyphId) { - var charCodes = null; - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - if (!charCodes) { - charCodes = []; - } - charCodes.push(charCode | 0); - } - } - return charCodes; - } - - function createCharCode(charCodeToGlyphId, glyphId) { - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - return charCode | 0; - } - } - newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = - glyphId; - return newMapping.nextAvailableFontCharCode++; - } - - var seacs = font.seacs; - if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { - var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; - var charset = font.getCharset(); - var seacMap = Object.create(null); - for (var glyphId in seacs) { - glyphId |= 0; - var seac = seacs[glyphId]; - var baseGlyphName = StandardEncoding[seac[2]]; - var accentGlyphName = StandardEncoding[seac[3]]; - var baseGlyphId = charset.indexOf(baseGlyphName); - var accentGlyphId = charset.indexOf(accentGlyphName); - if (baseGlyphId < 0 || accentGlyphId < 0) { - continue; - } - var accentOffset = { - x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], - y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] - }; - - var charCodes = getCharCodes(mapping, glyphId); - if (!charCodes) { - // There's no point in mapping it if the char code was never mapped - // to begin with. - continue; - } - for (var i = 0, ii = charCodes.length; i < ii; i++) { - var charCode = charCodes[i]; - // Find a fontCharCode that maps to the base and accent glyphs. - // If one doesn't exists, create it. - var charCodeToGlyphId = newMapping.charCodeToGlyphId; - var baseFontCharCode = createCharCode(charCodeToGlyphId, - baseGlyphId); - var accentFontCharCode = createCharCode(charCodeToGlyphId, - accentGlyphId); - seacMap[charCode] = { - baseFontCharCode: baseFontCharCode, - accentFontCharCode: accentFontCharCode, - accentOffset: accentOffset - }; - } - } - properties.seacMap = seacMap; - } - - var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; - - var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F'); - // PostScript Font Program - builder.addTable('CFF ', font.data); - // OS/2 and Windows Specific metrics - builder.addTable('OS/2', createOS2Table(properties, - newMapping.charCodeToGlyphId)); - // Character to glyphs mapping - builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, - numGlyphs)); - // Font header - builder.addTable('head', - '\x00\x01\x00\x00' + // Version number - '\x00\x00\x10\x00' + // fontRevision - '\x00\x00\x00\x00' + // checksumAdjustement - '\x5F\x0F\x3C\xF5' + // magicNumber - '\x00\x00' + // Flags - safeString16(unitsPerEm) + // unitsPerEM - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date - '\x00\x00' + // xMin - safeString16(properties.descent) + // yMin - '\x0F\xFF' + // xMax - safeString16(properties.ascent) + // yMax - string16(properties.italicAngle ? 2 : 0) + // macStyle - '\x00\x11' + // lowestRecPPEM - '\x00\x00' + // fontDirectionHint - '\x00\x00' + // indexToLocFormat - '\x00\x00'); // glyphDataFormat - - // Horizontal header - builder.addTable('hhea', - '\x00\x01\x00\x00' + // Version number - safeString16(properties.ascent) + // Typographic Ascent - safeString16(properties.descent) + // Typographic Descent - '\x00\x00' + // Line Gap - '\xFF\xFF' + // advanceWidthMax - '\x00\x00' + // minLeftSidebearing - '\x00\x00' + // minRightSidebearing - '\x00\x00' + // xMaxExtent - safeString16(properties.capHeight) + // caretSlopeRise - safeString16(Math.tan(properties.italicAngle) * - properties.xHeight) + // caretSlopeRun - '\x00\x00' + // caretOffset - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // metricDataFormat - string16(numGlyphs)); // Number of HMetrics - - // Horizontal metrics - builder.addTable('hmtx', (function fontFieldsHmtx() { - var charstrings = font.charstrings; - var cffWidths = font.cff ? font.cff.widths : null; - var hmtx = '\x00\x00\x00\x00'; // Fake .notdef - for (var i = 1, ii = numGlyphs; i < ii; i++) { - var width = 0; - if (charstrings) { - var charstring = charstrings[i - 1]; - width = 'width' in charstring ? charstring.width : 0; - } else if (cffWidths) { - width = Math.ceil(cffWidths[i] || 0); - } - hmtx += string16(width) + string16(0); - } - return hmtx; - })()); - - // Maximum profile - builder.addTable('maxp', - '\x00\x00\x50\x00' + // Version number - string16(numGlyphs)); // Num of glyphs - - // Naming tables - builder.addTable('name', createNameTable(fontName)); - - // PostScript information - builder.addTable('post', createPostTable(properties)); - - return builder.toArray(); - }, - - get spaceWidth() { - if ('_shadowWidth' in this) { - return this._shadowWidth; - } - - // trying to estimate space character width - var possibleSpaceReplacements = ['space', 'minus', 'one', 'i', 'I']; - var width; - for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { - var glyphName = possibleSpaceReplacements[i]; - // if possible, getting width by glyph name - if (glyphName in this.widths) { - width = this.widths[glyphName]; - break; - } - var glyphsUnicodeMap = getGlyphsUnicode(); - var glyphUnicode = glyphsUnicodeMap[glyphName]; - // finding the charcode via unicodeToCID map - var charcode = 0; - if (this.composite) { - if (this.cMap.contains(glyphUnicode)) { - charcode = this.cMap.lookup(glyphUnicode); - } - } - // ... via toUnicode map - if (!charcode && this.toUnicode) { - charcode = this.toUnicode.charCodeOf(glyphUnicode); - } - // setting it to unicode if negative or undefined - if (charcode <= 0) { - charcode = glyphUnicode; - } - // trying to get width via charcode - width = this.widths[charcode]; - if (width) { - break; // the non-zero width found - } - } - width = width || this.defaultWidth; - // Do not shadow the property here. See discussion: - // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280 - this._shadowWidth = width; - return width; - }, - - charToGlyph: function Font_charToGlyph(charcode, isSpace) { - var fontCharCode, width, operatorListId; - - var widthCode = charcode; - if (this.cMap && this.cMap.contains(charcode)) { - widthCode = this.cMap.lookup(charcode); - } - width = this.widths[widthCode]; - width = isNum(width) ? width : this.defaultWidth; - var vmetric = this.vmetrics && this.vmetrics[widthCode]; - - var unicode = this.toUnicode.get(charcode) || charcode; - if (typeof unicode === 'number') { - unicode = String.fromCharCode(unicode); - } - - var isInFont = charcode in this.toFontChar; - // First try the toFontChar map, if it's not there then try falling - // back to the char code. - fontCharCode = this.toFontChar[charcode] || charcode; - if (this.missingFile) { - fontCharCode = mapSpecialUnicodeValues(fontCharCode); - } - - if (this.isType3Font) { - // Font char code in this case is actually a glyph name. - operatorListId = fontCharCode; - } - - var accent = null; - if (this.seacMap && this.seacMap[charcode]) { - isInFont = true; - var seac = this.seacMap[charcode]; - fontCharCode = seac.baseFontCharCode; - accent = { - fontChar: String.fromCharCode(seac.accentFontCharCode), - offset: seac.accentOffset - }; - } - - var fontChar = String.fromCharCode(fontCharCode); - - var glyph = this.glyphCache[charcode]; - if (!glyph || - !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace, isInFont)) { - glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace, isInFont); - this.glyphCache[charcode] = glyph; - } - return glyph; - }, - - charsToGlyphs: function Font_charsToGlyphs(chars) { - var charsCache = this.charsCache; - var glyphs, glyph, charcode; - - // if we translated this string before, just grab it from the cache - if (charsCache) { - glyphs = charsCache[chars]; - if (glyphs) { - return glyphs; - } - } - - // lazily create the translation cache - if (!charsCache) { - charsCache = this.charsCache = Object.create(null); - } - - glyphs = []; - var charsCacheKey = chars; - var i = 0, ii; - - if (this.cMap) { - // composite fonts have multi-byte strings convert the string from - // single-byte to multi-byte - var c = Object.create(null); - while (i < chars.length) { - this.cMap.readCharCode(chars, i, c); - charcode = c.charcode; - var length = c.length; - i += length; - // Space is char with code 0x20 and length 1 in multiple-byte codes. - var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; - glyph = this.charToGlyph(charcode, isSpace); - glyphs.push(glyph); - } - } else { - for (i = 0, ii = chars.length; i < ii; ++i) { - charcode = chars.charCodeAt(i); - glyph = this.charToGlyph(charcode, charcode === 0x20); - glyphs.push(glyph); - } - } - - // Enter the translated string into the cache - return (charsCache[charsCacheKey] = glyphs); - } - }; - - return Font; -})(); - -var ErrorFont = (function ErrorFontClosure() { - function ErrorFont(error) { - this.error = error; - this.loadedName = 'g_font_error'; - this.loading = false; - } - - ErrorFont.prototype = { - charsToGlyphs: function ErrorFont_charsToGlyphs() { - return []; - }, - exportData: function ErrorFont_exportData() { - return {error: this.error}; - } - }; - - return ErrorFont; -})(); - -/** - * Shared logic for building a char code to glyph id mapping for Type1 and - * simple CFF fonts. See section 9.6.6.2 of the spec. - * @param {Object} properties Font properties object. - * @param {Object} builtInEncoding The encoding contained within the actual font - * data. - * @param {Array} glyphNames Array of glyph names where the index is the - * glyph ID. - * @returns {Object} A char code to glyph ID map. - */ -function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { - var charCodeToGlyphId = Object.create(null); - var glyphId, charCode, baseEncoding; - - if (properties.baseEncodingName) { - // If a valid base encoding name was used, the mapping is initialized with - // that. - baseEncoding = getEncoding(properties.baseEncodingName); - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } else if (!!(properties.flags & FontFlags.Symbolic)) { - // For a symbolic font the encoding should be the fonts built-in - // encoding. - for (charCode in builtInEncoding) { - charCodeToGlyphId[charCode] = builtInEncoding[charCode]; - } - } else { - // For non-symbolic fonts that don't have a base encoding the standard - // encoding should be used. - baseEncoding = StandardEncoding; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - - // Lastly, merge in the differences. - var differences = properties.differences, glyphsUnicodeMap; - if (differences) { - for (charCode in differences) { - var glyphName = differences[charCode]; - glyphId = glyphNames.indexOf(glyphName); - - if (glyphId === -1) { - if (!glyphsUnicodeMap) { - glyphsUnicodeMap = getGlyphsUnicode(); - } - var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap); - if (standardGlyphName !== glyphName) { - glyphId = glyphNames.indexOf(standardGlyphName); - } - } - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - return charCodeToGlyphId; -} - -// Type1Font is also a CIDFontType0. -var Type1Font = (function Type1FontClosure() { - function findBlock(streamBytes, signature, startIndex) { - var streamBytesLength = streamBytes.length; - var signatureLength = signature.length; - var scanLength = streamBytesLength - signatureLength; - - var i = startIndex, j, found = false; - while (i < scanLength) { - j = 0; - while (j < signatureLength && streamBytes[i + j] === signature[j]) { - j++; - } - if (j >= signatureLength) { // `signature` found, skip over whitespace. - i += j; - while (i < streamBytesLength && isSpace(streamBytes[i])) { - i++; - } - found = true; - break; - } - i++; - } - return { - found: found, - length: i, - }; - } - - function getHeaderBlock(stream, suggestedLength) { - var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63]; - - var streamStartPos = stream.pos; // Save the initial stream position. - var headerBytes, headerBytesLength, block; - try { - headerBytes = stream.getBytes(suggestedLength); - headerBytesLength = headerBytes.length; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - // Ignore errors if the `suggestedLength` is huge enough that a Uint8Array - // cannot hold the result of `getBytes`, and fallback to simply checking - // the entire stream (fixes issue3928.pdf). - } - - if (headerBytesLength === suggestedLength) { - // Most of the time `suggestedLength` is correct, so to speed things up we - // initially only check the last few bytes to see if the header was found. - // Otherwise we (potentially) check the entire stream to prevent errors in - // `Type1Parser` (fixes issue5686.pdf). - block = findBlock(headerBytes, EEXEC_SIGNATURE, - suggestedLength - 2 * EEXEC_SIGNATURE.length); - - if (block.found && block.length === suggestedLength) { - return { - stream: new Stream(headerBytes), - length: suggestedLength, - }; - } - } - warn('Invalid "Length1" property in Type1 font -- trying to recover.'); - stream.pos = streamStartPos; // Reset the stream position. - - var SCAN_BLOCK_LENGTH = 2048; - var actualLength; - while (true) { - var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH); - block = findBlock(scanBytes, EEXEC_SIGNATURE, 0); - - if (block.length === 0) { - break; - } - stream.pos += block.length; // Update the stream position. - - if (block.found) { - actualLength = stream.pos - streamStartPos; - break; - } - } - stream.pos = streamStartPos; // Reset the stream position. - - if (actualLength) { - return { - stream: new Stream(stream.getBytes(actualLength)), - length: actualLength, - }; - } - warn('Unable to recover "Length1" property in Type1 font -- using as is.'); - return { - stream: new Stream(stream.getBytes(suggestedLength)), - length: suggestedLength, - }; - } - - function getEexecBlock(stream, suggestedLength) { - // We should ideally parse the eexec block to ensure that `suggestedLength` - // is correct, so we don't truncate the block data if it's too small. - // However, this would also require checking if the fixed-content portion - // exists (using the 'Length3' property), and ensuring that it's valid. - // - // Given that `suggestedLength` almost always is correct, all the validation - // would require a great deal of unnecessary parsing for most fonts. - // To save time, we always fetch the entire stream instead, which also avoid - // issues if `suggestedLength` is huge (see comment in `getHeaderBlock`). - // - // NOTE: This means that the function can include the fixed-content portion - // in the returned eexec block. In practice this does *not* seem to matter, - // since `Type1Parser_extractFontProgram` will skip over any non-commands. - var eexecBytes = stream.getBytes(); - return { - stream: new Stream(eexecBytes), - length: eexecBytes.length, - }; - } - - function Type1Font(name, file, properties) { - // Some bad generators embed pfb file as is, we have to strip 6-byte header. - // Also, length1 and length2 might be off by 6 bytes as well. - // http://www.math.ubc.ca/~cass/piscript/type1.pdf - var PFB_HEADER_SIZE = 6; - var headerBlockLength = properties.length1; - var eexecBlockLength = properties.length2; - var pfbHeader = file.peekBytes(PFB_HEADER_SIZE); - var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; - if (pfbHeaderPresent) { - file.skip(PFB_HEADER_SIZE); - headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Get the data block containing glyphs and subrs information - var headerBlock = getHeaderBlock(file, headerBlockLength); - headerBlockLength = headerBlock.length; - var headerBlockParser = new Type1Parser(headerBlock.stream, false, - SEAC_ANALYSIS_ENABLED); - headerBlockParser.extractFontHeader(properties); - - if (pfbHeaderPresent) { - pfbHeader = file.getBytes(PFB_HEADER_SIZE); - eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Decrypt the data blocks and retrieve it's content - var eexecBlock = getEexecBlock(file, eexecBlockLength); - eexecBlockLength = eexecBlock.length; - var eexecBlockParser = new Type1Parser(eexecBlock.stream, true, - SEAC_ANALYSIS_ENABLED); - var data = eexecBlockParser.extractFontProgram(); - for (var info in data.properties) { - properties[info] = data.properties[info]; - } - - var charstrings = data.charstrings; - var type2Charstrings = this.getType2Charstrings(charstrings); - var subrs = this.getType2Subrs(data.subrs); - - this.charstrings = charstrings; - this.data = this.wrap(name, type2Charstrings, this.charstrings, - subrs, properties); - this.seacs = this.getSeacs(data.charstrings); - } - - Type1Font.prototype = { - get numGlyphs() { - return this.charstrings.length + 1; - }, - - getCharset: function Type1Font_getCharset() { - var charset = ['.notdef']; - var charstrings = this.charstrings; - for (var glyphId = 0; glyphId < charstrings.length; glyphId++) { - charset.push(charstrings[glyphId].glyphName); - } - return charset; - }, - - getGlyphMapping: function Type1Font_getGlyphMapping(properties) { - var charstrings = this.charstrings; - var glyphNames = ['.notdef'], glyphId; - for (glyphId = 0; glyphId < charstrings.length; glyphId++) { - glyphNames.push(charstrings[glyphId].glyphName); - } - var encoding = properties.builtInEncoding; - if (encoding) { - var builtInEncoding = Object.create(null); - for (var charCode in encoding) { - glyphId = glyphNames.indexOf(encoding[charCode]); - if (glyphId >= 0) { - builtInEncoding[charCode] = glyphId; - } - } - } - - return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); - }, - - getSeacs: function Type1Font_getSeacs(charstrings) { - var i, ii; - var seacMap = []; - for (i = 0, ii = charstrings.length; i < ii; i++) { - var charstring = charstrings[i]; - if (charstring.seac) { - // Offset by 1 for .notdef - seacMap[i + 1] = charstring.seac; - } - } - return seacMap; - }, - - getType2Charstrings: function Type1Font_getType2Charstrings( - type1Charstrings) { - var type2Charstrings = []; - for (var i = 0, ii = type1Charstrings.length; i < ii; i++) { - type2Charstrings.push(type1Charstrings[i].charstring); - } - return type2Charstrings; - }, - - getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { - var bias = 0; - var count = type1Subrs.length; - if (count < 1133) { - bias = 107; - } else if (count < 33769) { - bias = 1131; - } else { - bias = 32768; - } - - // Add a bunch of empty subrs to deal with the Type2 bias - var type2Subrs = []; - var i; - for (i = 0; i < bias; i++) { - type2Subrs.push([0x0B]); - } - - for (i = 0; i < count; i++) { - type2Subrs.push(type1Subrs[i]); - } - - return type2Subrs; - }, - - wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, - properties) { - var cff = new CFF(); - cff.header = new CFFHeader(1, 0, 4, 4); - - cff.names = [name]; - - var topDict = new CFFTopDict(); - // CFF strings IDs 0...390 are predefined names, so refering - // to entries in our own String INDEX starts at SID 391. - topDict.setByName('version', 391); - topDict.setByName('Notice', 392); - topDict.setByName('FullName', 393); - topDict.setByName('FamilyName', 394); - topDict.setByName('Weight', 395); - topDict.setByName('Encoding', null); // placeholder - topDict.setByName('FontMatrix', properties.fontMatrix); - topDict.setByName('FontBBox', properties.bbox); - topDict.setByName('charset', null); // placeholder - topDict.setByName('CharStrings', null); // placeholder - topDict.setByName('Private', null); // placeholder - cff.topDict = topDict; - - var strings = new CFFStrings(); - strings.add('Version 0.11'); // Version - strings.add('See original notice'); // Notice - strings.add(name); // FullName - strings.add(name); // FamilyName - strings.add('Medium'); // Weight - cff.strings = strings; - - cff.globalSubrIndex = new CFFIndex(); - - var count = glyphs.length; - var charsetArray = [0]; - var i, ii; - for (i = 0; i < count; i++) { - var index = CFFStandardStrings.indexOf(charstrings[i].glyphName); - // TODO: Insert the string and correctly map it. Previously it was - // thought mapping names that aren't in the standard strings to .notdef - // was fine, however in issue818 when mapping them all to .notdef the - // adieresis glyph no longer worked. - if (index === -1) { - index = 0; - } - charsetArray.push((index >> 8) & 0xff, index & 0xff); - } - cff.charset = new CFFCharset(false, 0, [], charsetArray); - - var charStringsIndex = new CFFIndex(); - charStringsIndex.add([0x8B, 0x0E]); // .notdef - for (i = 0; i < count; i++) { - var glyph = glyphs[i]; - // If the CharString outline is empty, replace it with .notdef to - // prevent OTS from rejecting the font (fixes bug1252420.pdf). - if (glyph.length === 0) { - charStringsIndex.add([0x8B, 0x0E]); // .notdef - continue; - } - charStringsIndex.add(glyph); - } - cff.charStrings = charStringsIndex; - - var privateDict = new CFFPrivateDict(); - privateDict.setByName('Subrs', null); // placeholder - var fields = [ - 'BlueValues', - 'OtherBlues', - 'FamilyBlues', - 'FamilyOtherBlues', - 'StemSnapH', - 'StemSnapV', - 'BlueShift', - 'BlueFuzz', - 'BlueScale', - 'LanguageGroup', - 'ExpansionFactor', - 'ForceBold', - 'StdHW', - 'StdVW' - ]; - for (i = 0, ii = fields.length; i < ii; i++) { - var field = fields[i]; - if (!(field in properties.privateData)) { - continue; - } - var value = properties.privateData[field]; - if (isArray(value)) { - // All of the private dictionary array data in CFF must be stored as - // "delta-encoded" numbers. - for (var j = value.length - 1; j > 0; j--) { - value[j] -= value[j - 1]; // ... difference from previous value - } - } - privateDict.setByName(field, value); - } - cff.topDict.privateDict = privateDict; - - var subrIndex = new CFFIndex(); - for (i = 0, ii = subrs.length; i < ii; i++) { - subrIndex.add(subrs[i]); - } - privateDict.subrsIndex = subrIndex; - - var compiler = new CFFCompiler(cff); - return compiler.compile(); - } - }; - - return Type1Font; -})(); - -var CFFFont = (function CFFFontClosure() { - function CFFFont(file, properties) { - this.properties = properties; - - var parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED); - this.cff = parser.parse(); - var compiler = new CFFCompiler(this.cff); - this.seacs = this.cff.seacs; - try { - this.data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - // There may have just been an issue with the compiler, set the data - // anyway and hope the font loaded. - this.data = file; - } - } - - CFFFont.prototype = { - get numGlyphs() { - return this.cff.charStrings.count; - }, - getCharset: function CFFFont_getCharset() { - return this.cff.charset.charset; - }, - getGlyphMapping: function CFFFont_getGlyphMapping() { - var cff = this.cff; - var properties = this.properties; - var charsets = cff.charset.charset; - var charCodeToGlyphId; - var glyphId; - - if (properties.composite) { - charCodeToGlyphId = Object.create(null); - if (cff.isCIDFont) { - // If the font is actually a CID font then we should use the charset - // to map CIDs to GIDs. - for (glyphId = 0; glyphId < charsets.length; glyphId++) { - var cid = charsets[glyphId]; - var charCode = properties.cMap.charCodeOf(cid); - charCodeToGlyphId[charCode] = glyphId; - } - } else { - // If it is NOT actually a CID font then CIDs should be mapped - // directly to GIDs. - for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { - charCodeToGlyphId[glyphId] = glyphId; - } - } - return charCodeToGlyphId; - } - - var encoding = cff.encoding ? cff.encoding.encoding : null; - charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); - return charCodeToGlyphId; - } - }; - - return CFFFont; -})(); - -// Workaround for seac on Windows. -(function checkSeacSupport() { - if (typeof navigator !== 'undefined' && /Windows/.test(navigator.userAgent)) { - SEAC_ANALYSIS_ENABLED = true; - } -})(); - -// Workaround for Private Use Area characters in Chrome on Windows -// http://code.google.com/p/chromium/issues/detail?id=122465 -// https://github.com/mozilla/pdf.js/issues/1689 -(function checkChromeWindows() { - if (typeof navigator !== 'undefined' && - /Windows.*Chrome/.test(navigator.userAgent)) { - SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true; - } -})(); - -exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED; -exports.ErrorFont = ErrorFont; -exports.Font = Font; -exports.FontFlags = FontFlags; -exports.IdentityToUnicodeMap = IdentityToUnicodeMap; -exports.ToUnicodeMap = ToUnicodeMap; -exports.getFontType = getFontType; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePsParser = {}), root.pdfjsSharedUtil, - root.pdfjsCoreParser); - } -}(this, function (exports, sharedUtil, coreParser) { - -var error = sharedUtil.error; -var isSpace = sharedUtil.isSpace; -var EOF = coreParser.EOF; - -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 = Object.create(null); - - 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(); - - this.strBuf = []; - } - PostScriptLexer.prototype = { - nextChar: function PostScriptLexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - getToken: function PostScriptLexer_getToken() { - 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 (!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 strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z' - ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) { - strBuf.push(String.fromCharCode(ch)); - } - var str = strBuf.join(''); - 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 strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0) { - if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9' - ch === 0x2D || ch === 0x2E) { // '-', '.' - strBuf.push(String.fromCharCode(ch)); - } else { - break; - } - } - var value = parseFloat(strBuf.join('')); - if (isNaN(value)) { - error('Invalid floating point number: ' + value); - } - return value; - } - }; - return PostScriptLexer; -})(); - -exports.PostScriptLexer = PostScriptLexer; -exports.PostScriptParser = PostScriptParser; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreFunction = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCorePsParser); - } -}(this, function (exports, sharedUtil, corePrimitives, corePsParser) { - -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isBool = sharedUtil.isBool; -var isDict = corePrimitives.isDict; -var isStream = corePrimitives.isStream; -var PostScriptLexer = corePsParser.PostScriptLexer; -var PostScriptParser = corePsParser.PostScriptParser; - -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 i, ii; - var length = 1; - for (i = 0, ii = size.length; i < ii; i++) { - length *= size[i]; - } - length *= outputSize; - - var array = new Array(length); - 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 (i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array[i] = (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); - }, - - parseArray: function PDFFunction_parseArray(xref, fnObj) { - if (!isArray(fnObj)) { - // not an array -- parsing as regular function - return this.parse(xref, fnObj); - } - - var fnArray = []; - for (var j = 0, jj = fnObj.length; j < jj; j++) { - var obj = xref.fetchIfRef(fnObj[j]); - fnArray.push(PDFFunction.parse(xref, obj)); - } - return function (src, srcOffset, dest, destOffset) { - for (var i = 0, ii = fnArray.length; i < ii; i++) { - fnArray[i](src, srcOffset, dest, destOffset + i); - } - }; - }, - - constructSampled: function PDFFunction_constructSampled(str, dict) { - function toMultiArray(arr) { - var inputLength = arr.length; - 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.getArray('Domain'); - var range = dict.getArray('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 - info('No support for cubic spline interpolation: ' + order); - } - - var encode = dict.getArray('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.getArray('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(src, srcOffset, - dest, destOffset) { - // 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]; - - // 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); - var i, j; - for (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 (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(src[srcOffset +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 (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; - } - - for (j = 0; j < n; ++j) { - // Sum all cube vertices' samples portions - var rj = 0; - for (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) - dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), - range[j][1]); - } - }; - }, - - constructInterpolated: function PDFFunction_constructInterpolated(str, - dict) { - var c0 = dict.getArray('C0') || [0]; - var c1 = dict.getArray('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(src, srcOffset, - dest, destOffset) { - var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n); - - for (var j = 0; j < length; ++j) { - dest[destOffset + j] = c0[j] + (x * diff[j]); - } - }; - }, - - constructStiched: function PDFFunction_constructStiched(fn, dict, xref) { - var domain = dict.getArray('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.getArray('Bounds'); - var encode = dict.getArray('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 = []; - var tmpBuf = new Float32Array(1); - - for (var i = 0, ii = fnsIR.length; i < ii; i++) { - fns.push(PDFFunction.fromIR(fnsIR[i])); - } - - return function constructStichedFromIRResult(src, srcOffset, - dest, destOffset) { - 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(src[srcOffset], domain[0], domain[1]); - // calculate 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]; - - // Prevent the value from becoming NaN as a result - // of division by zero (fixes issue6113.pdf). - tmpBuf[0] = dmin === dmax ? rmin : - rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - - // call the appropriate function - fns[i](tmpBuf, 0, dest, destOffset); - }; - }, - - constructPostScript: function PDFFunction_constructPostScript(fn, dict, - xref) { - var domain = dict.getArray('Domain'); - var range = dict.getArray('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 compiled = (new PostScriptCompiler()).compile(code, domain, range); - if (compiled) { - // Compiled function consists of simple expressions such as addition, - // subtraction, Math.max, and also contains 'var' and 'return' - // statements. See the generation in the PostScriptCompiler below. - /*jshint -W054 */ - return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); - } - - info('Unable to compile PS function'); - - var numOutputs = range.length >> 1; - var numInputs = domain.length >> 1; - 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 = Object.create(null); - // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values - // seen in our tests. - var MAX_CACHE_SIZE = 2048 * 4; - var cache_available = MAX_CACHE_SIZE; - var tmpBuf = new Float32Array(numInputs); - - return function constructPostScriptFromIRResult(src, srcOffset, - dest, destOffset) { - var i, value; - var key = ''; - var input = tmpBuf; - for (i = 0; i < numInputs; i++) { - value = src[srcOffset + i]; - input[i] = value; - key += value + '_'; - } - - var cachedValue = cache[key]; - if (cachedValue !== undefined) { - dest.set(cachedValue, destOffset); - return; - } - - var output = new Float32Array(numOutputs); - var stack = evaluator.execute(input); - var stackIndex = stack.length - numOutputs; - for (i = 0; i < numOutputs; i++) { - value = stack[stackIndex + i]; - var bound = range[i * 2]; - if (value < bound) { - value = bound; - } else { - bound = range[i * 2 +1]; - if (value > bound) { - value = bound; - } - } - output[i] = value; - } - if (cache_available > 0) { - cache_available--; - cache[key] = output; - } - dest.set(output, destOffset); - }; - } - }; -})(); - -function isPDFFunction(v) { - var fnDict; - if (typeof v !== 'object') { - return false; - } else if (isDict(v)) { - fnDict = v; - } else if (isStream(v)) { - fnDict = v.dict; - } else { - return false; - } - return fnDict.has('FunctionType'); -} - -var PostScriptStack = (function PostScriptStackClosure() { - var MAX_STACK_SIZE = 100; - function PostScriptStack(initialStack) { - this.stack = !initialStack ? [] : - Array.prototype.slice.call(initialStack, 0); - } - - 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) { - this.operators = operators; - } - 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(-a); - break; - case 'not': - a = stack.pop(); - if (isBool(a)) { - stack.push(!a); - } else { - stack.push(~a); - } - 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; -})(); - -// Most of the PDFs functions consist of simple operations such as: -// roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add. -// -// We can compile most of such programs, and at the same moment, we can -// optimize some expressions using basic math properties. Keeping track of -// min/max values will allow us to avoid extra Math.min/Math.max calls. -var PostScriptCompiler = (function PostScriptCompilerClosure() { - function AstNode(type) { - this.type = type; - } - AstNode.prototype.visit = function (visitor) { - throw new Error('abstract method'); - }; - - function AstArgument(index, min, max) { - AstNode.call(this, 'args'); - this.index = index; - this.min = min; - this.max = max; - } - AstArgument.prototype = Object.create(AstNode.prototype); - AstArgument.prototype.visit = function (visitor) { - visitor.visitArgument(this); - }; - - function AstLiteral(number) { - AstNode.call(this, 'literal'); - this.number = number; - this.min = number; - this.max = number; - } - AstLiteral.prototype = Object.create(AstNode.prototype); - AstLiteral.prototype.visit = function (visitor) { - visitor.visitLiteral(this); - }; - - function AstBinaryOperation(op, arg1, arg2, min, max) { - AstNode.call(this, 'binary'); - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - this.min = min; - this.max = max; - } - AstBinaryOperation.prototype = Object.create(AstNode.prototype); - AstBinaryOperation.prototype.visit = function (visitor) { - visitor.visitBinaryOperation(this); - }; - - function AstMin(arg, max) { - AstNode.call(this, 'max'); - this.arg = arg; - this.min = arg.min; - this.max = max; - } - AstMin.prototype = Object.create(AstNode.prototype); - AstMin.prototype.visit = function (visitor) { - visitor.visitMin(this); - }; - - function AstVariable(index, min, max) { - AstNode.call(this, 'var'); - this.index = index; - this.min = min; - this.max = max; - } - AstVariable.prototype = Object.create(AstNode.prototype); - AstVariable.prototype.visit = function (visitor) { - visitor.visitVariable(this); - }; - - function AstVariableDefinition(variable, arg) { - AstNode.call(this, 'definition'); - this.variable = variable; - this.arg = arg; - } - AstVariableDefinition.prototype = Object.create(AstNode.prototype); - AstVariableDefinition.prototype.visit = function (visitor) { - visitor.visitVariableDefinition(this); - }; - - function ExpressionBuilderVisitor() { - this.parts = []; - } - ExpressionBuilderVisitor.prototype = { - visitArgument: function (arg) { - this.parts.push('Math.max(', arg.min, ', Math.min(', - arg.max, ', src[srcOffset + ', arg.index, ']))'); - }, - visitVariable: function (variable) { - this.parts.push('v', variable.index); - }, - visitLiteral: function (literal) { - this.parts.push(literal.number); - }, - visitBinaryOperation: function (operation) { - this.parts.push('('); - operation.arg1.visit(this); - this.parts.push(' ', operation.op, ' '); - operation.arg2.visit(this); - this.parts.push(')'); - }, - visitVariableDefinition: function (definition) { - this.parts.push('var '); - definition.variable.visit(this); - this.parts.push(' = '); - definition.arg.visit(this); - this.parts.push(';'); - }, - visitMin: function (max) { - this.parts.push('Math.min('); - max.arg.visit(this); - this.parts.push(', ', max.max, ')'); - }, - toString: function () { - return this.parts.join(''); - } - }; - - function buildAddOperation(num1, num2) { - if (num2.type === 'literal' && num2.number === 0) { - // optimization: second operand is 0 - return num1; - } - if (num1.type === 'literal' && num1.number === 0) { - // optimization: first operand is 0 - return num2; - } - if (num2.type === 'literal' && num1.type === 'literal') { - // optimization: operands operand are literals - return new AstLiteral(num1.number + num2.number); - } - return new AstBinaryOperation('+', num1, num2, - num1.min + num2.min, num1.max + num2.max); - } - - function buildMulOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num2.number === 1) { - return num1; // and it's 1 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number * num2.number); - } - } - if (num1.type === 'literal') { - // optimization: first operands is a literal... - if (num1.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num1.number === 1) { - return num2; // and it's 1 - } - } - var min = Math.min(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - var max = Math.max(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - return new AstBinaryOperation('*', num1, num2, min, max); - } - - function buildSubOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return num1; // ... and it's 0 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number - num2.number); - } - } - if (num2.type === 'binary' && num2.op === '-' && - num1.type === 'literal' && num1.number === 1 && - num2.arg1.type === 'literal' && num2.arg1.number === 1) { - // optimization for case: 1 - (1 - x) - return num2.arg2; - } - return new AstBinaryOperation('-', num1, num2, - num1.min - num2.max, num1.max - num2.min); - } - - function buildMinOperation(num1, max) { - if (num1.min >= max) { - // optimization: num1 min value is not less than required max - return new AstLiteral(max); // just returning max - } else if (num1.max <= max) { - // optimization: num1 max value is not greater than required max - return num1; // just returning an argument - } - return new AstMin(num1, max); - } - - function PostScriptCompiler() {} - PostScriptCompiler.prototype = { - compile: function PostScriptCompiler_compile(code, domain, range) { - var stack = []; - var i, ii; - var instructions = []; - var inputSize = domain.length >> 1, outputSize = range.length >> 1; - var lastRegister = 0; - var n, j; - var num1, num2, ast1, ast2, tmpVar, item; - for (i = 0; i < inputSize; i++) { - stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); - } - - for (i = 0, ii = code.length; i < ii; i++) { - item = code[i]; - if (typeof item === 'number') { - stack.push(new AstLiteral(item)); - continue; - } - - switch (item) { - case 'add': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildAddOperation(num1, num2)); - break; - case 'cvr': - if (stack.length < 1) { - return null; - } - break; - case 'mul': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildMulOperation(num1, num2)); - break; - case 'sub': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildSubOperation(num1, num2)); - break; - case 'exch': - if (stack.length < 2) { - return null; - } - ast1 = stack.pop(); ast2 = stack.pop(); - stack.push(ast1, ast2); - break; - case 'pop': - if (stack.length < 1) { - return null; - } - stack.pop(); - break; - case 'index': - if (stack.length < 1) { - return null; - } - num1 = stack.pop(); - if (num1.type !== 'literal') { - return null; - } - n = num1.number; - if (n < 0 || (n|0) !== n || stack.length < n) { - return null; - } - ast1 = stack[stack.length - n - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - n - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'dup': - if (stack.length < 1) { - return null; - } - if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && - code[i + 3] === i + 7 && code[i + 4] === 'jz' && - code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) { - // special case of the commands sequence for the min operation - num1 = stack.pop(); - stack.push(buildMinOperation(num1, code[i + 1])); - i += 6; - break; - } - ast1 = stack[stack.length - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - // we don't have to save into intermediate variable a literal or - // variable. - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'roll': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - if (num2.type !== 'literal' || num1.type !== 'literal') { - // both roll operands must be numbers - return null; - } - j = num2.number; - n = num1.number; - if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) { - // ... and integers - return null; - } - j = ((j % n) + n) % n; - if (j === 0) { - break; // just skipping -- there are nothing to rotate - } - Array.prototype.push.apply(stack, - stack.splice(stack.length - n, n - j)); - break; - default: - return null; // unsupported operator - } - } - - if (stack.length !== outputSize) { - return null; - } - - var result = []; - instructions.forEach(function (instruction) { - var statementBuilder = new ExpressionBuilderVisitor(); - instruction.visit(statementBuilder); - result.push(statementBuilder.toString()); - }); - stack.forEach(function (expr, i) { - var statementBuilder = new ExpressionBuilderVisitor(); - expr.visit(statementBuilder); - var min = range[i * 2], max = range[i * 2 + 1]; - var out = [statementBuilder.toString()]; - if (min > expr.min) { - out.unshift('Math.max(', min, ', '); - out.push(')'); - } - if (max < expr.max) { - out.unshift('Math.min(', max, ', '); - out.push(')'); - } - out.unshift('dest[destOffset + ', i, '] = '); - out.push(';'); - result.push(out.join('')); - }); - return result.join('\n'); - } - }; - - return PostScriptCompiler; -})(); - -exports.isPDFFunction = isPDFFunction; -exports.PDFFunction = PDFFunction; -exports.PostScriptEvaluator = PostScriptEvaluator; -exports.PostScriptCompiler = PostScriptCompiler; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreColorSpace = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreFunction); - } -}(this, function (exports, sharedUtil, corePrimitives, coreFunction) { - -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isStream = corePrimitives.isStream; -var PDFFunction = coreFunction.PDFFunction; - -var ColorSpace = (function ColorSpaceClosure() { - /** - * Resizes an RGB image with 3 components. - * @param {TypedArray} src - The source buffer. - * @param {Number} bpc - Number of bits per component. - * @param {Number} w1 - Original width. - * @param {Number} h1 - Original height. - * @param {Number} w2 - New width. - * @param {Number} h2 - New height. - * @param {Number} alpha01 - Size reserved for the alpha channel. - * @param {TypedArray} dest - The destination buffer. - */ - function resizeRgbImage(src, bpc, w1, h1, w2, h2, alpha01, dest) { - var COMPONENTS = 3; - alpha01 = alpha01 !== 1 ? 0 : alpha01; - var xRatio = w1 / w2; - var yRatio = h1 / h2; - var i, j, py, newIndex = 0, oldIndex; - var xScaled = new Uint16Array(w2); - var w1Scanline = w1 * COMPONENTS; - - for (i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio) * COMPONENTS; - } - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - dest[newIndex++] = src[oldIndex++]; - dest[newIndex++] = src[oldIndex++]; - dest[newIndex++] = src[oldIndex++]; - newIndex += alpha01; - } - } - } - - // Constructor should define this.numComps, this.defaultColor, this.name - function ColorSpace() { - error('should not call ColorSpace constructor'); - } - - ColorSpace.prototype = { - /** - * Converts the color value to the RGB color. The color components are - * located in the src array starting from the srcOffset. Returns the array - * of the rgb components, each value ranging from [0,255]. - */ - getRgb: function ColorSpace_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - /** - * Converts the color value to the RGB color, similar to the getRgb method. - * The result placed into the dest array starting from the destOffset. - */ - getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, - dest, destOffset) { - error('Should not call ColorSpace.getRgbItem'); - }, - /** - * Converts the specified number of the color values to the RGB colors. - * The colors are located in the src array starting from the srcOffset. - * The result is placed into the dest array starting from the destOffset. - * The src array items shall be in [0,2^bits) range, the dest array items - * will be in [0,255] range. alpha01 indicates how many alpha components - * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA - * array). - */ - getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - error('Should not call ColorSpace.getRgbBuffer'); - }, - /** - * Determines the number of bytes required to store the result of the - * conversion done by the getRgbBuffer method. As in getRgbBuffer, - * |alpha01| is either 0 (RGB output) or 1 (RGBA output). - */ - getOutputLength: function ColorSpace_getOutputLength(inputLength, - alpha01) { - error('Should not call ColorSpace.getOutputLength'); - }, - /** - * Returns true if source data will be equal the result/output data. - */ - isPassthrough: function ColorSpace_isPassthrough(bits) { - return false; - }, - /** - * Fills in the RGB colors in the destination buffer. alpha01 indicates - * how many alpha components there are in the dest array; it will be either - * 0 (RGB array) or 1 (RGBA array). - */ - fillRgb: function ColorSpace_fillRgb(dest, originalWidth, - originalHeight, width, height, - actualHeight, bpc, comps, alpha01) { - var count = originalWidth * originalHeight; - var rgbBuf = null; - var numComponentColors = 1 << bpc; - var needsResizing = originalHeight !== height || originalWidth !== width; - var i, ii; - - if (this.isPassthrough(bpc)) { - rgbBuf = comps; - } else if (this.numComps === 1 && count > numComponentColors && - this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') { - // Optimization: create a color map when there is just one component and - // we are converting more colors than the size of the color map. We - // don't build the map if the colorspace is gray or rgb since those - // methods are faster than building a map. This mainly offers big speed - // ups for indexed and alternate colorspaces. - // - // TODO it may be worth while to cache the color map. While running - // testing I never hit a cache so I will leave that out for now (perhaps - // we are reparsing colorspaces too much?). - var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : - new Uint16Array(numComponentColors); - var key; - for (i = 0; i < numComponentColors; i++) { - allColors[i] = i; - } - var colorMap = new Uint8Array(numComponentColors * 3); - this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, - /* alpha01 = */ 0); - - var destPos, rgbPos; - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - destPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - dest[destPos++] = colorMap[key]; - dest[destPos++] = colorMap[key + 1]; - dest[destPos++] = colorMap[key + 2]; - destPos += alpha01; - } - } else { - rgbBuf = new Uint8Array(count * 3); - rgbPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - rgbBuf[rgbPos++] = colorMap[key]; - rgbBuf[rgbPos++] = colorMap[key + 1]; - rgbBuf[rgbPos++] = colorMap[key + 2]; - } - } - } else { - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, - alpha01); - } else { - rgbBuf = new Uint8Array(count * 3); - this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, - /* alpha01 = */ 0); - } - } - - if (rgbBuf) { - if (needsResizing) { - resizeRgbImage(rgbBuf, bpc, originalWidth, originalHeight, - width, height, alpha01, dest); - } else { - rgbPos = 0; - destPos = 0; - for (i = 0, ii = width * actualHeight; i < ii; i++) { - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - destPos += alpha01; - } - } - } - }, - /** - * True if the colorspace has components in the default range of [0, 1]. - * This should be true for all colorspaces except for lab color spaces - * which are [0,100], [-128, 127], [-128, 127]. - */ - usesZeroToOneRange: true - }; - - ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { - var IR = ColorSpace.parseToIR(cs, xref, res); - if (IR instanceof AlternateCS) { - return IR; - } - return ColorSpace.fromIR(IR); - }; - - ColorSpace.fromIR = function ColorSpace_fromIR(IR) { - var name = isArray(IR) ? IR[0] : IR; - var whitePoint, blackPoint, gamma; - - switch (name) { - case 'DeviceGrayCS': - return this.singletons.gray; - case 'DeviceRgbCS': - return this.singletons.rgb; - case 'DeviceCmykCS': - return this.singletons.cmyk; - case 'CalGrayCS': - whitePoint = IR[1]; - blackPoint = IR[2]; - gamma = IR[3]; - return new CalGrayCS(whitePoint, blackPoint, gamma); - case 'CalRGBCS': - whitePoint = IR[1]; - blackPoint = IR[2]; - gamma = IR[3]; - var matrix = IR[4]; - return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); - case 'PatternCS': - var basePatternCS = IR[1]; - if (basePatternCS) { - basePatternCS = ColorSpace.fromIR(basePatternCS); - } - return new PatternCS(basePatternCS); - case 'IndexedCS': - var baseIndexedCS = IR[1]; - var hiVal = IR[2]; - var lookup = IR[3]; - return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); - case 'AlternateCS': - var numComps = IR[1]; - var alt = IR[2]; - var tintFnIR = IR[3]; - - return new AlternateCS(numComps, ColorSpace.fromIR(alt), - PDFFunction.fromIR(tintFnIR)); - case 'LabCS': - whitePoint = IR[1]; - blackPoint = IR[2]; - var range = IR[3]; - return new LabCS(whitePoint, blackPoint, range); - default: - error('Unknown name ' + name); - } - return null; - }; - - ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { - if (isName(cs)) { - var colorSpaces = res.get('ColorSpace'); - if (isDict(colorSpaces)) { - var refcs = colorSpaces.get(cs.name); - if (refcs) { - cs = refcs; - } - } - } - - cs = xref.fetchIfRef(cs); - var mode; - - if (isName(cs)) { - mode = cs.name; - this.mode = mode; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'Pattern': - return ['PatternCS', null]; - default: - error('unrecognized colorspace ' + mode); - } - } else if (isArray(cs)) { - mode = xref.fetchIfRef(cs[0]).name; - this.mode = mode; - var numComps, params, alt, whitePoint, blackPoint, gamma; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'CalGray': - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray('WhitePoint'); - blackPoint = params.getArray('BlackPoint'); - gamma = params.get('Gamma'); - return ['CalGrayCS', whitePoint, blackPoint, gamma]; - case 'CalRGB': - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray('WhitePoint'); - blackPoint = params.getArray('BlackPoint'); - gamma = params.getArray('Gamma'); - var matrix = params.getArray('Matrix'); - return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix]; - case 'ICCBased': - var stream = xref.fetchIfRef(cs[1]); - var dict = stream.dict; - numComps = dict.get('N'); - alt = dict.get('Alternate'); - if (alt) { - var altIR = ColorSpace.parseToIR(alt, xref, res); - // Parse the /Alternate CS to ensure that the number of components - // are correct, and also (indirectly) that it is not a PatternCS. - var altCS = ColorSpace.fromIR(altIR); - if (altCS.numComps === numComps) { - return altIR; - } - warn('ICCBased color space: Ignoring incorrect /Alternate entry.'); - } - if (numComps === 1) { - return 'DeviceGrayCS'; - } else if (numComps === 3) { - return 'DeviceRgbCS'; - } else if (numComps === 4) { - return 'DeviceCmykCS'; - } - break; - case 'Pattern': - var basePatternCS = cs[1] || null; - if (basePatternCS) { - basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); - } - return ['PatternCS', basePatternCS]; - case 'Indexed': - case 'I': - var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); - var hiVal = xref.fetchIfRef(cs[2]) + 1; - var lookup = xref.fetchIfRef(cs[3]); - if (isStream(lookup)) { - lookup = lookup.getBytes(); - } - return ['IndexedCS', baseIndexedCS, hiVal, lookup]; - case 'Separation': - case 'DeviceN': - var name = xref.fetchIfRef(cs[1]); - numComps = 1; - if (isName(name)) { - numComps = 1; - } else if (isArray(name)) { - numComps = name.length; - } - alt = ColorSpace.parseToIR(cs[2], xref, res); - var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); - return ['AlternateCS', numComps, alt, tintFnIR]; - case 'Lab': - params = xref.fetchIfRef(cs[1]); - whitePoint = params.getArray('WhitePoint'); - blackPoint = params.getArray('BlackPoint'); - var range = params.getArray('Range'); - return ['LabCS', whitePoint, blackPoint, range]; - default: - error('unimplemented color space object "' + mode + '"'); - } - } else { - error('unrecognized color space object: "' + cs + '"'); - } - return null; - }; - /** - * Checks if a decode map matches the default decode map for a color space. - * This handles the general decode maps where there are two values per - * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. - * This does not handle Lab, Indexed, or Pattern decode maps since they are - * slightly different. - * @param {Array} decode Decode map (usually from an image). - * @param {Number} n Number of components the color space has. - */ - ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { - if (!isArray(decode)) { - return true; - } - - if (n * 2 !== decode.length) { - warn('The decode map is not the correct length'); - return true; - } - for (var i = 0, ii = decode.length; i < ii; i += 2) { - if (decode[i] !== 0 || decode[i + 1] !== 1) { - return false; - } - } - return true; - }; - - ColorSpace.singletons = { - get gray() { - return shadow(this, 'gray', new DeviceGrayCS()); - }, - get rgb() { - return shadow(this, 'rgb', new DeviceRgbCS()); - }, - get cmyk() { - return shadow(this, 'cmyk', new DeviceCmykCS()); - } - }; - - return ColorSpace; -})(); - -/** - * Alternate color space handles both Separation and DeviceN color spaces. A - * Separation color space is actually just a DeviceN with one color component. - * Both color spaces use a tinting function to convert colors to a base color - * space. - */ -var AlternateCS = (function AlternateCSClosure() { - function AlternateCS(numComps, base, tintFn) { - this.name = 'Alternate'; - this.numComps = numComps; - this.defaultColor = new Float32Array(numComps); - for (var i = 0; i < numComps; ++i) { - this.defaultColor[i] = 1; - } - this.base = base; - this.tintFn = tintFn; - this.tmpBuf = new Float32Array(base.numComps); - } - - AlternateCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var tmpBuf = this.tmpBuf; - this.tintFn(src, srcOffset, tmpBuf, 0); - this.base.getRgbItem(tmpBuf, 0, dest, destOffset); - }, - getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var tintFn = this.tintFn; - var base = this.base; - var scale = 1 / ((1 << bits) - 1); - var baseNumComps = base.numComps; - var usesZeroToOneRange = base.usesZeroToOneRange; - var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && - alpha01 === 0; - var pos = isPassthrough ? destOffset : 0; - var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count); - var numComps = this.numComps; - - var scaled = new Float32Array(numComps); - var tinted = new Float32Array(baseNumComps); - var i, j; - if (usesZeroToOneRange) { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - for (j = 0; j < baseNumComps; j++) { - baseBuf[pos++] = tinted[j] * 255; - } - } - } else { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - base.getRgbItem(tinted, 0, baseBuf, pos); - pos += baseNumComps; - } - } - if (!isPassthrough) { - base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); - } - }, - getOutputLength: function AlternateCS_getOutputLength(inputLength, - alpha01) { - return this.base.getOutputLength(inputLength * - this.base.numComps / this.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return AlternateCS; -})(); - -var PatternCS = (function PatternCSClosure() { - function PatternCS(baseCS) { - this.name = 'Pattern'; - this.base = baseCS; - } - PatternCS.prototype = {}; - - return PatternCS; -})(); - -var IndexedCS = (function IndexedCSClosure() { - function IndexedCS(base, highVal, lookup) { - this.name = 'Indexed'; - this.numComps = 1; - this.defaultColor = new Uint8Array([0]); - this.base = base; - this.highVal = highVal; - - var baseNumComps = base.numComps; - var length = baseNumComps * highVal; - var lookupArray; - - if (isStream(lookup)) { - lookupArray = new Uint8Array(length); - var bytes = lookup.getBytes(length); - lookupArray.set(bytes); - } else if (isString(lookup)) { - lookupArray = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - lookupArray[i] = lookup.charCodeAt(i); - } - } else if (lookup instanceof Uint8Array || lookup instanceof Array) { - lookupArray = lookup; - } else { - error('Unrecognized lookup table: ' + lookup); - } - this.lookup = lookupArray; - } - - IndexedCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var numComps = this.base.numComps; - var start = src[srcOffset] * numComps; - this.base.getRgbItem(this.lookup, start, dest, destOffset); - }, - getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var base = this.base; - var numComps = base.numComps; - var outputDelta = base.getOutputLength(numComps, alpha01); - var lookup = this.lookup; - - for (var i = 0; i < count; ++i) { - var lookupPos = src[srcOffset++] * numComps; - base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); - destOffset += outputDelta; - } - }, - getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) { - return this.base.getOutputLength(inputLength * this.base.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { - // indexed color maps shouldn't be changed - return true; - }, - usesZeroToOneRange: true - }; - return IndexedCS; -})(); - -var DeviceGrayCS = (function DeviceGrayCSClosure() { - function DeviceGrayCS() { - this.name = 'DeviceGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - } - - DeviceGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var c = (src[srcOffset] * 255) | 0; - c = c < 0 ? 0 : c > 255 ? 255 : c; - dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; - }, - getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - var c = (scale * src[j++]) | 0; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; - q += alpha01; - } - }, - getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, - alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceGrayCS; -})(); - -var DeviceRgbCS = (function DeviceRgbCSClosure() { - function DeviceRgbCS() { - this.name = 'DeviceRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - } - DeviceRgbCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var r = (src[srcOffset] * 255) | 0; - var g = (src[srcOffset + 1] * 255) | 0; - var b = (src[srcOffset + 2] * 255) | 0; - dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r; - dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g; - dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b; - }, - getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - if (bits === 8 && alpha01 === 0) { - dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); - return; - } - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - q += alpha01; - } - }, - getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, - alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: function DeviceRgbCS_isPassthrough(bits) { - return bits === 8; - }, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceRgbCS; -})(); - -var DeviceCmykCS = (function DeviceCmykCSClosure() { - // The coefficients below was found using numerical analysis: the method of - // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors, - // where color_value is the tabular value from the table of sampled RGB colors - // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding - // CMYK color conversion using the estimation below: - // f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255 - function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { - var c = src[srcOffset + 0] * srcScale; - var m = src[srcOffset + 1] * srcScale; - var y = src[srcOffset + 2] * srcScale; - var k = src[srcOffset + 3] * srcScale; - - var r = - (c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k + - -285.2331026137004) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y + - -17.873870861415444 * k - 5.497006427196366) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 17.5119270841813) + - k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0; - var g = - (c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k + - -79.2970844816548) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 190.9453302588951) + - y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + - k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0; - var b = - (c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k + - -14.183576799673286) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 112.23884253719248) + - y * (0.03296041114873217 * y + 115.60384449646641 * k + - -193.58209356861505) + - k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0; - - dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r; - dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g; - dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b; - } - - function DeviceCmykCS() { - this.name = 'DeviceCMYK'; - this.numComps = 4; - this.defaultColor = new Float32Array([0, 0, 0, 1]); - } - DeviceCmykCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(src, srcOffset, 1, dest, destOffset); - }, - getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - for (var i = 0; i < count; i++) { - convertToRgb(src, srcOffset, scale, dest, destOffset); - srcOffset += 4; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, - alpha01) { - return (inputLength / 4 * (3 + alpha01)) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return DeviceCmykCS; -})(); - -// -// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245 -// -var CalGrayCS = (function CalGrayCSClosure() { - function CalGrayCS(whitePoint, blackPoint, gamma) { - this.name = 'CalGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalGray'); - } - blackPoint = blackPoint || [0, 0, 0]; - gamma = gamma || 1; - - // Translate arguments to spec variables. - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - this.G = gamma; - - // Validate variables as per spec. - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ', falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + - ', ZB: ' + this.ZB + ', only default values are supported.'); - } - - if (this.G < 1) { - info('Invalid Gamma: ' + this.G + ' for ' + this.name + - ', falling back to default'); - this.G = 1; - } - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A represents a gray component of a calibrated gray space. - // A <---> AG in the spec - var A = src[srcOffset] * scale; - var AG = Math.pow(A, cs.G); - - // Computes L as per spec. ( = cs.YW * AG ) - // Except if other than default BlackPoint values are used. - var L = cs.YW * AG; - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // Convert values to rgb range [0, 255]. - var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; - dest[destOffset] = val; - dest[destOffset + 1] = val; - dest[destOffset + 2] = val; - } - - CalGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 1; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalGrayCS; -})(); - -// -// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247 -// -var CalRGBCS = (function CalRGBCSClosure() { - - // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these - // matrices. - var BRADFORD_SCALE_MATRIX = new Float32Array([ - 0.8951, 0.2664, -0.1614, - -0.7502, 1.7135, 0.0367, - 0.0389, -0.0685, 1.0296]); - - var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ - 0.9869929, -0.1470543, 0.1599627, - 0.4323053, 0.5183603, 0.0492912, - -0.0085287, 0.0400428, 0.9684867]); - - // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html. - var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ - 3.2404542, -1.5371385, -0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434, -0.2040259, 1.0572252]); - - var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); - - var tempNormalizeMatrix = new Float32Array(3); - var tempConvertMatrix1 = new Float32Array(3); - var tempConvertMatrix2 = new Float32Array(3); - - var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0; - - function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { - this.name = 'CalRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array(3); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalRGB'); - } - blackPoint = blackPoint || new Float32Array(3); - gamma = gamma || new Float32Array([1, 1, 1]); - matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - - // Translate arguments to spec variables. - var XW = whitePoint[0]; - var YW = whitePoint[1]; - var ZW = whitePoint[2]; - this.whitePoint = whitePoint; - - var XB = blackPoint[0]; - var YB = blackPoint[1]; - var ZB = blackPoint[2]; - this.blackPoint = blackPoint; - - this.GR = gamma[0]; - this.GG = gamma[1]; - this.GB = gamma[2]; - - this.MXA = matrix[0]; - this.MYA = matrix[1]; - this.MZA = matrix[2]; - this.MXB = matrix[3]; - this.MYB = matrix[4]; - this.MZB = matrix[5]; - this.MXC = matrix[6]; - this.MYC = matrix[7]; - this.MZC = matrix[8]; - - // Validate variables as per spec. - if (XW < 0 || ZW < 0 || YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (XB < 0 || YB < 0 || ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + - ', ' + ZB + '], falling back to default'); - this.blackPoint = new Float32Array(3); - } - - if (this.GR < 0 || this.GG < 0 || this.GB < 0) { - info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + - '] for ' + this.name + ', falling back to default'); - this.GR = this.GG = this.GB = 1; - } - - if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || - this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || - this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { - info('Invalid Matrix for ' + this.name + ' [' + - this.MXA + ', ' + this.MYA + ', ' + this.MZA + - this.MXB + ', ' + this.MYB + ', ' + this.MZB + - this.MXC + ', ' + this.MYC + ', ' + this.MZC + - '], falling back to default'); - this.MXA = this.MYB = this.MZC = 1; - this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; - } - } - - function matrixProduct(a, b, result) { - result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; - result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; - } - - function convertToFlat(sourceWhitePoint, LMS, result) { - result[0] = LMS[0] * 1 / sourceWhitePoint[0]; - result[1] = LMS[1] * 1 / sourceWhitePoint[1]; - result[2] = LMS[2] * 1 / sourceWhitePoint[2]; - } - - function convertToD65(sourceWhitePoint, LMS, result) { - var D65X = 0.95047; - var D65Y = 1; - var D65Z = 1.08883; - - result[0] = LMS[0] * D65X / sourceWhitePoint[0]; - result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; - result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; - } - - function sRGBTransferFunction(color) { - // See http://en.wikipedia.org/wiki/SRGB. - if (color <= 0.0031308){ - return adjustToRange(0, 1, 12.92 * color); - } - - return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); - } - - function adjustToRange(min, max, value) { - return Math.max(min, Math.min(max, value)); - } - - function decodeL(L) { - if (L < 0) { - return -decodeL(-L); - } - - if (L > 8.0) { - return Math.pow(((L + 16) / 116), 3); - } - - return L * DECODE_L_CONSTANT; - } - - function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { - - // In case the blackPoint is already the default blackPoint then there is - // no need to do compensation. - if (sourceBlackPoint[0] === 0 && - sourceBlackPoint[1] === 0 && - sourceBlackPoint[2] === 0) { - result[0] = XYZ_Flat[0]; - result[1] = XYZ_Flat[1]; - result[2] = XYZ_Flat[2]; - return; - } - - // For the blackPoint calculation details, please see - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - // The destination blackPoint is the default blackPoint [0, 0, 0]. - var zeroDecodeL = decodeL(0); - - var X_DST = zeroDecodeL; - var X_SRC = decodeL(sourceBlackPoint[0]); - - var Y_DST = zeroDecodeL; - var Y_SRC = decodeL(sourceBlackPoint[1]); - - var Z_DST = zeroDecodeL; - var Z_SRC = decodeL(sourceBlackPoint[2]); - - var X_Scale = (1 - X_DST) / (1 - X_SRC); - var X_Offset = 1 - X_Scale; - - var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); - var Y_Offset = 1 - Y_Scale; - - var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); - var Z_Offset = 1 - Z_Scale; - - result[0] = XYZ_Flat[0] * X_Scale + X_Offset; - result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; - result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; - } - - function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { - - // In case the whitePoint is already flat then there is no need to do - // normalization. - if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { - result[0] = XYZ_In[0]; - result[1] = XYZ_In[1]; - result[2] = XYZ_In[2]; - return; - } - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_Flat = tempNormalizeMatrix; - convertToFlat(sourceWhitePoint, LMS, LMS_Flat); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); - } - - function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_D65 = tempNormalizeMatrix; - convertToD65(sourceWhitePoint, LMS, LMS_D65); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A, B and C represent a red, green and blue components of a calibrated - // rgb space. - var A = adjustToRange(0, 1, src[srcOffset] * scale); - var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); - var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); - - // A <---> AGR in the spec - // B <---> BGG in the spec - // C <---> CGB in the spec - var AGR = Math.pow(A, cs.GR); - var BGG = Math.pow(B, cs.GG); - var CGB = Math.pow(C, cs.GB); - - // Computes intermediate variables L, M, N as per spec. - // To decode X, Y, Z values map L, M, N directly to them. - var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; - var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; - var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; - - // The following calculations are based on this document: - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - var XYZ = tempConvertMatrix1; - XYZ[0] = X; - XYZ[1] = Y; - XYZ[2] = Z; - var XYZ_Flat = tempConvertMatrix2; - - normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); - - var XYZ_Black = tempConvertMatrix1; - compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); - - var XYZ_D65 = tempConvertMatrix2; - normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); - - var SRGB = tempConvertMatrix1; - matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); - - var sR = sRGBTransferFunction(SRGB[0]); - var sG = sRGBTransferFunction(SRGB[1]); - var sB = sRGBTransferFunction(SRGB[2]); - - // Convert the values to rgb range [0, 255]. - dest[destOffset] = Math.round(sR * 255); - dest[destOffset + 1] = Math.round(sG * 255); - dest[destOffset + 2] = Math.round(sB * 255); - } - - CalRGBCS.prototype = { - getRgb: function CalRGBCS_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalRGBCS; -})(); - -// -// LabCS: Based on "PDF Reference, Sixth Ed", p.250 -// -var LabCS = (function LabCSClosure() { - function LabCS(whitePoint, blackPoint, range) { - this.name = 'Lab'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space Lab'); - } - blackPoint = blackPoint || [0, 0, 0]; - range = range || [-100, 100, -100, 100]; - - // Translate args to spec variables - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - this.amin = range[0]; - this.amax = range[1]; - this.bmin = range[2]; - this.bmax = range[3]; - - // These are here just for completeness - the spec doesn't offer any - // formulas that use BlackPoint in Lab - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - // Validate vars as per spec - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components, no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.amin > this.amax || this.bmin > this.bmax) { - info('Invalid Range, falling back to defaults'); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - } - - // Function g(x) from spec - function fn_g(x) { - if (x >= 6 / 29) { - return x * x * x; - } else { - return (108 / 841) * (x - 4 / 29); - } - } - - function decode(value, high1, low2, high2) { - return low2 + (value) * (high2 - low2) / (high1); - } - - // If decoding is needed maxVal should be 2^bits per component - 1. - function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { - // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax] - // not the usual [0, 1]. If a command like setFillColor is used the src - // values will already be within the correct range. However, if we are - // converting an image we have to map the values to the correct range given - // above. - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = src[srcOffset]; - var as = src[srcOffset + 1]; - var bs = src[srcOffset + 2]; - if (maxVal !== false) { - Ls = decode(Ls, maxVal, 0, 100); - as = decode(as, maxVal, cs.amin, cs.amax); - bs = decode(bs, maxVal, cs.bmin, cs.bmax); - } - - // Adjust limits of 'as' and 'bs' - as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; - bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; - - // Computes intermediate variables X,Y,Z as per spec - var M = (Ls + 16) / 116; - var L = M + (as / 500); - var N = M - (bs / 200); - - var X = cs.XW * fn_g(L); - var Y = cs.YW * fn_g(M); - var Z = cs.ZW * fn_g(N); - - var r, g, b; - // Using different conversions for D50 and D65 white points, - // per http://www.color.org/srgb.pdf - if (cs.ZW < 1) { - // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249) - r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; - g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; - b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; - } else { - // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888) - r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; - g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; - b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; - } - // clamp color values to [0,1] range then convert to [0,255] range. - dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; - dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; - dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; - } - - LabCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { - convertToRgb(this, src, srcOffset, false, dest, destOffset); - }, - getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var maxVal = (1 << bits) - 1; - for (var i = 0; i < count; i++) { - convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // XXX: Decoding is handled with the lab conversion because of the strange - // ranges that are used. - return true; - }, - usesZeroToOneRange: false - }; - return LabCS; -})(); - -exports.ColorSpace = ColorSpace; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreImage = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreColorSpace, root.pdfjsCoreStream, - root.pdfjsCoreJpx); - } -}(this, function (exports, sharedUtil, corePrimitives, coreColorSpace, - coreStream, coreJpx) { - -var ImageKind = sharedUtil.ImageKind; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var warn = sharedUtil.warn; -var Name = corePrimitives.Name; -var isStream = corePrimitives.isStream; -var ColorSpace = coreColorSpace.ColorSpace; -var DecodeStream = coreStream.DecodeStream; -var JpegStream = coreStream.JpegStream; -var JpxImage = coreJpx.JpxImage; - -var PDFImage = (function PDFImageClosure() { - /** - * Decodes the image using native decoder if possible. Resolves the promise - * when the image data is ready. - */ - function handleImageData(image, nativeDecoder) { - if (nativeDecoder && nativeDecoder.canDecode(image)) { - return nativeDecoder.decode(image); - } else { - return Promise.resolve(image); - } - } - - /** - * Decode and clamp a value. The formula is different from the spec because we - * don't decode to float range [0,1], we decode it in the [0,max] range. - */ - function decodeAndClamp(value, addend, coefficient, max) { - value = addend + value * coefficient; - // Clamp the value to the range - return (value < 0 ? 0 : (value > max ? max : value)); - } - - /** - * Resizes an image mask with 1 component. - * @param {TypedArray} src - The source buffer. - * @param {Number} bpc - Number of bits per component. - * @param {Number} w1 - Original width. - * @param {Number} h1 - Original height. - * @param {Number} w2 - New width. - * @param {Number} h2 - New height. - * @returns {TypedArray} The resized image mask buffer. - */ - function resizeImageMask(src, bpc, w1, h1, w2, h2) { - var length = w2 * h2; - var dest = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var xRatio = w1 / w2; - var yRatio = h1 / h2; - var i, j, py, newIndex = 0, oldIndex; - var xScaled = new Uint16Array(w2); - var w1Scanline = w1; - - for (i = 0; i < w2; i++) { - xScaled[i] = Math.floor(i * xRatio); - } - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - dest[newIndex++] = src[oldIndex]; - } - } - return dest; - } - - function PDFImage(xref, res, image, inline, smask, mask, isMask) { - this.image = image; - var dict = image.dict; - if (dict.has('Filter')) { - var filter = dict.get('Filter').name; - if (filter === 'JPXDecode') { - var jpxImage = new JpxImage(); - jpxImage.parseImageProperties(image.stream); - image.stream.reset(); - image.bitsPerComponent = jpxImage.bitsPerComponent; - image.numComps = jpxImage.componentsCount; - } else if (filter === 'JBIG2Decode') { - image.bitsPerComponent = 1; - image.numComps = 1; - } - } - // TODO cache rendered images? - - this.width = dict.get('Width', 'W'); - this.height = dict.get('Height', 'H'); - - if (this.width < 1 || this.height < 1) { - error('Invalid image width: ' + this.width + ' or height: ' + - this.height); - } - - this.interpolate = dict.get('Interpolate', 'I') || false; - this.imageMask = dict.get('ImageMask', 'IM') || false; - this.matte = dict.get('Matte') || false; - - var bitsPerComponent = image.bitsPerComponent; - if (!bitsPerComponent) { - bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); - if (!bitsPerComponent) { - if (this.imageMask) { - bitsPerComponent = 1; - } else { - error('Bits per component missing in image: ' + this.imageMask); - } - } - } - this.bpc = bitsPerComponent; - - if (!this.imageMask) { - var colorSpace = dict.get('ColorSpace', 'CS'); - if (!colorSpace) { - info('JPX images (which do not require color spaces)'); - switch (image.numComps) { - case 1: - colorSpace = Name.get('DeviceGray'); - break; - case 3: - colorSpace = Name.get('DeviceRGB'); - break; - case 4: - colorSpace = Name.get('DeviceCMYK'); - break; - default: - error('JPX images with ' + this.numComps + - ' color components not supported.'); - } - } - this.colorSpace = ColorSpace.parse(colorSpace, xref, res); - this.numComps = this.colorSpace.numComps; - } - - this.decode = dict.getArray('Decode', 'D'); - this.needsDecode = false; - if (this.decode && - ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) || - (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) { - this.needsDecode = true; - // Do some preprocessing to avoid more math. - var max = (1 << bitsPerComponent) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { - var dmin = this.decode[i]; - var dmax = this.decode[i + 1]; - this.decodeCoefficients[j] = dmax - dmin; - this.decodeAddends[j] = max * dmin; - } - } - - if (smask) { - this.smask = new PDFImage(xref, res, smask, false); - } else if (mask) { - if (isStream(mask)) { - var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); - if (!imageMask) { - warn('Ignoring /Mask in image without /ImageMask.'); - } else { - this.mask = new PDFImage(xref, res, mask, false, null, null, true); - } - } else { - // Color key mask (just an array). - this.mask = mask; - } - } - } - /** - * Handles processing of image data and returns the Promise that is resolved - * with a PDFImage when the image is ready to be used. - */ - PDFImage.buildImage = function PDFImage_buildImage(handler, xref, - res, image, inline, - nativeDecoder) { - var imagePromise = handleImageData(image, nativeDecoder); - var smaskPromise; - var maskPromise; - - var smask = image.dict.get('SMask'); - var mask = image.dict.get('Mask'); - - if (smask) { - smaskPromise = handleImageData(smask, nativeDecoder); - maskPromise = Promise.resolve(null); - } else { - smaskPromise = Promise.resolve(null); - if (mask) { - if (isStream(mask)) { - maskPromise = handleImageData(mask, nativeDecoder); - } else if (isArray(mask)) { - maskPromise = Promise.resolve(mask); - } else { - warn('Unsupported mask format.'); - maskPromise = Promise.resolve(null); - } - } else { - maskPromise = Promise.resolve(null); - } - } - return Promise.all([imagePromise, smaskPromise, maskPromise]).then( - function(results) { - var imageData = results[0]; - var smaskData = results[1]; - var maskData = results[2]; - return new PDFImage(xref, res, imageData, inline, smaskData, maskData); - }); - }; - - PDFImage.createMask = - function PDFImage_createMask(imgArray, width, height, - imageIsFromDecodeStream, inverseDecode) { - - // |imgArray| might not contain full data for every pixel of the mask, so - // we need to distinguish between |computedLength| and |actualLength|. - // In particular, if inverseDecode is true, then the array we return must - // have a length of |computedLength|. - - var computedLength = ((width + 7) >> 3) * height; - var actualLength = imgArray.byteLength; - var haveFullData = computedLength === actualLength; - var data, i; - - if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { - // imgArray came from a DecodeStream and its data is in an appropriate - // form, so we can just transfer it. - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(actualLength); - data.set(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - for (i = actualLength; i < computedLength; i++) { - data[i] = 0xff; - } - } - - // If necessary, invert the original mask data (but not any extra we might - // have added above). It's safe to modify the array -- whether it's the - // original or a copy, we're about to transfer it anyway, so nothing else - // in this thread can be relying on its contents. - if (inverseDecode) { - for (i = 0; i < actualLength; i++) { - data[i] = ~data[i]; - } - } - - return {data: data, width: width, height: height}; - }; - - PDFImage.prototype = { - get drawWidth() { - return Math.max(this.width, - this.smask && this.smask.width || 0, - this.mask && this.mask.width || 0); - }, - - get drawHeight() { - return Math.max(this.height, - this.smask && this.smask.height || 0, - this.mask && this.mask.height || 0); - }, - - decodeBuffer: function PDFImage_decodeBuffer(buffer) { - var bpc = this.bpc; - var numComps = this.numComps; - - var decodeAddends = this.decodeAddends; - var decodeCoefficients = this.decodeCoefficients; - var max = (1 << bpc) - 1; - var i, ii; - - if (bpc === 1) { - // If the buffer needed decode that means it just needs to be inverted. - for (i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = +!(buffer[i]); - } - return; - } - var index = 0; - for (i = 0, ii = this.width * this.height; i < ii; i++) { - for (var j = 0; j < numComps; j++) { - buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], - decodeCoefficients[j], max); - index++; - } - } - }, - - getComponents: function PDFImage_getComponents(buffer) { - var bpc = this.bpc; - - // This image doesn't require any extra work. - if (bpc === 8) { - return buffer; - } - - var width = this.width; - var height = this.height; - var numComps = this.numComps; - - var length = width * height * numComps; - var bufferPos = 0; - var output = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var rowComps = width * numComps; - - var max = (1 << bpc) - 1; - var i = 0, ii, buf; - - if (bpc === 1) { - // Optimization for reading 1 bpc images. - var mask, loop1End, loop2End; - for (var j = 0; j < height; j++) { - loop1End = i + (rowComps & ~7); - loop2End = i + rowComps; - - // unroll loop for all full bytes - while (i < loop1End) { - buf = buffer[bufferPos++]; - output[i] = (buf >> 7) & 1; - output[i + 1] = (buf >> 6) & 1; - output[i + 2] = (buf >> 5) & 1; - output[i + 3] = (buf >> 4) & 1; - output[i + 4] = (buf >> 3) & 1; - output[i + 5] = (buf >> 2) & 1; - output[i + 6] = (buf >> 1) & 1; - output[i + 7] = buf & 1; - i += 8; - } - - // handle remaining bits - if (i < loop2End) { - buf = buffer[bufferPos++]; - mask = 128; - while (i < loop2End) { - output[i++] = +!!(buf & mask); - mask >>= 1; - } - } - } - } else { - // The general case that handles all other bpc values. - var bits = 0; - buf = 0; - for (i = 0, ii = length; i < ii; ++i) { - if (i % rowComps === 0) { - buf = 0; - bits = 0; - } - - while (bits < bpc) { - buf = (buf << 8) | buffer[bufferPos++]; - bits += 8; - } - - var remainingBits = bits - bpc; - var value = buf >> remainingBits; - output[i] = (value < 0 ? 0 : (value > max ? max : value)); - buf = buf & ((1 << remainingBits) - 1); - bits = remainingBits; - } - } - return output; - }, - - fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, - actualHeight, image) { - var smask = this.smask; - var mask = this.mask; - var alphaBuf, sw, sh, i, ii, j; - - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8Array(sw * sh); - smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, - width, height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8Array(sw * sh); - mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); - - // Need to invert values in rgbaBuf - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - - if (sw !== width || sh !== height) { - alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, - width, height); - } - } else if (isArray(mask)) { - // Color key mask: if any of the components are outside the range - // then they should be painted. - alphaBuf = new Uint8Array(width * height); - var numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - var opacity = 0; - var imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - var color = image[imageOffset + j]; - var maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; - } - } - alphaBuf[i] = opacity; - } - } else { - error('Unknown mask format.'); - } - } - - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } - } else { - // No mask. - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } - } - }, - - undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { - var matte = this.smask && this.smask.matte; - if (!matte) { - return; - } - var matteRgb = this.colorSpace.getRgb(matte, 0); - var matteR = matteRgb[0]; - var matteG = matteRgb[1]; - var matteB = matteRgb[2]; - var length = width * height * 4; - var r, g, b; - for (var i = 0; i < length; i += 4) { - var alpha = buffer[i + 3]; - if (alpha === 0) { - // according formula we have to get Infinity in all components - // making it white (typical paper color) should be okay - buffer[i] = 255; - buffer[i + 1] = 255; - buffer[i + 2] = 255; - continue; - } - var k = 255 / alpha; - r = (buffer[i] - matteR) * k + matteR; - g = (buffer[i + 1] - matteG) * k + matteG; - b = (buffer[i + 2] - matteB) * k + matteB; - buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; - buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; - buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; - } - }, - - createImageData: function PDFImage_createImageData(forceRGBA) { - var drawWidth = this.drawWidth; - var drawHeight = this.drawHeight; - var imgData = { // other fields are filled in below - width: drawWidth, - height: drawHeight - }; - - var numComps = this.numComps; - var originalWidth = this.width; - var originalHeight = this.height; - var bpc = this.bpc; - - // Rows start at byte boundary. - var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; - var imgArray; - - if (!forceRGBA) { - // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image - // without any complications, we pass a same-sized copy to the main - // thread rather than expanding by 32x to RGBA form. This saves *lots* - // of memory for many scanned documents. It's also much faster. - // - // Similarly, if it is a 24-bit-per pixel RGB image without any - // complications, we avoid expanding by 1.333x to RGBA form. - var kind; - if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { - kind = ImageKind.GRAYSCALE_1BPP; - } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && - !this.needsDecode) { - kind = ImageKind.RGB_24BPP; - } - if (kind && !this.smask && !this.mask && - drawWidth === originalWidth && drawHeight === originalHeight) { - imgData.kind = kind; - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // If imgArray came from a DecodeStream, we're safe to transfer it - // (and thus detach its underlying buffer) because it will constitute - // the entire DecodeStream's data. But if it came from a Stream, we - // need to copy it because it'll only be a portion of the Stream's - // data, and the rest will be read later on. - if (this.image instanceof DecodeStream) { - imgData.data = imgArray; - } else { - var newArray = new Uint8Array(imgArray.length); - newArray.set(imgArray); - imgData.data = newArray; - } - if (this.needsDecode) { - // Invert the buffer (which must be grayscale if we reached here). - assert(kind === ImageKind.GRAYSCALE_1BPP); - var buffer = imgData.data; - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] ^= 0xff; - } - } - return imgData; - } - if (this.image instanceof JpegStream && !this.smask && !this.mask && - (this.colorSpace.name === 'DeviceGray' || - this.colorSpace.name === 'DeviceRGB' || - this.colorSpace.name === 'DeviceCMYK')) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(originalHeight * rowBytes, - drawWidth, drawHeight, true); - return imgData; - } - } - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // imgArray can be incomplete (e.g. after CCITT fax encoding). - var actualHeight = 0 | (imgArray.length / rowBytes * - drawHeight / originalHeight); - - var comps = this.getComponents(imgArray); - - // If opacity data is present, use RGBA_32BPP form. Otherwise, use the - // more compact RGB_24BPP form if allowable. - var alpha01, maybeUndoPreblend; - if (!forceRGBA && !this.smask && !this.mask) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 3); - alpha01 = 0; - maybeUndoPreblend = false; - } else { - imgData.kind = ImageKind.RGBA_32BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 4); - alpha01 = 1; - maybeUndoPreblend = true; - - // Color key masking (opacity) must be performed before decoding. - this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, - comps); - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, - drawWidth, drawHeight, actualHeight, bpc, comps, - alpha01); - if (maybeUndoPreblend) { - this.undoPreblend(imgData.data, drawWidth, actualHeight); - } - - return imgData; - }, - - fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { - var numComps = this.numComps; - if (numComps !== 1) { - error('Reading gray scale from a color image: ' + numComps); - } - - var width = this.width; - var height = this.height; - var bpc = this.bpc; - - // rows start at byte boundary - var rowBytes = (width * numComps * bpc + 7) >> 3; - var imgArray = this.getImageBytes(height * rowBytes); - - var comps = this.getComponents(imgArray); - var i, length; - - if (bpc === 1) { - // inline decoding (= inversion) for 1 bpc images - length = width * height; - if (this.needsDecode) { - // invert and scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (comps[i] - 1) & 255; - } - } else { - // scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (-comps[i]) & 255; - } - } - return; - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - length = width * height; - // we aren't using a colorspace so we need to scale the value - var scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = (scale * comps[i]) | 0; - } - }, - - getImageBytes: function PDFImage_getImageBytes(length, - drawWidth, drawHeight, - forceRGB) { - this.image.reset(); - this.image.drawWidth = drawWidth || this.width; - this.image.drawHeight = drawHeight || this.height; - this.image.forceRGB = !!forceRGB; - return this.image.getBytes(length); - } - }; - return PDFImage; -})(); - -exports.PDFImage = PDFImage; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreObj = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreCrypto, root.pdfjsCoreParser, - root.pdfjsCoreChunkedStream, root.pdfjsCoreColorSpace); - } -}(this, function (exports, sharedUtil, corePrimitives, coreCrypto, coreParser, - coreChunkedStream, coreColorSpace) { - -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MissingDataException = sharedUtil.MissingDataException; -var XRefParseException = sharedUtil.XRefParseException; -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var stringToPDFString = sharedUtil.stringToPDFString; -var stringToUTF8String = sharedUtil.stringToUTF8String; -var warn = sharedUtil.warn; -var isValidUrl = sharedUtil.isValidUrl; -var Util = sharedUtil.Util; -var Ref = corePrimitives.Ref; -var RefSet = corePrimitives.RefSet; -var RefSetCache = corePrimitives.RefSetCache; -var isName = corePrimitives.isName; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isRef = corePrimitives.isRef; -var isRefsEqual = corePrimitives.isRefsEqual; -var isStream = corePrimitives.isStream; -var CipherTransformFactory = coreCrypto.CipherTransformFactory; -var Lexer = coreParser.Lexer; -var Parser = coreParser.Parser; -var ChunkedStream = coreChunkedStream.ChunkedStream; -var ColorSpace = coreColorSpace.ColorSpace; - -var Catalog = (function CatalogClosure() { - function Catalog(pdfManager, xref, pageFactory) { - this.pdfManager = pdfManager; - this.xref = xref; - this.catDict = xref.getCatalogObj(); - this.fontCache = new RefSetCache(); - assert(isDict(this.catDict), - 'catalog object is not a dictionary'); - - // TODO refactor to move getPage() to the PDFDocument. - this.pageFactory = pageFactory; - this.pagePromises = []; - } - - 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, 'Metadata') && isName(subtype, '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'); - assert(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 obj = this.catDict.get('Outlines'); - if (!isDict(obj)) { - return null; - } - obj = obj.getRaw('First'); - if (!isRef(obj)) { - return null; - } - var root = { items: [] }; - var queue = [{obj: obj, parent: root}]; - // To avoid recursion, keep track of the already processed items. - var processed = new RefSet(); - processed.put(obj); - var xref = this.xref, blackColor = new Uint8Array(3); - - while (queue.length > 0) { - var i = queue.shift(); - var outlineDict = xref.fetchIfRef(i.obj); - if (outlineDict === null) { - continue; - } - assert(outlineDict.has('Title'), 'Invalid outline item'); - - var actionDict = outlineDict.get('A'), dest = null, url = null; - if (actionDict) { - var destEntry = actionDict.get('D'); - if (destEntry) { - dest = destEntry; - } else { - var uriEntry = actionDict.get('URI'); - if (isString(uriEntry) && isValidUrl(uriEntry, false)) { - url = uriEntry; - } - } - } else if (outlineDict.has('Dest')) { - dest = outlineDict.getRaw('Dest'); - if (isName(dest)) { - dest = dest.name; - } - } - var title = outlineDict.get('Title'); - var flags = outlineDict.get('F') || 0; - - var color = outlineDict.getArray('C'), rgbColor = blackColor; - // We only need to parse the color when it's valid, and non-default. - if (isArray(color) && color.length === 3 && - (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) { - rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0); - } - var outlineItem = { - dest: dest, - url: url, - title: stringToPDFString(title), - color: rgbColor, - count: outlineDict.get('Count'), - bold: !!(flags & 2), - italic: !!(flags & 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'); - assert( - 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 && obj.has('Dests')) { - 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) { - dests[name] = fetchDestination(names[name]); - } - } - return shadow(this, 'destinations', dests); - }, - getDestination: function Catalog_getDestination(destinationId) { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dest = null, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { // Simple destination dictionary. - var value = nameDictionaryRef.get(destinationId); - if (value) { - dest = fetchDestination(value); - } - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - dest = fetchDestination(nameTree.get(destinationId)); - } - return dest; - }, - - get pageLabels() { - var obj = null; - try { - obj = this.readPageLabels(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Unable to read page labels.'); - } - return shadow(this, 'pageLabels', obj); - }, - readPageLabels: function Catalog_readPageLabels() { - var obj = this.catDict.getRaw('PageLabels'); - if (!obj) { - return null; - } - var pageLabels = new Array(this.numPages); - var style = null; - var prefix = ''; - var start = 1; - - var numberTree = new NumberTree(obj, this.xref); - var nums = numberTree.getAll(); - var currentLabel = '', currentIndex = 1; - - for (var i = 0, ii = this.numPages; i < ii; i++) { - if (i in nums) { - var labelDict = nums[i]; - assert(isDict(labelDict), 'The PageLabel is not a dictionary.'); - - var type = labelDict.get('Type'); - assert(!type || isName(type, 'PageLabel'), - 'Invalid type in PageLabel dictionary.'); - - var s = labelDict.get('S'); - assert(!s || isName(s), 'Invalid style in PageLabel dictionary.'); - style = (s ? s.name : null); - - prefix = labelDict.get('P') || ''; - assert(isString(prefix), 'Invalid prefix in PageLabel dictionary.'); - - start = labelDict.get('St') || 1; - assert(isInt(start), 'Invalid start in PageLabel dictionary.'); - currentIndex = start; - } - - switch (style) { - case 'D': - currentLabel = currentIndex; - break; - case 'R': - case 'r': - currentLabel = Util.toRoman(currentIndex, style === 'r'); - break; - case 'A': - case 'a': - var LIMIT = 26; // Use only the characters A--Z, or a--z. - var A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61; - - var baseCharCode = (style === 'a' ? A_LOWER_CASE : A_UPPER_CASE); - var letterIndex = currentIndex - 1; - var character = String.fromCharCode(baseCharCode + - (letterIndex % LIMIT)); - var charBuf = []; - for (var j = 0, jj = (letterIndex / LIMIT) | 0; j <= jj; j++) { - charBuf.push(character); - } - currentLabel = charBuf.join(''); - break; - default: - assert(!style, - 'Invalid style "' + style + '" in PageLabel dictionary.'); - } - pageLabels[i] = prefix + currentLabel; - - currentLabel = ''; - currentIndex++; - } - return pageLabels; - }, - - get attachments() { - var xref = this.xref; - var attachments = null, nameTreeRef; - var obj = this.catDict.get('Names'); - if (obj) { - nameTreeRef = obj.getRaw('EmbeddedFiles'); - } - - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - var fs = new FileSpec(names[name], xref); - if (!attachments) { - attachments = Object.create(null); - } - attachments[stringToPDFString(name)] = fs.serializable; - } - } - return shadow(this, 'attachments', attachments); - }, - get javaScript() { - var xref = this.xref; - var obj = this.catDict.get('Names'); - - var javaScript = []; - function appendIfJavaScriptDict(jsDict) { - var type = jsDict.get('S'); - if (!isName(type, 'JavaScript')) { - return; - } - var js = jsDict.get('JS'); - if (isStream(js)) { - js = bytesToString(js.getBytes()); - } else if (!isString(js)) { - return; - } - javaScript.push(stringToPDFString(js)); - } - if (obj && obj.has('JavaScript')) { - var nameTree = new NameTree(obj.getRaw('JavaScript'), xref); - var names = nameTree.getAll(); - for (var name in names) { - // We don't really use the JavaScript right now. This code is - // defensive so we don't cause errors on document load. - var jsDict = names[name]; - if (isDict(jsDict)) { - appendIfJavaScriptDict(jsDict); - } - } - } - - // Append OpenAction actions to javaScript array - var openactionDict = this.catDict.get('OpenAction'); - if (isDict(openactionDict, 'Action')) { - var actionType = openactionDict.get('S'); - if (isName(actionType, 'Named')) { - // The named Print action is not a part of the PDF 1.7 specification, - // but is supported by many PDF readers/writers (including Adobe's). - var action = openactionDict.get('N'); - if (isName(action, 'Print')) { - javaScript.push('print({});'); - } - } else { - appendIfJavaScriptDict(openactionDict); - } - } - - return shadow(this, 'javaScript', javaScript); - }, - - cleanup: function Catalog_cleanup() { - var promises = []; - this.fontCache.forEach(function (promise) { - promises.push(promise); - }); - return Promise.all(promises).then(function (translatedFonts) { - for (var i = 0, ii = translatedFonts.length; i < ii; i++) { - var font = translatedFonts[i].dict; - delete font.translated; - } - this.fontCache.clear(); - }.bind(this)); - }, - - getPage: function Catalog_getPage(pageIndex) { - if (!(pageIndex in this.pagePromises)) { - this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then( - function (a) { - var dict = a[0]; - var ref = a[1]; - return this.pageFactory.createPage(pageIndex, dict, ref, - this.fontCache); - }.bind(this) - ); - } - return this.pagePromises[pageIndex]; - }, - - getPageDict: function Catalog_getPageDict(pageIndex) { - var capability = createPromiseCapability(); - var nodesToVisit = [this.catDict.getRaw('Pages')]; - var currentPageIndex = 0; - var xref = this.xref; - var checkAllKids = false; - - function next() { - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - if (isRef(currentNode)) { - xref.fetchAsync(currentNode).then(function (obj) { - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - if (pageIndex === currentPageIndex) { - capability.resolve([obj, currentNode]); - } else { - currentPageIndex++; - next(); - } - return; - } - nodesToVisit.push(obj); - next(); - }, capability.reject); - return; - } - - // Must be a child page dictionary. - assert( - isDict(currentNode), - 'page dictionary kid reference points to wrong type of object' - ); - var count = currentNode.get('Count'); - // If the current node doesn't have any children, avoid getting stuck - // in an empty node further down in the tree (see issue5644.pdf). - if (count === 0) { - checkAllKids = true; - } - // Skip nodes where the page can't be. - if (currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - - var kids = currentNode.get('Kids'); - assert(isArray(kids), 'page dictionary kids object is not an array'); - if (!checkAllKids && count === kids.length) { - // Nodes that don't have the page have been skipped and this is the - // bottom of the tree which means the page requested must be a - // descendant of this pages node. Ideally we would just resolve the - // promise with the page ref here, but there is the case where more - // pages nodes could link to single a page (see issue 3666 pdf). To - // handle this push it back on the queue so if it is a pages node it - // will be descended into. - nodesToVisit = [kids[pageIndex - currentPageIndex]]; - currentPageIndex = pageIndex; - continue; - } else { - for (var last = kids.length - 1; last >= 0; last--) { - nodesToVisit.push(kids[last]); - } - } - } - capability.reject('Page index ' + pageIndex + ' not found.'); - } - next(); - return capability.promise; - }, - - getPageIndex: function Catalog_getPageIndex(pageRef) { - // The page tree nodes have the count of all the leaves below them. To get - // how many pages are before we just have to walk up the tree and keep - // adding the count of siblings to the left of the node. - var xref = this.xref; - function pagesBeforeRef(kidRef) { - var total = 0; - var parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (isRefsEqual(kidRef, pageRef) && !isDict(node, 'Page') && - !(isDict(node) && !node.has('Type') && node.has('Contents'))) { - throw new Error('The reference does not point to a /Page Dict.'); - } - if (!node) { - return null; - } - assert(isDict(node), 'node must be a Dict.'); - parentRef = node.getRaw('Parent'); - return node.getAsync('Parent'); - }).then(function (parent) { - if (!parent) { - return null; - } - assert(isDict(parent), 'parent must be a Dict.'); - return parent.getAsync('Kids'); - }).then(function (kids) { - if (!kids) { - return null; - } - var kidPromises = []; - var found = false; - for (var i = 0; i < kids.length; i++) { - var kid = kids[i]; - assert(isRef(kid), 'kid must be a Ref.'); - if (kid.num === kidRef.num) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (kid) { - if (kid.has('Count')) { - var count = kid.get('Count'); - total += count; - } else { // page leaf node - total++; - } - })); - } - if (!found) { - error('kid ref not found in parents kids'); - } - return Promise.all(kidPromises).then(function () { - return [total, parentRef]; - }); - }); - } - - var total = 0; - function next(ref) { - return pagesBeforeRef(ref).then(function (args) { - if (!args) { - return total; - } - var count = args[0]; - var parentRef = args[1]; - total += count; - return next(parentRef); - }); - } - - return next(pageRef); - } - }; - - return Catalog; -})(); - -var XRef = (function XRefClosure() { - function XRef(stream, password) { - this.stream = stream; - this.entries = []; - this.xrefstms = Object.create(null); - // prepare the XRef cache - this.cache = []; - this.password = password; - this.stats = { - streamTypes: [], - fontTypes: [] - }; - } - - 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(); - - // The pdflib PDF generator can generate a nested trailer dictionary - if (!isDict(dict) && dict.dict) { - dict = dict.dict; - } - 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)) { - error('Invalid entry in XRef subsection: ' + first + ', ' + count); - } - - // The first xref table entry, i.e. obj 0, should be free. Attempting - // to adjust an incorrect first obj # (fixes issue 3248 and 7229). - if (i === 0 && entry.free && first === 1) { - first = 0; - } - - 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; - } - - // 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 is 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. - var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; - var PERCENT = 0x25, LT = 0x3C; - - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== LF && ch !== CR && ch !== LT) { - 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 objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; - 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]); - - // Clear out any existing entries, since they may be bogus. - this.entries.length = 0; - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - while (position < length) { - var ch = buffer[position]; - if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { - ++position; - continue; - } - if (ch === PERCENT) { // %-comment - do { - ++position; - if (position >= length) { - break; - } - ch = buffer[position]; - } while (ch !== LF && ch !== CR); - continue; - } - var token = readToken(buffer, position); - var m; - if (token.indexOf('xref') === 0 && - (token.length === 4 || /\s/.test(token[4]))) { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = objRegExp.exec(token))) { - if (typeof this.entries[m[1]] === 'undefined') { - this.entries[m[1]] = { - offset: position - stream.start, - 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 - stream.start); - this.xrefstms[position - stream.start] = 1; // Avoid recursion - } - - position += contentLength; - } else if (token.indexOf('trailer') === 0 && - (token.length === 7 || /\s/.test(token[7]))) { - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else { - position += token.length + 1; - } - } - // reading XRef streams - var i, ii; - for (i = 0, ii = xrefStms.length; i < ii; ++i) { - this.startXRefQueue.push(xrefStms[i]); - this.readXRef(/* recoveryMode */ true); - } - // finding main trailer - var dict; - for (i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), /* allowStreams = */ true, - /* xref = */ this, /* recoveryMode = */ true); - var obj = parser.getObj(); - if (!isCmd(obj, 'trailer')) { - continue; - } - // read the trailer dictionary - dict = parser.getObj(); - if (!isDict(dict)) { - 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 + stream.start; - - var parser = new Parser(new Lexer(stream), true, this); - 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'); - } - } else { - error('Invalid XRef stream header'); - } - - // 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; - } - info('(while reading XRef): ' + e); - } - - if (recoveryMode) { - return; - } - throw new XRefParseException(); - }, - - getEntry: function XRef_getEntry(i) { - var xrefEntry = this.entries[i]; - if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { - return xrefEntry; - } - return null; - }, - - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) { - return obj; - } - return this.fetch(obj); - }, - - fetch: function XRef_fetch(ref, suppressEncryption) { - assert(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) { - var cacheEntry = this.cache[num]; - return cacheEntry; - } - - var xrefEntry = this.getEntry(num); - - // the referenced entry can be free - if (xrefEntry === null) { - return (this.cache[num] = null); - } - - if (xrefEntry.uncompressed) { - xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); - } else { - xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); - } - if (isDict(xrefEntry)){ - xrefEntry.objId = ref.toString(); - } else if (isStream(xrefEntry)) { - xrefEntry.dict.objId = ref.toString(); - } - return xrefEntry; - }, - - fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, - suppressEncryption) { - var gen = ref.gen; - var num = ref.num; - if (xrefEntry.gen !== gen) { - error('inconsistent generation in XRef'); - } - var stream = this.stream.makeSubStream(xrefEntry.offset + - this.stream.start); - var parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || parseInt(obj1, 10) !== num || - !isInt(obj2) || parseInt(obj2, 10) !== 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) { - xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } else { - xrefEntry = parser.getObj(); - } - if (!isStream(xrefEntry)) { - this.cache[num] = xrefEntry; - } - return xrefEntry; - }, - - fetchCompressed: function XRef_fetchCompressed(xrefEntry, - suppressEncryption) { - var tableOffset = xrefEntry.offset; - var 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'); - } - var parser = new Parser(new Lexer(stream), false, this); - parser.allowStreams = true; - var i, entries = [], num, 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()); - // The ObjStm should not contain 'endobj'. If it's present, skip over it - // to support corrupt PDFs (fixes issue 5241, bug 898610, bug 1037816). - if (isCmd(parser.buf1, 'endobj')) { - parser.shift(); - } - num = nums[i]; - var entry = this.entries[num]; - if (entry && entry.offset === tableOffset && entry.gen === i) { - this.cache[num] = entries[i]; - } - } - xrefEntry = entries[xrefEntry.gen]; - if (xrefEntry === undefined) { - error('bad XRef entry for compressed object'); - } - return xrefEntry; - }, - - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { - if (!isRef(obj)) { - return Promise.resolve(obj); - } - return this.fetchAsync(obj); - }, - - fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { - var streamManager = this.stream.manager; - var xref = this; - return new Promise(function tryFetch(resolve, reject) { - try { - resolve(xref.fetch(ref, suppressEncryption)); - } catch (e) { - if (e instanceof MissingDataException) { - streamManager.requestRange(e.begin, e.end).then(function () { - tryFetch(resolve, reject); - }, reject); - return; - } - reject(e); - } - }); - }, - - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * A NameTree/NumberTree is like a Dict but has some advantageous properties, - * see the specification (7.9.6 and 7.9.7) for additional details. - * TODO: implement all the Dict functions and make this more efficient. - */ -var NameOrNumberTree = (function NameOrNumberTreeClosure() { - function NameOrNumberTree(root, xref) { - throw new Error('Cannot initialize NameOrNumberTree.'); - } - - NameOrNumberTree.prototype = { - getAll: function NameOrNumberTree_getAll() { - var dict = Object.create(null); - if (!this.root) { - return dict; - } - var xref = this.xref; - // Reading Name/Number 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]; - assert(!processed.has(kid), - 'Duplicate entry in "' + this._type + '" tree.'); - queue.push(kid); - processed.put(kid); - } - continue; - } - var entries = obj.get(this._type); - if (isArray(entries)) { - for (i = 0, n = entries.length; i < n; i += 2) { - dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]); - } - } - } - return dict; - }, - - get: function NameOrNumberTree_get(key) { - if (!this.root) { - return null; - } - - var xref = this.xref; - var kidsOrEntries = xref.fetchIfRef(this.root); - var loopCount = 0; - var MAX_LEVELS = 10; - var l, r, m; - - // Perform a binary search to quickly find the entry that - // contains the key we are looking for. - while (kidsOrEntries.has('Kids')) { - if (++loopCount > MAX_LEVELS) { - warn('Search depth limit reached for "' + this._type + '" tree.'); - return null; - } - - var kids = kidsOrEntries.get('Kids'); - if (!isArray(kids)) { - return null; - } - - l = 0; - r = kids.length - 1; - while (l <= r) { - m = (l + r) >> 1; - var kid = xref.fetchIfRef(kids[m]); - var limits = kid.get('Limits'); - - if (key < xref.fetchIfRef(limits[0])) { - r = m - 1; - } else if (key > xref.fetchIfRef(limits[1])) { - l = m + 1; - } else { - kidsOrEntries = xref.fetchIfRef(kids[m]); - break; - } - } - if (l > r) { - return null; - } - } - - // If we get here, then we have found the right entry. Now go through the - // entries in the dictionary until we find the key we're looking for. - var entries = kidsOrEntries.get(this._type); - if (isArray(entries)) { - // Perform a binary search to reduce the lookup time. - l = 0; - r = entries.length - 2; - while (l <= r) { - // Check only even indices (0, 2, 4, ...) because the - // odd indices contain the actual data. - m = (l + r) & ~1; - var currentKey = xref.fetchIfRef(entries[m]); - if (key < currentKey) { - r = m - 2; - } else if (key > currentKey) { - l = m + 2; - } else { - return xref.fetchIfRef(entries[m + 1]); - } - } - } - return null; - } - }; - return NameOrNumberTree; -})(); - -var NameTree = (function NameTreeClosure() { - function NameTree(root, xref) { - this.root = root; - this.xref = xref; - this._type = 'Names'; - } - - Util.inherit(NameTree, NameOrNumberTree, {}); - - return NameTree; -})(); - -var NumberTree = (function NumberTreeClosure() { - function NumberTree(root, xref) { - this.root = root; - this.xref = xref; - this._type = 'Nums'; - } - - Util.inherit(NumberTree, NameOrNumberTree, {}); - - return NumberTree; -})(); - -/** - * "A PDF file can refer to the contents of another file by using a File - * Specification (PDF 1.1)", see the spec (7.11) for more details. - * NOTE: Only embedded files are supported (as part of the attachments support) - * TODO: support the 'URL' file system (with caching if !/V), portable - * collections attributes and related files (/RF) - */ -var FileSpec = (function FileSpecClosure() { - function FileSpec(root, xref) { - if (!root || !isDict(root)) { - return; - } - this.xref = xref; - this.root = root; - if (root.has('FS')) { - this.fs = root.get('FS'); - } - this.description = root.has('Desc') ? - stringToPDFString(root.get('Desc')) : - ''; - if (root.has('RF')) { - warn('Related file specifications are not supported'); - } - this.contentAvailable = true; - if (!root.has('EF')) { - this.contentAvailable = false; - warn('Non-embedded file specifications are not supported'); - } - } - - function pickPlatformItem(dict) { - // Look for the filename in this order: - // UF, F, Unix, Mac, DOS - if (dict.has('UF')) { - return dict.get('UF'); - } else if (dict.has('F')) { - return dict.get('F'); - } else if (dict.has('Unix')) { - return dict.get('Unix'); - } else if (dict.has('Mac')) { - return dict.get('Mac'); - } else if (dict.has('DOS')) { - return dict.get('DOS'); - } else { - return null; - } - } - - FileSpec.prototype = { - get filename() { - if (!this._filename && this.root) { - var filename = pickPlatformItem(this.root) || 'unnamed'; - this._filename = stringToPDFString(filename). - replace(/\\\\/g, '\\'). - replace(/\\\//g, '/'). - replace(/\\/g, '/'); - } - return this._filename; - }, - get content() { - if (!this.contentAvailable) { - return null; - } - if (!this.contentRef && this.root) { - this.contentRef = pickPlatformItem(this.root.get('EF')); - } - var content = null; - if (this.contentRef) { - var xref = this.xref; - var fileObj = xref.fetchIfRef(this.contentRef); - if (fileObj && isStream(fileObj)) { - content = fileObj.getBytes(); - } else { - warn('Embedded file specification points to non-existing/invalid ' + - 'content'); - } - } else { - warn('Embedded file specification does not have a content'); - } - return content; - }, - get serializable() { - return { - filename: this.filename, - content: this.content - }; - } - }; - return FileSpec; -})(); - -/** - * 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) { - var value; - if (isDict(node) || isStream(node)) { - var map; - if (isDict(node)) { - map = node.map; - } else { - map = node.dict.map; - } - for (var key in map) { - value = map[key]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } else if (isArray(node)) { - for (var i = 0, ii = node.length; i < ii; i++) { - 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; - this.capability = null; - } - - ObjectLoader.prototype = { - load: function ObjectLoader_load() { - var keys = this.keys; - this.capability = createPromiseCapability(); - // 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.capability.resolve(); - return this.capability.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.capability.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).then( - 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), this.capability.reject); - return; - } - // Everything is loaded. - this.refSet = null; - this.capability.resolve(); - } - }; - - return ObjectLoader; -})(); - -exports.Catalog = Catalog; -exports.ObjectLoader = ObjectLoader; -exports.XRef = XRef; -exports.FileSpec = FileSpec; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePattern = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreFunction, - root.pdfjsCoreColorSpace); - } -}(this, function (exports, sharedUtil, corePrimitives, coreFunction, - coreColorSpace) { - -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var MissingDataException = sharedUtil.MissingDataException; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var warn = sharedUtil.warn; -var isStream = corePrimitives.isStream; -var PDFFunction = coreFunction.PDFFunction; -var ColorSpace = coreColorSpace.ColorSpace; - -var ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; - -var Pattern = (function PatternClosure() { - // Constructor should define this.getPattern - function Pattern() { - error('should not call Pattern constructor'); - } - - Pattern.prototype = { - // Input: current Canvas context - // Output: the appropriate fillStyle or strokeStyle - getPattern: function Pattern_getPattern(ctx) { - error('Should not call Pattern.getStyle: ' + ctx); - } - }; - - Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, - res, handler) { - - var dict = isStream(shading) ? shading.dict : shading; - var type = dict.get('ShadingType'); - - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - // Both radial and axial shadings are handled by RadialAxial shading. - return new Shadings.RadialAxial(dict, matrix, xref, res); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new Shadings.Mesh(shading, matrix, xref, res); - default: - throw new Error('Unsupported ShadingType: ' + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.shadingPattern}); - warn(ex); - return new Shadings.Dummy(); - } - }; - return Pattern; -})(); - -var Shadings = {}; - -// A small number to offset the first/last color stops so we can insert ones to -// support extend. Number.MIN_VALUE is too small and breaks the extend. -Shadings.SMALL_NUMBER = 1e-6; - -// Radial and axial shading have very similar implementations -// If needed, the implementations can be broken into two classes -Shadings.RadialAxial = (function RadialAxialClosure() { - function RadialAxial(dict, matrix, xref, res) { - this.matrix = matrix; - this.coordsArr = dict.getArray('Coords'); - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - - var t0 = 0.0, t1 = 1.0; - if (dict.has('Domain')) { - var domainArr = dict.getArray('Domain'); - t0 = domainArr[0]; - t1 = domainArr[1]; - } - - var extendStart = false, extendEnd = false; - if (dict.has('Extend')) { - var extendArr = dict.getArray('Extend'); - extendStart = extendArr[0]; - extendEnd = extendArr[1]; - } - - if (this.shadingType === ShadingType.RADIAL && - (!extendStart || !extendEnd)) { - // Radial gradient only currently works if either circle is fully within - // the other circle. - var x1 = this.coordsArr[0]; - var y1 = this.coordsArr[1]; - var r1 = this.coordsArr[2]; - var x2 = this.coordsArr[3]; - var y2 = this.coordsArr[4]; - var r2 = this.coordsArr[5]; - var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - if (r1 <= r2 + distance && - r2 <= r1 + distance) { - warn('Unsupported radial gradient.'); - } - } - - this.extendStart = extendStart; - this.extendEnd = extendEnd; - - var fnObj = dict.get('Function'); - var fn = PDFFunction.parseArray(xref, fnObj); - - // 10 samples seems good enough for now, but probably won't work - // if there are sharp color changes. Ideally, we would implement - // the spec faithfully and add lossless optimizations. - var diff = t1 - t0; - var step = diff / 10; - - var colorStops = this.colorStops = []; - - // Protect against bad domains so we don't end up in an infinte loop below. - if (t0 >= t1 || step <= 0) { - // Acrobat doesn't seem to handle these cases so we'll ignore for - // now. - info('Bad shading domain.'); - return; - } - - var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); - var rgbColor; - for (var i = t0; i <= t1; i += step) { - ratio[0] = i; - fn(ratio, 0, color, 0); - rgbColor = cs.getRgb(color, 0); - var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - colorStops.push([(i - t0) / diff, cssColor]); - } - - var background = 'transparent'; - if (dict.has('Background')) { - rgbColor = cs.getRgb(dict.get('Background'), 0); - background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - } - - if (!extendStart) { - // Insert a color stop at the front and offset the first real color stop - // so it doesn't conflict with the one we insert. - colorStops.unshift([0, background]); - colorStops[1][0] += Shadings.SMALL_NUMBER; - } - if (!extendEnd) { - // Same idea as above in extendStart but for the end. - colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; - colorStops.push([1, background]); - } - - this.colorStops = colorStops; - } - - RadialAxial.prototype = { - getIR: function RadialAxial_getIR() { - var coordsArr = this.coordsArr; - var shadingType = this.shadingType; - var type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = 'axial'; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = 'radial'; - } else { - error('getPattern type unknown: ' + shadingType); - } - - var matrix = this.matrix; - if (matrix) { - p0 = Util.applyTransform(p0, matrix); - p1 = Util.applyTransform(p1, matrix); - if (shadingType === ShadingType.RADIAL) { - var scale = Util.singularValueDecompose2dScale(matrix); - r0 *= scale[0]; - r1 *= scale[1]; - } - } - - return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; - } - }; - - return RadialAxial; -})(); - -// All mesh shading. For now, they will be presented as set of the triangles -// to be drawn on the canvas and rgb color for each vertex. -Shadings.Mesh = (function MeshClosure() { - function MeshStreamReader(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - - var numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - var csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : - this.tmpCompsBuf; - } - MeshStreamReader.prototype = { - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - var nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - }, - readBits: function MeshStreamReader_readBits(n) { - var buffer = this.buffer; - var bufferLength = this.bufferLength; - if (n === 32) { - if (bufferLength === 0) { - return ((this.stream.getByte() << 24) | - (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | - this.stream.getByte()) >>> 0; - } - buffer = (buffer << 24) | (this.stream.getByte() << 16) | - (this.stream.getByte() << 8) | this.stream.getByte(); - var nextByte = this.stream.getByte(); - this.buffer = nextByte & ((1 << bufferLength) - 1); - return ((buffer << (8 - bufferLength)) | - ((nextByte & 0xFF) >> bufferLength)) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return this.stream.getByte(); - } - while (bufferLength < n) { - buffer = (buffer << 8) | this.stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & ((1 << bufferLength) - 1); - return buffer >> bufferLength; - }, - align: function MeshStreamReader_align() { - this.buffer = 0; - this.bufferLength = 0; - }, - readFlag: function MeshStreamReader_readFlag() { - return this.readBits(this.context.bitsPerFlag); - }, - readCoordinate: function MeshStreamReader_readCoordinate() { - var bitsPerCoordinate = this.context.bitsPerCoordinate; - var xi = this.readBits(bitsPerCoordinate); - var yi = this.readBits(bitsPerCoordinate); - var decode = this.context.decode; - var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - return [ - xi * scale * (decode[1] - decode[0]) + decode[0], - yi * scale * (decode[3] - decode[2]) + decode[2] - ]; - }, - readComponents: function MeshStreamReader_readComponents() { - var numComps = this.context.numComps; - var bitsPerComponent = this.context.bitsPerComponent; - var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - var decode = this.context.decode; - var components = this.tmpCompsBuf; - for (var i = 0, j = 4; i < numComps; i++, j += 2) { - var ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - var color = this.tmpCsCompsBuf; - if (this.context.colorFn) { - this.context.colorFn(components, 0, color, 0); - } - return this.context.colorSpace.getRgb(color, 0); - } - }; - - function decodeType4Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var operators = []; - var ps = []; // not maintaining cs since that will match ps - var verticesLeft = 0; // assuming we have all data to start a new triangle - while (reader.hasData) { - var f = reader.readFlag(); - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - if (verticesLeft === 0) { // ignoring flags if we started a triangle - assert(0 <= f && f <= 2, 'Unknown type4 flag'); - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps[ps.length - 2], ps[ps.length - 1]); - verticesLeft = 1; - break; - case 2: - ps.push(ps[ps.length - 3], ps[ps.length - 1]); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - - reader.align(); - } - mesh.figures.push({ - type: 'triangles', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - }); - } - - function decodeType5Shading(mesh, reader, verticesPerRow) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = []; // not maintaining cs since that will match ps - while (reader.hasData) { - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - mesh.figures.push({ - type: 'lattice', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow: verticesPerRow - }); - } - - var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - - var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds - - var getB = (function getBClosure() { - function buildB(count) { - var lut = []; - for (var i = 0; i <= count; i++) { - var t = i / count, t_ = 1 - t; - lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, - 3 * t * t * t_, t * t * t])); - } - return lut; - } - var cache = []; - return function getB(count) { - if (!cache[count]) { - cache[count] = buildB(count); - } - return cache[count]; - }; - })(); - - function buildFigureFromPatch(mesh, index) { - var figure = mesh.figures[index]; - assert(figure.type === 'patch', 'Unexpected patch mesh figure'); - - var coords = mesh.coords, colors = mesh.colors; - var pi = figure.coords; - var ci = figure.colors; - - var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / - (mesh.bounds[2] - mesh.bounds[0])); - splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); - var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / - (mesh.bounds[3] - mesh.bounds[1])); - splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); - - var verticesPerRow = splitXBy + 1; - var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - var k = 0; - var cl = new Uint8Array(3), cr = new Uint8Array(3); - var c0 = colors[ci[0]], c1 = colors[ci[1]], - c2 = colors[ci[2]], c3 = colors[ci[3]]; - var bRow = getB(splitYBy), bCol = getB(splitXBy); - for (var row = 0; row <= splitYBy; row++) { - cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0; - cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0; - cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0; - - cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0; - cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0; - cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0; - - for (var col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && - (col === 0 || col === splitXBy)) { - continue; - } - var x = 0, y = 0; - var q = 0; - for (var i = 0; i <= 3; i++) { - for (var j = 0; j <= 3; j++, q++) { - var m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - var newColor = new Uint8Array(3); - newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0; - newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0; - newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - - mesh.figures[index] = { - type: 'lattice', - coords: figureCoords, - colors: figureColors, - verticesPerRow: verticesPerRow - }; - } - - function decodeType6Shading(mesh, reader) { - // A special case of Type 7. The p11, p12, p21, p22 automatically filled - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type6 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; - ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - // set p11, p12, p21, p22 - ps[5] = coords.length; - coords.push([ - (-4 * coords[ps[0]][0] - coords[ps[15]][0] + - 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, - (-4 * coords[ps[0]][1] - coords[ps[15]][1] + - 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 - ]); - ps[6] = coords.length; - coords.push([ - (-4 * coords[ps[3]][0] - coords[ps[12]][0] + - 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, - (-4 * coords[ps[3]][1] - coords[ps[12]][1] + - 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 - ]); - ps[9] = coords.length; - coords.push([ - (-4 * coords[ps[12]][0] - coords[ps[3]][0] + - 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, - (-4 * coords[ps[12]][1] - coords[ps[3]][1] + - 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 - ]); - ps[10] = coords.length; - coords.push([ - (-4 * coords[ps[15]][0] - coords[ps[0]][0] + - 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, - (-4 * coords[ps[15]][1] - coords[ps[0]][1] + - 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 - ]); - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function decodeType7Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type7 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7; - ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = ps[2]; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function updateBounds(mesh) { - var minX = mesh.coords[0][0], minY = mesh.coords[0][1], - maxX = minX, maxY = minY; - for (var i = 1, ii = mesh.coords.length; i < ii; i++) { - var x = mesh.coords[i][0], y = mesh.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - mesh.bounds = [minX, minY, maxX, maxY]; - } - - function packData(mesh) { - var i, ii, j, jj; - - var coords = mesh.coords; - var coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - var xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - mesh.coords = coordsPacked; - - var colors = mesh.colors; - var colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - var c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - mesh.colors = colorsPacked; - - var figures = mesh.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - - function Mesh(stream, matrix, xref, res) { - assert(isStream(stream), 'Mesh data is not a stream'); - var dict = stream.dict; - this.matrix = matrix; - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - this.bbox = dict.getArray('BBox'); - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - this.background = dict.has('Background') ? - cs.getRgb(dict.get('Background'), 0) : null; - - var fnObj = dict.get('Function'); - var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; - - this.coords = []; - this.colors = []; - this.figures = []; - - var decodeContext = { - bitsPerCoordinate: dict.get('BitsPerCoordinate'), - bitsPerComponent: dict.get('BitsPerComponent'), - bitsPerFlag: dict.get('BitsPerFlag'), - decode: dict.getArray('Decode'), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - var reader = new MeshStreamReader(stream, decodeContext); - - var patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - decodeType4Shading(this, reader); - break; - case ShadingType.LATTICE_FORM_MESH: - var verticesPerRow = dict.get('VerticesPerRow') | 0; - assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); - decodeType5Shading(this, reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - decodeType6Shading(this, reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - decodeType7Shading(this, reader); - patchMesh = true; - break; - default: - error('Unsupported mesh type.'); - break; - } - - if (patchMesh) { - // dirty bounds calculation for determining, how dense shall be triangles - updateBounds(this); - for (var i = 0, ii = this.figures.length; i < ii; i++) { - buildFigureFromPatch(this, i); - } - } - // calculate bounds - updateBounds(this); - - packData(this); - } - - Mesh.prototype = { - getIR: function Mesh_getIR() { - return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, - this.bounds, this.matrix, this.bbox, this.background]; - } - }; - - return Mesh; -})(); - -Shadings.Dummy = (function DummyClosure() { - function Dummy() { - this.type = 'Pattern'; - } - - Dummy.prototype = { - getIR: function Dummy_getIR() { - return ['Dummy']; - } - }; - return Dummy; -})(); - -function getTilingPatternIR(operatorList, dict, args) { - var matrix = dict.getArray('Matrix'); - var bbox = dict.getArray('BBox'); - var xstep = dict.get('XStep'); - var ystep = dict.get('YStep'); - var paintType = dict.get('PaintType'); - var tilingType = dict.get('TilingType'); - - return [ - 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, - paintType, tilingType - ]; -} - -exports.Pattern = Pattern; -exports.getTilingPatternIR = getTilingPatternIR; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreEvaluator = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, - root.pdfjsCoreImage, root.pdfjsCoreColorSpace, root.pdfjsCoreMurmurHash3, - root.pdfjsCoreFonts, root.pdfjsCoreFunction, root.pdfjsCorePattern, - root.pdfjsCoreCMap, root.pdfjsCoreMetrics, root.pdfjsCoreBidi, - root.pdfjsCoreEncodings, root.pdfjsCoreStandardFonts, - root.pdfjsCoreUnicode, root.pdfjsCoreGlyphList); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, - coreImage, coreColorSpace, coreMurmurHash3, coreFonts, - coreFunction, corePattern, coreCMap, coreMetrics, coreBidi, - coreEncodings, coreStandardFonts, coreUnicode, - coreGlyphList) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var TextRenderingMode = sharedUtil.TextRenderingMode; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isNum = sharedUtil.isNum; -var isString = sharedUtil.isString; -var getLookupTableFactory = sharedUtil.getLookupTableFactory; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var Name = corePrimitives.Name; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isRef = corePrimitives.isRef; -var isStream = corePrimitives.isStream; -var DecodeStream = coreStream.DecodeStream; -var JpegStream = coreStream.JpegStream; -var Stream = coreStream.Stream; -var Lexer = coreParser.Lexer; -var Parser = coreParser.Parser; -var isEOF = coreParser.isEOF; -var PDFImage = coreImage.PDFImage; -var ColorSpace = coreColorSpace.ColorSpace; -var MurmurHash3_64 = coreMurmurHash3.MurmurHash3_64; -var ErrorFont = coreFonts.ErrorFont; -var FontFlags = coreFonts.FontFlags; -var Font = coreFonts.Font; -var IdentityToUnicodeMap = coreFonts.IdentityToUnicodeMap; -var ToUnicodeMap = coreFonts.ToUnicodeMap; -var getFontType = coreFonts.getFontType; -var isPDFFunction = coreFunction.isPDFFunction; -var PDFFunction = coreFunction.PDFFunction; -var Pattern = corePattern.Pattern; -var getTilingPatternIR = corePattern.getTilingPatternIR; -var CMapFactory = coreCMap.CMapFactory; -var IdentityCMap = coreCMap.IdentityCMap; -var getMetrics = coreMetrics.getMetrics; -var bidi = coreBidi.bidi; -var WinAnsiEncoding = coreEncodings.WinAnsiEncoding; -var StandardEncoding = coreEncodings.StandardEncoding; -var MacRomanEncoding = coreEncodings.MacRomanEncoding; -var SymbolSetEncoding = coreEncodings.SymbolSetEncoding; -var ZapfDingbatsEncoding = coreEncodings.ZapfDingbatsEncoding; -var getEncoding = coreEncodings.getEncoding; -var getStdFontMap = coreStandardFonts.getStdFontMap; -var getSerifFonts = coreStandardFonts.getSerifFonts; -var getSymbolsFonts = coreStandardFonts.getSymbolsFonts; -var getNormalizedUnicodes = coreUnicode.getNormalizedUnicodes; -var reverseIfRtl = coreUnicode.reverseIfRtl; -var getUnicodeForGlyph = coreUnicode.getUnicodeForGlyph; -var getGlyphsUnicode = coreGlyphList.getGlyphsUnicode; - -var PartialEvaluator = (function PartialEvaluatorClosure() { - var DefaultPartialEvaluatorOptions = { - forceDataSchema: false, - maxImageSize: -1, - disableFontFace: false, - cMapOptions: { url: null, packed: false } - }; - - function NativeImageDecoder(xref, resources, handler, forceDataSchema) { - this.xref = xref; - this.resources = resources; - this.handler = handler; - this.forceDataSchema = forceDataSchema; - } - NativeImageDecoder.prototype = { - canDecode: function (image) { - return image instanceof JpegStream && - NativeImageDecoder.isDecodable(image, this.xref, this.resources); - }, - decode: function (image) { - // For natively supported JPEGs send them to the main thread for decoding. - var dict = image.dict; - var colorSpace = dict.get('ColorSpace', 'CS'); - colorSpace = ColorSpace.parse(colorSpace, this.xref, this.resources); - var numComps = colorSpace.numComps; - var decodePromise = this.handler.sendWithPromise('JpegDecode', - [image.getIR(this.forceDataSchema), numComps]); - return decodePromise.then(function (message) { - var data = message.data; - return new Stream(data, 0, data.length, image.dict); - }); - } - }; - /** - * Checks if the image can be decoded and displayed by the browser without any - * further processing such as color space conversions. - */ - NativeImageDecoder.isSupported = - function NativeImageDecoder_isSupported(image, xref, res) { - var dict = image.dict; - if (dict.has('DecodeParms') || dict.has('DP')) { - return false; - } - var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); - return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && - cs.isDefaultDecode(dict.getArray('Decode', 'D')); - }; - /** - * Checks if the image can be decoded by the browser. - */ - NativeImageDecoder.isDecodable = - function NativeImageDecoder_isDecodable(image, xref, res) { - var dict = image.dict; - if (dict.has('DecodeParms') || dict.has('DP')) { - return false; - } - var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res); - return (cs.numComps === 1 || cs.numComps === 3) && - cs.isDefaultDecode(dict.getArray('Decode', 'D')); - }; - - function PartialEvaluator(pdfManager, xref, handler, pageIndex, - uniquePrefix, idCounters, fontCache, options) { - this.pdfManager = pdfManager; - this.xref = xref; - this.handler = handler; - this.pageIndex = pageIndex; - this.uniquePrefix = uniquePrefix; - this.idCounters = idCounters; - this.fontCache = fontCache; - this.options = options || DefaultPartialEvaluatorOptions; - } - - // Trying to minimize Date.now() usage and check every 100 time - var TIME_SLOT_DURATION_MS = 20; - var CHECK_TIME_EVERY = 100; - function TimeSlotManager() { - this.reset(); - } - TimeSlotManager.prototype = { - check: function TimeSlotManager_check() { - if (++this.checked < CHECK_TIME_EVERY) { - return false; - } - this.checked = 0; - return this.endTime <= Date.now(); - }, - reset: function TimeSlotManager_reset() { - this.endTime = Date.now() + TIME_SLOT_DURATION_MS; - this.checked = 0; - } - }; - - var deferred = Promise.resolve(); - - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - PartialEvaluator.prototype = { - hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { - if (!isDict(resources)) { - return false; - } - - var processed = Object.create(null); - if (resources.objId) { - processed[resources.objId] = true; - } - - var nodes = [resources], xref = this.xref; - while (nodes.length) { - var key, i, ii; - var node = nodes.shift(); - // First check the current resources for blend modes. - var graphicStates = node.get('ExtGState'); - if (isDict(graphicStates)) { - var graphicStatesKeys = graphicStates.getKeys(); - for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) { - key = graphicStatesKeys[i]; - - var graphicState = graphicStates.get(key); - var bm = graphicState.get('BM'); - if (isName(bm) && bm.name !== 'Normal') { - return true; - } - } - } - // Descend into the XObjects to look for more resources and blend modes. - var xObjects = node.get('XObject'); - if (!isDict(xObjects)) { - continue; - } - var xObjectsKeys = xObjects.getKeys(); - for (i = 0, ii = xObjectsKeys.length; i < ii; i++) { - key = xObjectsKeys[i]; - - var xObject = xObjects.getRaw(key); - if (isRef(xObject)) { - if (processed[xObject.toString()]) { - // The XObject has already been processed, and by avoiding a - // redundant `xref.fetch` we can *significantly* reduce the load - // time for badly generated PDF files (fixes issue6961.pdf). - continue; - } - xObject = xref.fetch(xObject); - } - if (!isStream(xObject)) { - continue; - } - if (xObject.dict.objId) { - if (processed[xObject.dict.objId]) { - // stream has objId and is processed already - continue; - } - processed[xObject.dict.objId] = true; - } - var xResources = xObject.dict.get('Resources'); - // Checking objId to detect an infinite loop. - if (isDict(xResources) && - (!xResources.objId || !processed[xResources.objId])) { - nodes.push(xResources); - if (xResources.objId) { - processed[xResources.objId] = true; - } - } - } - } - return false; - }, - - buildFormXObject: function PartialEvaluator_buildFormXObject(resources, - xobj, smask, - operatorList, - task, - initialState) { - var matrix = xobj.dict.getArray('Matrix'); - var bbox = xobj.dict.getArray('BBox'); - var group = xobj.dict.get('Group'); - if (group) { - var groupOptions = { - matrix: matrix, - bbox: bbox, - smask: smask, - isolated: false, - knockout: false - }; - - var groupSubtype = group.get('S'); - var colorSpace; - if (isName(groupSubtype, 'Transparency')) { - groupOptions.isolated = (group.get('I') || false); - groupOptions.knockout = (group.get('K') || false); - colorSpace = (group.has('CS') ? - ColorSpace.parse(group.get('CS'), this.xref, resources) : null); - } - - if (smask && smask.backdrop) { - colorSpace = colorSpace || ColorSpace.singletons.rgb; - smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); - } - - operatorList.addOp(OPS.beginGroup, [groupOptions]); - } - - operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); - - return this.getOperatorList(xobj, task, - (xobj.dict.get('Resources') || resources), operatorList, initialState). - then(function () { - operatorList.addOp(OPS.paintFormXObjectEnd, []); - - if (group) { - operatorList.addOp(OPS.endGroup, [groupOptions]); - } - }); - }, - - buildPaintImageXObject: - function PartialEvaluator_buildPaintImageXObject(resources, image, - inline, operatorList, - cacheKey, imageCache) { - var self = this; - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - if (!(w && isNum(w)) || !(h && isNum(h))) { - warn('Image dimensions are missing, or not numbers.'); - return; - } - var maxImageSize = this.options.maxImageSize; - if (maxImageSize !== -1 && w * h > maxImageSize) { - warn('Image exceeded maximum allowed size and was removed.'); - return; - } - - var imageMask = (dict.get('ImageMask', 'IM') || false); - var imgData, args; - if (imageMask) { - // This depends on a tmpCanvas being filled with the - // current fillStyle, such that processing the pixel - // data can't be done here. Instead of creating a - // complete PDFImage, only read the information needed - // for later. - - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = (width + 7) >> 3; - var imgArray = image.getBytes(bitStrideLength * height); - var decode = dict.getArray('Decode', 'D'); - var inverseDecode = (!!decode && decode[0] > 0); - - imgData = PDFImage.createMask(imgArray, width, height, - image instanceof DecodeStream, - inverseDecode); - imgData.cached = true; - args = [imgData]; - operatorList.addOp(OPS.paintImageMaskXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageMaskXObject, - args: args - }; - } - return; - } - - var softMask = (dict.get('SMask', 'SM') || false); - var mask = (dict.get('Mask') || false); - - var SMALL_IMAGE_DIMENSIONS = 200; - // Inlining small images into the queue as RGB data - if (inline && !softMask && !mask && !(image instanceof JpegStream) && - (w + h) < SMALL_IMAGE_DIMENSIONS) { - var imageObj = new PDFImage(this.xref, resources, image, - inline, null, null); - // We force the use of RGBA_32BPP images here, because we can't handle - // any other kind. - imgData = imageObj.createImageData(/* forceRGBA = */ true); - operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var uniquePrefix = (this.uniquePrefix || ''); - var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); - operatorList.addDependency(objId); - args = [objId, w, h]; - - if (!softMask && !mask && image instanceof JpegStream && - NativeImageDecoder.isSupported(image, this.xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - operatorList.addOp(OPS.paintJpegXObject, args); - this.handler.send('obj', - [objId, this.pageIndex, 'JpegStream', - image.getIR(this.options.forceDataSchema)]); - return; - } - - // Creates native image decoder only if a JPEG image or mask is present. - var nativeImageDecoder = null; - if (image instanceof JpegStream || mask instanceof JpegStream || - softMask instanceof JpegStream) { - nativeImageDecoder = new NativeImageDecoder(self.xref, resources, - self.handler, self.options.forceDataSchema); - } - - PDFImage.buildImage(self.handler, self.xref, resources, image, inline, - nativeImageDecoder). - then(function(imageObj) { - var imgData = imageObj.createImageData(/* forceRGBA = */ false); - self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData], - [imgData.data.buffer]); - }).then(undefined, function (reason) { - warn('Unable to decode image: ' + reason); - self.handler.send('obj', [objId, self.pageIndex, 'Image', null]); - }); - - operatorList.addOp(OPS.paintImageXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageXObject, - args: args - }; - } - }, - - handleSMask: function PartialEvaluator_handleSmask(smask, resources, - operatorList, task, - stateManager) { - var smaskContent = smask.get('G'); - var smaskOptions = { - subtype: smask.get('S').name, - backdrop: smask.get('BC') - }; - - // The SMask might have a alpha/luminosity value transfer function -- - // we will build a map of integer values in range 0..255 to be fast. - var transferObj = smask.get('TR'); - if (isPDFFunction(transferObj)) { - var transferFn = PDFFunction.parse(this.xref, transferObj); - var transferMap = new Uint8Array(256); - var tmp = new Float32Array(1); - for (var i = 0; i < 256; i++) { - tmp[0] = i / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[i] = (tmp[0] * 255) | 0; - } - smaskOptions.transferMap = transferMap; - } - - return this.buildFormXObject(resources, smaskContent, smaskOptions, - operatorList, task, stateManager.state.clone()); - }, - - handleTilingType: - function PartialEvaluator_handleTilingType(fn, args, resources, - pattern, patternDict, - operatorList, task) { - // Create an IR of the pattern code. - var tilingOpList = new OperatorList(); - // Merge the available resources, to prevent issues when the patternDict - // is missing some /Resources entries (fixes issue6541.pdf). - var resourcesArray = [patternDict.get('Resources'), resources]; - var patternResources = Dict.merge(this.xref, resourcesArray); - - return this.getOperatorList(pattern, task, patternResources, - tilingOpList).then(function () { - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - operatorList.addDependencies(tilingOpList.dependencies); - operatorList.addOp(fn, getTilingPatternIR({ - fnArray: tilingOpList.fnArray, - argsArray: tilingOpList.argsArray - }, patternDict, args)); - }); - }, - - handleSetFont: - function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, - operatorList, task, state) { - // TODO(mack): Not needed? - var fontName; - if (fontArgs) { - fontArgs = fontArgs.slice(); - fontName = fontArgs[0].name; - } - - var self = this; - return this.loadFont(fontName, fontRef, this.xref, resources).then( - function (translated) { - if (!translated.font.isType3Font) { - return translated; - } - return translated.loadType3Data(self, resources, operatorList, task). - then(function () { - return translated; - }, function (reason) { - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - return new TranslatedFont('g_font_error', - new ErrorFont('Type3 font load error: ' + reason), translated.font); - }); - }).then(function (translated) { - state.font = translated.font; - translated.send(self.handler); - return translated.loadedName; - }); - }, - - handleText: function PartialEvaluator_handleText(chars, state) { - var font = state.font; - var glyphs = font.charsToGlyphs(chars); - var isAddToPathSet = !!(state.textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - if (font.data && (isAddToPathSet || this.options.disableFontFace)) { - var buildPath = function (fontChar) { - if (!font.renderer.hasBuiltPath(fontChar)) { - var path = font.renderer.getPathJs(fontChar); - this.handler.send('commonobj', [ - font.loadedName + '_path_' + fontChar, - 'FontPath', - path - ]); - } - }.bind(this); - - for (var i = 0, ii = glyphs.length; i < ii; i++) { - var glyph = glyphs[i]; - buildPath(glyph.fontChar); - - // If the glyph has an accent we need to build a path for its - // fontChar too, otherwise CanvasGraphics_paintChar will fail. - var accent = glyph.accent; - if (accent && accent.fontChar) { - buildPath(accent.fontChar); - } - } - } - - return glyphs; - }, - - setGState: function PartialEvaluator_setGState(resources, gState, - operatorList, task, - xref, stateManager) { - // This array holds the converted/processed state data. - var gStateObj = []; - var gStateKeys = gState.getKeys(); - var self = this; - var promise = Promise.resolve(); - for (var i = 0, ii = gStateKeys.length; i < ii; i++) { - var key = gStateKeys[i]; - var value = gState.get(key); - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gStateObj.push([key, value]); - break; - case 'Font': - promise = promise.then(function () { - return self.handleSetFont(resources, null, value[0], operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - gStateObj.push([key, [loadedName, value[1]]]); - }); - }); - break; - case 'BM': - gStateObj.push([key, value]); - break; - case 'SMask': - if (isName(value, 'None')) { - gStateObj.push([key, false]); - break; - } - if (isDict(value)) { - promise = promise.then(function (dict) { - return self.handleSMask(dict, resources, operatorList, - task, stateManager); - }.bind(this, value)); - gStateObj.push([key, true]); - } else { - warn('Unsupported SMask type'); - } - - break; - // Only generate info log messages for the following since - // they are unlikely to have a big impact on the rendering. - case 'OP': - case 'op': - case 'OPM': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - case 'TR': - case 'TR2': - case 'HT': - case 'SM': - case 'SA': - case 'AIS': - case 'TK': - // TODO implement these operators. - info('graphic state operator ' + key); - break; - default: - info('Unknown graphic state operator ' + key); - break; - } - } - return promise.then(function () { - if (gStateObj.length > 0) { - operatorList.addOp(OPS.setGState, [gStateObj]); - } - }); - }, - - loadFont: function PartialEvaluator_loadFont(fontName, font, xref, - resources) { - - function errorFont() { - return Promise.resolve(new TranslatedFont('g_font_error', - new ErrorFont('Font ' + fontName + ' is not available'), font)); - } - var fontRef; - if (font) { // Loading by ref. - assert(isRef(font)); - fontRef = font; - } else { // Loading by name. - var fontRes = resources.get('Font'); - if (fontRes) { - fontRef = fontRes.getRaw(fontName); - } else { - warn('fontRes not available'); - return errorFont(); - } - } - if (!fontRef) { - warn('fontRef not available'); - return errorFont(); - } - - if (this.fontCache.has(fontRef)) { - return this.fontCache.get(fontRef); - } - - font = xref.fetchIfRef(fontRef); - if (!isDict(font)) { - return errorFont(); - } - - // We are holding `font.translated` references just for `fontRef`s that - // are not actually `Ref`s, but rather `Dict`s. See explanation below. - if (font.translated) { - return font.translated; - } - - var fontCapability = createPromiseCapability(); - - var preEvaluatedFont = this.preEvaluateFont(font, xref); - var descriptor = preEvaluatedFont.descriptor; - - var fontRefIsRef = isRef(fontRef), fontID; - if (fontRefIsRef) { - fontID = fontRef.toString(); - } - - if (isDict(descriptor)) { - if (!descriptor.fontAliases) { - descriptor.fontAliases = Object.create(null); - } - - var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; - if (fontAliases[hash]) { - var aliasFontRef = fontAliases[hash].aliasRef; - if (fontRefIsRef && aliasFontRef && - this.fontCache.has(aliasFontRef)) { - this.fontCache.putAlias(fontRef, aliasFontRef); - return this.fontCache.get(fontRef); - } - } else { - fontAliases[hash] = { - fontID: Font.getFontID() - }; - } - - if (fontRefIsRef) { - fontAliases[hash].aliasRef = fontRef; - } - fontID = fontAliases[hash].fontID; - } - - // Workaround for bad PDF generators that reference fonts incorrectly, - // where `fontRef` is a `Dict` rather than a `Ref` (fixes bug946506.pdf). - // In this case we should not put the font into `this.fontCache` (which is - // a `RefSetCache`), since it's not meaningful to use a `Dict` as a key. - // - // However, if we don't cache the font it's not possible to remove it - // when `cleanup` is triggered from the API, which causes issues on - // subsequent rendering operations (see issue7403.pdf). - // A simple workaround would be to just not hold `font.translated` - // references in this case, but this would force us to unnecessarily load - // the same fonts over and over. - // - // Instead, we cheat a bit by attempting to use a modified `fontID` as a - // key in `this.fontCache`, to allow the font to be cached. - // NOTE: This works because `RefSetCache` calls `toString()` on provided - // keys. Also, since `fontRef` is used when getting cached fonts, - // we'll not accidentally match fonts cached with the `fontID`. - if (fontRefIsRef) { - this.fontCache.put(fontRef, fontCapability.promise); - } else { - if (!fontID) { - fontID = (this.uniquePrefix || 'F_') + (++this.idCounters.obj); - } - this.fontCache.put('id_' + fontID, fontCapability.promise); - } - assert(fontID, 'The "fontID" must be defined.'); - - // Keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page. - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID; - - font.translated = fontCapability.promise; - - // TODO move promises into translate font - var translatedPromise; - try { - translatedPromise = this.translateFont(preEvaluatedFont, xref); - } catch (e) { - translatedPromise = Promise.reject(e); - } - - var self = this; - translatedPromise.then(function (translatedFont) { - if (translatedFont.fontType !== undefined) { - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[translatedFont.fontType] = true; - } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - translatedFont, font)); - }, function (reason) { - // TODO fontCapability.reject? - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - - try { - // error, but it's still nice to have font type reported - var descriptor = preEvaluatedFont.descriptor; - var fontFile3 = descriptor && descriptor.get('FontFile3'); - var subtype = fontFile3 && fontFile3.get('Subtype'); - var fontType = getFontType(preEvaluatedFont.type, - subtype && subtype.name); - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[fontType] = true; - } catch (ex) { } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - new ErrorFont(reason instanceof Error ? reason.message : reason), - font)); - }); - return fontCapability.promise; - }, - - buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { - var lastIndex = operatorList.length - 1; - if (!args) { - args = []; - } - if (lastIndex < 0 || - operatorList.fnArray[lastIndex] !== OPS.constructPath) { - operatorList.addOp(OPS.constructPath, [[fn], args]); - } else { - var opArgs = operatorList.argsArray[lastIndex]; - opArgs[0].push(fn); - Array.prototype.push.apply(opArgs[1], args); - } - }, - - handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, - cs, patterns, resources, task, xref) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - var pattern; - if (isName(patternName) && - (pattern = patterns.get(patternName.name))) { - var dict = (isStream(pattern) ? pattern.dict : pattern); - var typeNum = dict.get('PatternType'); - - if (typeNum === TILING_PATTERN) { - var color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, - dict, operatorList, task); - } else if (typeNum === SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.getArray('Matrix'); - pattern = Pattern.parseShading(shading, matrix, xref, resources, - this.handler); - operatorList.addOp(fn, pattern.getIR()); - return Promise.resolve(); - } else { - return Promise.reject('Unknown PatternType: ' + typeNum); - } - } - // TODO shall we fail here? - operatorList.addOp(fn, args); - return Promise.resolve(); - }, - - getOperatorList: function PartialEvaluator_getOperatorList(stream, - task, - resources, - operatorList, - initialState) { - - var self = this; - var xref = this.xref; - var imageCache = Object.create(null); - - assert(operatorList); - - resources = (resources || Dict.empty); - var xobjs = (resources.get('XObject') || Dict.empty); - var patterns = (resources.get('Pattern') || Dict.empty); - var stateManager = new StateManager(initialState || new EvalState()); - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function promiseBody(resolve, reject) { - var next = function (promise) { - promise.then(function () { - try { - promiseBody(resolve, reject); - } catch (ex) { - reject(ex); - } - }, reject); - }; - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, i, ii, cs; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are used beyond this loop, so we - // cannot reuse the same array on each iteration. Therefore we pass - // in |null| as the initial value (see the comment on - // EvaluatorPreprocessor_read() for why). - operation.args = null; - if (!(preprocessor.read(operation))) { - break; - } - var args = operation.args; - var fn = operation.fn; - - switch (fn | 0) { - case OPS.paintXObject: - if (args[0].code) { - break; - } - // eagerly compile XForm objects - var name = args[0].name; - if (!name) { - warn('XObject must be referred to by name.'); - continue; - } - if (imageCache[name] !== undefined) { - operatorList.addOp(imageCache[name].fn, imageCache[name].args); - args = null; - continue; - } - - var xobj = xobjs.get(name); - if (xobj) { - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), 'XObject should have a Name subtype'); - - if (type.name === 'Form') { - stateManager.save(); - next(self.buildFormXObject(resources, xobj, null, - operatorList, task, - stateManager.state.clone()). - then(function () { - stateManager.restore(); - })); - return; - } else if (type.name === 'Image') { - self.buildPaintImageXObject(resources, xobj, false, - operatorList, name, imageCache); - args = null; - continue; - } else if (type.name === 'PS') { - // PostScript XObjects are unused when viewing documents. - // See section 4.7.1 of Adobe's PDF reference. - info('Ignored XObject subtype PS'); - continue; - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - break; - case OPS.setFont: - var fontSize = args[1]; - // eagerly collect all fonts - next(self.handleSetFont(resources, args, null, operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - operatorList.addOp(OPS.setFont, [loadedName, fontSize]); - })); - return; - case OPS.endInlineImage: - var cacheKey = args[0].cacheKey; - if (cacheKey) { - var cacheEntry = imageCache[cacheKey]; - if (cacheEntry !== undefined) { - operatorList.addOp(cacheEntry.fn, cacheEntry.args); - args = null; - continue; - } - } - self.buildPaintImageXObject(resources, args[0], true, - operatorList, cacheKey, imageCache); - args = null; - continue; - case OPS.showText: - args[0] = self.handleText(args[0], stateManager.state); - break; - case OPS.showSpacedText: - var arr = args[0]; - var combinedGlyphs = []; - var arrLength = arr.length; - var state = stateManager.state; - for (i = 0; i < arrLength; ++i) { - var arrItem = arr[i]; - if (isString(arrItem)) { - Array.prototype.push.apply(combinedGlyphs, - self.handleText(arrItem, state)); - } else if (isNum(arrItem)) { - combinedGlyphs.push(arrItem); - } - } - args[0] = combinedGlyphs; - fn = OPS.showText; - break; - case OPS.nextLineShowText: - operatorList.addOp(OPS.nextLine); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.nextLineSetSpacingShowText: - operatorList.addOp(OPS.nextLine); - operatorList.addOp(OPS.setWordSpacing, [args.shift()]); - operatorList.addOp(OPS.setCharSpacing, [args.shift()]); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.setTextRenderingMode: - stateManager.state.textRenderingMode = args[0]; - break; - - case OPS.setFillColorSpace: - stateManager.state.fillColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setStrokeColorSpace: - stateManager.state.strokeColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setFillColor: - cs = stateManager.state.fillColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColor: - cs = stateManager.state.strokeColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; - if (cs.name === 'Pattern') { - next(self.handleColorN(operatorList, OPS.setFillColorN, args, - cs, patterns, resources, task, xref)); - return; - } - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; - if (cs.name === 'Pattern') { - next(self.handleColorN(operatorList, OPS.setStrokeColorN, args, - cs, patterns, resources, task, xref)); - return; - } - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - - case OPS.shadingFill: - var shadingRes = resources.get('Shading'); - if (!shadingRes) { - error('No shading resource found'); - } - - var shading = shadingRes.get(args[0].name); - if (!shading) { - error('No shading object found'); - } - - var shadingFill = Pattern.parseShading(shading, null, xref, - resources, self.handler); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = OPS.shadingFill; - break; - case OPS.setGState: - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gState = extGState.get(dictName.name); - next(self.setGState(resources, gState, operatorList, task, xref, - stateManager)); - return; - case OPS.moveTo: - case OPS.lineTo: - case OPS.curveTo: - case OPS.curveTo2: - case OPS.curveTo3: - case OPS.closePath: - self.buildPath(operatorList, fn, args); - continue; - case OPS.rectangle: - self.buildPath(operatorList, fn, args); - continue; - case OPS.markPoint: - case OPS.markPointProps: - case OPS.beginMarkedContent: - case OPS.beginMarkedContentProps: - case OPS.endMarkedContent: - case OPS.beginCompat: - case OPS.endCompat: - // Ignore operators where the corresponding handlers are known to - // be no-op in CanvasGraphics (display/canvas.js). This prevents - // serialization errors and is also a bit more efficient. - // We could also try to serialize all objects in a general way, - // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266, - // but doing so is meaningless without knowing the semantics. - continue; - default: - // Note: Ignore the operator if it has `Dict` arguments, since - // those are non-serializable, otherwise postMessage will throw - // "An object could not be cloned.". - if (args !== null) { - for (i = 0, ii = args.length; i < ii; i++) { - if (args[i] instanceof Dict) { - break; - } - } - if (i < ii) { - warn('getOperatorList - ignoring operator: ' + fn); - continue; - } - } - } - operatorList.addOp(fn, args); - } - if (stop) { - next(deferred); - return; - } - // Some PDFs don't close all restores inside object/form. - // Closing those for them. - for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { - operatorList.addOp(OPS.restore, []); - } - resolve(); - }); - }, - - getTextContent: - function PartialEvaluator_getTextContent(stream, task, resources, - stateManager, - normalizeWhitespace, - combineTextItems) { - - stateManager = (stateManager || new StateManager(new TextState())); - - var WhitespaceRegexp = /\s/g; - - var textContent = { - items: [], - styles: Object.create(null) - }; - var textContentItem = { - initialized: false, - str: [], - width: 0, - height: 0, - vertical: false, - lastAdvanceWidth: 0, - lastAdvanceHeight: 0, - textAdvanceScale: 0, - spaceWidth: 0, - fakeSpaceMin: Infinity, - fakeMultiSpaceMin: Infinity, - fakeMultiSpaceMax: -0, - textRunBreakAllowed: false, - transform: null, - fontName: null - }; - var SPACE_FACTOR = 0.3; - var MULTI_SPACE_FACTOR = 1.5; - var MULTI_SPACE_FACTOR_MAX = 4; - - var self = this; - var xref = this.xref; - - resources = (xref.fetchIfRef(resources) || Dict.empty); - - // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd. - var xobjs = null; - var xobjsCache = Object.create(null); - - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - - var textState; - - function ensureTextContentItem() { - if (textContentItem.initialized) { - return textContentItem; - } - var font = textState.font; - if (!(font.loadedName in textContent.styles)) { - textContent.styles[font.loadedName] = { - fontFamily: font.fallbackName, - ascent: font.ascent, - descent: font.descent, - vertical: font.vertical - }; - } - textContentItem.fontName = font.loadedName; - - // 9.4.4 Text Space Details - var tsm = [textState.fontSize * textState.textHScale, 0, - 0, textState.fontSize, - 0, textState.textRise]; - - if (font.isType3Font && - textState.fontMatrix !== FONT_IDENTITY_MATRIX && - textState.fontSize === 1) { - var glyphHeight = font.bbox[3] - font.bbox[1]; - if (glyphHeight > 0) { - glyphHeight = glyphHeight * textState.fontMatrix[3]; - tsm[3] *= glyphHeight; - } - } - - var trm = Util.transform(textState.ctm, - Util.transform(textState.textMatrix, tsm)); - textContentItem.transform = trm; - if (!font.vertical) { - textContentItem.width = 0; - textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); - textContentItem.vertical = false; - } else { - textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); - textContentItem.height = 0; - textContentItem.vertical = true; - } - - var a = textState.textLineMatrix[0]; - var b = textState.textLineMatrix[1]; - var scaleLineX = Math.sqrt(a * a + b * b); - a = textState.ctm[0]; - b = textState.ctm[1]; - var scaleCtmX = Math.sqrt(a * a + b * b); - textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - textContentItem.lastAdvanceWidth = 0; - textContentItem.lastAdvanceHeight = 0; - - var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; - if (spaceWidth) { - textContentItem.spaceWidth = spaceWidth; - textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; - textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; - textContentItem.fakeMultiSpaceMax = - spaceWidth * MULTI_SPACE_FACTOR_MAX; - // It's okay for monospace fonts to fake as much space as needed. - textContentItem.textRunBreakAllowed = !font.isMonospace; - } else { - textContentItem.spaceWidth = 0; - textContentItem.fakeSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMax = 0; - textContentItem.textRunBreakAllowed = false; - } - - - textContentItem.initialized = true; - return textContentItem; - } - - function replaceWhitespace(str) { - // Replaces all whitespaces with standard spaces (0x20), to avoid - // alignment issues between the textLayer and the canvas if the text - // contains e.g. tabs (fixes issue6612.pdf). - var i = 0, ii = str.length, code; - while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { - i++; - } - return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); - } - - function runBidiTransform(textChunk) { - var str = textChunk.str.join(''); - var bidiResult = bidi(str, -1, textChunk.vertical); - return { - str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : - bidiResult.str), - dir: bidiResult.dir, - width: textChunk.width, - height: textChunk.height, - transform: textChunk.transform, - fontName: textChunk.fontName - }; - } - - function handleSetFont(fontName, fontRef) { - return self.loadFont(fontName, fontRef, xref, resources). - then(function (translated) { - textState.font = translated.font; - textState.fontMatrix = translated.font.fontMatrix || - FONT_IDENTITY_MATRIX; - }); - } - - function buildTextContentItem(chars) { - var font = textState.font; - var textChunk = ensureTextContentItem(); - var width = 0; - var height = 0; - var glyphs = font.charsToGlyphs(chars); - var defaultVMetrics = font.defaultVMetrics; - for (var i = 0; i < glyphs.length; i++) { - var glyph = glyphs[i]; - var vMetricX = null; - var vMetricY = null; - var glyphWidth = null; - if (font.vertical) { - if (glyph.vmetric) { - glyphWidth = glyph.vmetric[0]; - vMetricX = glyph.vmetric[1]; - vMetricY = glyph.vmetric[2]; - } else { - glyphWidth = glyph.width; - vMetricX = glyph.width * 0.5; - vMetricY = defaultVMetrics[2]; - } - } else { - glyphWidth = glyph.width; - } - - var glyphUnicode = glyph.unicode; - var NormalizedUnicodes = getNormalizedUnicodes(); - if (NormalizedUnicodes[glyphUnicode] !== undefined) { - glyphUnicode = NormalizedUnicodes[glyphUnicode]; - } - glyphUnicode = reverseIfRtl(glyphUnicode); - - // The following will calculate the x and y of the individual glyphs. - // if (font.vertical) { - // tsm[4] -= vMetricX * Math.abs(textState.fontSize) * - // textState.fontMatrix[0]; - // tsm[5] -= vMetricY * textState.fontSize * - // textState.fontMatrix[0]; - // } - // var trm = Util.transform(textState.textMatrix, tsm); - // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm); - // var x = pt[0]; - // var y = pt[1]; - - var charSpacing = textState.charSpacing; - if (glyph.isSpace) { - var wordSpacing = textState.wordSpacing; - charSpacing += wordSpacing; - if (wordSpacing > 0) { - addFakeSpaces(wordSpacing, textChunk.str); - } - } - - var tx = 0; - var ty = 0; - if (!font.vertical) { - var w0 = glyphWidth * textState.fontMatrix[0]; - tx = (w0 * textState.fontSize + charSpacing) * - textState.textHScale; - width += tx; - } else { - var w1 = glyphWidth * textState.fontMatrix[0]; - ty = w1 * textState.fontSize + charSpacing; - height += ty; - } - textState.translateTextMatrix(tx, ty); - - textChunk.str.push(glyphUnicode); - } - - if (!font.vertical) { - textChunk.lastAdvanceWidth = width; - textChunk.width += width * textChunk.textAdvanceScale; - } else { - textChunk.lastAdvanceHeight = height; - textChunk.height += Math.abs(height * textChunk.textAdvanceScale); - } - - return textChunk; - } - - function addFakeSpaces(width, strBuf) { - if (width < textContentItem.fakeSpaceMin) { - return; - } - if (width < textContentItem.fakeMultiSpaceMin) { - strBuf.push(' '); - return; - } - var fakeSpaces = Math.round(width / textContentItem.spaceWidth); - while (fakeSpaces-- > 0) { - strBuf.push(' '); - } - } - - function flushTextContentItem() { - if (!textContentItem.initialized) { - return; - } - textContent.items.push(runBidiTransform(textContentItem)); - - textContentItem.initialized = false; - textContentItem.str.length = 0; - } - - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function promiseBody(resolve, reject) { - var next = function (promise) { - promise.then(function () { - try { - promiseBody(resolve, reject); - } catch (ex) { - reject(ex); - } - }, reject); - }; - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, args = []; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are not used beyond this loop, so - // we can reuse the same array on every iteration, thus avoiding - // unnecessary allocations. - args.length = 0; - operation.args = args; - if (!(preprocessor.read(operation))) { - break; - } - textState = stateManager.state; - var fn = operation.fn; - args = operation.args; - var advance, diff; - - switch (fn | 0) { - case OPS.setFont: - // Optimization to ignore multiple identical Tf commands. - var fontNameArg = args[0].name, fontSizeArg = args[1]; - if (textState.font && fontNameArg === textState.fontName && - fontSizeArg === textState.fontSize) { - break; - } - - flushTextContentItem(); - textState.fontName = fontNameArg; - textState.fontSize = fontSizeArg; - next(handleSetFont(fontNameArg, null)); - return; - case OPS.setTextRise: - flushTextContentItem(); - textState.textRise = args[0]; - break; - case OPS.setHScale: - flushTextContentItem(); - textState.textHScale = args[0] / 100; - break; - case OPS.setLeading: - flushTextContentItem(); - textState.leading = args[0]; - break; - case OPS.moveText: - // Optimization to treat same line movement as advance - var isSameTextLine = !textState.font ? false : - ((textState.font.vertical ? args[0] : args[1]) === 0); - advance = args[0] - args[1]; - if (combineTextItems && - isSameTextLine && textContentItem.initialized && - advance > 0 && - advance <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(args[0], args[1]); - textContentItem.width += - (args[0] - textContentItem.lastAdvanceWidth); - textContentItem.height += - (args[1] - textContentItem.lastAdvanceHeight); - diff = (args[0] - textContentItem.lastAdvanceWidth) - - (args[1] - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.setLeadingMoveText: - flushTextContentItem(); - textState.leading = -args[1]; - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.nextLine: - flushTextContentItem(); - textState.carriageReturn(); - break; - case OPS.setTextMatrix: - // Optimization to treat same line movement as advance. - advance = textState.calcTextLineMatrixAdvance( - args[0], args[1], args[2], args[3], args[4], args[5]); - if (combineTextItems && - advance !== null && textContentItem.initialized && - advance.value > 0 && - advance.value <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(advance.width, - advance.height); - textContentItem.width += - (advance.width - textContentItem.lastAdvanceWidth); - textContentItem.height += - (advance.height - textContentItem.lastAdvanceHeight); - diff = (advance.width - textContentItem.lastAdvanceWidth) - - (advance.height - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.setTextMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - textState.setTextLineMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.setCharSpacing: - textState.charSpacing = args[0]; - break; - case OPS.setWordSpacing: - textState.wordSpacing = args[0]; - break; - case OPS.beginText: - flushTextContentItem(); - textState.textMatrix = IDENTITY_MATRIX.slice(); - textState.textLineMatrix = IDENTITY_MATRIX.slice(); - break; - case OPS.showSpacedText: - var items = args[0]; - var offset; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - buildTextContentItem(items[j]); - } else { - ensureTextContentItem(); - - // PDF Specification 5.3.2 states: - // The number is expressed in thousandths of a unit of text - // space. - // This amount is subtracted from the current horizontal or - // vertical coordinate, depending on the writing mode. - // In the default coordinate system, a positive adjustment - // has the effect of moving the next glyph painted either to - // the left or down by the given amount. - advance = items[j] * textState.fontSize / 1000; - var breakTextRun = false; - if (textState.font.vertical) { - offset = advance * - (textState.textHScale * textState.textMatrix[2] + - textState.textMatrix[3]); - textState.translateTextMatrix(0, advance); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be added to height to paint down. - textContentItem.height += offset; - } - } else { - advance = -advance; - offset = advance * ( - textState.textHScale * textState.textMatrix[0] + - textState.textMatrix[1]); - textState.translateTextMatrix(advance, 0); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be subtracted from width to paint left. - textContentItem.width += offset; - } - } - if (breakTextRun) { - flushTextContentItem(); - } else if (advance > 0) { - addFakeSpaces(advance, textContentItem.str); - } - } - } - break; - case OPS.showText: - buildTextContentItem(args[0]); - break; - case OPS.nextLineShowText: - flushTextContentItem(); - textState.carriageReturn(); - buildTextContentItem(args[0]); - break; - case OPS.nextLineSetSpacingShowText: - flushTextContentItem(); - textState.wordSpacing = args[0]; - textState.charSpacing = args[1]; - textState.carriageReturn(); - buildTextContentItem(args[2]); - break; - case OPS.paintXObject: - flushTextContentItem(); - if (args[0].code) { - break; - } - - if (!xobjs) { - xobjs = (resources.get('XObject') || Dict.empty); - } - - var name = args[0].name; - if (xobjsCache.key === name) { - if (xobjsCache.texts) { - Util.appendToArray(textContent.items, xobjsCache.texts.items); - Util.extendObj(textContent.styles, xobjsCache.texts.styles); - } - break; - } - - var xobj = xobjs.get(name); - if (!xobj) { - break; - } - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), 'XObject should have a Name subtype'); - - if ('Form' !== type.name) { - xobjsCache.key = name; - xobjsCache.texts = null; - break; - } - - stateManager.save(); - var matrix = xobj.dict.getArray('Matrix'); - if (isArray(matrix) && matrix.length === 6) { - stateManager.transform(matrix); - } - - next(self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager, - normalizeWhitespace, combineTextItems).then( - function (formTextContent) { - Util.appendToArray(textContent.items, formTextContent.items); - Util.extendObj(textContent.styles, formTextContent.styles); - stateManager.restore(); - - xobjsCache.key = name; - xobjsCache.texts = formTextContent; - })); - return; - case OPS.setGState: - flushTextContentItem(); - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !isName(dictName)) { - break; - } - var gState = extGState.get(dictName.name); - if (!isDict(gState)) { - break; - } - var gStateFont = gState.get('Font'); - if (gStateFont) { - textState.fontName = null; - textState.fontSize = gStateFont[1]; - next(handleSetFont(null, gStateFont[0])); - return; - } - break; - } // switch - } // while - if (stop) { - next(deferred); - return; - } - flushTextContentItem(); - resolve(textContent); - }); - }, - - extractDataStructures: - function PartialEvaluator_extractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); - var toUnicodePromise = toUnicode ? - this.readToUnicode(toUnicode) : Promise.resolve(undefined); - - if (properties.composite) { - // CIDSystemInfo helps to match CID to glyphs - var cidSystemInfo = dict.get('CIDSystemInfo'); - if (isDict(cidSystemInfo)) { - properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), - supplement: cidSystemInfo.get('Supplement') - }; - } - - var cidToGidMap = dict.get('CIDToGIDMap'); - if (isStream(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); - } - } - - // Based on 9.6.6 of the spec the encoding can come from multiple places - // and depends on the font type. The base encoding and differences are - // read here, but the encoding that is actually used is chosen during - // glyph mapping in the font. - // TODO: Loading the built in encoding in the font would allow the - // differences to be merged in here not require us to hold on to it. - var differences = []; - var baseEncodingName = null; - var encoding; - if (dict.has('Encoding')) { - encoding = dict.get('Encoding'); - if (isDict(encoding)) { - baseEncodingName = encoding.get('BaseEncoding'); - baseEncodingName = (isName(baseEncodingName) ? - baseEncodingName.name : null); - // Load the differences between the base and original - if (encoding.has('Differences')) { - var diffEncoding = encoding.get('Differences'); - var index = 0; - for (var j = 0, jj = diffEncoding.length; j < jj; j++) { - var data = xref.fetchIfRef(diffEncoding[j]); - if (isNum(data)) { - index = data; - } else if (isName(data)) { - differences[index++] = data.name; - } else { - error('Invalid entry in \'Differences\' array: ' + data); - } - } - } - } else if (isName(encoding)) { - baseEncodingName = encoding.name; - } else { - error('Encoding is not a Name nor a Dict'); - } - // According to table 114 if the encoding is a named encoding it must be - // one of these predefined encodings. - if ((baseEncodingName !== 'MacRomanEncoding' && - baseEncodingName !== 'MacExpertEncoding' && - baseEncodingName !== 'WinAnsiEncoding')) { - baseEncodingName = null; - } - } - - if (baseEncodingName) { - properties.defaultEncoding = getEncoding(baseEncodingName).slice(); - } else { - encoding = (properties.type === 'TrueType' ? - WinAnsiEncoding : StandardEncoding); - // The Symbolic attribute can be misused for regular fonts - // Heuristic: we have to check if the font is a standard one also - if (!!(properties.flags & FontFlags.Symbolic)) { - encoding = MacRomanEncoding; - if (!properties.file) { - if (/Symbol/i.test(properties.name)) { - encoding = SymbolSetEncoding; - } else if (/Dingbats/i.test(properties.name)) { - encoding = ZapfDingbatsEncoding; - } - } - } - properties.defaultEncoding = encoding; - } - - properties.differences = differences; - properties.baseEncodingName = baseEncodingName; - properties.hasEncoding = !!baseEncodingName || differences.length > 0; - properties.dict = dict; - return toUnicodePromise.then(function(toUnicode) { - properties.toUnicode = toUnicode; - return this.buildToUnicode(properties); - }.bind(this)).then(function (toUnicode) { - properties.toUnicode = toUnicode; - return properties; - }); - }, - - /** - * Builds a char code to unicode map based on section 9.10 of the spec. - * @param {Object} properties Font properties object. - * @return {Promise} A Promise that is resolved with a - * {ToUnicodeMap|IdentityToUnicodeMap} object. - */ - buildToUnicode: function PartialEvaluator_buildToUnicode(properties) { - properties.hasIncludedToUnicodeMap = - !!properties.toUnicode && properties.toUnicode.length > 0; - // Section 9.10.2 Mapping Character Codes to Unicode Values - if (properties.hasIncludedToUnicodeMap) { - return Promise.resolve(properties.toUnicode); - } - // According to the spec if the font is a simple font we should only map - // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or - // the differences array only contains adobe standard or symbol set names, - // in pratice it seems better to always try to create a toUnicode - // map based of the default encoding. - var toUnicode, charcode, glyphName; - if (!properties.composite /* is simple font */) { - toUnicode = []; - var encoding = properties.defaultEncoding.slice(); - var baseEncodingName = properties.baseEncodingName; - // Merge in the differences array. - var differences = properties.differences; - for (charcode in differences) { - glyphName = differences[charcode]; - if (glyphName === '.notdef') { - // Skip .notdef to prevent rendering errors, e.g. boxes appearing - // where there should be spaces (fixes issue5256.pdf). - continue; - } - encoding[charcode] = glyphName; - } - var glyphsUnicodeMap = getGlyphsUnicode(); - for (charcode in encoding) { - // a) Map the character code to a character name. - glyphName = encoding[charcode]; - // b) Look up the character name in the Adobe Glyph List (see the - // Bibliography) to obtain the corresponding Unicode value. - if (glyphName === '') { - continue; - } else if (glyphsUnicodeMap[glyphName] === undefined) { - // (undocumented) c) Few heuristics to recognize unknown glyphs - // NOTE: Adobe Reader does not do this step, but OSX Preview does - var code = 0; - switch (glyphName[0]) { - case 'G': // Gxx glyph - if (glyphName.length === 3) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'g': // g00xx glyph - if (glyphName.length === 5) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'C': // Cddd glyph - case 'c': // cddd glyph - if (glyphName.length >= 3) { - code = +glyphName.substr(1); - } - break; - default: - // 'uniXXXX'/'uXXXX{XX}' glyphs - var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap); - if (unicode !== -1) { - code = unicode; - } - } - if (code) { - // If |baseEncodingName| is one the predefined encodings, - // and |code| equals |charcode|, using the glyph defined in the - // baseEncoding seems to yield a better |toUnicode| mapping - // (fixes issue 5070). - if (baseEncodingName && code === +charcode) { - var baseEncoding = getEncoding(baseEncodingName); - if (baseEncoding && (glyphName = baseEncoding[charcode])) { - toUnicode[charcode] = - String.fromCharCode(glyphsUnicodeMap[glyphName]); - continue; - } - } - toUnicode[charcode] = String.fromCharCode(code); - } - continue; - } - toUnicode[charcode] = - String.fromCharCode(glyphsUnicodeMap[glyphName]); - } - return Promise.resolve(new ToUnicodeMap(toUnicode)); - } - // If the font is a composite font that uses one of the predefined CMaps - // listed in Table 118 (except Identity–H and Identity–V) or whose - // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or - // Adobe-Korea1 character collection: - if (properties.composite && ( - (properties.cMap.builtInCMap && - !(properties.cMap instanceof IdentityCMap)) || - (properties.cidSystemInfo.registry === 'Adobe' && - (properties.cidSystemInfo.ordering === 'GB1' || - properties.cidSystemInfo.ordering === 'CNS1' || - properties.cidSystemInfo.ordering === 'Japan1' || - properties.cidSystemInfo.ordering === 'Korea1')))) { - // Then: - // a) Map the character code to a character identifier (CID) according - // to the font’s CMap. - // b) Obtain the registry and ordering of the character collection used - // by the font’s CMap (for example, Adobe and Japan1) from its - // CIDSystemInfo dictionary. - var registry = properties.cidSystemInfo.registry; - var ordering = properties.cidSystemInfo.ordering; - // c) Construct a second CMap name by concatenating the registry and - // ordering obtained in step (b) in the format registry–ordering–UCS2 - // (for example, Adobe–Japan1–UCS2). - var ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2'); - // d) Obtain the CMap with the name constructed in step (c) (available - // from the ASN Web site; see the Bibliography). - return CMapFactory.create(ucs2CMapName, this.options.cMapOptions, - null).then( - function (ucs2CMap) { - var cMap = properties.cMap; - toUnicode = []; - cMap.forEach(function(charcode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - // e) Map the CID obtained in step (a) according to the CMap - // obtained in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.lookup(cid); - if (ucs2) { - toUnicode[charcode] = - String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } - }); - return new ToUnicodeMap(toUnicode); - }); - } - - // The viewer's choice, just use an identity map. - return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar, - properties.lastChar)); - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmapObj = toUnicode; - if (isName(cmapObj)) { - return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then( - function (cmap) { - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - return new ToUnicodeMap(cmap.getMap()); - }); - } else if (isStream(cmapObj)) { - return CMapFactory.create(cmapObj, this.options.cMapOptions, null).then( - function (cmap) { - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - var map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) - // to iterate over all keys. - cmap.forEach(function(charCode, token) { - var str = []; - for (var k = 0; k < token.length; k += 2) { - var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCharCode.apply(String, str); - }); - return new ToUnicodeMap(map); - }); - } - return Promise.resolve(null); - }, - - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); - - // Set encoding 0 to later verify the font has an encoding - var result = []; - for (var j = 0, jj = glyphsData.length; j < jj; j++) { - var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID === 0) { - continue; - } - var code = j >> 1; - result[code] = glyphID; - } - return result; - }, - - extractWidths: function PartialEvaluator_extractWidths(dict, xref, - descriptor, - properties) { - var glyphsWidths = []; - var defaultWidth = 0; - var glyphsVMetrics = []; - var defaultVMetrics; - var i, ii, j, jj, start, code, widths; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - widths = dict.get('W'); - if (widths) { - for (i = 0, ii = widths.length; i < ii; i++) { - start = widths[i++]; - code = xref.fetchIfRef(widths[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsWidths[start++] = code[j]; - } - } else { - var width = widths[++i]; - for (j = start; j <= code; j++) { - glyphsWidths[j] = width; - } - } - } - } - - if (properties.vertical) { - var vmetrics = (dict.get('DW2') || [880, -1000]); - defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; - vmetrics = dict.get('W2'); - if (vmetrics) { - for (i = 0, ii = vmetrics.length; i < ii; i++) { - start = vmetrics[i++]; - code = xref.fetchIfRef(vmetrics[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsVMetrics[start++] = [code[j++], code[j++], code[j]]; - } - } else { - var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]]; - for (j = start; j <= code; j++) { - glyphsVMetrics[j] = vmetric; - } - } - } - } - } - } else { - var firstChar = properties.firstChar; - widths = dict.get('Widths'); - if (widths) { - j = firstChar; - for (i = 0, ii = widths.length; i < ii; i++) { - glyphsWidths[j++] = widths[i]; - } - defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0); - } else { - // Trying get the BaseFont metrics (see comment above). - var baseFontName = dict.get('BaseFont'); - if (isName(baseFontName)) { - var metrics = this.getBaseFontMetrics(baseFontName.name); - - glyphsWidths = this.buildCharCodeToWidth(metrics.widths, - properties); - defaultWidth = metrics.defaultWidth; - } - } - } - - // Heuristic: detection of monospace font by checking all non-zero widths - var isMonospace = true; - var firstWidth = defaultWidth; - for (var glyph in glyphsWidths) { - var glyphWidth = glyphsWidths[glyph]; - if (!glyphWidth) { - continue; - } - if (!firstWidth) { - firstWidth = glyphWidth; - continue; - } - if (firstWidth !== glyphWidth) { - isMonospace = false; - break; - } - } - if (isMonospace) { - properties.flags |= FontFlags.FixedPitch; - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - properties.defaultVMetrics = defaultVMetrics; - properties.vmetrics = glyphsVMetrics; - }, - - isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - return (fontNameWoStyle in getSerifFonts()) || - (fontNameWoStyle.search(/serif/gi) !== -1); - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0; - var widths = []; - var monospace = false; - var stdFontMap = getStdFontMap(); - var lookupName = (stdFontMap[name] || name); - var Metrics = getMetrics(); - - if (!(lookupName in Metrics)) { - // Use default fonts for looking up font metrics if the passed - // font is not a base font - if (this.isSerifFont(name)) { - lookupName = 'Times-Roman'; - } else { - lookupName = 'Helvetica'; - } - } - var glyphWidths = Metrics[lookupName]; - - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - monospace = true; - } else { - widths = glyphWidths(); // expand lazy widths array - } - - return { - defaultWidth: defaultWidth, - monospace: monospace, - widths: widths - }; - }, - - buildCharCodeToWidth: - function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, - properties) { - var widths = Object.create(null); - var differences = properties.differences; - var encoding = properties.defaultEncoding; - for (var charCode = 0; charCode < 256; charCode++) { - if (charCode in differences && - widthsByGlyphName[differences[charCode]]) { - widths[charCode] = widthsByGlyphName[differences[charCode]]; - continue; - } - if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { - widths[charCode] = widthsByGlyphName[encoding[charCode]]; - continue; - } - } - return widths; - }, - - preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { - var baseDict = dict; - var type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - - var composite = false; - var uint8array; - if (type.name === 'Type0') { - // If font is a composite - // - get the descendant font - // - set the type according to the descendant font - // - get the FontDescriptor from the descendant font - var df = dict.get('DescendantFonts'); - if (!df) { - error('Descendant fonts are not specified'); - } - dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df); - - type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - composite = true; - } - - var descriptor = dict.get('FontDescriptor'); - if (descriptor) { - var hash = new MurmurHash3_64(); - var encoding = baseDict.getRaw('Encoding'); - if (isName(encoding)) { - hash.update(encoding.name); - } else if (isRef(encoding)) { - hash.update(encoding.toString()); - } else if (isDict(encoding)) { - var keys = encoding.getKeys(); - for (var i = 0, ii = keys.length; i < ii; i++) { - var entry = encoding.getRaw(keys[i]); - if (isName(entry)) { - hash.update(entry.name); - } else if (isRef(entry)) { - hash.update(entry.toString()); - } else if (isArray(entry)) { // 'Differences' entry. - // Ideally we should check the contents of the array, but to avoid - // parsing it here and then again in |extractDataStructures|, - // we only use the array length for now (fixes bug1157493.pdf). - hash.update(entry.length.toString()); - } - } - } - - var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); - if (isStream(toUnicode)) { - var stream = toUnicode.str || toUnicode; - uint8array = stream.buffer ? - new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : - new Uint8Array(stream.bytes.buffer, - stream.start, stream.end - stream.start); - hash.update(uint8array); - - } else if (isName(toUnicode)) { - hash.update(toUnicode.name); - } - - var widths = dict.get('Widths') || baseDict.get('Widths'); - if (widths) { - uint8array = new Uint8Array(new Uint32Array(widths).buffer); - hash.update(uint8array); - } - } - - return { - descriptor: descriptor, - dict: dict, - baseDict: baseDict, - composite: composite, - type: type.name, - hash: hash ? hash.hexdigest() : '' - }; - }, - - translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, - xref) { - var baseDict = preEvaluatedFont.baseDict; - var dict = preEvaluatedFont.dict; - var composite = preEvaluatedFont.composite; - var descriptor = preEvaluatedFont.descriptor; - var type = preEvaluatedFont.type; - var maxCharIndex = (composite ? 0xFFFF : 0xFF); - var cMapOptions = this.options.cMapOptions; - var properties; - - if (!descriptor) { - if (type === 'Type3') { - // FontDescriptor is only required for Type3 fonts when the document - // is a tagged pdf. Create a barbebones one to get by. - descriptor = new Dict(null); - descriptor.set('FontName', Name.get(type)); - descriptor.set('FontBBox', dict.getArray('FontBBox')); - } else { - // Before PDF 1.5 if the font was one of the base 14 fonts, having a - // FontDescriptor was not required. - // This case is here for compatibility. - var baseFontName = dict.get('BaseFont'); - if (!isName(baseFontName)) { - error('Base font is not specified'); - } - - // Using base font name as a font name. - baseFontName = baseFontName.name.replace(/[,_]/g, '-'); - var metrics = this.getBaseFontMetrics(baseFontName); - - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - var flags = - (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | - (metrics.monospace ? FontFlags.FixedPitch : 0) | - (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - properties = { - type: type, - name: baseFontName, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - return this.extractDataStructures(dict, dict, xref, properties).then( - function (properties) { - properties.widths = this.buildCharCodeToWidth(metrics.widths, - properties); - return new Font(baseFontName, null, properties); - }.bind(this)); - } - } - - // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem - // to ignore this rule when a variant of a standard font is used. - // TODO Fill the width array depending on which of the base font this is - // a variant. - var firstChar = (dict.get('FirstChar') || 0); - var lastChar = (dict.get('LastChar') || maxCharIndex); - - var fontName = descriptor.get('FontName'); - var baseFont = dict.get('BaseFont'); - // Some bad PDFs have a string as the font name. - if (isString(fontName)) { - fontName = Name.get(fontName); - } - if (isString(baseFont)) { - baseFont = Name.get(baseFont); - } - - if (type !== 'Type3') { - var fontNameStr = fontName && fontName.name; - var baseFontStr = baseFont && baseFont.name; - if (fontNameStr !== baseFontStr) { - info('The FontDescriptor\'s FontName is "' + fontNameStr + - '" but should be the same as the Font\'s BaseFont "' + - baseFontStr + '"'); - // Workaround for cases where e.g. fontNameStr = 'Arial' and - // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). - if (fontNameStr && baseFontStr && - baseFontStr.indexOf(fontNameStr) === 0) { - fontName = baseFont; - } - } - } - fontName = (fontName || baseFont); - - assert(isName(fontName), 'invalid font name'); - - var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); - if (fontFile) { - if (fontFile.dict) { - var subtype = fontFile.dict.get('Subtype'); - if (subtype) { - subtype = subtype.name; - } - var length1 = fontFile.dict.get('Length1'); - var length2 = fontFile.dict.get('Length2'); - var length3 = fontFile.dict.get('Length3'); - } - } - - properties = { - type: type, - name: fontName.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - length3: length3, - loadedName: baseDict.loadedName, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: (dict.getArray('FontMatrix') || FONT_IDENTITY_MATRIX), - firstChar: firstChar || 0, - lastChar: (lastChar || maxCharIndex), - bbox: descriptor.getArray('FontBBox'), - ascent: descriptor.get('Ascent'), - descent: descriptor.get('Descent'), - xHeight: descriptor.get('XHeight'), - capHeight: descriptor.get('CapHeight'), - flags: descriptor.get('Flags'), - italicAngle: descriptor.get('ItalicAngle'), - coded: false - }; - - var cMapPromise; - if (composite) { - var cidEncoding = baseDict.get('Encoding'); - if (isName(cidEncoding)) { - properties.cidEncoding = cidEncoding.name; - } - cMapPromise = CMapFactory.create(cidEncoding, cMapOptions, null).then( - function (cMap) { - properties.cMap = cMap; - properties.vertical = properties.cMap.vertical; - }); - } else { - cMapPromise = Promise.resolve(undefined); - } - - return cMapPromise.then(function () { - return this.extractDataStructures(dict, baseDict, xref, properties); - }.bind(this)).then(function (properties) { - this.extractWidths(dict, xref, descriptor, properties); - - if (type === 'Type3') { - properties.isType3Font = true; - } - - return new Font(fontName.name, fontFile, properties); - }.bind(this)); - } - }; - - return PartialEvaluator; -})(); - -var TranslatedFont = (function TranslatedFontClosure() { - function TranslatedFont(loadedName, font, dict) { - this.loadedName = loadedName; - this.font = font; - this.dict = dict; - this.type3Loaded = null; - this.sent = false; - } - TranslatedFont.prototype = { - send: function (handler) { - if (this.sent) { - return; - } - var fontData = this.font.exportData(); - handler.send('commonobj', [ - this.loadedName, - 'Font', - fontData - ]); - this.sent = true; - }, - loadType3Data: function (evaluator, resources, parentOperatorList, task) { - assert(this.font.isType3Font); - - if (this.type3Loaded) { - return this.type3Loaded; - } - - var translatedFont = this.font; - var loadCharProcsPromise = Promise.resolve(); - var charProcs = this.dict.get('CharProcs'); - var fontResources = this.dict.get('Resources') || resources; - var charProcKeys = charProcs.getKeys(); - var charProcOperatorList = Object.create(null); - for (var i = 0, n = charProcKeys.length; i < n; ++i) { - loadCharProcsPromise = loadCharProcsPromise.then(function (key) { - var glyphStream = charProcs.get(key); - var operatorList = new OperatorList(); - return evaluator.getOperatorList(glyphStream, task, fontResources, - operatorList).then(function () { - charProcOperatorList[key] = operatorList.getIR(); - - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - parentOperatorList.addDependencies(operatorList.dependencies); - }, function (reason) { - warn('Type3 font resource \"' + key + '\" is not available'); - var operatorList = new OperatorList(); - charProcOperatorList[key] = operatorList.getIR(); - }); - }.bind(this, charProcKeys[i])); - } - this.type3Loaded = loadCharProcsPromise.then(function () { - translatedFont.charProcOperatorList = charProcOperatorList; - }); - return this.type3Loaded; - } - }; - return TranslatedFont; -})(); - -var OperatorList = (function OperatorListClosure() { - var CHUNK_SIZE = 1000; - var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size - - function getTransfers(queue) { - var transfers = []; - var fnArray = queue.fnArray, argsArray = queue.argsArray; - for (var i = 0, ii = queue.length; i < ii; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - var arg = argsArray[i][0]; // first param in imgData - if (!arg.cached) { - transfers.push(arg.data.buffer); - } - break; - } - } - return transfers; - } - - function OperatorList(intent, messageHandler, pageIndex) { - this.messageHandler = messageHandler; - this.fnArray = []; - this.argsArray = []; - this.dependencies = Object.create(null); - this._totalLength = 0; - this.pageIndex = pageIndex; - this.intent = intent; - } - - OperatorList.prototype = { - get length() { - return this.argsArray.length; - }, - - /** - * @returns {number} The total length of the entire operator list, - * since `this.length === 0` after flushing. - */ - get totalLength() { - return (this._totalLength + this.length); - }, - - addOp: function(fn, args) { - this.fnArray.push(fn); - this.argsArray.push(args); - if (this.messageHandler) { - if (this.fnArray.length >= CHUNK_SIZE) { - this.flush(); - } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && - (fn === OPS.restore || fn === OPS.endText)) { - // heuristic to flush on boundary of restore or endText - this.flush(); - } - } - }, - - addDependency: function(dependency) { - if (dependency in this.dependencies) { - return; - } - this.dependencies[dependency] = true; - this.addOp(OPS.dependency, [dependency]); - }, - - addDependencies: function(dependencies) { - for (var key in dependencies) { - this.addDependency(key); - } - }, - - addOpList: function(opList) { - Util.extendObj(this.dependencies, opList.dependencies); - for (var i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - }, - - getIR: function() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - }, - - flush: function(lastChunk) { - if (this.intent !== 'oplist') { - new QueueOptimizer().optimize(this); - } - var transfers = getTransfers(this); - var length = this.length; - this._totalLength += length; - - this.messageHandler.send('RenderPageChunk', { - operatorList: { - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk: lastChunk, - length: length - }, - pageIndex: this.pageIndex, - intent: this.intent - }, transfers); - this.dependencies = Object.create(null); - this.fnArray.length = 0; - this.argsArray.length = 0; - } - }; - - return OperatorList; -})(); - -var StateManager = (function StateManagerClosure() { - function StateManager(initialState) { - this.state = initialState; - this.stateStack = []; - } - StateManager.prototype = { - save: function () { - var old = this.state; - this.stateStack.push(this.state); - this.state = old.clone(); - }, - restore: function () { - var prev = this.stateStack.pop(); - if (prev) { - this.state = prev; - } - }, - transform: function (args) { - this.state.ctm = Util.transform(this.state.ctm, args); - } - }; - return StateManager; -})(); - -var TextState = (function TextStateClosure() { - function TextState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontName = null; - this.fontSize = 0; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - - TextState.prototype = { - setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textLineMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - translateTextMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textLineMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - calcTextLineMatrixAdvance: - function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) { - var font = this.font; - if (!font) { - return null; - } - var m = this.textLineMatrix; - if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) { - return null; - } - var txDiff = e - m[4], tyDiff = f - m[5]; - if ((font.vertical && txDiff !== 0) || (!font.vertical && tyDiff !== 0)) { - return null; - } - var tx, ty, denominator = a * d - b * c; - if (font.vertical) { - tx = -tyDiff * c / denominator; - ty = tyDiff * a / denominator; - } else { - tx = txDiff * d / denominator; - ty = -txDiff * b / denominator; - } - return { width: tx, height: ty, value: (font.vertical ? ty : tx), }; - }, - calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { - // 9.4.4 Text Space Details - var tsm = [this.fontSize * this.textHScale, 0, - 0, this.fontSize, - 0, this.textRise]; - return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); - }, - carriageReturn: function TextState_carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - }, - clone: function TextState_clone() { - var clone = Object.create(this); - clone.textMatrix = this.textMatrix.slice(); - clone.textLineMatrix = this.textLineMatrix.slice(); - clone.fontMatrix = this.fontMatrix.slice(); - return clone; - } - }; - return TextState; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; - } - EvalState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - }; - return EvalState; -})(); - -var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { - // Specifies properties for each command - // - // If variableArgs === true: [0, `numArgs`] expected - // If variableArgs === false: exactly `numArgs` expected - var getOPMap = getLookupTableFactory(function (t) { - // Graphic state - t['w'] = { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }; - t['J'] = { id: OPS.setLineCap, numArgs: 1, variableArgs: false }; - t['j'] = { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }; - t['M'] = { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }; - t['d'] = { id: OPS.setDash, numArgs: 2, variableArgs: false }; - t['ri'] = { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }; - t['i'] = { id: OPS.setFlatness, numArgs: 1, variableArgs: false }; - t['gs'] = { id: OPS.setGState, numArgs: 1, variableArgs: false }; - t['q'] = { id: OPS.save, numArgs: 0, variableArgs: false }; - t['Q'] = { id: OPS.restore, numArgs: 0, variableArgs: false }; - t['cm'] = { id: OPS.transform, numArgs: 6, variableArgs: false }; - - // Path - t['m'] = { id: OPS.moveTo, numArgs: 2, variableArgs: false }; - t['l'] = { id: OPS.lineTo, numArgs: 2, variableArgs: false }; - t['c'] = { id: OPS.curveTo, numArgs: 6, variableArgs: false }; - t['v'] = { id: OPS.curveTo2, numArgs: 4, variableArgs: false }; - t['y'] = { id: OPS.curveTo3, numArgs: 4, variableArgs: false }; - t['h'] = { id: OPS.closePath, numArgs: 0, variableArgs: false }; - t['re'] = { id: OPS.rectangle, numArgs: 4, variableArgs: false }; - t['S'] = { id: OPS.stroke, numArgs: 0, variableArgs: false }; - t['s'] = { id: OPS.closeStroke, numArgs: 0, variableArgs: false }; - t['f'] = { id: OPS.fill, numArgs: 0, variableArgs: false }; - t['F'] = { id: OPS.fill, numArgs: 0, variableArgs: false }; - t['f*'] = { id: OPS.eoFill, numArgs: 0, variableArgs: false }; - t['B'] = { id: OPS.fillStroke, numArgs: 0, variableArgs: false }; - t['B*'] = { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }; - t['b'] = { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }; - t['b*'] = { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }; - t['n'] = { id: OPS.endPath, numArgs: 0, variableArgs: false }; - - // Clipping - t['W'] = { id: OPS.clip, numArgs: 0, variableArgs: false }; - t['W*'] = { id: OPS.eoClip, numArgs: 0, variableArgs: false }; - - // Text - t['BT'] = { id: OPS.beginText, numArgs: 0, variableArgs: false }; - t['ET'] = { id: OPS.endText, numArgs: 0, variableArgs: false }; - t['Tc'] = { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }; - t['Tw'] = { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }; - t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false }; - t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false }; - t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false }; - t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }; - t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false }; - t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false }; - t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }; - t['Tm'] = { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }; - t['T*'] = { id: OPS.nextLine, numArgs: 0, variableArgs: false }; - t['Tj'] = { id: OPS.showText, numArgs: 1, variableArgs: false }; - t['TJ'] = { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }; - t['\''] = { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }; - t['"'] = { id: OPS.nextLineSetSpacingShowText, numArgs: 3, - variableArgs: false }; - - // Type3 fonts - t['d0'] = { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }; - t['d1'] = { id: OPS.setCharWidthAndBounds, numArgs: 6, - variableArgs: false }; - - // Color - t['CS'] = { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }; - t['cs'] = { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }; - t['SC'] = { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }; - t['SCN'] = { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }; - t['sc'] = { id: OPS.setFillColor, numArgs: 4, variableArgs: true }; - t['scn'] = { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }; - t['G'] = { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }; - t['g'] = { id: OPS.setFillGray, numArgs: 1, variableArgs: false }; - t['RG'] = { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }; - t['rg'] = { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }; - t['K'] = { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }; - t['k'] = { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }; - - // Shading - t['sh'] = { id: OPS.shadingFill, numArgs: 1, variableArgs: false }; - - // Images - t['BI'] = { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }; - t['ID'] = { id: OPS.beginImageData, numArgs: 0, variableArgs: false }; - t['EI'] = { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }; - - // XObjects - t['Do'] = { id: OPS.paintXObject, numArgs: 1, variableArgs: false }; - t['MP'] = { id: OPS.markPoint, numArgs: 1, variableArgs: false }; - t['DP'] = { id: OPS.markPointProps, numArgs: 2, variableArgs: false }; - t['BMC'] = { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }; - t['BDC'] = { id: OPS.beginMarkedContentProps, numArgs: 2, - variableArgs: false }; - t['EMC'] = { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }; - - // Compatibility - t['BX'] = { id: OPS.beginCompat, numArgs: 0, variableArgs: false }; - t['EX'] = { id: OPS.endCompat, numArgs: 0, variableArgs: false }; - - // (reserved partial commands for the lexer) - t['BM'] = null; - t['BD'] = null; - t['true'] = null; - t['fa'] = null; - t['fal'] = null; - t['fals'] = null; - t['false'] = null; - t['nu'] = null; - t['nul'] = null; - t['null'] = null; - }); - - function EvaluatorPreprocessor(stream, xref, stateManager) { - this.opMap = getOPMap(); - // TODO(mduan): pass array of knownCommands rather than this.opMap - // dictionary - this.parser = new Parser(new Lexer(stream, this.opMap), false, xref); - this.stateManager = stateManager; - this.nonProcessedArgs = []; - } - - EvaluatorPreprocessor.prototype = { - get savedStatesDepth() { - return this.stateManager.stateStack.length; - }, - - // |operation| is an object with two fields: - // - // - |fn| is an out param. - // - // - |args| is an inout param. On entry, it should have one of two values. - // - // - An empty array. This indicates that the caller is providing the - // array in which the args will be stored in. The caller should use - // this value if it can reuse a single array for each call to read(). - // - // - |null|. This indicates that the caller needs this function to create - // the array in which any args are stored in. If there are zero args, - // this function will leave |operation.args| as |null| (thus avoiding - // allocations that would occur if we used an empty array to represent - // zero arguments). Otherwise, it will replace |null| with a new array - // containing the arguments. The caller should use this value if it - // cannot reuse an array for each call to read(). - // - // These two modes are present because this function is very hot and so - // avoiding allocations where possible is worthwhile. - // - read: function EvaluatorPreprocessor_read(operation) { - var args = operation.args; - while (true) { - var obj = this.parser.getObj(); - if (isCmd(obj)) { - var cmd = obj.cmd; - // Check that the command is valid - var opSpec = this.opMap[cmd]; - if (!opSpec) { - warn('Unknown command "' + cmd + '"'); - continue; - } - - var fn = opSpec.id; - var numArgs = opSpec.numArgs; - var argsLength = args !== null ? args.length : 0; - - if (!opSpec.variableArgs) { - // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf - if (argsLength !== numArgs) { - var nonProcessedArgs = this.nonProcessedArgs; - while (argsLength > numArgs) { - nonProcessedArgs.push(args.shift()); - argsLength--; - } - while (argsLength < numArgs && nonProcessedArgs.length !== 0) { - if (!args) { - args = []; - } - args.unshift(nonProcessedArgs.pop()); - argsLength++; - } - } - - if (argsLength < numArgs) { - // If we receive too few args, it's not possible to possible - // to execute the command, so skip the command - info('Command ' + fn + ': because expected ' + - numArgs + ' args, but received ' + argsLength + - ' args; skipping'); - args = null; - continue; - } - } else if (argsLength > numArgs) { - info('Command ' + fn + ': expected [0,' + numArgs + - '] args, but received ' + argsLength + ' args'); - } - - // TODO figure out how to type-check vararg functions - this.preprocessCommand(fn, args); - - operation.fn = fn; - operation.args = args; - return true; - } else { - if (isEOF(obj)) { - return false; // no more commands - } - // argument - if (obj !== null) { - if (!args) { - args = []; - } - args.push(obj); - assert(args.length <= 33, 'Too many arguments'); - } - } - } - }, - - preprocessCommand: - function EvaluatorPreprocessor_preprocessCommand(fn, args) { - switch (fn | 0) { - case OPS.save: - this.stateManager.save(); - break; - case OPS.restore: - this.stateManager.restore(); - break; - case OPS.transform: - this.stateManager.transform(args); - break; - } - } - }; - return EvaluatorPreprocessor; -})(); - -var QueueOptimizer = (function QueueOptimizerClosure() { - function addState(parentState, pattern, fn) { - var state = parentState; - for (var i = 0, ii = pattern.length - 1; i < ii; i++) { - var item = pattern[i]; - state = (state[item] || (state[item] = [])); - } - state[pattern[pattern.length - 1]] = fn; - } - - function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray) { - // Handles special case of mainly LaTeX documents which use image masks to - // draw lines with the current fill style. - // 'count' groups of (save, transform, paintImageMaskXObject, restore)+ - // have been found at iFirstSave. - var iFirstPIMXO = iFirstSave + 2; - for (var i = 0; i < count; i++) { - var arg = argsArray[iFirstPIMXO + 4 * i]; - var imageMask = arg.length === 1 && arg[0]; - if (imageMask && imageMask.width === 1 && imageMask.height === 1 && - (!imageMask.data.length || - (imageMask.data.length === 1 && imageMask.data[0] === 0))) { - fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; - continue; - } - break; - } - return count - i; - } - - var InitialState = []; - - // This replaces (save, transform, paintInlineImageXObject, restore)+ - // sequences with one |paintInlineImageXObjectGroup| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], - function foundInlineImageGroup(context) { - var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - var MAX_WIDTH = 1000; - var IMAGE_PADDING = 1; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIIXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintInlineImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, - MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i; - } - - // assuming that heights of those image is too small (~1 pixel) - // packing as much as possible by lines - var maxX = 0; - var map = [], maxLineHeight = 0; - var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; - var q; - for (q = 0; q < count; q++) { - var transform = argsArray[iFirstTransform + (q << 2)]; - var img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - // starting new line - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform: transform, - x: currentX, y: currentY, - w: img.width, h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - var imgData = new Uint8Array(imgWidth * imgHeight * 4); - var imgRowSize = imgWidth << 2; - for (q = 0; q < count; q++) { - var data = argsArray[iFirstPIIXO + (q << 2)][0].data; - // Copy image by lines and extends pixels into padding. - var rowSize = map[q].w << 2; - var dataOffset = 0; - var offset = (map[q].x + map[q].y * imgWidth) << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (var k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, - [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP, - data: imgData }, map]); - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageMaskXObject, restore)+ - // sequences with one |paintImageMaskXObjectGroup| or one - // |paintImageMaskXObjectRepeat| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], - function foundImageMaskGroup(context) { - var MIN_IMAGES_IN_MASKS_BLOCK = 10; - var MAX_IMAGES_IN_MASKS_BLOCK = 100; - var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIMXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageMaskXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = (i - iFirstSave) / 4; - count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i; - } - - var q; - var isSameImage = false; - var iTransform, transformArgs; - var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - if (argsArray[iFirstTransform][1] === 0 && - argsArray[iFirstTransform][2] === 0) { - isSameImage = true; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - iTransform = iFirstTransform + 4; - var iPIMXO = iFirstPIMXO + 4; - for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || - transformArgs[0] !== firstTransformArg0 || - transformArgs[1] !== 0 || - transformArgs[2] !== 0 || - transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; // different image or transform - } - } - } - - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - var positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, - [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - var images = []; - for (q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ data: maskParams.data, width: maskParams.width, - height: maskParams.height, - transform: transformArgs }); - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageXObject, restore)+ sequences - // with one paintImageXObjectRepeat operation, if the |transform| and - // |paintImageXObjectRepeat| ops are appropriate. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], - function (context) { - var MIN_IMAGES_IN_BLOCK = 3; - var MAX_IMAGES_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIXO = curr - 1; - var iFirstRestore = curr; - - if (argsArray[iFirstTransform][1] !== 0 || - argsArray[iFirstTransform][2] !== 0) { - return iFirstRestore + 1; // transform has the wrong form - } - - // Look for the quartets. - var firstPIXOArg0 = argsArray[iFirstPIXO][0]; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstTransformArg0 || - argsArray[i + 1][1] !== 0 || - argsArray[i + 1][2] !== 0 || - argsArray[i + 1][3] !== firstTransformArg3) { - break; // transforms don't match - } - if (argsArray[i + 2][0] !== firstPIXOArg0) { - break; // images don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i; - } - - // Extract the (x,y) positions from all of the matching transforms. - var positions = new Float32Array(count * 2); - var iTransform = iFirstTransform; - for (var q = 0; q < count; q++, iTransform += 4) { - var transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, - positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - - return iFirstSave + 1; - }); - - // This replaces (beginText, setFont, setTextMatrix, showText, endText)+ - // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+ - // sequences, if the font for each one is the same. - addState(InitialState, - [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], - function (context) { - var MIN_CHARS_IN_BLOCK = 3; - var MAX_CHARS_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstBeginText = curr - 4; - var iFirstSetFont = curr - 3; - var iFirstSetTextMatrix = curr - 2; - var iFirstShowText = curr - 1; - var iFirstEndText = curr; - - // Look for the quintets. - var firstSetFontArg0 = argsArray[iFirstSetFont][0]; - var firstSetFontArg1 = argsArray[iFirstSetFont][1]; - var i = iFirstBeginText + 5; - var ii = fnArray.length; - while (i + 4 < ii) { - if (fnArray[i] !== OPS.beginText || - fnArray[i + 1] !== OPS.setFont || - fnArray[i + 2] !== OPS.setTextMatrix || - fnArray[i + 3] !== OPS.showText || - fnArray[i + 4] !== OPS.endText) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstSetFontArg0 || - argsArray[i + 1][1] !== firstSetFontArg1) { - break; // fonts don't match - } - i += 5; - } - - // At this point, i is the index of the first op past the last valid - // quintet. - var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i; - } - - // If the preceding quintet is (, setFont, setTextMatrix, - // showText, endText), include that as well. (E.g. might be - // |dependency|.) - var iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && - fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && - fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && - fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && - fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && - argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && - argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - - // Remove (endText, beginText, setFont) trios. - var iEndText = iFirst + 4; - for (var q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - - return iEndText + 1; - }); - - function QueueOptimizer() {} - - QueueOptimizer.prototype = { - optimize: function QueueOptimizer_optimize(queue) { - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var context = { - iCurr: 0, - fnArray: fnArray, - argsArray: argsArray - }; - var state; - var i = 0, ii = fnArray.length; - while (i < ii) { - state = (state || InitialState)[fnArray[i]]; - if (typeof state === 'function') { // we found some handler - context.iCurr = i; - // state() returns the index of the first non-matching op (if we - // didn't match) or the first op past the modified ops (if we did - // match and replace). - i = state(context); - state = undefined; // reset the state machine - ii = context.fnArray.length; - } else { - i++; - } - } - } - }; - return QueueOptimizer; -})(); - -exports.OperatorList = OperatorList; -exports.PartialEvaluator = PartialEvaluator; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreAnnotation = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreColorSpace, - root.pdfjsCoreObj, root.pdfjsCoreEvaluator); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, - coreColorSpace, coreObj, coreEvaluator) { - -var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; -var AnnotationFieldFlag = sharedUtil.AnnotationFieldFlag; -var AnnotationFlag = sharedUtil.AnnotationFlag; -var AnnotationType = sharedUtil.AnnotationType; -var OPS = sharedUtil.OPS; -var Util = sharedUtil.Util; -var isBool = sharedUtil.isBool; -var isString = sharedUtil.isString; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isValidUrl = sharedUtil.isValidUrl; -var stringToBytes = sharedUtil.stringToBytes; -var stringToPDFString = sharedUtil.stringToPDFString; -var stringToUTF8String = sharedUtil.stringToUTF8String; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isRef = corePrimitives.isRef; -var Stream = coreStream.Stream; -var ColorSpace = coreColorSpace.ColorSpace; -var ObjectLoader = coreObj.ObjectLoader; -var FileSpec = coreObj.FileSpec; -var OperatorList = coreEvaluator.OperatorList; - -/** - * @class - * @alias AnnotationFactory - */ -function AnnotationFactory() {} -AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { - /** - * @param {XRef} xref - * @param {Object} ref - * @param {string} uniquePrefix - * @param {Object} idCounters - * @returns {Annotation} - */ - create: function AnnotationFactory_create(xref, ref, - uniquePrefix, idCounters) { - var dict = xref.fetchIfRef(ref); - if (!isDict(dict)) { - return; - } - var id = isRef(ref) ? ref.toString() : - 'annot_' + (uniquePrefix || '') + (++idCounters.obj); - - // Determine the annotation's subtype. - var subtype = dict.get('Subtype'); - subtype = isName(subtype) ? subtype.name : null; - - // Return the right annotation object based on the subtype and field type. - var parameters = { - xref: xref, - dict: dict, - ref: isRef(ref) ? ref : null, - subtype: subtype, - id: id, - }; - - switch (subtype) { - case 'Link': - return new LinkAnnotation(parameters); - - case 'Text': - return new TextAnnotation(parameters); - - case 'Widget': - var fieldType = Util.getInheritableProperty(dict, 'FT'); - fieldType = isName(fieldType) ? fieldType.name : null; - - switch (fieldType) { - case 'Tx': - return new TextWidgetAnnotation(parameters); - } - warn('Unimplemented widget field type "' + fieldType + '", ' + - 'falling back to base field type.'); - return new WidgetAnnotation(parameters); - - case 'Popup': - return new PopupAnnotation(parameters); - - case 'Highlight': - return new HighlightAnnotation(parameters); - - case 'Underline': - return new UnderlineAnnotation(parameters); - - case 'Squiggly': - return new SquigglyAnnotation(parameters); - - case 'StrikeOut': - return new StrikeOutAnnotation(parameters); - - case 'FileAttachment': - return new FileAttachmentAnnotation(parameters); - - default: - if (!subtype) { - warn('Annotation is missing the required /Subtype.'); - } else { - warn('Unimplemented annotation type "' + subtype + '", ' + - 'falling back to base annotation.'); - } - return new Annotation(parameters); - } - } -}; - -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); - } - } else { - appearance = appearances; - } - return appearance; - } - - function Annotation(params) { - var dict = params.dict; - - this.setFlags(dict.get('F')); - this.setRectangle(dict.getArray('Rect')); - this.setColor(dict.getArray('C')); - this.setBorderStyle(dict); - this.appearance = getDefaultAppearance(dict); - - // Expose public properties using a data object. - this.data = {}; - this.data.id = params.id; - this.data.subtype = params.subtype; - this.data.annotationFlags = this.flags; - this.data.rect = this.rectangle; - this.data.color = this.color; - this.data.borderStyle = this.borderStyle; - this.data.hasAppearance = !!this.appearance; - } - - Annotation.prototype = { - /** - * @private - */ - _hasFlag: function Annotation_hasFlag(flags, flag) { - return !!(flags & flag); - }, - - /** - * @private - */ - _isViewable: function Annotation_isViewable(flags) { - return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && - !this._hasFlag(flags, AnnotationFlag.HIDDEN) && - !this._hasFlag(flags, AnnotationFlag.NOVIEW); - }, - - /** - * @private - */ - _isPrintable: function AnnotationFlag_isPrintable(flags) { - return this._hasFlag(flags, AnnotationFlag.PRINT) && - !this._hasFlag(flags, AnnotationFlag.INVISIBLE) && - !this._hasFlag(flags, AnnotationFlag.HIDDEN); - }, - - /** - * @return {boolean} - */ - get viewable() { - if (this.flags === 0) { - return true; - } - return this._isViewable(this.flags); - }, - - /** - * @return {boolean} - */ - get printable() { - if (this.flags === 0) { - return false; - } - return this._isPrintable(this.flags); - }, - - /** - * Set the flags. - * - * @public - * @memberof Annotation - * @param {number} flags - Unsigned 32-bit integer specifying annotation - * characteristics - * @see {@link shared/util.js} - */ - setFlags: function Annotation_setFlags(flags) { - this.flags = (isInt(flags) && flags > 0) ? flags : 0; - }, - - /** - * Check if a provided flag is set. - * - * @public - * @memberof Annotation - * @param {number} flag - Hexadecimal representation for an annotation - * characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFlag: function Annotation_hasFlag(flag) { - return this._hasFlag(this.flags, flag); - }, - - /** - * Set the rectangle. - * - * @public - * @memberof Annotation - * @param {Array} rectangle - The rectangle array with exactly four entries - */ - setRectangle: function Annotation_setRectangle(rectangle) { - if (isArray(rectangle) && rectangle.length === 4) { - this.rectangle = Util.normalizeRect(rectangle); - } else { - this.rectangle = [0, 0, 0, 0]; - } - }, - - /** - * Set the color and take care of color space conversion. - * - * @public - * @memberof Annotation - * @param {Array} color - The color array containing either 0 - * (transparent), 1 (grayscale), 3 (RGB) or - * 4 (CMYK) elements - */ - setColor: function Annotation_setColor(color) { - var rgbColor = new Uint8Array(3); // Black in RGB color space (default) - if (!isArray(color)) { - this.color = rgbColor; - return; - } - - switch (color.length) { - case 0: // Transparent, which we indicate with a null value - this.color = null; - break; - - case 1: // Convert grayscale to RGB - ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 3: // Convert RGB percentages to RGB - ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 4: // Convert CMYK to RGB - ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - default: - this.color = rgbColor; - break; - } - }, - - /** - * Set the border style (as AnnotationBorderStyle object). - * - * @public - * @memberof Annotation - * @param {Dict} borderStyle - The border style dictionary - */ - setBorderStyle: function Annotation_setBorderStyle(borderStyle) { - this.borderStyle = new AnnotationBorderStyle(); - if (!isDict(borderStyle)) { - return; - } - if (borderStyle.has('BS')) { - var dict = borderStyle.get('BS'); - var dictType = dict.get('Type'); - - if (!dictType || isName(dictType, 'Border')) { - this.borderStyle.setWidth(dict.get('W')); - this.borderStyle.setStyle(dict.get('S')); - this.borderStyle.setDashArray(dict.getArray('D')); - } - } else if (borderStyle.has('Border')) { - var array = borderStyle.getArray('Border'); - if (isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2]); - - if (array.length === 4) { // Dash array available - this.borderStyle.setDashArray(array[3]); - } - } - } else { - // There are no border entries in the dictionary. According to the - // specification, we should draw a solid border of width 1 in that - // case, but Adobe Reader did not implement that part of the - // specification and instead draws no border at all, so we do the same. - // See also https://github.com/mozilla/pdf.js/issues/6179. - this.borderStyle.setWidth(0); - } - }, - - /** - * Prepare the annotation for working with a popup in the display layer. - * - * @private - * @memberof Annotation - * @param {Dict} dict - The annotation's data dictionary - */ - _preparePopup: function Annotation_preparePopup(dict) { - if (!dict.has('C')) { - // Fall back to the default background color. - this.data.color = null; - } - - this.data.hasPopup = dict.has('Popup'); - this.data.title = stringToPDFString(dict.get('T') || ''); - this.data.contents = stringToPDFString(dict.get('Contents') || ''); - }, - - loadResources: function Annotation_loadResources(keys) { - return new Promise(function (resolve, reject) { - this.appearance.dict.getAsync('Resources').then(function (resources) { - if (!resources) { - resolve(); - return; - } - var objectLoader = new ObjectLoader(resources.map, - keys, - resources.xref); - objectLoader.load().then(function() { - resolve(resources); - }, reject); - }, reject); - }.bind(this)); - }, - - getOperatorList: function Annotation_getOperatorList(evaluator, task, - renderForms) { - if (!this.appearance) { - return Promise.resolve(new OperatorList()); - } - - var data = this.data; - var appearanceDict = this.appearance.dict; - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'ColorSpace', - 'Pattern', - 'Shading', - 'XObject', - 'Font' - // ProcSet - // Properties - ]); - var bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1]; - var matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0 ,0]; - var transform = getTransformMatrix(data.rect, bbox, matrix); - var self = this; - - return resourcesPromise.then(function(resources) { - var opList = new OperatorList(); - opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]); - return evaluator.getOperatorList(self.appearance, task, - resources, opList). - then(function () { - opList.addOp(OPS.endAnnotation, []); - self.appearance.reset(); - return opList; - }); - }); - } - }; - - Annotation.appendToOperatorList = function Annotation_appendToOperatorList( - annotations, opList, partialEvaluator, task, intent, renderForms) { - var annotationPromises = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if ((intent === 'display' && annotations[i].viewable) || - (intent === 'print' && annotations[i].printable)) { - annotationPromises.push( - annotations[i].getOperatorList(partialEvaluator, task, renderForms)); - } - } - return Promise.all(annotationPromises).then(function(operatorLists) { - opList.addOp(OPS.beginAnnotations, []); - for (var i = 0, n = operatorLists.length; i < n; ++i) { - opList.addOpList(operatorLists[i]); - } - opList.addOp(OPS.endAnnotations, []); - }); - }; - - return Annotation; -})(); - -/** - * Contains all data regarding an annotation's border style. - * - * @class - */ -var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() { - /** - * @constructor - * @private - */ - function AnnotationBorderStyle() { - this.width = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } - - AnnotationBorderStyle.prototype = { - /** - * Set the width. - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} width - The width - */ - setWidth: function AnnotationBorderStyle_setWidth(width) { - if (width === (width | 0)) { - this.width = width; - } - }, - - /** - * Set the style. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Object} style - The style object - * @see {@link shared/util.js} - */ - setStyle: function AnnotationBorderStyle_setStyle(style) { - if (!style) { - return; - } - switch (style.name) { - case 'S': - this.style = AnnotationBorderStyleType.SOLID; - break; - - case 'D': - this.style = AnnotationBorderStyleType.DASHED; - break; - - case 'B': - this.style = AnnotationBorderStyleType.BEVELED; - break; - - case 'I': - this.style = AnnotationBorderStyleType.INSET; - break; - - case 'U': - this.style = AnnotationBorderStyleType.UNDERLINE; - break; - - default: - break; - } - }, - - /** - * Set the dash array. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Array} dashArray - The dash array with at least one element - */ - setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { - // We validate the dash array, but we do not use it because CSS does not - // allow us to change spacing of dashes. For more information, visit - // http://www.w3.org/TR/css3-background/#the-border-style. - if (isArray(dashArray) && dashArray.length > 0) { - // According to the PDF specification: the elements in a dashArray - // shall be numbers that are nonnegative and not all equal to zero. - var isValid = true; - var allZeros = true; - for (var i = 0, len = dashArray.length; i < len; i++) { - var element = dashArray[i]; - var validNumber = (+element >= 0); - if (!validNumber) { - isValid = false; - break; - } else if (element > 0) { - allZeros = false; - } - } - if (isValid && !allZeros) { - this.dashArray = dashArray; - } else { - this.width = 0; // Adobe behavior when the array is invalid. - } - } else if (dashArray) { - this.width = 0; // Adobe behavior when the array is invalid. - } - }, - - /** - * Set the horizontal corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The horizontal corner radius - */ - setHorizontalCornerRadius: - function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.horizontalCornerRadius = radius; - } - }, - - /** - * Set the vertical corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The vertical corner radius - */ - setVerticalCornerRadius: - function AnnotationBorderStyle_setVerticalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.verticalCornerRadius = radius; - } - } - }; - - return AnnotationBorderStyle; -})(); - -var WidgetAnnotation = (function WidgetAnnotationClosure() { - function WidgetAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - data.annotationType = AnnotationType.WIDGET; - 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 : null; - this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; - - data.fieldFlags = Util.getInheritableProperty(dict, 'Ff'); - if (!isInt(data.fieldFlags) || data.fieldFlags < 0) { - data.fieldFlags = 0; - } - - // Hide signatures because we cannot validate them. - if (data.fieldType === 'Sig') { - this.setFlags(AnnotationFlag.HIDDEN); - } - - // 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 if (parent && ref) { - // 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('.'); - } - - Util.inherit(WidgetAnnotation, Annotation, { - /** - * Check if a provided field flag is set. - * - * @public - * @memberof WidgetAnnotation - * @param {number} flag - Hexadecimal representation for an annotation - * field characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFieldFlag: function WidgetAnnotation_hasFieldFlag(flag) { - return !!(this.data.fieldFlags & flag); - }, - }); - - return WidgetAnnotation; -})(); - -var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { - function TextWidgetAnnotation(params) { - WidgetAnnotation.call(this, params); - - // Determine the alignment of text in the field. - var alignment = Util.getInheritableProperty(params.dict, 'Q'); - if (!isInt(alignment) || alignment < 0 || alignment > 2) { - alignment = null; - } - this.data.textAlignment = alignment; - - // Determine the maximum length of text in the field. - var maximumLength = Util.getInheritableProperty(params.dict, 'MaxLen'); - if (!isInt(maximumLength) || maximumLength < 0) { - maximumLength = null; - } - this.data.maxLen = maximumLength; - - // Process field flags for the display layer. - this.data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY); - this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE); - this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) && - !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) && - !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) && - !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) && - this.data.maxLen !== null; - } - - Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { - getOperatorList: - function TextWidgetAnnotation_getOperatorList(evaluator, task, - renderForms) { - var operatorList = new OperatorList(); - - // Do not render form elements on the canvas when interactive forms are - // enabled. The display layer is responsible for rendering them instead. - if (renderForms) { - return Promise.resolve(operatorList); - } - - if (this.appearance) { - return Annotation.prototype.getOperatorList.call(this, evaluator, task, - renderForms); - } - - // Even if there is an appearance stream, ignore it. This is the - // behaviour used by Adobe Reader. - if (!this.data.defaultAppearance) { - return Promise.resolve(operatorList); - } - - var stream = new Stream(stringToBytes(this.data.defaultAppearance)); - return evaluator.getOperatorList(stream, task, this.fieldResources, - operatorList). - then(function () { - return operatorList; - }); - } - }); - - return TextWidgetAnnotation; -})(); - -var TextAnnotation = (function TextAnnotationClosure() { - var DEFAULT_ICON_SIZE = 22; // px - - function TextAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.TEXT; - - if (this.data.hasAppearance) { - this.data.name = 'NoIcon'; - } else { - this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; - this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; - this.data.name = parameters.dict.has('Name') ? - parameters.dict.get('Name').name : 'Note'; - } - this._preparePopup(parameters.dict); - } - - Util.inherit(TextAnnotation, Annotation, {}); - - return TextAnnotation; -})(); - -var LinkAnnotation = (function LinkAnnotationClosure() { - function LinkAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - data.annotationType = AnnotationType.LINK; - - var action = dict.get('A'), url, dest; - if (action && isDict(action)) { - var linkType = action.get('S').name; - switch (linkType) { - case 'URI': - url = action.get('URI'); - if (isName(url)) { - // Some bad PDFs do not put parentheses around relative URLs. - url = '/' + url.name; - } else if (url) { - url = addDefaultProtocolToUrl(url); - } - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - break; - - case 'GoTo': - dest = action.get('D'); - break; - - case 'GoToR': - var urlDict = action.get('F'); - if (isDict(urlDict)) { - // We assume that we found a FileSpec dictionary - // and fetch the URL without checking any further. - url = urlDict.get('F') || null; - } else if (isString(urlDict)) { - url = urlDict; - } - - // NOTE: the destination is relative to the *remote* document. - var remoteDest = action.get('D'); - if (remoteDest) { - if (isName(remoteDest)) { - remoteDest = remoteDest.name; - } - if (isString(url)) { - var baseUrl = url.split('#')[0]; - if (isString(remoteDest)) { - // In practice, a named destination may contain only a number. - // If that happens, use the '#nameddest=' form to avoid the link - // redirecting to a page, instead of the correct destination. - url = baseUrl + '#' + - (/^\d+$/.test(remoteDest) ? 'nameddest=' : '') + remoteDest; - } else if (isArray(remoteDest)) { - url = baseUrl + '#' + JSON.stringify(remoteDest); - } - } - } - // The 'NewWindow' property, equal to `LinkTarget.BLANK`. - var newWindow = action.get('NewWindow'); - if (isBool(newWindow)) { - data.newWindow = newWindow; - } - break; - - case 'Named': - data.action = action.get('N').name; - break; - - default: - warn('unrecognized link type: ' + linkType); - } - } else if (dict.has('Dest')) { // Simple destination link. - dest = dict.get('Dest'); - } - - if (url) { - if (isValidUrl(url, /* allowRelative = */ false)) { - data.url = tryConvertUrlEncoding(url); - } - } - if (dest) { - data.dest = isName(dest) ? dest.name : dest; - } - } - - // Lets URLs beginning with 'www.' default to using the 'http://' protocol. - function addDefaultProtocolToUrl(url) { - if (isString(url) && url.indexOf('www.') === 0) { - return ('http://' + url); - } - return url; - } - - function tryConvertUrlEncoding(url) { - // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded - // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding, see Bugzilla 1122280. - try { - return stringToUTF8String(url); - } catch (e) { - return url; - } - } - - Util.inherit(LinkAnnotation, Annotation, {}); - - return LinkAnnotation; -})(); - -var PopupAnnotation = (function PopupAnnotationClosure() { - function PopupAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.POPUP; - - var dict = parameters.dict; - var parentItem = dict.get('Parent'); - if (!parentItem) { - warn('Popup annotation has a missing or invalid parent annotation.'); - return; - } - - this.data.parentId = dict.getRaw('Parent').toString(); - this.data.title = stringToPDFString(parentItem.get('T') || ''); - this.data.contents = stringToPDFString(parentItem.get('Contents') || ''); - - if (!parentItem.has('C')) { - // Fall back to the default background color. - this.data.color = null; - } else { - this.setColor(parentItem.getArray('C')); - this.data.color = this.color; - } - - // If the Popup annotation is not viewable, but the parent annotation is, - // that is most likely a bug. Fallback to inherit the flags from the parent - // annotation (this is consistent with the behaviour in Adobe Reader). - if (!this.viewable) { - var parentFlags = parentItem.get('F'); - if (this._isViewable(parentFlags)) { - this.setFlags(parentFlags); - } - } - } - - Util.inherit(PopupAnnotation, Annotation, {}); - - return PopupAnnotation; -})(); - -var HighlightAnnotation = (function HighlightAnnotationClosure() { - function HighlightAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.HIGHLIGHT; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(HighlightAnnotation, Annotation, {}); - - return HighlightAnnotation; -})(); - -var UnderlineAnnotation = (function UnderlineAnnotationClosure() { - function UnderlineAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.UNDERLINE; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(UnderlineAnnotation, Annotation, {}); - - return UnderlineAnnotation; -})(); - -var SquigglyAnnotation = (function SquigglyAnnotationClosure() { - function SquigglyAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.SQUIGGLY; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(SquigglyAnnotation, Annotation, {}); - - return SquigglyAnnotation; -})(); - -var StrikeOutAnnotation = (function StrikeOutAnnotationClosure() { - function StrikeOutAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.STRIKEOUT; - this._preparePopup(parameters.dict); - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(StrikeOutAnnotation, Annotation, {}); - - return StrikeOutAnnotation; -})(); - -var FileAttachmentAnnotation = (function FileAttachmentAnnotationClosure() { - function FileAttachmentAnnotation(parameters) { - Annotation.call(this, parameters); - - var file = new FileSpec(parameters.dict.get('FS'), parameters.xref); - - this.data.annotationType = AnnotationType.FILEATTACHMENT; - this.data.file = file.serializable; - this._preparePopup(parameters.dict); - } - - Util.inherit(FileAttachmentAnnotation, Annotation, {}); - - return FileAttachmentAnnotation; -})(); - -exports.Annotation = Annotation; -exports.AnnotationBorderStyle = AnnotationBorderStyle; -exports.AnnotationFactory = AnnotationFactory; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreDocument = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, - root.pdfjsCoreObj, root.pdfjsCoreParser, root.pdfjsCoreCrypto, - root.pdfjsCoreEvaluator, root.pdfjsCoreAnnotation); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreObj, - coreParser, coreCrypto, coreEvaluator, coreAnnotation) { - -var MissingDataException = sharedUtil.MissingDataException; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isArrayBuffer = sharedUtil.isArrayBuffer; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var stringToBytes = sharedUtil.stringToBytes; -var stringToPDFString = sharedUtil.stringToPDFString; -var warn = sharedUtil.warn; -var isSpace = sharedUtil.isSpace; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isStream = corePrimitives.isStream; -var NullStream = coreStream.NullStream; -var Stream = coreStream.Stream; -var StreamsSequenceStream = coreStream.StreamsSequenceStream; -var Catalog = coreObj.Catalog; -var ObjectLoader = coreObj.ObjectLoader; -var XRef = coreObj.XRef; -var Linearization = coreParser.Linearization; -var calculateMD5 = coreCrypto.calculateMD5; -var OperatorList = coreEvaluator.OperatorList; -var PartialEvaluator = coreEvaluator.PartialEvaluator; -var Annotation = coreAnnotation.Annotation; -var AnnotationFactory = coreAnnotation.AnnotationFactory; - -var Page = (function PageClosure() { - - var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; - - function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { - this.pdfManager = pdfManager; - this.pageIndex = pageIndex; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - this.fontCache = fontCache; - this.uniquePrefix = 'p' + this.pageIndex + '_'; - this.idCounters = { - obj: 0 - }; - this.evaluatorOptions = pdfManager.evaluatorOptions; - this.resourcesPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - - getInheritedPageProp: function Page_getInheritedPageProp(key) { - var dict = this.pageDict, valueArray = null, loopCount = 0; - var MAX_LOOP_COUNT = 100; - // Always walk up the entire parent chain, to be able to find - // e.g. \Resources placed on multiple levels of the tree. - while (dict) { - var value = dict.get(key); - if (value) { - if (!valueArray) { - valueArray = []; - } - valueArray.push(value); - } - if (++loopCount > MAX_LOOP_COUNT) { - warn('Page_getInheritedPageProp: maximum loop count exceeded.'); - break; - } - dict = dict.get('Parent'); - } - if (!valueArray) { - return Dict.empty; - } - if (valueArray.length === 1 || !isDict(valueArray[0]) || - loopCount > MAX_LOOP_COUNT) { - return valueArray[0]; - } - return Dict.merge(this.xref, valueArray); - }, - - get content() { - return this.getPageProp('Contents'); - }, - - get resources() { - // For robustness: The spec states that a \Resources entry has to be - // present, but can be empty. Some document omit it still, in this case - // we return an empty dictionary. - return shadow(this, 'resources', this.getInheritedPageProp('Resources')); - }, - - get mediaBox() { - var obj = this.getInheritedPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) { - obj = LETTER_SIZE_MEDIABOX; - } - return shadow(this, 'mediaBox', obj); - }, - - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.getInheritedPageProp('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 rotate() { - var rotate = this.getInheritedPageProp('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 Page_loadResources(keys) { - if (!this.resourcesPromise) { - // TODO: add async getInheritedPageProp and remove this. - this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); - } - return this.resourcesPromise.then(function resourceSuccess() { - var objectLoader = new ObjectLoader(this.resources.map, - keys, - this.xref); - return objectLoader.load(); - }.bind(this)); - }, - - getOperatorList: function Page_getOperatorList(handler, task, intent, - renderInteractiveForms) { - var self = this; - - 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, - this.uniquePrefix, - this.idCounters, - this.fontCache, - this.evaluatorOptions); - - var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - var pageListPromise = dataPromises.then(function(data) { - var contentStream = data[0]; - var opList = new OperatorList(intent, handler, self.pageIndex); - - handler.send('StartRenderPage', { - transparency: partialEvaluator.hasBlendModes(self.resources), - pageIndex: self.pageIndex, - intent: intent - }); - return partialEvaluator.getOperatorList(contentStream, task, - self.resources, opList).then(function () { - return opList; - }); - }); - - var annotationsPromise = pdfManager.ensure(this, 'annotations'); - return Promise.all([pageListPromise, annotationsPromise]).then( - function(datas) { - var pageOpList = datas[0]; - var annotations = datas[1]; - - if (annotations.length === 0) { - pageOpList.flush(true); - return pageOpList; - } - - var annotationsReadyPromise = Annotation.appendToOperatorList( - annotations, pageOpList, partialEvaluator, task, intent, - renderInteractiveForms); - return annotationsReadyPromise.then(function () { - pageOpList.flush(true); - return pageOpList; - }); - }); - }, - - extractTextContent: function Page_extractTextContent(task, - normalizeWhitespace, - combineTextItems) { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'XObject', - 'Font' - ]); - - var dataPromises = Promise.all([contentStreamPromise, - resourcesPromise]); - return dataPromises.then(function(data) { - var contentStream = data[0]; - var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, - handler, self.pageIndex, - self.uniquePrefix, - self.idCounters, - self.fontCache, - self.evaluatorOptions); - - return partialEvaluator.getTextContent(contentStream, - task, - self.resources, - /* stateManager = */ null, - normalizeWhitespace, - combineTextItems); - }); - }, - - getAnnotationsData: function Page_getAnnotationsData(intent) { - var annotations = this.annotations; - var annotationsData = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } - } - annotationsData.push(annotations[i].data); - } - return annotationsData; - }, - - get annotations() { - var annotations = []; - var annotationRefs = this.getInheritedPageProp('Annots') || []; - var annotationFactory = new AnnotationFactory(); - for (var i = 0, n = annotationRefs.length; i < n; ++i) { - var annotationRef = annotationRefs[i]; - var annotation = annotationFactory.create(this.xref, annotationRef, - this.uniquePrefix, - this.idCounters); - 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() { - var FINGERPRINT_FIRST_BYTES = 1024; - var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + - '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; - - 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) { - assert(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 strBuf = []; - if (pos + limit > end) { - limit = end - pos; - } - for (var n = 0; n < limit; ++n) { - strBuf.push(String.fromCharCode(stream.getByte())); - } - var str = strBuf.join(''); - 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); - var version = this.catalog.catDict.get('Version'); - if (isName(version)) { - this.pdfFormatVersion = version.name; - } - try { - // checking if AcroForm is present - this.acroForm = this.catalog.catDict.get('AcroForm'); - if (this.acroForm) { - this.xfa = this.acroForm.get('XFA'); - var fields = this.acroForm.get('Fields'); - if ((!fields || !isArray(fields) || fields.length === 0) && - !this.xfa) { - // no fields and no XFA -- not a form (?) - this.acroForm = null; - } - } - } catch (ex) { - info('Something wrong with AcroForm entry'); - this.acroForm = null; - } - }, - - get linearization() { - var linearization = null; - if (this.stream.length) { - try { - linearization = Linearization.create(this.stream); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info(err); - } - } - // 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 (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); - } - if (!this.pdfFormatVersion) { - // 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); - var self = this; - var pageFactory = { - createPage: function (pageIndex, dict, ref, fontCache) { - return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, - fontCache); - } - }; - this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); - }, - 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, - IsXFAPresent: !!this.xfa - }; - 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, hash, fileID = ''; - var idArray = xref.trailer.get('ID'); - - if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && - idArray[0] !== EMPTY_FINGERPRINT) { - hash = stringToBytes(idArray[0]); - } else { - if (this.stream.ensureRange) { - this.stream.ensureRange(0, - Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); - } - hash = calculateMD5(this.stream.bytes.subarray(0, - FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); - } - - for (var i = 0, n = hash.length; i < n; i++) { - var hex = hash[i].toString(16); - fileID += hex.length === 1 ? '0' + hex : hex; - } - - return shadow(this, 'fingerprint', fileID); - }, - - getPage: function PDFDocument_getPage(pageIndex) { - return this.catalog.getPage(pageIndex); - }, - - cleanup: function PDFDocument_cleanup() { - return this.catalog.cleanup(); - } - }; - - return PDFDocument; -})(); - -exports.Page = Page; -exports.PDFDocument = PDFDocument; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePdfManager = {}), root.pdfjsSharedUtil, - root.pdfjsCoreStream, root.pdfjsCoreChunkedStream, - root.pdfjsCoreDocument); - } -}(this, function (exports, sharedUtil, coreStream, coreChunkedStream, - coreDocument) { - -var NotImplementedException = sharedUtil.NotImplementedException; -var MissingDataException = sharedUtil.MissingDataException; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var Util = sharedUtil.Util; -var Stream = coreStream.Stream; -var ChunkedStreamManager = coreChunkedStream.ChunkedStreamManager; -var PDFDocument = coreDocument.PDFDocument; - -var BasePdfManager = (function BasePdfManagerClosure() { - function BasePdfManager() { - throw new Error('Cannot initialize BaseManagerManager'); - } - - BasePdfManager.prototype = { - get docId() { - return this._docId; - }, - - onLoadedStream: function BasePdfManager_onLoadedStream() { - throw new NotImplementedException(); - }, - - ensureDoc: function BasePdfManager_ensureDoc(prop, args) { - return this.ensure(this.pdfDocument, prop, args); - }, - - ensureXRef: function BasePdfManager_ensureXRef(prop, args) { - return this.ensure(this.pdfDocument.xref, prop, args); - }, - - ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { - return this.ensure(this.pdfDocument.catalog, prop, args); - }, - - getPage: function BasePdfManager_getPage(pageIndex) { - return this.pdfDocument.getPage(pageIndex); - }, - - cleanup: function BasePdfManager_cleanup() { - return this.pdfDocument.cleanup(); - }, - - ensure: function BasePdfManager_ensure(obj, prop, args) { - return new NotImplementedException(); - }, - - requestRange: function BasePdfManager_requestRange(begin, end) { - return new NotImplementedException(); - }, - - requestLoadedStream: function BasePdfManager_requestLoadedStream() { - return new NotImplementedException(); - }, - - sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { - return new NotImplementedException(); - }, - - updatePassword: function BasePdfManager_updatePassword(password) { - this.pdfDocument.xref.password = this.password = password; - if (this._passwordChangedCapability) { - this._passwordChangedCapability.resolve(); - } - }, - - passwordChanged: function BasePdfManager_passwordChanged() { - this._passwordChangedCapability = createPromiseCapability(); - return this._passwordChangedCapability.promise; - }, - - terminate: function BasePdfManager_terminate() { - return new NotImplementedException(); - } - }; - - return BasePdfManager; -})(); - -var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(docId, data, password, evaluatorOptions) { - this._docId = docId; - this.evaluatorOptions = evaluatorOptions; - var stream = new Stream(data); - this.pdfDocument = new PDFDocument(this, stream, password); - this._loadedStreamCapability = createPromiseCapability(); - this._loadedStreamCapability.resolve(stream); - } - - Util.inherit(LocalPdfManager, BasePdfManager, { - ensure: function LocalPdfManager_ensure(obj, prop, args) { - return new Promise(function (resolve, reject) { - try { - var value = obj[prop]; - var result; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch (e) { - reject(e); - } - }); - }, - - requestRange: function LocalPdfManager_requestRange(begin, end) { - return Promise.resolve(); - }, - - requestLoadedStream: function LocalPdfManager_requestLoadedStream() { - return; - }, - - onLoadedStream: function LocalPdfManager_onLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - terminate: function LocalPdfManager_terminate() { - return; - } - }); - - return LocalPdfManager; -})(); - -var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions) { - this._docId = docId; - this.msgHandler = args.msgHandler; - this.evaluatorOptions = evaluatorOptions; - - var params = { - msgHandler: args.msgHandler, - url: args.url, - length: args.length, - disableAutoFetch: args.disableAutoFetch, - rangeChunkSize: args.rangeChunkSize - }; - this.streamManager = new ChunkedStreamManager(pdfNetworkStream, params); - this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(), - args.password); - } - - Util.inherit(NetworkPdfManager, BasePdfManager, { - ensure: function NetworkPdfManager_ensure(obj, prop, args) { - var pdfManager = this; - - return new Promise(function (resolve, reject) { - function ensureHelper() { - try { - var result; - var value = obj[prop]; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch(e) { - if (!(e instanceof MissingDataException)) { - reject(e); - return; - } - pdfManager.streamManager.requestRange(e.begin, e.end). - then(ensureHelper, reject); - } - } - - ensureHelper(); - }); - }, - - requestRange: function NetworkPdfManager_requestRange(begin, end) { - return this.streamManager.requestRange(begin, end); - }, - - requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { - this.streamManager.requestAllChunks(); - }, - - sendProgressiveData: - function NetworkPdfManager_sendProgressiveData(chunk) { - this.streamManager.onReceiveData({ chunk: chunk }); - }, - - onLoadedStream: function NetworkPdfManager_onLoadedStream() { - return this.streamManager.onLoadedStream(); - }, - - terminate: function NetworkPdfManager_terminate() { - this.streamManager.abort(); - } - }); - - return NetworkPdfManager; -})(); - -exports.LocalPdfManager = LocalPdfManager; -exports.NetworkPdfManager = NetworkPdfManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreWorker = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCorePdfManager); - } -}(this, function (exports, sharedUtil, corePrimitives, corePdfManager) { - -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MessageHandler = sharedUtil.MessageHandler; -var MissingPDFException = sharedUtil.MissingPDFException; -var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; -var PasswordException = sharedUtil.PasswordException; -var PasswordResponses = sharedUtil.PasswordResponses; -var UnknownErrorException = sharedUtil.UnknownErrorException; -var XRefParseException = sharedUtil.XRefParseException; -var arrayByteLength = sharedUtil.arrayByteLength; -var arraysToBytes = sharedUtil.arraysToBytes; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var warn = sharedUtil.warn; -var setVerbosityLevel = sharedUtil.setVerbosityLevel; -var Ref = corePrimitives.Ref; -var LocalPdfManager = corePdfManager.LocalPdfManager; -var NetworkPdfManager = corePdfManager.NetworkPdfManager; -var globalScope = sharedUtil.globalScope; - -var WorkerTask = (function WorkerTaskClosure() { - function WorkerTask(name) { - this.name = name; - this.terminated = false; - this._capability = createPromiseCapability(); - } - - WorkerTask.prototype = { - get finished() { - return this._capability.promise; - }, - - finish: function () { - this._capability.resolve(); - }, - - terminate: function () { - this.terminated = true; - }, - - ensureNotTerminated: function () { - if (this.terminated) { - throw new Error('Worker task was terminated'); - } - } - }; - - return WorkerTask; -})(); - - -/** @implements {IPDFStream} */ -var PDFWorkerStream = (function PDFWorkerStreamClosure() { - function PDFWorkerStream(params, msgHandler) { - this._queuedChunks = []; - var initialData = params.initialData; - if (initialData && initialData.length > 0) { - this._queuedChunks.push(initialData); - } - this._msgHandler = msgHandler; - - this._isRangeSupported = !(params.disableRange); - this._isStreamingSupported = !(params.disableStream); - this._contentLength = params.length; - - this._fullRequestReader = null; - this._rangeReaders = []; - - msgHandler.on('OnDataRange', this._onReceiveData.bind(this)); - msgHandler.on('OnDataProgress', this._onProgress.bind(this)); - } - PDFWorkerStream.prototype = { - _onReceiveData: function PDFWorkerStream_onReceiveData(args) { - if (args.begin === undefined) { - if (this._fullRequestReader) { - this._fullRequestReader._enqueue(args.chunk); - } else { - this._queuedChunks.push(args.chunk); - } - } else { - var found = this._rangeReaders.some(function (rangeReader) { - if (rangeReader._begin !== args.begin) { - return false; - } - rangeReader._enqueue(args.chunk); - return true; - }); - assert(found); - } - }, - - _onProgress: function PDFWorkerStream_onProgress(evt) { - if (this._rangeReaders.length > 0) { - // Reporting to first range reader. - var firstReader = this._rangeReaders[0]; - if (firstReader.onProgress) { - firstReader.onProgress({loaded: evt.loaded}); - } - } - }, - - _removeRangeReader: function PDFWorkerStream_removeRangeReader(reader) { - var i = this._rangeReaders.indexOf(reader); - if (i >= 0) { - this._rangeReaders.splice(i, 1); - } - }, - - getFullReader: function PDFWorkerStream_getFullReader() { - assert(!this._fullRequestReader); - var queuedChunks = this._queuedChunks; - this._queuedChunks = null; - return new PDFWorkerStreamReader(this, queuedChunks); - }, - - getRangeReader: function PDFWorkerStream_getRangeReader(begin, end) { - var reader = new PDFWorkerStreamRangeReader(this, begin, end); - this._msgHandler.send('RequestDataRange', { begin: begin, end: end }); - this._rangeReaders.push(reader); - return reader; - }, - - cancelAllRequests: function PDFWorkerStream_cancelAllRequests(reason) { - if (this._fullRequestReader) { - this._fullRequestReader.cancel(reason); - } - var readers = this._rangeReaders.slice(0); - readers.forEach(function (rangeReader) { - rangeReader.cancel(reason); - }); - } - }; - - /** @implements {IPDFStreamReader} */ - function PDFWorkerStreamReader(stream, queuedChunks) { - this._stream = stream; - this._done = false; - this._queuedChunks = queuedChunks || []; - this._requests = []; - this._headersReady = Promise.resolve(); - stream._fullRequestReader = this; - - this.onProgress = null; // not used - } - PDFWorkerStreamReader.prototype = { - _enqueue: function PDFWorkerStreamReader_enqueue(chunk) { - if (this._done) { - return; // ignore new data - } - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - requestCapability.resolve({value: chunk, done: false}); - return; - } - this._queuedChunks.push(chunk); - }, - - get headersReady() { - return this._headersReady; - }, - - get isRangeSupported() { - return this._stream._isRangeSupported; - }, - - get isStreamingSupported() { - return this._stream._isStreamingSupported; - }, - - get contentLength() { - return this._stream._contentLength; - }, - - read: function PDFWorkerStreamReader_read() { - if (this._queuedChunks.length > 0) { - var chunk = this._queuedChunks.shift(); - return Promise.resolve({value: chunk, done: false}); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFWorkerStreamReader_cancel(reason) { - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - } - }; - - /** @implements {IPDFStreamRangeReader} */ - function PDFWorkerStreamRangeReader(stream, begin, end) { - this._stream = stream; - this._begin = begin; - this._end = end; - this._queuedChunk = null; - this._requests = []; - this._done = false; - - this.onProgress = null; - } - PDFWorkerStreamRangeReader.prototype = { - _enqueue: function PDFWorkerStreamRangeReader_enqueue(chunk) { - if (this._done) { - return; // ignore new data - } - if (this._requests.length === 0) { - this._queuedChunk = chunk; - } else { - var requestsCapability = this._requests.shift(); - requestsCapability.resolve({value: chunk, done: false}); - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - } - this._done = true; - this._stream._removeRangeReader(this); - }, - - get isStreamingSupported() { - return false; - }, - - read: function PDFWorkerStreamRangeReader_read() { - if (this._queuedChunk) { - return Promise.resolve({value: this._queuedChunk, done: false}); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFWorkerStreamRangeReader_cancel(reason) { - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - this._stream._removeRangeReader(this); - } - }; - - return PDFWorkerStream; -})(); - -/** @type IPDFStream */ -var PDFNetworkStream; - -/** - * Sets PDFNetworkStream class to be used as alternative PDF data transport. - * @param {IPDFStream} cls - the PDF data transport. - */ -function setPDFNetworkStreamClass(cls) { - PDFNetworkStream = cls; -} - -var WorkerMessageHandler = { - setup: function wphSetup(handler, port) { - var testMessageProcessed = false; - handler.on('test', function wphSetupTest(data) { - if (testMessageProcessed) { - return; // we already processed 'test' message once - } - testMessageProcessed = true; - - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', 'main', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('configure', function wphConfigure(data) { - setVerbosityLevel(data.verbosity); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); - }, - createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { - // This context is actually holds references on pdfManager and handler, - // until the latter is destroyed. - var pdfManager; - var terminated = false; - var cancelXHRs = null; - var WorkerTasks = []; - - var docId = docParams.docId; - var workerHandlerName = docParams.docId + '_worker'; - var handler = new MessageHandler(workerHandlerName, docId, port); - - // Ensure that postMessage transfers are correctly enabled/disabled, - // to prevent "DataCloneError" in older versions of IE (see issue 6957). - handler.postMessageTransfers = docParams.postMessageTransfers; - - function ensureNotTerminated() { - if (terminated) { - throw new Error('Worker was terminated'); - } - } - - function startWorkerTask(task) { - WorkerTasks.push(task); - } - - function finishWorkerTask(task) { - task.finish(); - var i = WorkerTasks.indexOf(task); - WorkerTasks.splice(i, 1); - } - - function loadDocument(recoveryMode) { - var loadDocumentCapability = createPromiseCapability(); - - var parseSuccess = function parseSuccess() { - var numPagesPromise = pdfManager.ensureDoc('numPages'); - var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); - var encryptedPromise = pdfManager.ensureXRef('encrypt'); - Promise.all([numPagesPromise, fingerprintPromise, - encryptedPromise]).then(function onDocReady(results) { - var doc = { - numPages: results[0], - fingerprint: results[1], - encrypted: !!results[2], - }; - loadDocumentCapability.resolve(doc); - }, - parseFailure); - }; - - var parseFailure = function parseFailure(e) { - loadDocumentCapability.reject(e); - }; - - pdfManager.ensureDoc('checkHeader', []).then(function() { - pdfManager.ensureDoc('parseStartXRef', []).then(function() { - pdfManager.ensureDoc('parse', [recoveryMode]).then( - parseSuccess, parseFailure); - }, parseFailure); - }, parseFailure); - - return loadDocumentCapability.promise; - } - - function getPdfManager(data, evaluatorOptions) { - var pdfManagerCapability = createPromiseCapability(); - var pdfManager; - - var source = data.source; - if (source.data) { - try { - pdfManager = new LocalPdfManager(docId, source.data, source.password, - evaluatorOptions); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } - - var pdfStream; - try { - if (source.chunkedViewerLoading) { - pdfStream = new PDFWorkerStream(source, handler); - } else { - assert(PDFNetworkStream, 'pdfjs/core/network module is not loaded'); - pdfStream = new PDFNetworkStream(data); - } - } catch (ex) { - pdfManagerCapability.reject(ex); - return pdfManagerCapability.promise; - } - - var fullRequest = pdfStream.getFullReader(); - fullRequest.headersReady.then(function () { - if (!fullRequest.isStreamingSupported || - !fullRequest.isRangeSupported) { - // If stream or range are disabled, it's our only way to report - // loading progress. - fullRequest.onProgress = function (evt) { - handler.send('DocProgress', { - loaded: evt.loaded, - total: evt.total - }); - }; - } - - if (!fullRequest.isRangeSupported) { - return; - } - - // We don't need auto-fetch when streaming is enabled. - var disableAutoFetch = source.disableAutoFetch || - fullRequest.isStreamingSupported; - pdfManager = new NetworkPdfManager(docId, pdfStream, { - msgHandler: handler, - url: source.url, - password: source.password, - length: fullRequest.contentLength, - disableAutoFetch: disableAutoFetch, - rangeChunkSize: source.rangeChunkSize - }, evaluatorOptions); - pdfManagerCapability.resolve(pdfManager); - cancelXHRs = null; - }).catch(function (reason) { - pdfManagerCapability.reject(reason); - cancelXHRs = null; - }); - - var cachedChunks = [], loaded = 0; - var flushChunks = function () { - var pdfFile = arraysToBytes(cachedChunks); - if (source.length && pdfFile.length !== source.length) { - warn('reported HTTP length is different from actual'); - } - // the data is array, instantiating directly from it - try { - pdfManager = new LocalPdfManager(docId, pdfFile, source.password, - evaluatorOptions); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cachedChunks = []; - }; - var readPromise = new Promise(function (resolve, reject) { - var readChunk = function (chunk) { - try { - ensureNotTerminated(); - if (chunk.done) { - if (!pdfManager) { - flushChunks(); - } - cancelXHRs = null; - return; - } - - var data = chunk.value; - loaded += arrayByteLength(data); - if (!fullRequest.isStreamingSupported) { - handler.send('DocProgress', { - loaded: loaded, - total: Math.max(loaded, fullRequest.contentLength || 0) - }); - } - - if (pdfManager) { - pdfManager.sendProgressiveData(data); - } else { - cachedChunks.push(data); - } - - fullRequest.read().then(readChunk, reject); - } catch (e) { - reject(e); - } - }; - fullRequest.read().then(readChunk, reject); - }); - readPromise.catch(function (e) { - pdfManagerCapability.reject(e); - cancelXHRs = null; - }); - - cancelXHRs = function () { - pdfStream.cancelAllRequests('abort'); - }; - - return pdfManagerCapability.promise; - } - - var setupDoc = function(data) { - var onSuccess = function(doc) { - ensureNotTerminated(); - handler.send('GetDoc', { pdfInfo: doc }); - }; - - var onFailure = function(e) { - if (e instanceof PasswordException) { - if (e.code === PasswordResponses.NEED_PASSWORD) { - handler.send('NeedPassword', e); - } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) { - handler.send('IncorrectPassword', e); - } - } else if (e instanceof InvalidPDFException) { - handler.send('InvalidPDF', e); - } else if (e instanceof MissingPDFException) { - handler.send('MissingPDF', e); - } else if (e instanceof UnexpectedResponseException) { - handler.send('UnexpectedResponse', e); - } else { - handler.send('UnknownError', - new UnknownErrorException(e.message, e.toString())); - } - }; - - ensureNotTerminated(); - - var cMapOptions = { - url: data.cMapUrl === undefined ? null : data.cMapUrl, - packed: data.cMapPacked === true - }; - var evaluatorOptions = { - forceDataSchema: data.disableCreateObjectURL, - maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize, - disableFontFace: data.disableFontFace, - cMapOptions: cMapOptions - }; - - getPdfManager(data, evaluatorOptions).then(function (newPdfManager) { - if (terminated) { - // We were in a process of setting up the manager, but it got - // terminated in the middle. - newPdfManager.terminate(); - throw new Error('Worker was terminated'); - } - - pdfManager = newPdfManager; - handler.send('PDFManagerReady', null); - pdfManager.onLoadedStream().then(function(stream) { - handler.send('DataLoaded', { length: stream.bytes.byteLength }); - }); - }).then(function pdfManagerReady() { - ensureNotTerminated(); - - loadDocument(false).then(onSuccess, function loadFailure(ex) { - ensureNotTerminated(); - - // Try again with recoveryMode == true - if (!(ex instanceof XRefParseException)) { - if (ex instanceof PasswordException) { - // after password exception prepare to receive a new password - // to repeat loading - pdfManager.passwordChanged().then(pdfManagerReady); - } - - onFailure(ex); - return; - } - - pdfManager.requestLoadedStream(); - pdfManager.onLoadedStream().then(function() { - ensureNotTerminated(); - - loadDocument(true).then(onSuccess, onFailure); - }); - }, onFailure); - }, onFailure); - }; - - handler.on('GetPage', function wphSetupGetPage(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - var rotatePromise = pdfManager.ensure(page, 'rotate'); - var refPromise = pdfManager.ensure(page, 'ref'); - var viewPromise = pdfManager.ensure(page, 'view'); - - return Promise.all([rotatePromise, refPromise, viewPromise]).then( - function(results) { - return { - rotate: results[0], - ref: results[1], - view: results[2] - }; - }); - }); - }); - - handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new Ref(data.ref.num, data.ref.gen); - var catalog = pdfManager.pdfDocument.catalog; - return catalog.getPageIndex(ref); - }); - - handler.on('GetDestinations', - function wphSetupGetDestinations(data) { - return pdfManager.ensureCatalog('destinations'); - } - ); - - handler.on('GetDestination', - function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [data.id]); - } - ); - - handler.on('GetPageLabels', - function wphSetupGetPageLabels(data) { - return pdfManager.ensureCatalog('pageLabels'); - } - ); - - handler.on('GetAttachments', - function wphSetupGetAttachments(data) { - return pdfManager.ensureCatalog('attachments'); - } - ); - - handler.on('GetJavaScript', - function wphSetupGetJavaScript(data) { - return pdfManager.ensureCatalog('javaScript'); - } - ); - - handler.on('GetOutline', - function wphSetupGetOutline(data) { - return pdfManager.ensureCatalog('documentOutline'); - } - ); - - handler.on('GetMetadata', - function wphSetupGetMetadata(data) { - return Promise.all([pdfManager.ensureDoc('documentInfo'), - pdfManager.ensureCatalog('metadata')]); - } - ); - - handler.on('GetData', function wphSetupGetData(data) { - pdfManager.requestLoadedStream(); - return pdfManager.onLoadedStream().then(function(stream) { - return stream.bytes; - }); - }); - - handler.on('GetStats', - function wphSetupGetStats(data) { - return pdfManager.pdfDocument.xref.stats; - } - ); - - handler.on('UpdatePassword', function wphSetupUpdatePassword(data) { - pdfManager.updatePassword(data); - }); - - handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); - }); - }); - - handler.on('RenderPageRequest', function wphSetupRenderPage(data) { - var pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); - startWorkerTask(task); - - var pageNum = pageIndex + 1; - var start = Date.now(); - // Pre compile the pdf page and fetch the fonts/images. - page.getOperatorList(handler, task, data.intent, - data.renderInteractiveForms).then( - function(operatorList) { - finishWorkerTask(task); - - info('page=' + pageNum + ' - getOperatorList: time=' + - (Date.now() - start) + 'ms, len=' + operatorList.totalLength); - }, function(e) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - - // For compatibility with older behavior, generating unknown - // unsupported feature notification on errors. - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.unknown}); - - var minimumStackMessage = - 'worker.js: while trying to getPage() and getOperatorList()'; - - var wrappedException; - - // Turn the error into an obj that can be serialized - if (typeof e === 'string') { - wrappedException = { - message: e, - stack: minimumStackMessage - }; - } else if (typeof e === 'object') { - wrappedException = { - message: e.message || e.toString(), - stack: e.stack || minimumStackMessage - }; - } else { - wrappedException = { - message: 'Unknown exception type: ' + (typeof e), - stack: minimumStackMessage - }; - } - - handler.send('PageError', { - pageNum: pageNum, - error: wrappedException, - intent: data.intent - }); - }); - }); - }, this); - - handler.on('GetTextContent', function wphExtractText(data) { - var pageIndex = data.pageIndex; - var normalizeWhitespace = data.normalizeWhitespace; - var combineTextItems = data.combineTextItems; - return pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('GetTextContent: page ' + pageIndex); - startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); - return page.extractTextContent(task, normalizeWhitespace, - combineTextItems).then( - function(textContent) { - finishWorkerTask(task); - info('text indexing: page=' + pageNum + ' - time=' + - (Date.now() - start) + 'ms'); - return textContent; - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - throw reason; - }); - }); - }); - - handler.on('Cleanup', function wphCleanup(data) { - return pdfManager.cleanup(); - }); - - handler.on('Terminate', function wphTerminate(data) { - terminated = true; - if (pdfManager) { - pdfManager.terminate(); - pdfManager = null; - } - if (cancelXHRs) { - cancelXHRs(); - } - - var waitOn = []; - WorkerTasks.forEach(function (task) { - waitOn.push(task.finished); - task.terminate(); - }); - - return Promise.all(waitOn).then(function () { - // Notice that even if we destroying handler, resolved response promise - // must be sent back. - handler.destroy(); - handler = null; - }); - }); - - handler.on('Ready', function wphReady(data) { - setupDoc(docParams); - docParams = null; // we don't need docParams anymore -- saving memory. - }); - return workerHandlerName; - } -}; - -function initializeWorker() { - if (!('console' in globalScope)) { - var consoleTimer = {}; - - var workerConsole = { - log: function log() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_log', - data: args - }); - }, - - error: function error() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_error', - data: args - }); - throw 'pdf.js execution error'; - }, - - time: function time(name) { - consoleTimer[name] = Date.now(); - }, - - timeEnd: function timeEnd(name) { - var time = consoleTimer[name]; - if (!time) { - error('Unknown timer name ' + name); - } - this.log('Timer:', name, Date.now() - time); - } - }; - - globalScope.console = workerConsole; - } - - var handler = new MessageHandler('worker', 'main', self); - WorkerMessageHandler.setup(handler, self); - handler.send('ready', null); -} - -// Worker thread (and not node.js)? -if (typeof window === 'undefined' && - !(typeof module !== 'undefined' && module.require)) { - initializeWorker(); -} - -exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass; -exports.WorkerTask = WorkerTask; -exports.WorkerMessageHandler = WorkerMessageHandler; -})); - - - - -var NetworkManager = (function NetworkManagerClosure() { - - var OK_RESPONSE = 200; - var PARTIAL_CONTENT_RESPONSE = 206; - - function NetworkManager(url, args) { - this.url = url; - args = args || {}; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = (this.isHttp && args.httpHeaders) || {}; - this.withCredentials = args.withCredentials || false; - this.getXhr = args.getXhr || - function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; - - this.currXhrId = 0; - this.pendingRequests = Object.create(null); - this.loadedRequests = Object.create(null); - } - - function getArrayBuffer(xhr) { - var data = xhr.response; - if (typeof data !== 'string') { - return data; - } - var length = data.length; - var array = new Uint8Array(length); - for (var i = 0; i < length; i++) { - array[i] = data.charCodeAt(i) & 0xFF; - } - return array.buffer; - } - - var supportsMozChunked = (function supportsMozChunkedClosure() { - try { - var x = new XMLHttpRequest(); - // Firefox 37- required .open() to be called before setting responseType. - // https://bugzilla.mozilla.org/show_bug.cgi?id=707484 - // Even though the URL is not visited, .open() could fail if the URL is - // blocked, e.g. via the connect-src CSP directive or the NoScript addon. - // When this error occurs, this feature detection method will mistakenly - // report that moz-chunked-arraybuffer is not supported in Firefox 37-. - x.open('GET', 'https://example.com'); - x.responseType = 'moz-chunked-arraybuffer'; - return x.responseType === 'moz-chunked-arraybuffer'; - } catch (e) { - return false; - } - })(); - - NetworkManager.prototype = { - requestRange: function NetworkManager_requestRange(begin, end, listeners) { - var args = { - begin: begin, - end: end - }; - for (var prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - }, - - requestFull: function NetworkManager_requestFull(listeners) { - return this.request(listeners); - }, - - request: function NetworkManager_request(args) { - var xhr = this.getXhr(); - var xhrId = this.currXhrId++; - var pendingRequest = this.pendingRequests[xhrId] = { - xhr: xhr - }; - - xhr.open('GET', this.url); - xhr.withCredentials = this.withCredentials; - for (var property in this.httpHeaders) { - var value = this.httpHeaders[property]; - if (typeof value === 'undefined') { - continue; - } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && 'begin' in args && 'end' in args) { - var rangeStr = args.begin + '-' + (args.end - 1); - xhr.setRequestHeader('Range', 'bytes=' + rangeStr); - pendingRequest.expectedStatus = 206; - } else { - pendingRequest.expectedStatus = 200; - } - - var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; - if (useMozChunkedLoading) { - xhr.responseType = 'moz-chunked-arraybuffer'; - pendingRequest.onProgressiveData = args.onProgressiveData; - pendingRequest.mozChunked = true; - } else { - xhr.responseType = 'arraybuffer'; - } - - if (args.onError) { - xhr.onerror = function(evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - - xhr.send(null); - - return xhrId; - }, - - onProgress: function NetworkManager_onProgress(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - if (pendingRequest.mozChunked) { - var chunk = getArrayBuffer(pendingRequest.xhr); - pendingRequest.onProgressiveData(chunk); - } - - var onProgress = pendingRequest.onProgress; - if (onProgress) { - onProgress(evt); - } - }, - - onStateChange: function NetworkManager_onStateChange(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - var xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - - if (xhr.readyState !== 4) { - return; - } - - if (!(xhrId in this.pendingRequests)) { - // The XHR request might have been aborted in onHeadersReceived() - // callback, in which case we should abort request - return; - } - - delete this.pendingRequests[xhrId]; - - // success status == 0 can be on ftp, file and other protocols - if (xhr.status === 0 && this.isHttp) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - var xhrStatus = xhr.status || OK_RESPONSE; - - // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: - // "A server MAY ignore the Range header". This means it's possible to - // get a 200 rather than a 206 response from a range request. - var ok_response_on_range_request = - xhrStatus === OK_RESPONSE && - pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - - if (!ok_response_on_range_request && - xhrStatus !== pendingRequest.expectedStatus) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - - this.loadedRequests[xhrId] = true; - - var chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - var rangeHeader = xhr.getResponseHeader('Content-Range'); - var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - var begin = parseInt(matches[1], 10); - pendingRequest.onDone({ - begin: begin, - chunk: chunk - }); - } else if (pendingRequest.onProgressiveData) { - pendingRequest.onDone(null); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk: chunk - }); - } else if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - }, - - hasPendingRequests: function NetworkManager_hasPendingRequests() { - for (var xhrId in this.pendingRequests) { - return true; - } - return false; - }, - - getRequestXhr: function NetworkManager_getXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - }, - - isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { - return !!(this.pendingRequests[xhrId].onProgressiveData); - }, - - isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - }, - - isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { - return xhrId in this.loadedRequests; - }, - - abortAllRequests: function NetworkManager_abortAllRequests() { - for (var xhrId in this.pendingRequests) { - this.abortRequest(xhrId | 0); - } - }, - - abortRequest: function NetworkManager_abortRequest(xhrId) { - var xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } - }; - - return NetworkManager; -})(); - -(function (root, factory) { - { - factory((root.pdfjsCoreNetwork = {}), root.pdfjsSharedUtil, - root.pdfjsCoreWorker); - } -}(this, function (exports, sharedUtil, coreWorker) { - - var assert = sharedUtil.assert; - var createPromiseCapability = sharedUtil.createPromiseCapability; - var isInt = sharedUtil.isInt; - var MissingPDFException = sharedUtil.MissingPDFException; - var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; - - /** @implements {IPDFStream} */ - function PDFNetworkStream(options) { - this._options = options; - var source = options.source; - this._manager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - this._rangeChunkSize = source.rangeChunkSize; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - - PDFNetworkStream.prototype = { - _onRangeRequestReaderClosed: - function PDFNetworkStream_onRangeRequestReaderClosed(reader) { - var i = this._rangeRequestReaders.indexOf(reader); - if (i >= 0) { - this._rangeRequestReaders.splice(i, 1); - } - }, - - getFullReader: function PDFNetworkStream_getFullReader() { - assert(!this._fullRequestReader); - this._fullRequestReader = - new PDFNetworkStreamFullRequestReader(this._manager, this._options); - return this._fullRequestReader; - }, - - getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) { - var reader = new PDFNetworkStreamRangeRequestReader(this._manager, - begin, end); - reader.onClosed = this._onRangeRequestReaderClosed.bind(this); - this._rangeRequestReaders.push(reader); - return reader; - }, - - cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) { - if (this._fullRequestReader) { - this._fullRequestReader.cancel(reason); - } - var readers = this._rangeRequestReaders.slice(0); - readers.forEach(function (reader) { - reader.cancel(reason); - }); - } - }; - - /** @implements {IPDFStreamReader} */ - function PDFNetworkStreamFullRequestReader(manager, options) { - this._manager = manager; - - var source = options.source; - var args = { - onHeadersReceived: this._onHeadersReceived.bind(this), - onProgressiveData: source.disableStream ? null : - this._onProgressiveData.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = source.url; - this._fullRequestId = manager.requestFull(args); - this._headersReceivedCapability = createPromiseCapability(); - this._disableRange = options.disableRange || false; - this._contentLength = source.length; // optional - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - - this._isStreamingSupported = false; - this._isRangeSupported = false; - - this._cachedChunks = []; - this._requests = []; - this._done = false; - this._storedError = undefined; - - this.onProgress = null; - } - - PDFNetworkStreamFullRequestReader.prototype = { - _validateRangeRequestCapabilities: function - PDFNetworkStreamFullRequestReader_validateRangeRequestCapabilities() { - - if (this._disableRange) { - return false; - } - - var networkManager = this._manager; - var fullRequestXhrId = this._fullRequestId; - var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); - if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { - return false; - } - - var contentEncoding = - fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; - if (contentEncoding !== 'identity') { - return false; - } - - var length = fullRequestXhr.getResponseHeader('Content-Length'); - length = parseInt(length, 10); - if (!isInt(length)) { - return false; - } - - this._contentLength = length; // setting right content length - - if (length <= 2 * this._rangeChunkSize) { - // The file size is smaller than the size of two chunks, so it does - // not make any sense to abort the request and retry with a range - // request. - return false; - } - - return true; - }, - - _onHeadersReceived: - function PDFNetworkStreamFullRequestReader_onHeadersReceived() { - - if (this._validateRangeRequestCapabilities()) { - this._isRangeSupported = true; - } - - var networkManager = this._manager; - var fullRequestXhrId = this._fullRequestId; - if (networkManager.isStreamingRequest(fullRequestXhrId)) { - // We can continue fetching when progressive loading is enabled, - // and we don't need the autoFetch feature. - this._isStreamingSupported = true; - } else if (this._isRangeSupported) { - // NOTE: by cancelling the full request, and then issuing range - // requests, there will be an issue for sites where you can only - // request the pdf once. However, if this is the case, then the - // server should not be returning that it can support range - // requests. - networkManager.abortRequest(fullRequestXhrId); - } - - this._headersReceivedCapability.resolve(); - }, - - _onProgressiveData: - function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) { - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - requestCapability.resolve({value: chunk, done: false}); - } else { - this._cachedChunks.push(chunk); - } - }, - - _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) { - if (args) { - this._onProgressiveData(args.chunk); - } - this._done = true; - if (this._cachedChunks.length > 0) { - return; - } - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - }, - - _onError: function PDFNetworkStreamFullRequestReader_onError(status) { - var url = this._url; - var exception; - if (status === 404 || status === 0 && /^file:/.test(url)) { - exception = new MissingPDFException('Missing PDF "' + url + '".'); - } else { - exception = new UnexpectedResponseException( - 'Unexpected server response (' + status + - ') while retrieving PDF "' + url + '".', status); - } - this._storedError = exception; - this._headersReceivedCapability.reject(exception); - this._requests.forEach(function (requestCapability) { - requestCapability.reject(exception); - }); - this._requests = []; - this._cachedChunks = []; - }, - - _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) { - if (this.onProgress) { - this.onProgress({ - loaded: data.loaded, - total: data.lengthComputable ? data.total : this._contentLength - }); - } - }, - - get isRangeSupported() { - return this._isRangeSupported; - }, - - get isStreamingSupported() { - return this._isStreamingSupported; - }, - - get contentLength() { - return this._contentLength; - }, - - get headersReady() { - return this._headersReceivedCapability.promise; - }, - - read: function PDFNetworkStreamFullRequestReader_read() { - if (this._storedError) { - return Promise.reject(this._storedError); - } - if (this._cachedChunks.length > 0) { - var chunk = this._cachedChunks.shift(); - return Promise.resolve(chunk); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) { - this._done = true; - this._headersReceivedCapability.reject(reason); - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - if (this._manager.isPendingRequest(this._fullRequestId)) { - this._manager.abortRequest(this._fullRequestId); - } - this._fullRequestReader = null; - } - }; - - /** @implements {IPDFStreamRangeReader} */ - function PDFNetworkStreamRangeRequestReader(manager, begin, end) { - this._manager = manager; - var args = { - onDone: this._onDone.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._requestId = manager.requestRange(begin, end, args); - this._requests = []; - this._queuedChunk = null; - this._done = false; - - this.onProgress = null; - this.onClosed = null; - } - - PDFNetworkStreamRangeRequestReader.prototype = { - _close: function PDFNetworkStreamRangeRequestReader_close() { - if (this.onClosed) { - this.onClosed(this); - } - }, - - _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) { - var chunk = data.chunk; - if (this._requests.length > 0) { - var requestCapability = this._requests.shift(); - requestCapability.resolve({value: chunk, done: false}); - } else { - this._queuedChunk = chunk; - } - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - this._close(); - }, - - _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) { - if (!this.isStreamingSupported && this.onProgress) { - this.onProgress({ - loaded: evt.loaded - }); - } - }, - - get isStreamingSupported() { - return false; // TODO allow progressive range bytes loading - }, - - read: function PDFNetworkStreamRangeRequestReader_read() { - if (this._queuedChunk !== null) { - var chunk = this._queuedChunk; - this._queuedChunk = null; - return Promise.resolve({value: chunk, done: false}); - } - if (this._done) { - return Promise.resolve({value: undefined, done: true}); - } - var requestCapability = createPromiseCapability(); - this._requests.push(requestCapability); - return requestCapability.promise; - }, - - cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) { - this._done = true; - this._requests.forEach(function (requestCapability) { - requestCapability.resolve({value: undefined, done: true}); - }); - this._requests = []; - if (this._manager.isPendingRequest(this._requestId)) { - this._manager.abortRequest(this._requestId); - } - this._close(); - } - }; - - coreWorker.setPDFNetworkStreamClass(PDFNetworkStream); - - exports.PDFNetworkStream = PDFNetworkStream; - exports.NetworkManager = NetworkManager; -})); - }).call(pdfjsLibs); - - exports.WorkerMessageHandler = pdfjsLibs.pdfjsCoreWorker.WorkerMessageHandler; -})); - From 9c8c838bc230adada562a1182750fd62101a0119 Mon Sep 17 00:00:00 2001 From: Brian Gough Date: Thu, 2 Mar 2017 09:40:25 +0000 Subject: [PATCH 12/60] set .gitattributes to binary for pdfjs charmaps --- services/web/public/js/libs/pdfjs-1.7.225/bcmaps/.gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 services/web/public/js/libs/pdfjs-1.7.225/bcmaps/.gitattributes diff --git a/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/.gitattributes b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/.gitattributes new file mode 100644 index 0000000000..556f8c827b --- /dev/null +++ b/services/web/public/js/libs/pdfjs-1.7.225/bcmaps/.gitattributes @@ -0,0 +1 @@ +* binary From 2b36a443c95cbcecb578ed6b8265d82ff98a5b31 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 2 Mar 2017 16:45:24 +0000 Subject: [PATCH 13/60] Pull track changes backend into a module --- .../Features/Chat/ChatController.coffee | 37 ++- .../Comments/CommentsController.coffee | 111 ------- .../Project/ProjectEditorHandler.coffee | 4 +- .../TrackChanges/RangesManager.coffee | 23 -- .../TrackChangesController.coffee | 42 --- .../TrackChanges/TrackChangesManager.coffee | 5 - services/web/app/coffee/router.coffee | 16 - .../coffee/Chat/ChatControllerTests.coffee | 78 ++++- .../Comments/CommentsControllerTests.coffee | 284 ------------------ .../TrackChanges/RangesManagerTests.coffee | 55 ---- 10 files changed, 113 insertions(+), 542 deletions(-) delete mode 100644 services/web/app/coffee/Features/Comments/CommentsController.coffee delete mode 100644 services/web/app/coffee/Features/TrackChanges/RangesManager.coffee delete mode 100644 services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee delete mode 100644 services/web/app/coffee/Features/TrackChanges/TrackChangesManager.coffee delete mode 100644 services/web/test/UnitTests/coffee/Comments/CommentsControllerTests.coffee delete mode 100644 services/web/test/UnitTests/coffee/TrackChanges/RangesManagerTests.coffee diff --git a/services/web/app/coffee/Features/Chat/ChatController.coffee b/services/web/app/coffee/Features/Chat/ChatController.coffee index 3090f4f108..b163df8158 100644 --- a/services/web/app/coffee/Features/Chat/ChatController.coffee +++ b/services/web/app/coffee/Features/Chat/ChatController.coffee @@ -4,9 +4,9 @@ logger = require("logger-sharelatex") AuthenticationController = require('../Authentication/AuthenticationController') UserInfoManager = require('../User/UserInfoManager') UserInfoController = require('../User/UserInfoController') -CommentsController = require('../Comments/CommentsController') +async = require "async" -module.exports = +module.exports = ChatController = sendMessage: (req, res, next)-> project_id = req.params.project_id content = req.body.content @@ -28,7 +28,38 @@ module.exports = logger.log project_id:project_id, query:query, "getting messages" ChatApiHandler.getGlobalMessages project_id, query.limit, query.before, (err, messages) -> return next(err) if err? - CommentsController._injectUserInfoIntoThreads {global: { messages: messages }}, (err) -> + ChatController._injectUserInfoIntoThreads {global: { messages: messages }}, (err) -> return next(err) if err? logger.log length: messages?.length, "sending messages to client" res.json messages + + _injectUserInfoIntoThreads: (threads, callback = (error, threads) ->) -> + userCache = {} + getUserDetails = (user_id, callback = (error, user) ->) -> + return callback(null, userCache[user_id]) if userCache[user_id]? + UserInfoManager.getPersonalInfo user_id, (err, user) -> + return callback(error) if error? + user = UserInfoController.formatPersonalInfo user + userCache[user_id] = user + callback null, user + + jobs = [] + for thread_id, thread of threads + do (thread) -> + if thread.resolved + jobs.push (cb) -> + getUserDetails thread.resolved_by_user_id, (error, user) -> + cb(error) if error? + thread.resolved_by_user = user + cb() + for message in thread.messages + do (message) -> + jobs.push (cb) -> + getUserDetails message.user_id, (error, user) -> + cb(error) if error? + message.user = user + cb() + + async.series jobs, (error) -> + return callback(error) if error? + return callback null, threads \ No newline at end of file diff --git a/services/web/app/coffee/Features/Comments/CommentsController.coffee b/services/web/app/coffee/Features/Comments/CommentsController.coffee deleted file mode 100644 index bda006eb8f..0000000000 --- a/services/web/app/coffee/Features/Comments/CommentsController.coffee +++ /dev/null @@ -1,111 +0,0 @@ -ChatApiHandler = require("../Chat/ChatApiHandler") -EditorRealTimeController = require("../Editor/EditorRealTimeController") -logger = require("logger-sharelatex") -AuthenticationController = require('../Authentication/AuthenticationController') -UserInfoManager = require('../User/UserInfoManager') -UserInfoController = require('../User/UserInfoController') -DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler" -async = require "async" - -module.exports = CommentsController = - sendComment: (req, res, next) -> - {project_id, thread_id} = req.params - content = req.body.content - user_id = AuthenticationController.getLoggedInUserId(req) - if !user_id? - err = new Error('no logged-in user') - return next(err) - logger.log {project_id, thread_id, user_id, content}, "sending comment" - ChatApiHandler.sendComment project_id, thread_id, user_id, content, (err, comment) -> - return next(err) if err? - UserInfoManager.getPersonalInfo comment.user_id, (err, user) -> - return next(err) if err? - comment.user = UserInfoController.formatPersonalInfo(user) - EditorRealTimeController.emitToRoom project_id, "new-comment", thread_id, comment, (err) -> - res.send 204 - - getThreads: (req, res, next) -> - {project_id} = req.params - logger.log {project_id}, "getting comment threads for project" - ChatApiHandler.getThreads project_id, (err, threads) -> - return next(err) if err? - CommentsController._injectUserInfoIntoThreads threads, (error, threads) -> - return next(err) if err? - res.json threads - - resolveThread: (req, res, next) -> - {project_id, thread_id} = req.params - user_id = AuthenticationController.getLoggedInUserId(req) - logger.log {project_id, thread_id, user_id}, "resolving comment thread" - ChatApiHandler.resolveThread project_id, thread_id, user_id, (err) -> - return next(err) if err? - UserInfoManager.getPersonalInfo user_id, (err, user) -> - return next(err) if err? - EditorRealTimeController.emitToRoom project_id, "resolve-thread", thread_id, UserInfoController.formatPersonalInfo(user), (err)-> - res.send 204 - - reopenThread: (req, res, next) -> - {project_id, thread_id} = req.params - logger.log {project_id, thread_id}, "reopening comment thread" - ChatApiHandler.reopenThread project_id, thread_id, (err, threads) -> - return next(err) if err? - EditorRealTimeController.emitToRoom project_id, "reopen-thread", thread_id, (err)-> - res.send 204 - - deleteThread: (req, res, next) -> - {project_id, doc_id, thread_id} = req.params - logger.log {project_id, doc_id, thread_id}, "deleting comment thread" - DocumentUpdaterHandler.deleteThread project_id, doc_id, thread_id, (err) -> - return next(err) if err? - ChatApiHandler.deleteThread project_id, thread_id, (err, threads) -> - return next(err) if err? - EditorRealTimeController.emitToRoom project_id, "delete-thread", thread_id, (err)-> - res.send 204 - - editMessage: (req, res, next) -> - {project_id, thread_id, message_id} = req.params - {content} = req.body - logger.log {project_id, thread_id, message_id}, "editing message thread" - ChatApiHandler.editMessage project_id, thread_id, message_id, content, (err) -> - return next(err) if err? - EditorRealTimeController.emitToRoom project_id, "edit-message", thread_id, message_id, content, (err)-> - res.send 204 - - deleteMessage: (req, res, next) -> - {project_id, thread_id, message_id} = req.params - logger.log {project_id, thread_id, message_id}, "deleting message" - ChatApiHandler.deleteMessage project_id, thread_id, message_id, (err, threads) -> - return next(err) if err? - EditorRealTimeController.emitToRoom project_id, "delete-message", thread_id, message_id, (err)-> - res.send 204 - - _injectUserInfoIntoThreads: (threads, callback = (error, threads) ->) -> - userCache = {} - getUserDetails = (user_id, callback = (error, user) ->) -> - return callback(null, userCache[user_id]) if userCache[user_id]? - UserInfoManager.getPersonalInfo user_id, (err, user) -> - return callback(error) if error? - user = UserInfoController.formatPersonalInfo user - userCache[user_id] = user - callback null, user - - jobs = [] - for thread_id, thread of threads - do (thread) -> - if thread.resolved - jobs.push (cb) -> - getUserDetails thread.resolved_by_user_id, (error, user) -> - cb(error) if error? - thread.resolved_by_user = user - cb() - for message in thread.messages - do (message) -> - jobs.push (cb) -> - getUserDetails message.user_id, (error, user) -> - cb(error) if error? - message.user = user - cb() - - async.series jobs, (error) -> - return callback(error) if error? - return callback null, threads \ No newline at end of file diff --git a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee index 3af40bf162..8ec25ace10 100644 --- a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee @@ -1,6 +1,8 @@ _ = require("underscore") module.exports = ProjectEditorHandler = + trackChangesAvailable: false + buildProjectModelView: (project, members, invites) -> result = _id : project._id @@ -38,7 +40,7 @@ module.exports = ProjectEditorHandler = templates: false references: false trackChanges: false - trackChangesVisible: trackChangesVisible + trackChangesVisible: ProjectEditorHandler.trackChangesAvailable and trackChangesVisible }) return result diff --git a/services/web/app/coffee/Features/TrackChanges/RangesManager.coffee b/services/web/app/coffee/Features/TrackChanges/RangesManager.coffee deleted file mode 100644 index 09e6b52ed1..0000000000 --- a/services/web/app/coffee/Features/TrackChanges/RangesManager.coffee +++ /dev/null @@ -1,23 +0,0 @@ -DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler" -DocstoreManager = require "../Docstore/DocstoreManager" -UserInfoManager = require "../User/UserInfoManager" -async = require "async" - -module.exports = RangesManager = - getAllRanges: (project_id, callback = (error, docs) ->) -> - DocumentUpdaterHandler.flushProjectToMongo project_id, (error) -> - return callback(error) if error? - DocstoreManager.getAllRanges project_id, callback - - getAllChangesUsers: (project_id, callback = (error, users) ->) -> - user_ids = {} - RangesManager.getAllRanges project_id, (error, docs) -> - return callback(error) if error? - jobs = [] - for doc in docs - for change in doc.ranges?.changes or [] - user_ids[change.metadata.user_id] = true - - async.mapSeries Object.keys(user_ids), (user_id, cb) -> - UserInfoManager.getPersonalInfo user_id, cb - , callback \ No newline at end of file diff --git a/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee b/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee deleted file mode 100644 index d71481a7fd..0000000000 --- a/services/web/app/coffee/Features/TrackChanges/TrackChangesController.coffee +++ /dev/null @@ -1,42 +0,0 @@ -RangesManager = require "./RangesManager" -logger = require "logger-sharelatex" -UserInfoController = require "../User/UserInfoController" -DocumentUpdaterHandler = require "../DocumentUpdater/DocumentUpdaterHandler" -EditorRealTimeController = require("../Editor/EditorRealTimeController") -TrackChangesManager = require "./TrackChangesManager" - -module.exports = TrackChangesController = - getAllRanges: (req, res, next) -> - project_id = req.params.project_id - logger.log {project_id}, "request for project ranges" - RangesManager.getAllRanges project_id, (error, docs = []) -> - return next(error) if error? - docs = ({id: d._id, ranges: d.ranges} for d in docs) - res.json docs - - getAllChangesUsers: (req, res, next) -> - project_id = req.params.project_id - logger.log {project_id}, "request for project range users" - RangesManager.getAllChangesUsers project_id, (error, users) -> - return next(error) if error? - users = (UserInfoController.formatPersonalInfo(user) for user in users) - # Get rid of any anonymous/deleted user objects - users = users.filter (u) -> u?.id? - res.json users - - acceptChange: (req, res, next) -> - {project_id, doc_id, change_id} = req.params - logger.log {project_id, doc_id, change_id}, "request to accept change" - DocumentUpdaterHandler.acceptChange project_id, doc_id, change_id, (error) -> - return next(error) if error? - EditorRealTimeController.emitToRoom project_id, "accept-change", doc_id, change_id, (err)-> - res.send 204 - - toggleTrackChanges: (req, res, next) -> - {project_id} = req.params - track_changes_on = !!req.body.on - logger.log {project_id, track_changes_on}, "request to toggle track changes" - TrackChangesManager.toggleTrackChanges project_id, track_changes_on, (error) -> - return next(error) if error? - EditorRealTimeController.emitToRoom project_id, "toggle-track-changes", track_changes_on, (err)-> - res.send 204 diff --git a/services/web/app/coffee/Features/TrackChanges/TrackChangesManager.coffee b/services/web/app/coffee/Features/TrackChanges/TrackChangesManager.coffee deleted file mode 100644 index 8eb7c10c29..0000000000 --- a/services/web/app/coffee/Features/TrackChanges/TrackChangesManager.coffee +++ /dev/null @@ -1,5 +0,0 @@ -Project = require("../../models/Project").Project - -module.exports = TrackChangesManager = - toggleTrackChanges: (project_id, track_changes_on, callback = (error) ->) -> - Project.update {_id: project_id}, {track_changes: track_changes_on}, callback diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index 62d5ec0865..53e92eb7a6 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -40,8 +40,6 @@ AuthorizationMiddlewear = require('./Features/Authorization/AuthorizationMiddlew BetaProgramController = require('./Features/BetaProgram/BetaProgramController') AnalyticsRouter = require('./Features/Analytics/AnalyticsRouter') AnnouncementsController = require("./Features/Announcements/AnnouncementsController") -TrackChangesController = require("./Features/TrackChanges/TrackChangesController") -CommentsController = require "./Features/Comments/CommentsController" logger = require("logger-sharelatex") _ = require("underscore") @@ -177,11 +175,6 @@ module.exports = class Router webRouter.get "/project/:Project_id/doc/:doc_id/diff", AuthorizationMiddlewear.ensureUserCanReadProject, HistoryController.proxyToHistoryApi webRouter.post "/project/:Project_id/doc/:doc_id/version/:version_id/restore", AuthorizationMiddlewear.ensureUserCanReadProject, HistoryController.proxyToHistoryApi - webRouter.get "/project/:project_id/ranges", AuthorizationMiddlewear.ensureUserCanReadProject, TrackChangesController.getAllRanges - webRouter.get "/project/:project_id/changes/users", AuthorizationMiddlewear.ensureUserCanReadProject, TrackChangesController.getAllChangesUsers - webRouter.post "/project/:project_id/doc/:doc_id/changes/:change_id/accept", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, TrackChangesController.acceptChange - webRouter.post "/project/:project_id/track_changes", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, TrackChangesController.toggleTrackChanges - webRouter.get '/Project/:Project_id/download/zip', AuthorizationMiddlewear.ensureUserCanReadProject, ProjectDownloadsController.downloadProject webRouter.get '/project/download/zip', AuthorizationMiddlewear.ensureUserCanReadMultipleProjects, ProjectDownloadsController.downloadMultipleProjects @@ -232,15 +225,6 @@ module.exports = class Router webRouter.get "/project/:project_id/messages", AuthorizationMiddlewear.ensureUserCanReadProject, ChatController.getMessages webRouter.post "/project/:project_id/messages", AuthorizationMiddlewear.ensureUserCanReadProject, ChatController.sendMessage - - # Note: Read only users can still comment - webRouter.post "/project/:project_id/thread/:thread_id/messages", AuthorizationMiddlewear.ensureUserCanReadProject, CommentsController.sendComment - webRouter.get "/project/:project_id/threads", AuthorizationMiddlewear.ensureUserCanReadProject, CommentsController.getThreads - webRouter.post "/project/:project_id/thread/:thread_id/resolve", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, CommentsController.resolveThread - webRouter.post "/project/:project_id/thread/:thread_id/reopen", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, CommentsController.reopenThread - webRouter.delete "/project/:project_id/doc/:doc_id/thread/:thread_id", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, CommentsController.deleteThread - webRouter.post "/project/:project_id/thread/:thread_id/messages/:message_id/edit", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, CommentsController.editMessage - webRouter.delete "/project/:project_id/thread/:thread_id/messages/:message_id", AuthorizationMiddlewear.ensureUserCanWriteProjectContent, CommentsController.deleteMessage webRouter.post "/project/:Project_id/references/index", AuthorizationMiddlewear.ensureUserCanReadProject, ReferencesController.index webRouter.post "/project/:Project_id/references/indexAll", AuthorizationMiddlewear.ensureUserCanReadProject, ReferencesController.indexAll diff --git a/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee b/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee index 851eb47f09..8a7fd757ea 100644 --- a/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Chat/ChatControllerTests.coffee @@ -69,7 +69,7 @@ describe "ChatController", -> @req.query = limit: @limit = "30" before: @before = "12345" - @CommentsController._injectUserInfoIntoThreads = sinon.stub().yields() + @ChatController._injectUserInfoIntoThreads = sinon.stub().yields() @ChatApiHandler.getGlobalMessages = sinon.stub().yields(null, @messages = ["mock", "messages"]) @ChatController.getMessages @req, @res @@ -79,4 +79,78 @@ describe "ChatController", -> .should.equal true it "should return the messages", -> - @res.json.calledWith(@messages).should.equal true \ No newline at end of file + @res.json.calledWith(@messages).should.equal true + + describe "_injectUserInfoIntoThreads", -> + beforeEach -> + @users = { + "user_id_1": { + "mock": "user_1" + } + "user_id_2": { + "mock": "user_2" + } + } + @UserInfoManager.getPersonalInfo = (user_id, callback) => + return callback(null, @users[user_id]) + sinon.spy @UserInfoManager, "getPersonalInfo" + @UserInfoController.formatPersonalInfo = (user) -> + return { "formatted": user["mock"] } + + it "should inject a user object into messaged and resolved data", (done) -> + @ChatController._injectUserInfoIntoThreads { + thread1: { + resolved: true + resolved_by_user_id: "user_id_1" + messages: [{ + user_id: "user_id_1" + content: "foo" + }, { + user_id: "user_id_2" + content: "bar" + }] + }, + thread2: { + messages: [{ + user_id: "user_id_1" + content: "baz" + }] + } + }, (error, threads) -> + expect(threads).to.deep.equal { + thread1: { + resolved: true + resolved_by_user_id: "user_id_1" + resolved_by_user: { "formatted": "user_1" } + messages: [{ + user_id: "user_id_1" + user: { "formatted": "user_1" } + content: "foo" + }, { + user_id: "user_id_2" + user: { "formatted": "user_2" } + content: "bar" + }] + }, + thread2: { + messages: [{ + user_id: "user_id_1" + user: { "formatted": "user_1" } + content: "baz" + }] + } + } + done() + + it "should only need to look up each user once", (done) -> + @ChatController._injectUserInfoIntoThreads [{ + messages: [{ + user_id: "user_id_1" + content: "foo" + }, { + user_id: "user_id_1" + content: "bar" + }] + }], (error, threads) => + @UserInfoManager.getPersonalInfo.calledOnce.should.equal true + done() \ No newline at end of file diff --git a/services/web/test/UnitTests/coffee/Comments/CommentsControllerTests.coffee b/services/web/test/UnitTests/coffee/Comments/CommentsControllerTests.coffee deleted file mode 100644 index e55f0d04da..0000000000 --- a/services/web/test/UnitTests/coffee/Comments/CommentsControllerTests.coffee +++ /dev/null @@ -1,284 +0,0 @@ -should = require('chai').should() -SandboxedModule = require('sandboxed-module') -assert = require('assert') -path = require('path') -sinon = require('sinon') -modulePath = path.join __dirname, "../../../../app/js/Features/Comments/CommentsController" -expect = require("chai").expect - -describe "CommentsController", -> - beforeEach -> - @user_id = 'mock-user-id' - @settings = {} - @ChatApiHandler = {} - @EditorRealTimeController = - emitToRoom:sinon.stub() - @AuthenticationController = - getLoggedInUserId: sinon.stub().returns(@user_id) - @CommentsController = SandboxedModule.require modulePath, requires: - "settings-sharelatex": @settings - "logger-sharelatex": log: -> - "../Chat/ChatApiHandler": @ChatApiHandler - "../Editor/EditorRealTimeController": @EditorRealTimeController - '../Authentication/AuthenticationController': @AuthenticationController - '../User/UserInfoManager': @UserInfoManager = {} - '../User/UserInfoController': @UserInfoController = {} - "../DocumentUpdater/DocumentUpdaterHandler": @DocumentUpdaterHandler = {} - @req = {} - @res = - json: sinon.stub() - send: sinon.stub() - - describe "sendComment", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - thread_id: @thread_id = "mock-thread-id" - @req.body = - content: @content = "message-content" - @UserInfoManager.getPersonalInfo = sinon.stub().yields(null, @user = {"unformatted": "user"}) - @UserInfoController.formatPersonalInfo = sinon.stub().returns(@formatted_user = {"formatted": "user"}) - @ChatApiHandler.sendComment = sinon.stub().yields(null, @message = {"mock": "message", user_id: @user_id}) - @CommentsController.sendComment @req, @res - - it "should look up the user", -> - @UserInfoManager.getPersonalInfo - .calledWith(@user_id) - .should.equal true - - it "should format and inject the user into the comment", -> - @UserInfoController.formatPersonalInfo - .calledWith(@user) - .should.equal true - @message.user.should.deep.equal @formatted_user - - it "should tell the chat handler about the message", -> - @ChatApiHandler.sendComment - .calledWith(@project_id, @thread_id, @user_id, @content) - .should.equal true - - it "should tell the editor real time controller about the update with the data from the chat handler", -> - @EditorRealTimeController.emitToRoom - .calledWith(@project_id, "new-comment", @thread_id, @message) - .should.equal true - - it "should return a 204 status code", -> - @res.send.calledWith(204).should.equal true - - describe "getThreads", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - @ChatApiHandler.getThreads = sinon.stub().yields(null, @threads = {"mock", "threads"}) - @CommentsController._injectUserInfoIntoThreads = sinon.stub().yields(null, @threads) - @CommentsController.getThreads @req, @res - - it "should ask the chat handler about the request", -> - @ChatApiHandler.getThreads - .calledWith(@project_id) - .should.equal true - - it "should inject the user details into the threads", -> - @CommentsController._injectUserInfoIntoThreads - .calledWith(@threads) - .should.equal true - - it "should return the messages", -> - @res.json.calledWith(@threads).should.equal true - - describe "resolveThread", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - thread_id: @thread_id = "mock-thread-id" - @ChatApiHandler.resolveThread = sinon.stub().yields() - @UserInfoManager.getPersonalInfo = sinon.stub().yields(null, @user = {"unformatted": "user"}) - @UserInfoController.formatPersonalInfo = sinon.stub().returns(@formatted_user = {"formatted": "user"}) - @CommentsController.resolveThread @req, @res - - it "should ask the chat handler to resolve the thread", -> - @ChatApiHandler.resolveThread - .calledWith(@project_id, @thread_id) - .should.equal true - - it "should look up the user", -> - @UserInfoManager.getPersonalInfo - .calledWith(@user_id) - .should.equal true - - it "should tell the client the comment was resolved", -> - @EditorRealTimeController.emitToRoom - .calledWith(@project_id, "resolve-thread", @thread_id, @formatted_user) - .should.equal true - - it "should return a success code", -> - @res.send.calledWith(204).should.equal - - describe "reopenThread", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - thread_id: @thread_id = "mock-thread-id" - @ChatApiHandler.reopenThread = sinon.stub().yields() - @CommentsController.reopenThread @req, @res - - it "should ask the chat handler to reopen the thread", -> - @ChatApiHandler.reopenThread - .calledWith(@project_id, @thread_id) - .should.equal true - - it "should tell the client the comment was resolved", -> - @EditorRealTimeController.emitToRoom - .calledWith(@project_id, "reopen-thread", @thread_id) - .should.equal true - - it "should return a success code", -> - @res.send.calledWith(204).should.equal - - describe "deleteThread", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - doc_id: @doc_id = "mock-doc-id" - thread_id: @thread_id = "mock-thread-id" - @DocumentUpdaterHandler.deleteThread = sinon.stub().yields() - @ChatApiHandler.deleteThread = sinon.stub().yields() - @CommentsController.deleteThread @req, @res - - it "should ask the doc udpater to delete the thread", -> - @DocumentUpdaterHandler.deleteThread - .calledWith(@project_id, @doc_id, @thread_id) - .should.equal true - - it "should ask the chat handler to delete the thread", -> - @ChatApiHandler.deleteThread - .calledWith(@project_id, @thread_id) - .should.equal true - - it "should tell the client the thread was deleted", -> - @EditorRealTimeController.emitToRoom - .calledWith(@project_id, "delete-thread", @thread_id) - .should.equal true - - it "should return a success code", -> - @res.send.calledWith(204).should.equal - - describe "editMessage", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - thread_id: @thread_id = "mock-thread-id" - message_id: @message_id = "mock-thread-id" - @req.body = - content: @content = "mock-content" - @ChatApiHandler.editMessage = sinon.stub().yields() - @CommentsController.editMessage @req, @res - - it "should ask the chat handler to edit the comment", -> - @ChatApiHandler.editMessage - .calledWith(@project_id, @thread_id, @message_id, @content) - .should.equal true - - it "should tell the client the comment was edited", -> - @EditorRealTimeController.emitToRoom - .calledWith(@project_id, "edit-message", @thread_id, @message_id, @content) - .should.equal true - - it "should return a success code", -> - @res.send.calledWith(204).should.equal - - describe "deleteMessage", -> - beforeEach -> - @req.params = - project_id: @project_id = "mock-project-id" - thread_id: @thread_id = "mock-thread-id" - message_id: @message_id = "mock-thread-id" - @ChatApiHandler.deleteMessage = sinon.stub().yields() - @CommentsController.deleteMessage @req, @res - - it "should ask the chat handler to deleted the message", -> - @ChatApiHandler.deleteMessage - .calledWith(@project_id, @thread_id, @message_id) - .should.equal true - - it "should tell the client the message was deleted", -> - @EditorRealTimeController.emitToRoom - .calledWith(@project_id, "delete-message", @thread_id, @message_id) - .should.equal true - - it "should return a success code", -> - @res.send.calledWith(204).should.equal - - describe "_injectUserInfoIntoThreads", -> - beforeEach -> - @users = { - "user_id_1": { - "mock": "user_1" - } - "user_id_2": { - "mock": "user_2" - } - } - @UserInfoManager.getPersonalInfo = (user_id, callback) => - return callback(null, @users[user_id]) - sinon.spy @UserInfoManager, "getPersonalInfo" - @UserInfoController.formatPersonalInfo = (user) -> - return { "formatted": user["mock"] } - - it "should inject a user object into messaged and resolved data", (done) -> - @CommentsController._injectUserInfoIntoThreads { - thread1: { - resolved: true - resolved_by_user_id: "user_id_1" - messages: [{ - user_id: "user_id_1" - content: "foo" - }, { - user_id: "user_id_2" - content: "bar" - }] - }, - thread2: { - messages: [{ - user_id: "user_id_1" - content: "baz" - }] - } - }, (error, threads) -> - expect(threads).to.deep.equal { - thread1: { - resolved: true - resolved_by_user_id: "user_id_1" - resolved_by_user: { "formatted": "user_1" } - messages: [{ - user_id: "user_id_1" - user: { "formatted": "user_1" } - content: "foo" - }, { - user_id: "user_id_2" - user: { "formatted": "user_2" } - content: "bar" - }] - }, - thread2: { - messages: [{ - user_id: "user_id_1" - user: { "formatted": "user_1" } - content: "baz" - }] - } - } - done() - - it "should only need to look up each user once", (done) -> - @CommentsController._injectUserInfoIntoThreads [{ - messages: [{ - user_id: "user_id_1" - content: "foo" - }, { - user_id: "user_id_1" - content: "bar" - }] - }], (error, threads) => - @UserInfoManager.getPersonalInfo.calledOnce.should.equal true - done() \ No newline at end of file diff --git a/services/web/test/UnitTests/coffee/TrackChanges/RangesManagerTests.coffee b/services/web/test/UnitTests/coffee/TrackChanges/RangesManagerTests.coffee deleted file mode 100644 index b9c95040c1..0000000000 --- a/services/web/test/UnitTests/coffee/TrackChanges/RangesManagerTests.coffee +++ /dev/null @@ -1,55 +0,0 @@ -should = require('chai').should() -SandboxedModule = require('sandboxed-module') -assert = require('assert') -sinon = require('sinon') -path = require "path" -modulePath = path.join __dirname, "../../../../app/js/Features/TrackChanges/RangesManager" -expect = require("chai").expect - -describe "RangesManager", -> - beforeEach -> - @RangesManager = SandboxedModule.require modulePath, requires: - "../DocumentUpdater/DocumentUpdaterHandler": @DocumentUpdaterHandler = {} - "../Docstore/DocstoreManager": @DocstoreManager = {} - "../User/UserInfoManager": @UserInfoManager = {} - - describe "getAllChangesUsers", -> - beforeEach -> - @project_id = "mock-project-id" - @user_id1 = "mock-user-id-1" - @user_id1 = "mock-user-id-2" - @docs = [{ - ranges: - changes: [{ - op: { i: "foo", p: 42 } - metadata: - user_id: @user_id1 - }, { - op: { i: "bar", p: 102 } - metadata: - user_id: @user_id2 - }] - }, { - ranges: - changes: [{ - op: { i: "baz", p: 3 } - metadata: - user_id: @user_id1 - }] - }] - @users = {} - @users[@user_id1] = {"mock": "user-1"} - @users[@user_id2] = {"mock": "user-2"} - @UserInfoManager.getPersonalInfo = (user_id, callback) => callback null, @users[user_id] - sinon.spy @UserInfoManager, "getPersonalInfo" - @RangesManager.getAllRanges = sinon.stub().yields(null, @docs) - - it "should return an array of unique users", (done) -> - @RangesManager.getAllChangesUsers @project_id, (error, users) => - users.should.deep.equal [{"mock": "user-1"}, {"mock": "user-2"}] - done() - - it "should only call getPersonalInfo once for each user", (done) -> - @RangesManager.getAllChangesUsers @project_id, (error, users) => - @UserInfoManager.getPersonalInfo.calledTwice.should.equal true - done() \ No newline at end of file From 5459ae8daa8fda88dd581618ab9f485c78a88686 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 3 Mar 2017 17:15:29 +0000 Subject: [PATCH 14/60] Prepare to use a static feature page. --- .../app/coffee/Features/StaticPages/StaticPagesRouter.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee b/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee index f1f55814c7..a885825bf2 100644 --- a/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee +++ b/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee @@ -15,6 +15,8 @@ module.exports = webRouter.get '/style', HomeController.externalPage("style_guide", "Style Guide") webRouter.get '/jobs', HomeController.externalPage("jobs", "Jobs") + webRouter.get '/review-features', HomeController.externalPage("review-features-page", "Review features") + webRouter.get '/dropbox', HomeController.externalPage("dropbox", "Dropbox and ShareLaTeX") webRouter.get '/university', UniversityController.getIndexPage From 45fe526284936668c196c572ec471ff30daa50aa Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 3 Mar 2017 17:15:48 +0000 Subject: [PATCH 15/60] Styles for the feature page. --- .../stylesheets/app/review-features-page.less | 231 ++++++++++++++++++ services/web/public/stylesheets/style.less | 1 + 2 files changed, 232 insertions(+) create mode 100644 services/web/public/stylesheets/app/review-features-page.less diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less new file mode 100644 index 0000000000..1206da62df --- /dev/null +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -0,0 +1,231 @@ +@rfp-h1-size: 2.442em; +@rfp-h2-size: 1.953em; +@rfp-h3-size: 1.563em; +@rfp-lead-size: 1.25em; + +@rfp-sl-red: @red; +@rfp-rp-blue: @rp-type-blue; + +@rfp-rp-blue-light: #F8F9FD; +@rfp-rp-blue-dark: shade(@rfp-rp-blue, 50%); +@rfp-rp-blue-darker: shade(@rfp-rp-blue, 65%); +@rfp-rp-blue-darkest: shade(@rfp-rp-blue, 75%); + +.rfp-main { + background-color: @rfp-rp-blue-dark; + color: #FFF; + font-size: 18px; +} + // Typographical scale and basics. + .rfp-h1 { + font-size: @rfp-h1-size; + margin-bottom: 2em; + color: inherit; + } + .rfp-h1-main { + color: #505050; + } + .rfp-h2 { + font-size: @rfp-h2-size; + margin-bottom: 2em; + color: inherit; + .rfp-section-feature-alt & { + color: @rfp-rp-blue-dark; + } + } + .rfp-h3 { + font-size: @rfp-h3-size; + margin-bottom: 2em; + color: inherit; + } + .rfp-lead { + font-size: @rfp-lead-size; + margin-bottom: 2em; + max-width: 30em; + margin-left: auto; + margin-right: auto; + font-weight: 300; + } + .rfp-lead-strong { + font-weight: 700; + } + .rfp-p { + margin-bottom: 2em; + max-width: 30em; + margin-left: auto; + margin-right: auto; + font-weight: 300; + .rfp-section-feature & { + margin-left: initial; + } + .rfp-section-feature-alt & { + margin-left: auto; + margin-right: initial; + } + } + .rfp-highlight, + .rfp-highlight-brand { + font-weight: 700; + } + .rfp-highlight-brand { + color: @rfp-sl-red; + } + // Sections + .rfp-section { + padding: 60px; + text-align: center; + } + .rfp-section-masthead { + background-image: linear-gradient(to right, fade(#FFF, 90%), fade(#FFF, 90%)), url(/img/feature-page/full-editor.png); + //color: @rfp-sl-red; + background-size: cover; + background-position: center; + color: #505050; + } + .rfp-section-blockquote { + padding-top: 30px; + padding-bottom: 30px; + background-color: @rfp-sl-red; + } + .rfp-section-feature { + color: #FFF; + text-align: left; + } + .rfp-section-feature-alt { + text-align: right; + color: @rfp-rp-blue-dark; + background-color: @rfp-rp-blue-light; + } + .rfp-section-testimonials { + background-color: @rfp-rp-blue-darkest; + } + .rfp-section-final { + background-color: @rfp-rp-blue-darker; + } + // Elements + .rfp-quote-section { + display: flex; + } + .rfp-quote { + display: flex; + flex-direction: column; + justify-content: space-between; + flex: 0 0 50%; + font-size: @rfp-lead-size; + background-color: #FFF; + color: @rfp-rp-blue-dark; + margin-right: 20px; + padding: 20px 40px; + border-left: 0; + max-width: 30em; + font-size: @rfp-lead-size; + quotes: "\201C" "\201D"; + // Override weird Boostrap default. + p { + display: block; + } + &:last-of-type { + margin-right: 0; + } + &::before { + content: none; + } + } + .rfp-quote-main { + display: flex; + max-width: none; + border-left: 0; + margin: 0 auto; + padding: 0; + quotes: "\201C" "\201D"; + font-size: @rfp-lead-size; + // Override weird Boostrap default. + p { + display: block; + } + &::before { + content: none; + } + } + .rfp-quoted-text { + position: relative; + display: inline-block; + font-family: @font-family-serif; + font-style: italic; + text-align: left; + margin: 0 0 40px 0; + &::before { + content: open-quote; + display: block; + position: absolute; + font-family: @font-family-serif; + font-size: @rfp-lead-size; + line-height: inherit; + color: inherit; + left: -0.75em; + } + .rfp-quote-main & { + flex: 1 1 70%; + margin: auto 40px auto auto; + } + } + .rfp-quoted-person { + display: inline-block; + font-size: .8em; + .rfp-quote-main & { + display: flex; + align-items: center; + flex: 0 0 30%; + } + } + .rfp-quote-person-photo { + border-radius: 3em; + width: 6em; + margin-bottom: 20px; + .rfp-quote-main & { + margin-bottom: 0; + margin-right: 20px; + } + } + .rfp-cta-container { + max-width: 40em; + margin: 0 auto; + padding: 40px; + background-color: #FFF; + color: @rfp-rp-blue-dark; + } + .rfp-cta { + display: inline-block; + background-color: @rfp-sl-red; + color: #FFF; + font-size: @rfp-h3-size; + padding: .75em 1.5em; + &:hover, + &:focus { + color: #FFF; + text-decoration: none; + outline: 0; + .rfp-cta-main { + transform: translate(0, -30%); + } + .rfp-cta-extra { + opacity: 1; + transform: translate(-50%, -40%); + } + } + } + .rfp-cta-main { + display: block; + transition: transform 0.25s; + transform: translate(0, 0, 0); + } + .rfp-cta-extra { + display: block; + position: absolute; + left: 50%; + text-transform: uppercase; + transition: opacity 0.25s, transform 0.25s; + transform: translate(-50%, 100%); + opacity: 0; + font-size: 0.5em; + } \ No newline at end of file diff --git a/services/web/public/stylesheets/style.less b/services/web/public/stylesheets/style.less index 61d5199773..2ab13566ad 100755 --- a/services/web/public/stylesheets/style.less +++ b/services/web/public/stylesheets/style.less @@ -78,6 +78,7 @@ @import "app/subscription.less"; @import "app/sprites.less"; @import "app/invite.less"; +@import "app/review-features-page.less"; @import "../js/libs/pdfListView/TextLayer.css"; @import "../js/libs/pdfListView/AnnotationsLayer.css"; From 0f4579df72c72e9d4f31e8c8d5b6b2a7f90277c8 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 3 Mar 2017 17:16:38 +0000 Subject: [PATCH 16/60] Assets for the feature page. --- .../web/public/img/feature-page/full-editor.png | Bin 0 -> 69408 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/full-editor.png diff --git a/services/web/public/img/feature-page/full-editor.png b/services/web/public/img/feature-page/full-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e33376dec9af4c716a8c81ce96894abe7f1b79 GIT binary patch literal 69408 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%0AdR>F%u1>VVG5c*a; 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�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 G&i)sI__e?Q literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/feat-changes.mp4 b/services/web/public/img/feature-page/feat-changes.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..8cced26501e86e92997dfc969978afde7088f9b6 GIT binary patch literal 421813 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

        xG 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

        -5nRwTjRflLEDq~R~34YADXjLAtO5jH0{Mw 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

        =kS8sf!V(#y0{?UiOC;l=B6Ep0q)(~W_KBr>wZ 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

        5T_NQ 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 Fe*mF(41xdv literal 0 HcmV?d00001 From beb8484246668c07680783b6da703607dad512ed Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Tue, 7 Mar 2017 17:22:02 +0000 Subject: [PATCH 22/60] Style adjustments; add animation classes. --- .../stylesheets/app/review-features-page.less | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index 4c3b039384..a38b54995a 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -104,10 +104,20 @@ box-shadow: @rfp-card-shadow; } .rfp-section-feature { + display: flex; color: @rfp-rp-blue-dark; background-color: @rfp-rp-blue-light; text-align: left; } + .rfp-feature-description-container, + .rfp-feature-video-container { + flex: 0 0 50%; + } + .rfp-feature-video-container { + .rfp-section-feature-alt & { + order: -1; + } + } .rfp-section-feature-alt { color: #FFF; background-color: transparent; @@ -120,14 +130,27 @@ background-color: @rfp-rp-blue-darker; } // Elements - .rfp-screenshot-masthead { + .rfp-video { max-width: 100%; box-shadow: @rfp-card-shadow; - margin-bottom: 2em; border-radius: @rfp-border-radius; } + .rfp-video-masthead { + margin-bottom: 2em; + } + .rfp-video-anim { + transition: transform 0.8s ease, opacity 0.8s ease; + transform: translate(100%, 0); + opacity: 0; + } + .rfp-video-anim-alt { + transform: translate(-100%, 0); + } + .rfp-video-anim-in { + transform: translate(0, 0); + opacity: 1; + } .rfp-quote-section { - @media (min-width: @screen-sm-min) { display: flex; } From fb91219661c86feef23cfeec5a125ebeeb932cfe Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 8 Mar 2017 11:38:28 +0000 Subject: [PATCH 23/60] Don't submit comment on clicking cancel --- services/web/app/views/project/editor/review-panel.pug | 4 ++-- .../ide/review-panel/directives/addCommentEntry.coffee | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/services/web/app/views/project/editor/review-panel.pug b/services/web/app/views/project/editor/review-panel.pug index fe5ada3596..b9dea40207 100644 --- a/services/web/app/views/project/editor/review-panel.pug +++ b/services/web/app/views/project/editor/review-panel.pug @@ -340,10 +340,10 @@ script(type='text/ng-template', id='addCommentEntryTemplate') ng-keypress="handleCommentKeyPress($event);" placeholder=translate("add_your_comment_here") focus-on="comment:new:open" - ng-blur="submitNewComment()" + ng-blur="submitNewComment($event)" ) .rp-entry-actions - button.rp-entry-button( + button.rp-entry-button.rp-entry-button-cancel( ng-click="cancelNewComment();" ) i.fa.fa-times diff --git a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee index c30eaadd0f..2ec79efcd5 100644 --- a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee +++ b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee @@ -31,7 +31,10 @@ define [ if scope.state.content.length > 0 scope.submitNewComment() - scope.submitNewComment = () -> + scope.submitNewComment = (event) -> + # If this is from a blur event from clicking on cancel, ignore it. + if event? and event.type == "blur" and $(event.relatedTarget).hasClass("rp-entry-button-cancel") + return true scope.onSubmit { content: scope.state.content } scope.state.isAdding = false scope.state.content = "" From 3a9f20cc1e2cd3d7dc243685b0fff58e6094916f Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 8 Mar 2017 11:42:14 +0000 Subject: [PATCH 24/60] Centre loading indicator when review panel is open --- .../web/public/stylesheets/app/editor/review-panel.less | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index b46fd70992..7d2dbb1c9f 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -117,6 +117,12 @@ z-index: 6; } +.loading-panel { + .rp-size-expanded & { + right: @review-panel-width; + } +} + .review-panel-toolbar { display: none; .rp-size-expanded & { From eb30c46458f27f33b0a7e6afe46029ef892788fd Mon Sep 17 00:00:00 2001 From: James Allen Date: Wed, 8 Mar 2017 11:57:33 +0000 Subject: [PATCH 25/60] Turn on track changes for everyone and take out of beta --- .../coffee/Features/Project/ProjectEditorHandler.coffee | 7 +------ services/web/app/coffee/models/User.coffee | 3 --- services/web/app/views/beta_program/opt_in.pug | 4 +--- services/web/app/views/project/editor/header.pug | 1 - 4 files changed, 2 insertions(+), 13 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee index 8ec25ace10..c7acdee766 100644 --- a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee @@ -22,11 +22,6 @@ module.exports = ProjectEditorHandler = if !result.invites? result.invites = [] - trackChangesVisible = false - for member in members - if member.privilegeLevel == "owner" and (member.user?.featureSwitches?.track_changes or member.user?.betaProgram) - trackChangesVisible = true - {owner, ownerFeatures, members} = @buildOwnerAndMembersViews(members) result.owner = owner result.members = members @@ -40,7 +35,7 @@ module.exports = ProjectEditorHandler = templates: false references: false trackChanges: false - trackChangesVisible: ProjectEditorHandler.trackChangesAvailable and trackChangesVisible + trackChangesVisible: ProjectEditorHandler.trackChangesAvailable }) return result diff --git a/services/web/app/coffee/models/User.coffee b/services/web/app/coffee/models/User.coffee index e4097aaa67..099b9ef8e2 100644 --- a/services/web/app/coffee/models/User.coffee +++ b/services/web/app/coffee/models/User.coffee @@ -39,9 +39,6 @@ UserSchema = new Schema references: { type:Boolean, default: Settings.defaultFeatures.references } trackChanges: { type:Boolean, default: Settings.defaultFeatures.trackChanges } } - featureSwitches : { - track_changes: { type: Boolean } - } referal_id : {type:String, default:() -> uuid.v4().split("-")[0]} refered_users: [ type:ObjectId, ref:'User' ] refered_user_count: { type:Number, default: 0 } diff --git a/services/web/app/views/beta_program/opt_in.pug b/services/web/app/views/beta_program/opt_in.pug index c740b894a6..b9fb1062e7 100644 --- a/services/web/app/views/beta_program/opt_in.pug +++ b/services/web/app/views/beta_program/opt_in.pug @@ -18,9 +18,7 @@ block content | #{translate("beta_program_badge_description")} span.beta-feature-badge p.text-centered - strong We're currently testing track changes and commenting: - p.text-centered - img(src="/img/teasers/track-changes/track-changes-beta.png", style="max-width: 100%; border-bottom: 1px solid #ddd") + strong We're not currently testing anything in beta, but keep checking back! .row.text-centered .col-md-12 if user.betaProgram diff --git a/services/web/app/views/project/editor/header.pug b/services/web/app/views/project/editor/header.pug index fe3732de97..b90201b397 100644 --- a/services/web/app/views/project/editor/header.pug +++ b/services/web/app/views/project/editor/header.pug @@ -94,7 +94,6 @@ header.toolbar.toolbar-header.toolbar-with-labels( i.review-icon p.toolbar-label | #{translate("review")} - span(style="vertical-align: 20%; margin-left: 4px; padding: 2px 4px;").beta-feature-badge a.btn.btn-full-height( href, ng-if="permissions.admin", From f1e362629faff80cb8e7250426780c4a215f27a1 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 12:23:08 +0000 Subject: [PATCH 26/60] Add logos. --- .../public/img/feature-page/user-caltech.png | Bin 0 -> 288715 bytes .../public/img/feature-page/user-chalmers.png | Bin 0 -> 43586 bytes .../public/img/feature-page/user-deepmind.png | Bin 0 -> 26066 bytes .../public/img/feature-page/user-nasa-jpl.png | Bin 0 -> 48058 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/user-caltech.png create mode 100644 services/web/public/img/feature-page/user-chalmers.png create mode 100644 services/web/public/img/feature-page/user-deepmind.png create mode 100644 services/web/public/img/feature-page/user-nasa-jpl.png diff --git a/services/web/public/img/feature-page/user-caltech.png b/services/web/public/img/feature-page/user-caltech.png new file mode 100644 index 0000000000000000000000000000000000000000..da2c7d27d8d3baf2deb014381b0f8fa4b7c92186 GIT binary patch literal 288715 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 z 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ⅆUZe-I+K5!UEXCc^fP{1=VQl%Eh+!9 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

        xtKwsnMzcf6-%A!w1GN{bJ>jQ}7$h*s0W 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

        )H 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 literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/user-chalmers.png b/services/web/public/img/feature-page/user-chalmers.png new file mode 100644 index 0000000000000000000000000000000000000000..9756dd1132c29c9fcd8475c59ede136284ec8890 GIT binary patch literal 43586 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 literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/user-nasa-jpl.png b/services/web/public/img/feature-page/user-nasa-jpl.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcbf3b6220ea32667030c86f54009934e7ca630 GIT binary patch literal 48058 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 Date: Wed, 8 Mar 2017 12:25:03 +0000 Subject: [PATCH 27/60] New URL; style adjustments. --- .../StaticPages/StaticPagesRouter.coffee | 2 +- .../web/public/img/feature-page/intro.mp4 | Bin 132214 -> 106467 bytes .../stylesheets/app/review-features-page.less | 55 ++++++++++++++---- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee b/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee index a885825bf2..f543d20c2e 100644 --- a/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee +++ b/services/web/app/coffee/Features/StaticPages/StaticPagesRouter.coffee @@ -15,7 +15,7 @@ module.exports = webRouter.get '/style', HomeController.externalPage("style_guide", "Style Guide") webRouter.get '/jobs', HomeController.externalPage("jobs", "Jobs") - webRouter.get '/review-features', HomeController.externalPage("review-features-page", "Review features") + webRouter.get '/track-changes-and-comments-in-latex', HomeController.externalPage("review-features-page", "Review features") webRouter.get '/dropbox', HomeController.externalPage("dropbox", "Dropbox and ShareLaTeX") diff --git a/services/web/public/img/feature-page/intro.mp4 b/services/web/public/img/feature-page/intro.mp4 index ce7dc877dabc0108a25a8655e3b34b3bae5329f4..888b99975d89de38847bbf0974fa5cfd4b4753b4 100644 GIT binary patch literal 106467 zcmX`SV|XY{6D=Cswz*^5wr$(Co$T1QZQHi(WXJZ&`<;94kLl@Ny;gNqb^Vx`rw0H4 zfWXw*!`{Z8nGpa02*AS0&gS=GG;lRy_{A6i001CN9ZgIC0Ht*B2`)N2Im#Md|OjI7KAGz3O=jwS>Q%!~w%jLd8t1jfc}90sfmzZ2rLzXUoN zc@Z%hW�KpFC_t+-O}bj7{vU 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 literal 132214 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 Fe*mF(41xdv diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index a38b54995a..cb3ce23919 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -22,7 +22,7 @@ // Typographical scale and basics. .rfp-h1 { font-size: @rfp-h1-size; - margin-bottom: 2em; + margin-bottom: 1.6em; color: inherit; } .rfp-h1-masthead { @@ -31,12 +31,12 @@ } .rfp-h2 { font-size: @rfp-h2-size; - margin-bottom: 2em; + margin-bottom: 1.6em; color: inherit; } .rfp-h3 { font-size: @rfp-h3-size; - margin-bottom: 2em; + margin-bottom: 1.6em; color: inherit; } .rfp-h3-cta { @@ -45,7 +45,7 @@ } .rfp-lead { font-size: @rfp-lead-size; - margin-bottom: 2em; + margin-bottom: 1.6em; max-width: 30em; margin-left: auto; margin-right: auto; @@ -62,7 +62,7 @@ } } .rfp-p { - margin-bottom: 2em; + margin-bottom: 1.6em; max-width: 30em; margin-left: auto; margin-right: auto; @@ -75,17 +75,14 @@ margin-right: initial; } } - .rfp-highlight, - .rfp-highlight-brand { + .rfp-highlight { font-weight: 700; } - .rfp-highlight-brand { - color: @rfp-sl-red; - } // Sections .rfp-section { padding: 30px; text-align: center; + overflow: hidden; @media (min-width: @screen-sm-min) { padding: 60px; } @@ -105,6 +102,7 @@ } .rfp-section-feature { display: flex; + align-items: center; color: @rfp-rp-blue-dark; background-color: @rfp-rp-blue-light; text-align: left; @@ -113,10 +111,20 @@ .rfp-feature-video-container { flex: 0 0 50%; } - .rfp-feature-video-container { + .rfp-feature-description-container { + padding-right: 1em; .rfp-section-feature-alt & { + padding-right: 0; + padding-left: 1em; + } + } + .rfp-feature-video-container { + padding-left: 1em; + .rfp-section-feature-alt & { + padding-left: 0; + padding-right: 1em; order: -1; - } + } } .rfp-section-feature-alt { color: #FFF; @@ -268,6 +276,29 @@ margin-right: 20px; } } + .rfp-users { + display: flex; + flex-wrap: wrap; + margin: 0 1em 2em; + @media (min-width: @screen-md-min) { + flex-wrap: nowrap; + align-items: center; + } + } + .rfp-user-container { + flex: 0 0 100%; + padding: 10px; + @media (min-width: @screen-xs-min) { + flex-basis: 50%; + } + @media (min-width: @screen-md-min) { + flex-basis: 25%; + padding: 20px; + } + } + .rfp-user-logo { + max-width: 100%; + } .rfp-cta-container { max-width: 40em; margin: 0 auto; From fcfadbfd5e579db3e553ba512b6140c7da2f3e37 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 12:32:19 +0000 Subject: [PATCH 28/60] Make features sections responsive. --- .../stylesheets/app/review-features-page.less | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index cb3ce23919..20450c37f0 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -101,35 +101,44 @@ box-shadow: @rfp-card-shadow; } .rfp-section-feature { - display: flex; - align-items: center; + display: block; color: @rfp-rp-blue-dark; background-color: @rfp-rp-blue-light; text-align: left; + @media (min-width: @screen-sm-min) { + display: flex; + align-items: center; + } } .rfp-feature-description-container, .rfp-feature-video-container { flex: 0 0 50%; } .rfp-feature-description-container { - padding-right: 1em; - .rfp-section-feature-alt & { - padding-right: 0; - padding-left: 1em; + @media (min-width: @screen-sm-min) { + padding-right: 1em; + .rfp-section-feature-alt & { + padding-right: 0; + padding-left: 1em; + } } } .rfp-feature-video-container { - padding-left: 1em; - .rfp-section-feature-alt & { - padding-left: 0; - padding-right: 1em; - order: -1; + @media (min-width: @screen-sm-min) { + padding-left: 1em; + .rfp-section-feature-alt & { + padding-left: 0; + padding-right: 1em; + order: -1; + } } } .rfp-section-feature-alt { color: #FFF; background-color: transparent; - text-align: right; + @media (min-width: @screen-sm-min) { + text-align: right; + } } .rfp-section-testimonials { background-color: @rfp-rp-blue-darkest; From d28c976810dabf1447bc2128ed78ef3498f7d987 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 13:54:46 +0000 Subject: [PATCH 29/60] Styling for the intro animation. --- .../stylesheets/app/review-features-page.less | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index 20450c37f0..236d931b66 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -147,6 +147,29 @@ background-color: @rfp-rp-blue-darker; } // Elements + .rfp-h1-masthead-portion { + display: inline-block; + transform: translate(150px, 0); + opacity: 0; + transition: transform 0.8s ease 0s, opacity 0.8s ease 0s; + &:nth-child(2) { + transition-delay: 0.5s, 0.5s; + } + &:nth-child(3) { + transition-delay: 0.5s, 0.5s; + } + &:nth-child(4) { + transition-delay: 1s, 1s; + } + &:nth-child(5) { + transition-delay: 1s, 1s; + } + + .rfp-section-masthead-in & { + transform: translate(0, 0); + opacity: 1; + } + } .rfp-video { max-width: 100%; box-shadow: @rfp-card-shadow; @@ -154,6 +177,13 @@ } .rfp-video-masthead { margin-bottom: 2em; + transform: translate(0, 100px); + opacity: 0; + transition: transform 0.8s ease 1s, opacity 0.8s ease 1s; + .rfp-section-masthead-in & { + transform: translate(0, 0); + opacity: 1; + } } .rfp-video-anim { transition: transform 0.8s ease, opacity 0.8s ease; From f398b45d75ad828be451fa46c8ce0afae9df5e83 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 14:32:55 +0000 Subject: [PATCH 30/60] Ensure minimum height on load animation. --- .../public/stylesheets/app/review-features-page.less | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index 236d931b66..db07a3d3ce 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -92,6 +92,17 @@ background-size: cover; background-position: center; background-color: @rfp-rp-blue-darker; + min-height: 100vh; + .rfp-lead { + opacity: 0; + transition: opacity 0.8s ease; + } + &.rfp-section-masthead-in { + min-height: none; + .rfp-lead { + opacity: 1; + } + } } .rfp-section-blockquote { position: relative; @@ -180,6 +191,7 @@ transform: translate(0, 100px); opacity: 0; transition: transform 0.8s ease 1s, opacity 0.8s ease 1s; + .rfp-section-masthead-in & { transform: translate(0, 0); opacity: 1; From ebd4db448415777fad8eb849a8b52a263415a366 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 15:00:59 +0000 Subject: [PATCH 31/60] Predefined sizing for main video; max content width. --- .../stylesheets/app/review-features-page.less | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index db07a3d3ce..c86a3bd012 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -18,6 +18,7 @@ background-color: @rfp-rp-blue-dark; color: #FFF; font-size: 18px; + min-width: @screen-xs-min; } // Typographical scale and basics. .rfp-h1 { @@ -117,8 +118,10 @@ background-color: @rfp-rp-blue-light; text-align: left; @media (min-width: @screen-sm-min) { - display: flex; - align-items: center; + .rfp-section-wrapper { + display: flex; + align-items: center; + } } } .rfp-feature-description-container, @@ -157,6 +160,10 @@ .rfp-section-final { background-color: @rfp-rp-blue-darker; } + .rfp-section-wrapper { + max-width: @container-large-desktop; + margin: auto; + } // Elements .rfp-h1-masthead-portion { display: inline-block; @@ -187,14 +194,31 @@ border-radius: @rfp-border-radius; } .rfp-video-masthead { + width: 400px; + height: 241px; margin-bottom: 2em; transform: translate(0, 100px); opacity: 0; transition: transform 0.8s ease 1s, opacity 0.8s ease 1s; - + box-shadow: none; + max-width: none; + + @media (min-width: 600px) { + width: 525px; + height: 316px; + } + @media (min-width: @screen-sm-min) { + width: 633px; + height: 381px; + } + @media (min-width: @screen-sm-min) { + width: 697px; + height: 420px; + } .rfp-section-masthead-in & { transform: translate(0, 0); opacity: 1; + box-shadow: @rfp-card-shadow; } } .rfp-video-anim { From 821f35b6224f8f547a4e820c1407b36a74760a55 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 15:53:39 +0000 Subject: [PATCH 32/60] Add white version of current logo. --- services/web/public/img/logo-white@2x.png | Bin 0 -> 17545 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/logo-white@2x.png diff --git a/services/web/public/img/logo-white@2x.png b/services/web/public/img/logo-white@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf336e4a3d8a2f8ace89e6dab9780dab7a6b4fc GIT binary patch literal 17545 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 literal 0 HcmV?d00001 From 5c294785e34d63ad3e3a191191deb6a7b4267610 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 15:53:46 +0000 Subject: [PATCH 33/60] Add styling for feature page header. --- .../stylesheets/app/review-features-page.less | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index c86a3bd012..3650fc4098 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -14,12 +14,16 @@ @rfp-card-shadow: 0 0 30px 5px rgba(0, 0, 0, .3); @rfp-border-radius: 5px; +@rfp-header-height: 80px; +@rfp-header-height-collapsed: 50px; + .rfp-main { background-color: @rfp-rp-blue-dark; color: #FFF; font-size: 18px; min-width: @screen-xs-min; } + // Typographical scale and basics. .rfp-h1 { font-size: @rfp-h1-size; @@ -80,6 +84,35 @@ font-weight: 700; } // Sections + .rfp-header { + position: fixed; + top: 0; + width: 100%; + z-index: 2; + height: @rfp-header-height; + transition: height .2s; + background-color: fade(@rfp-rp-blue-darkest, 90%); + padding: 10px 30px; + min-width: @screen-xs-min; + @media (min-width: @screen-sm-min) { + padding-left: 60px; + padding-right: 60px; + } + .rfp-main-header-collapsed & { + height: @rfp-header-height-collapsed; + } + } + .rfp-header-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + max-width: @container-large-desktop; + height: 100%; + margin: auto; + } + .rfp-header-logo { + height: 21px; + } .rfp-section { padding: 30px; text-align: center; @@ -94,6 +127,7 @@ background-position: center; background-color: @rfp-rp-blue-darker; min-height: 100vh; + padding-top: @rfp-header-height; .rfp-lead { opacity: 0; transition: opacity 0.8s ease; @@ -162,7 +196,7 @@ } .rfp-section-wrapper { max-width: @container-large-desktop; - margin: auto; + margin: 0 auto; } // Elements .rfp-h1-masthead-portion { @@ -404,6 +438,11 @@ } } } + + .rfp-cta-header { + font-size: 1em; + padding: .2em 1em; + } .rfp-cta-main { display: block; transition: transform 0.25s; From 10e48de9135b0dd43a8143714a25d1a52cfea0f2 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 16:04:15 +0000 Subject: [PATCH 34/60] Remove min height in intro section. --- services/web/public/stylesheets/app/review-features-page.less | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index 3650fc4098..eb729cfe1d 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -126,14 +126,12 @@ background-size: cover; background-position: center; background-color: @rfp-rp-blue-darker; - min-height: 100vh; padding-top: @rfp-header-height; .rfp-lead { opacity: 0; transition: opacity 0.8s ease; } &.rfp-section-masthead-in { - min-height: none; .rfp-lead { opacity: 1; } From e0547b4df91087ec170ecd4fe9df5154ed8a628e Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 16:55:05 +0000 Subject: [PATCH 35/60] Responsive fixes. --- .../stylesheets/app/review-features-page.less | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index eb729cfe1d..b7a46b76ea 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -21,14 +21,17 @@ background-color: @rfp-rp-blue-dark; color: #FFF; font-size: 18px; - min-width: @screen-xs-min; + min-width: 240px; } // Typographical scale and basics. .rfp-h1 { - font-size: @rfp-h1-size; + font-size: @rfp-h2-size; margin-bottom: 1.6em; color: inherit; + @media (min-width: @screen-xs-min) { + font-size: @rfp-h1-size; + } } .rfp-h1-masthead { color: #FFF; @@ -49,12 +52,14 @@ margin-bottom: 40px; } .rfp-lead { - font-size: @rfp-lead-size; margin-bottom: 1.6em; max-width: 30em; margin-left: auto; margin-right: auto; font-weight: 300; + @media (min-width: @screen-xs-min) { + font-size: @rfp-lead-size; + } } .rfp-lead-cta { margin-top: 0; @@ -92,8 +97,12 @@ height: @rfp-header-height; transition: height .2s; background-color: fade(@rfp-rp-blue-darkest, 90%); - padding: 10px 30px; - min-width: @screen-xs-min; + padding: 10px 20px; + min-width: 320px; + @media (min-width: @screen-xs-min) { + padding-left: 30px; + padding-right: 30px; + } @media (min-width: @screen-sm-min) { padding-left: 60px; padding-right: 60px; @@ -111,12 +120,18 @@ margin: auto; } .rfp-header-logo { - height: 21px; + height: 15px; + @media (min-width: @screen-xs-min) { + height: 21px; + } } .rfp-section { - padding: 30px; + padding: 30px 20px; text-align: center; overflow: hidden; + @media (min-width: @screen-xs-min) { + padding: 30px; + } @media (min-width: @screen-sm-min) { padding: 60px; } @@ -226,8 +241,8 @@ border-radius: @rfp-border-radius; } .rfp-video-masthead { - width: 400px; - height: 241px; + width: 270px; + height: 163px; margin-bottom: 2em; transform: translate(0, 100px); opacity: 0; @@ -235,6 +250,10 @@ box-shadow: none; max-width: none; + @media (min-width: @screen-xs-min) { + width: 400px; + height: 241px; + } @media (min-width: 600px) { width: 525px; height: 316px; @@ -280,9 +299,13 @@ quotes: "\201C" "\201D"; box-shadow: @rfp-card-shadow; border-radius: @rfp-border-radius; - font-size: @rfp-lead-size; background-color: #FFF; color: @rfp-rp-blue-dark; + font-size: 1em; + + @media (min-width: @screen-xs-min) { + font-size: @rfp-lead-size; + } @media (min-width: @screen-sm-min) { display: flex; @@ -421,7 +444,10 @@ color: #FFF; font-size: @rfp-h3-size; border-radius: @rfp-border-radius; - padding: .75em 1.5em; + padding: .75em; + @media (min-width: @screen-xs-min) { + padding: .75em 1.5em; + } &:hover, &:focus { color: #FFF; From df9eb83fc27b1d9ba0f3fb9b57ddc1d81366e315 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 17:14:35 +0000 Subject: [PATCH 36/60] More responsive fixes. --- .../stylesheets/app/review-features-page.less | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index b7a46b76ea..6497dbfad5 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -285,7 +285,7 @@ opacity: 1; } .rfp-quote-section { - @media (min-width: @screen-sm-min) { + @media (min-width: @screen-md-min) { display: flex; } } @@ -302,24 +302,27 @@ background-color: #FFF; color: @rfp-rp-blue-dark; font-size: 1em; + margin: 0 auto 20px; @media (min-width: @screen-xs-min) { font-size: @rfp-lead-size; } - @media (min-width: @screen-sm-min) { + @media (min-width: @screen-md-min) { display: flex; flex-direction: column; justify-content: space-between; flex: 0 1 50%; margin-right: 20px; - // Override weird Boostrap default. } + // Override weird Boostrap default. p { display: block; } &:last-of-type { - margin-right: 0; + @media (min-width: @screen-md-min) { + margin-right: 0; + } } &::before { content: none; @@ -333,7 +336,7 @@ padding: 0; quotes: "\201C" "\201D"; font-size: @rfp-lead-size; - @media (min-width: @screen-sm-min) { + @media (min-width: @screen-md-min) { display: flex; } // Override weird Boostrap default. @@ -362,7 +365,7 @@ left: -0.75em; } .rfp-quote-main & { - @media (min-width: @screen-sm-min) { + @media (min-width: @screen-md-min) { flex: 1 1 70%; margin: auto 40px auto auto; } @@ -381,7 +384,7 @@ .rfp-quoted-person-name { margin: 0; } - .rfp-quoted-person-link { + .rfp-quoted-person-affil { margin: 0; font-size: .8em; &:hover, From 63b84d3724bd91a52675d3eb12aed8c5091fab05 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 8 Mar 2017 17:58:22 +0000 Subject: [PATCH 37/60] don't add /blog to the start of blog urls in annoucements also up timeout --- services/web/app/coffee/Features/Blog/BlogHandler.coffee | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/Blog/BlogHandler.coffee b/services/web/app/coffee/Features/Blog/BlogHandler.coffee index 6f8f41b5fd..c3fd33b8eb 100644 --- a/services/web/app/coffee/Features/Blog/BlogHandler.coffee +++ b/services/web/app/coffee/Features/Blog/BlogHandler.coffee @@ -10,7 +10,7 @@ module.exports = BlogHandler = opts = url:blogUrl json:true - timeout:500 + timeout:1000 request.get opts, (err, res, announcements)-> if err? return callback err @@ -18,7 +18,6 @@ module.exports = BlogHandler = return callback("blog announcement returned non 200") logger.log announcementsLength: announcements?.length, "announcements returned" announcements = _.map announcements, (announcement)-> - announcement.url = "/blog#{announcement.url}" announcement.date = new Date(announcement.date) return announcement callback(err, announcements) From 3b2ab7fce1fb3e14809f711e6be09feab5bd68b6 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Wed, 8 Mar 2017 19:09:11 +0000 Subject: [PATCH 38/60] Add user photos. --- .../img/feature-page/courtney-gibbons.jpg | Bin 0 -> 58347 bytes .../img/feature-page/joanna-ellis-monaghan.jpg | Bin 0 -> 26551 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/courtney-gibbons.jpg create mode 100644 services/web/public/img/feature-page/joanna-ellis-monaghan.jpg diff --git a/services/web/public/img/feature-page/courtney-gibbons.jpg b/services/web/public/img/feature-page/courtney-gibbons.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae7d769ad5b28d2ee4a02f4cd27e1d7d46fd2ea7 GIT binary patch literal 58347 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 Date: Thu, 9 Mar 2017 09:07:56 +0000 Subject: [PATCH 39/60] Add last user photo. --- .../public/img/feature-page/pamela-marcum.jpg | Bin 0 -> 53721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/pamela-marcum.jpg diff --git a/services/web/public/img/feature-page/pamela-marcum.jpg b/services/web/public/img/feature-page/pamela-marcum.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66741607d1e19c2f8e227c57c1e941656c29e6b6 GIT binary patch literal 53721 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 b`oF90RQ&a)N_?Fu Date: Thu, 9 Mar 2017 09:13:49 +0000 Subject: [PATCH 40/60] Don't show onboarding for newly registered users --- .../coffee/Features/Project/ProjectController.coffee | 5 +++++ .../coffee/Project/ProjectControllerTests.coffee | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index 563ace8a51..ce9bfbd727 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -224,6 +224,11 @@ module.exports = ProjectController = cb = underscore.once(cb) if !user_id? return cb() + timestamp = user_id.toString().substring(0,8) + userSignupDate = new Date( parseInt( timestamp, 16 ) * 1000 ) + if userSignupDate > new Date("2017-03-09") # 8th March + # Don't show for users who registered after it was released + return cb(null, false) timeout = setTimeout cb, 500 AnalyticsManager.getLastOccurance user_id, "shown-track-changes-onboarding-2", (error, event) -> clearTimeout timeout diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index ba92046c28..b2cfb6efc1 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -13,7 +13,7 @@ describe "ProjectController", -> @project_id = "123213jlkj9kdlsaj" @user = - _id:"!£123213kjljkl" + _id:"588f3ddae8ebc1bac07c9fa4" first_name: "bjkdsjfk" @settings = apis: @@ -302,7 +302,7 @@ describe "ProjectController", -> name:"my proj" _id:"213123kjlkj" @user = - _id:"123kj21k3lj" + _id: "588f3ddae8ebc1bac07c9fa4" ace: fontSize:"massive" theme:"sexy" @@ -381,3 +381,11 @@ describe "ProjectController", -> opts.showTrackChangesOnboarding.should.equal false done() @ProjectController.loadEditor @req, @res + + it "should set showTrackChangesOnboarding = false if the user signed up after release", (done) -> + @AuthenticationController.getLoggedInUserId.returns("58c11a608ba0d6e49e8ce5d5") + @AnalyticsManager.getLastOccurance.yields(null, null) + @res.render = (pageName, opts)=> + opts.showTrackChangesOnboarding.should.equal false + done() + @ProjectController.loadEditor @req, @res From ec25ee9045fc27e96ae926cc411b2f65e3cdc925 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Thu, 9 Mar 2017 10:11:45 +0000 Subject: [PATCH 41/60] When upload to filestore fails, produce an error --- .../FileStore/FileStoreHandler.coffee | 13 ++++++-- .../FileStore/FileStoreHandlerTests.coffee | 31 +++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/services/web/app/coffee/Features/FileStore/FileStoreHandler.coffee b/services/web/app/coffee/Features/FileStore/FileStoreHandler.coffee index 1512b53e7e..eb5c2cd03f 100644 --- a/services/web/app/coffee/Features/FileStore/FileStoreHandler.coffee +++ b/services/web/app/coffee/Features/FileStore/FileStoreHandler.coffee @@ -25,10 +25,19 @@ module.exports = FileStoreHandler = timeout:fiveMinsInMs writeStream = request(opts) readStream.pipe writeStream - writeStream.on "end", callback + + writeStream.on 'response', (response) -> + if response.statusCode not in [200, 201] + err = new Error("non-ok response from filestore for upload: #{response.statusCode}") + logger.err {err, statusCode: response.statusCode}, "error uploading to filestore" + callback(err) + else + callback(null) + readStream.on "error", (err)-> logger.err err:err, project_id:project_id, file_id:file_id, fsPath:fsPath, "something went wrong on the read stream of uploadFileFromDisk" callback err + writeStream.on "error", (err)-> logger.err err:err, project_id:project_id, file_id:file_id, fsPath:fsPath, "something went wrong on the write stream of uploadFileFromDisk" callback err @@ -79,4 +88,4 @@ module.exports = FileStoreHandler = callback(err) _buildUrl: (project_id, file_id)-> - return "#{settings.apis.filestore.url}/project/#{project_id}/file/#{file_id}" \ No newline at end of file + return "#{settings.apis.filestore.url}/project/#{project_id}/file/#{file_id}" diff --git a/services/web/test/UnitTests/coffee/FileStore/FileStoreHandlerTests.coffee b/services/web/test/UnitTests/coffee/FileStore/FileStoreHandlerTests.coffee index caae9c0ae8..7452c6fb79 100644 --- a/services/web/test/UnitTests/coffee/FileStore/FileStoreHandlerTests.coffee +++ b/services/web/test/UnitTests/coffee/FileStore/FileStoreHandlerTests.coffee @@ -17,8 +17,8 @@ describe "FileStoreHandler", -> @writeStream = my:"writeStream" on: (type, cb)-> - if type == "end" - cb() + if type == "response" + cb({statusCode: 200}) @readStream = {my:"readStream", on: sinon.stub()} @request = sinon.stub() @settings = apis:{filestore:{url:"http//filestore.sharelatex.test"}} @@ -79,6 +79,16 @@ describe "FileStoreHandler", -> @handler._buildUrl.calledWith(@project_id, @file_id).should.equal true done() + it 'should callback with null', (done) -> + @fs.createReadStream.returns + pipe:-> + on: (type, cb)-> + if type == "end" + cb() + @handler.uploadFileFromDisk @project_id, @file_id, @fsPath, (err) => + expect(err).to.not.exist + done() + describe "symlink", -> it "should not read file if it is symlink", (done)-> @isSafeOnFileSystem = false @@ -86,6 +96,23 @@ describe "FileStoreHandler", -> @fs.createReadStream.called.should.equal false done() + describe "when upload fails", -> + beforeEach -> + @writeStream.on = (type, cb) -> + if type == "response" + cb({statusCode: 500}) + + it 'should callback with an error', (done) -> + @fs.createReadStream.returns + pipe:-> + on: (type, cb)-> + if type == "end" + cb() + @handler.uploadFileFromDisk @project_id, @file_id, @fsPath, (err) => + expect(err).to.exist + expect(err).to.be.instanceof Error + done() + describe "deleteFile", -> it "should send a delete request to filestore api", (done)-> From e4e4b3b1785a349eb07da0003af70c90e7021e06 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 9 Mar 2017 10:59:04 +0000 Subject: [PATCH 42/60] Remove unneeded images. --- .../public/img/feature-page/full-editor.png | Bin 69408 -> 0 bytes .../web/public/img/feature-page/hero-img.png | Bin 124300 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 services/web/public/img/feature-page/full-editor.png delete mode 100644 services/web/public/img/feature-page/hero-img.png diff --git a/services/web/public/img/feature-page/full-editor.png b/services/web/public/img/feature-page/full-editor.png deleted file mode 100644 index e3e33376dec9af4c716a8c81ce96894abe7f1b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69408 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

        ZwQ+zS8%alN*8>Wap`0KQOe{X&;Srrr* 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 Awg3PC From c4fb4e032129b8f61319cf63907be6e4dbe5baa8 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 9 Mar 2017 10:59:13 +0000 Subject: [PATCH 43/60] Update videos. --- .../public/img/feature-page/feat-discuss.mp4 | Bin 201928 -> 214985 bytes .../public/img/feature-page/feat-todos.mp4 | Bin 230127 -> 225988 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/services/web/public/img/feature-page/feat-discuss.mp4 b/services/web/public/img/feature-page/feat-discuss.mp4 index 00088a957c9a51ec1f1cb64e0b43c04d6e070864..bdb5c952b6c1cd08b0c0fc473c4632469027d4d1 100644 GIT binary patch literal 214985 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 I{>w`L4}WhUZ~y=R literal 201928 zcmX`SV|XY{6D=Cswr$(CZQHhO+sTf0Y}?L`ZQD*x-tXLVe@svH>b0t?s_V}@GXnqs zKw#$L>0s-?!UO;S1YqfGZ~J>O8M+xW{$h*(000nXPNt>+K%08DCWbD*oM$l5pP&0p z(X;O3HHp?VnpJ`|;_Dj^CN>rVS^{HxCsP7O7A68GCKh&10uvKw6}BSA}}^IGBoC8Bych{<7H$cFflc$&GBXm`n)15ZS`aw98vR;~3$i~&l z&{N;o-qykJe-Zr_$;HXg((c#AFVV^HKaQD`p{=PiF9(5QWBva>-T$~w#=OQ(W(2lIzjggD zt=|bR)9+yrIR2LmF9Y2#$I;jTSP+}eT&~CxBERO0y9e+8`J-)YU%KM)W41O+X=rB z8#?~B(SJPw5C8yh@L(Dd2tfY;G75C4_z8JbN1y&z%)clR-0v;}Ac9V}5Y-M_n;w=s z&X~KjdO#_t(6X|=ZC9S(+bNQ@#MtIKQXpV=edZKB@4JR8fz;GBwS^;(T4anyqLZo`@fxF)Z));tbV<#AA{I(s=S9k6BG(gtnp??z&LmeMTZQnWlZU!u%n zBwMqbQ8ZPNLeBfeNluK|yUoR_bue0$i-pC`n}qRjrZ|a&0xvMWZ;gAi0YIGd9pxj9 z6Ir`+^^nx%xen(1#;dOFJf4wb(Z~v%W*A&%3p+#&wV>5c5SeON>L`_6TEX*F3(0XZ zd63GIf=x0BdqMcASk{T}#cqM+mG&vc=(Z68_|g|_0*^nJycHm&=tbI-((WsrE5OCd zg-MIZStDcSbMiBLW)M!$g?#%k_w`>NZADN`zck(eG;D3rQ#WZdU@e-MWd3H?@PkNM z%1@E^`;z^-*$X&GSOfIke4w)DiwUrZdJ47e3m|mHEJAnPn>~_L<&<5^Z7~hC|L!gLec3-$^}3%HPYpik;EHc%0Uz)^@Mk3q z_blOccQYF%_KIiNG&Um7MTl3K%o$S8^+=uhM#R0+{*($Lh>vf^jUp@rtMIJos)x`= zw3Xdux$}pprpgI?6Onp_t8PT|)#lXa(r8kpS?7Y@ZUb)Xwg-(^F(Bhdr$0ncLjaS$ z#6

        $yapNbns&zRnJ!ZM$pr@&Y?cb0VerW#a-*Dq{hUgGoZnlwNNvM0RZ&1k??zg&zg-EDSl#$(rZ_ z!DHk@Vt{GvoKzWnDR-^VBcF?FgPnNlvZd0Ov~lzyo}^$GV*fr&0FD*;r8oTmK&ELU z9GkJ|OjGx`?Zj1gG%WSzw)lE4Agv}SxOU^xGy^+ur_s2cB4y)me07;G4Epdm&(6R+ zPscO?@-!i&m4!Vp9#w;sEIJkrA3WNRIeH`N$#OLWfNW#!d+QIT1VMg{IvEC5Ny1C) zRkUavuHovS_u@752UKFW#j|EB*L90`APB9R|1%QU&uwZU8L#@O5lT)?a(#JA)RhyQ z-s3!nG11Chi7>p@LjdoGZ!0YTQ}-F}JEixlt-i01=-0Ox_dwfV&UT6dpWw%FJKer< z<7V*vA2FgWmIN-GJqUIv2D*y)9KR&LD7V8OwCb>_4+a~~3>u6%LaMlALmLjPc7}BrgfAmHjvGIP(gPc2C(!JG&&dMlb z6fwfo;Ahi<2mm&9*g1hKvw`3ZjCeU<6O_=!$_5JzHp3NWhUgk(dthI?p3Fag{i+2_<`@jfqeQ*Vb(g}9_X??K$G z%J_`dCPx=IG5wxawgxwjVkg15FI&ssDAIJUi_c^QekP$T49zIFZ$)f!czF>|G#PYU z^8saY)L(xTR;HiuvgC&a&|283g)Jj;0(?%A8^lKLIaVpmEBGsIk#(XonmIP6_?EB> zESHT5?HRo)xTCw644Q(=v3W-#TQ~L&g<^Cm?KJ}_=!>8ZkMPTp=Y*{z#XNlAWoqQO=Nm>>L(6SGmjIy60j@;9^i|roozB1}Z(^F*F zU+#ymBMDaL;E$7_V~8)2o@BE~xoc(p$8_?VB$>r0NA@>C(l>_p*tI)Q*tWFq^FH>F z&XG|-?29VyOiLGoa&4+A35N2a#n2`xhul_iV2DwZN}E(Yos)BRgYXQeM*9N}F~gN| zT9mrQ1;*4&lOP@jj=RFO6uHQ~n z9?%#D5Sxq)NWC^*Wx11?PMgF~tDd~JkzR5J;cB0{#x%!wIX+aqa2gA!hbCgGymfDW z?_JxcBv%5#ns{3%uv~DGJl!TLzSzg#B$Mu# z0`zfHa(l1$p=yB%&wJS5hR2eZ$0b@{u?fSCgpjeG*Vs!gb7soa zr_nE#(8ka!tQ!x%(=YfUWY|STmeK?EqmDrPs8r8t_}(`U)vzPxi4z~$tq$m@H^4Zm z)e3gU&^Oq9UPJRl^1mpSeLnm@V1#!2yEgO__bRtDv2hg0b@im1^Wa_(+^m)T5#U0yi(fGM?PXacn3{cqS^e=U9V@iCHw}v}{?>odqXP zgvkVDS~ciaPR#mflpu>}9p)U{q_MXS;0)E(gtyz>OFK0hy=neS<|lev1U<*b83J`n zVYRGSAAf${&*d<7MEQ+@+;0TNCpxVlV7$GEoH7Bv9F9-AJnK;I(qAw)Ep4aj4@Z)S z_j2O|J`gpQP$2)rBC|$7Ddtxudv_TSSf6(WbQJek?l~P8i{(_D2oR3X*$z<0Bx3<{ zcO_z;_8U%$m1+$mruaizxACKo2gn=>&w{yCcVS{SnQ?lHZAb!D!Rudv@Zy1$;j|6N zw`>)39W~&-jZH<;QqYS|G`@Pl+0Rc-ePrEesS;JQ^I;y#{H3(iBhI8oyb%ymy!rXr zWb#%MJu>=XS4Rwwsl;^{Xy}@B(z;jhCt1S&_tv7mw>UqQZMrA|g+oNn)RA`0zl$XI zwW({L>h(-)T)TP_0uChR2vhmkYD@+Cf=+K+#=DBT^xF9eTfu@TCG@4Exf`~UxM!eW zphOzbaMp3X8@>dXsHoKMi0O7ltDy9hxaRG`u?6N+N-ak}Vq=voIbEyWOHuSM&?#@&3_DyJ zP4x5VBCXjRzg5_MJSV(7FgfYK+wb%sSZMYf6eAg^c|{`1!e|mT&Lgdfgmu&fPH(tTP4n zot|<%mPL1L0U271#-~w#9nUhViqa6|xcSjzln9&RIxAi^iQTbpB`FvgK!Q+96kr(5 z%pNVo%^t*x{Fij^jBA7)I1~%cSj5c>tjZS4cnki{=w9FZy1WO2IJ(;)L}KfAb(kVp zq$s+?zuCh3cke~>XQ7qJ3>qP%j6ZoyQdi{wyXKgw7S4;1xLmc-zM+iZ(rOwm5erXT z3(qPEQL|OoGzYA)n)OPs9L3T#S3?^GO+(xf`T!T+?m2iOZILSVLHSQb%>B%z#HBD0%pr^XzT933Ca9r#|OWmg4kh=;rPKk1-5rBjszyPNJJ5T$nx92&(x(a!9@XSlNtXUD+U&#}N;X)JK(0p&#cj zlsg=6`ri**uJ3efEqM0(Z+-B$+0Ge3JSKzw#49;x0iT%}pO7S+7WItB^3(I!W~oM4 zV}uc5c!$Rg9#CP73{0ZhU-+u}p9Js$*6-|=i}j=ntq_`z@qY{|z#uu7^z6~|xdCx; zf@!XJLk5cmgsD+$aj$&RHA>$@SMMv{+2 zrsb_eWF#%6MBy9Tu#7K3#qB89u06`*lGFE|E6o2L_y=Y&h6gA0?e!m=#lVAElhE z{$(0+f#3pb-||&k%-k!7Lnw74%{KV5=^yXc`dXTHv^Mr;dih5e+g+ji+k|%w$HmPnYc0RuiS%!|FSl;Y7p9dBXe0X zOU;r8w@L`&7Z=5tTINPS^iN1Kf+TkQO@elvfphVZSjl3kX$+{sQ zbgPxCVgn6LafWO=$6?RnnxwGD`mhnl;B2^-^C1!`3KLaYgQ;Xn-6JasD~W7xmLm z|69H}yD31P;u_oAoX*Mk2<##41H>R-)MSy0hU#9o_jLCB-P0WKdR^U~QM)gPfL=&l zNoZT%!Bi!gj9OfUWY5a-oiJ<468rSBu3v+5iEKW>ZtP-Hw<`G_xc=B(^{v_cZ0W>< zY&MP=l#SQ*oUjj=-9Vrj1`-wY2_I#1(jn2G#a{Qqfw8%G*bL;J|A}k=#V~suLJq z_P@!QfRS;e=)Pin9`6o!r;O*dK;I-AOON>aja{hM=6tTpo~7a1n{qHW6Ixrk62Z zogF|3QZskPqjh ze5S${3ES+nyB55XmRsXX?r!hb6K zD3uR=H!e)Iy4JUqyGF{rujX^f(GkdHh$O|@x87+N?d{m1CZivw3#+4L{DLD}rC+d- z4%#qtOJ>IZ9by7per7O1qagB7N}*pde~@L|kC-PWjHW&1;rLHamR z`*w^?c%tV%vfX~;UkS$OUmGf*_Wsw}$83C7VdVgh7#%iS$}tCh;I&V#JSJ{PYo$FP zE7};?bZUETa60Q!z){8$hmEODK506@&T1Ab3D6l7^~RW)D7clc+CPZ^cfi!g%FrAE z#`vu3j1YEL)F4WDrYV`Wn^5~A4k2+Qn-yTFmj0bXG^EoPIJRkX=Ss(>f_OSH$^9OJ zmQ2x5gI+jO3xr~YNQ3^B>cBA2!Y|082zPfO8da)mPPGA!x{KnwMNw}bl#GDZ89+(M z)l}9iI?UM#Ua`vkJpgV40FZ@`ybgfPhT_W?NZu;JQv0=D%P{@cUYYI8Tiyph^1(G% zwn5{fxWoRFg`QyH=YYZdP{uRx7r}KIy+Ys3A|9fg`g9+t$=TNQo$ndf{<*Sg5eh0qm^W_6?&wK8o{G!`EGG($UJcCR zSh}c0J`^KDt|>jv9K;hAs!6Crm-GnSsvf{;3}fU1^v^nYIZ;KMYgsIdxNZqCBbV*b&#YJ6G0ym%LcwjyPp?-9uTM`PsWW5Gx+QTzk#I=%mW^ofW%f-|tXTSaKwK8l z2kQ6bMkzpK%n!g=mw4NCVm(F^LB-+=HVe*b!nl2tl}fJA{oQu1x;Y+M@l4Ivt@g|d|+Dhu}D!S_@}eXHE&t3+&;Q)T z<@ON~mL>gtHNjLWb=58Lh&3D4tGPgGT)fW$FHMa#MV z8sFs)jVcBY!HkTVn6axjva)?V#ld$5z*`K6v>yqMrGJ5hH~oO$_EsbXA|A?|5$~?m zgb{AAww)+WQWh4lK6nZ65#JjDXd9HkyZ07w{ioxc!a0{-mfGW04o*0=2lR+8Frmmm zPd{>%Chs4klhudK(T9BKmPd6WW%JowATrk#g8>_*oxk=}Bf?;}tOQ#gmrQELDl?gT ziunm2(R%Eyr~Z83#0Mrw6RBdYML!3W7Z?hEY;a;*xb-{1w~7CEJXp~?ibv^(yTF?1 z9d#U7OU=@`ZNo7C&JB)YX(((f2wJ)jm}_^um`tn%jfX?xQ2gJjrLEP?tMfoG^41=3 z7QKlrovyCH90RE}+Tq3ILqSjIpRbhzUB6Hd%OKc=smoDTc2tgb*p>7Hd+2FSvB4?I z3xVfi1e#EaQ+hz18OLR7%9~p}%d2BxR)mFabc;1@rCjVB2G*yTszosLfx= zj92x?;oR87u)wHRcP9t6n7dPJR(didTK1h!YetV+0ecoSaXw^6_;ee2G+~UpvLxHG zhumOmOtF0`5_Hg;L4qSxV{;$Eg0kpup}RJ{$;hlxGZl3$FAFeQ^%*+Se7+u~VdeLI z)vk3}5CD)g%mI~5uHKD~-Ydd&)sLq-iDeV`9UZngt~Kim1wVSyz|;2?es8{Py1C&g zKiB_Q9YFo|Z!&ZVQPd4~?DR0^Q~E8Kg@Z$ZYexSWJb%#fpEDbNXJxINUj;h7A}Z7} zoTV74VJ(1-X#)ryt2@V&0vPR6a~F@wcVd$M$dE9s;3z1OVDQowLao7JKPC+U-*XG^ za-e&tS84W+9{LNHSTni)pm4LrFl4QwDyOhiS`BJ<5ccSxLQl*_Yqy}szDUa+G2H?- z+~JS^H1cqm39G=43YT3}jFV>-7^x}J;aWXb#33B3b?b_G%2UK7rX#8T99U#ZACG}* zslK_Ccihm^1+R5z8S~q@-Od^2=TRGqRZHjC3}&0IgOS74yiVL|ou{LMdn~kE19SaJ zeZ73@W-0=aRTUat+ozl!+iVEg^mM1q&tws7W&c`yvN3a#G1)1UM0;b!aolM_b`IGK zM~mW@`+F~y1Dl8pg1$pc!L?6Heh+_z{qXlP`XIO!PxP2`(g|Z&xON#eG<9%B>GY3Q z-Do?)AxuV`X_m;duUJi4JiIt)RHwRRZyheOmp(*^2N2SEeA4`n#XHDOr$m8qI+5w% zI>+QY%m*O%9mQ$C5HCktumT?*+Et`NIut)@$=mcBJl@78=}^lG=gPk$6I+(DOgK5& zi}*5fCCKjOzk{;wP%B;sk|DJDx1)&*K3aISmb00{v=_USn~Og+HU9mzljAtkjnRho zAA%)V_mqVUcc*K&Ifs4yl!QNC7JbUcDZYY3zEc#2TB1ONa$0>TfAyW$l0y#5%dB9(kFBUof+KL*C@wYgAzL0`yh$Paftg6Jko=8xR7X;Rsm_Im{crux#^(D-XG*7wg>O8qnJ_od z-<=zo*P)>|NyuLBNf*A@>enQ~5FV+T*|+g7@XMCpcQ6u9GS~tzCv|s|0HA8=yug?Q zD==vRgllYOG5@@&wJ_o4DJw)7A<>;CuyhjhM!B1b?Mrj!I#gGQFHotf=Zgg_Covuz z_zw($nsAh{iwkYoJEVq;G;NpW`JP_!Lam~5TAJFw>QJe9vUm)in3!3(<&R~hvsraR z0Z8cE0lLm{t;piH1Qc-RfBd;TNqyTfQtC+akdO48| zHlZrII`P6mUV4qsPA=@-r>qE5ZI-3UXKAM0vy~(WXV=fLTd+{98_XdtG+SqdI1y-5 zp5xfFs9IiC+tY(vMt4x6>{rh4|HCWZz#arZ*i9+%u_J|6vHF!z5gTc;3x*IGQ&SU@ zmEWLkr9fHGDiy0noW8z$yw#?BN5kQey3gT`pr^Of>_!h({-V6O#Q>#=P$Gly77|9< z>9o}IV~h_kN0qs6(BULc&j_1h7xxWAlInQK#5{o0)8a zF58@K5B+yv850>@Jd+cSbB9S=fV?9lMnTD$2~lA84~JZcsOgSqYzmkM=f%ZdGhhzH zzn-}5zVHRQX!8TnuDQ~VCkvnOSwWiiOcG3cp9cct5bp|(UZ%VOGO{7I!KQvl>JIco zSXf&jGqKK!FPpOrO%Hcvg9`563IqL;;P9&;3ur>gxg~b1ew{J{4fAt0ChK~u1QW3k zhqH5jh}tk+eor~aCKPL~JNZGOQpQ@;5%R!-5E(~5Tc7RX;Aa?k8ivqq!MeghSSOq^ z{S78G82ZKMOQVzn-@JYIJmSi&(}p^YbpSo|BUN>m*1*3>4H21@IUln>e;Dxgl^!Hc zJ}es*BFuNCmQ?zeRX`q&U8aeIuB{~v-&`QTymIjsiWE&ZaTl#6g7Q=~2FqXzRSQ(` z$k?%4DPS(22LEQsmCY#oZXByJZP_c9=?Gj`RKcoJa+DBTjHhlid|zscOlaeJXIJw^ z3Y{^WorTE^+gMnvQ!Juxsk?xtUBfGh5F=w?x$>w+YBaHmimAMDL;^6-%zQ z7e3x=8~E5{$iedH-!^!Omii_-@L;-bR!dI}-A8dmjPk{kbV40^aw0Mc>6(w*Gdvs& z{F5o+BucpFhtPCMt!!G?xNg+b@K&R=>|i4e`;_Hmi#3YhhyV#0c&J|dd*Li%OG8`c z>SZEX7mKnbYQM^Vr)iy!7DZP{nH$&g$C^ zku^Koxq~4cQIln}Qig>u#S;J{MMc`1BhKz|e$%A^mlM=R+T*d2;|`{*UuKHn*EaZd z8TUGK@T}V$v#g}{^%2}roY_r(-u32Ne{sscI%<-$yxP@ypT+ZJLhj%f0#I=&!EFZ( zeF^RlypCo7#9Z}r#~5-Bon~PT+%*`(5RNj_5<9&nE}NriOHkU6-x1Gaid_1VwAZ?1v6w0HNBJl))3nLsna) zply`}pO~}?0bp=N$s5_zkeq+$(&R7Q(C`H>5JJ~2@OmkRl%BW6^c<*PhoKPGsKG?> zY15{610ItS$|}f%gs@ALh*?CN4F4BmOz4hTMQ0(xZ;bqKS86SDqsKpo55n65&xugm z_1cag@MN!2WKMKHh2(QBb{$Ce)f0mY&vZ~Z-G0dym9V@hvZa?HPl@Hn2zhrI$6>Y6 z!tMr{e&%Li$iZXbN)a<q2;* z+G>*f@3eM7g23xn1v#(IE8JA4D83!@$}w*5^bl5!V)1Ge-eVbe+#9qI){ zxaz1VZ@|OQKPecf$lmh{7_J|8HW*f%#hkqv3C zKV5T(0F%~%Y++59m3n`pvN8a&Dom5>>w^`GDHUZJjFFkH5sjCLvVJN=MTQt%%k)zo zK2{4U4IHua;<4y}ymJl|y)40)R>jxiGPd~6myAjeNhbB746^yU$OTMHM8IoE`p>%ZE+*2Uct^lilmtZ|h_rW0xdjIVgyLK3~pz}4f$+ilm9Ro~nZ zdR@x26r6MUA%O%9TjCjjxRSz~;)L*kg&3Ft$2;I%W$)<ss!I{%^i>K!7Bcl zT0wWFQyOr7@(WN)s2w`m=u%qMdKNhlUB-hy=7Ty8(Pc}X3M%j+!rTxvL$GA8pmlG| z6yV7Mdh9{mox(R$0+hEY#Kz0LJGvIC9aA1sTE6Z0mhuEq^gBytO2yZ&b&x6eI%v_@ zcJpL9qjo7oR8OVGAz~_Pq3g3Oa8E*>g%$@_sYZUeRl?ctK>0`qjZ-5J|3meiPL_aD zOi40fbLmLg@jae+*G_2OU(4iTi$hAfj`!u0ZCn7=8hJdx0dwu&SfYo~$xE^|wU_+h zGHy`-_+kHJ0Fm6fKPiA(M19|P$XimhQ=&nVYKm$Wsr>XgVY(pyNizSqYAE%f{053> z>sj*eUJufAB2TNDjH@~!N2Nl-agBjsZdh^3HaK!;P1to0N{AJR74~4km%&(YJp^f@ z&=G6hjRdW(6--*dS=qwmvm;ze4{JM7S;v^v&$I<3TKI}*G(DQkV^e;K{2U7ziqF+b zGfU1+Vk?#`d|iWIosT2%M%m~yl~7H$+)C|FJdk!4eF+pc4$+E7>8?ZF0UPInX4>iX z1K*z+&Qcm$vh4*6yn{R#93#;;T6yP*%vM2&35 zI@AEq9OWai!K0ftD#s>#-JXh30&ntCHwmV`b z**cZ63lRtiIUHv>I41iaRkJXCIVkp2MvTb@7TTA<;WA$}_GYvNxTlP%Z-KoEHPwY0 z0-!OgoKQ-vi{KRi<4!JYXS(kBN!UV(QfUq-IW|Pq!>;M971 zb+BZs=+n}2ky;=d1fd(^B1hVfxG$%6k|Pc|4W+Sj?BDcaJljS>wy7fN{bi(i5#JxJ zY`&&BmVh@-&)#_B2*7DB-UT8AqtYm6@43LG4a)$cYCxpPTGt2uK#qy0%6=``J(Lg5 z@p}Q1u&Pe;@_Gw*Z_Fbq=MuL+P4KKTl{v`t2ihI(B$DURY1U0R7pcphxV41Rca=UF z2TZMlmgjlETO@BVlCg)A4$t+P4_>m$J+{A8>AGhu^MrO}&o~!JG3EbAc3pvGsDXWR zF>2w3);nXC0nD|O`mFjG1}~`2=z{C&sm^hOB$pf||%6@@RlQdW$ zq?7?<__}7k_txG=858L*WSBKnpAO}^VC}c+_o5t;@5&{Q@x=%>j6`-r?@5nn0)Q6A zWeB`+>3ve83U^ZL$PoC9yX)7dA)b|%QqQy$*#z*M18E)2nZ=pjhjgj`$s|UAEXN&9 zg1+tVaP z%wiP^EiP0PFF7xD-_M78yI}KHO6QH>XSWMj>^q7P$?0ov^ki8B2E+f*-*Vb9)Z`I; zlB5j5b1peU?`23&*n%K>mg-W1jtHs_+lNfR^^k)nW*(+XBep%9gTnZQiW$m#o?HVb zv$$bAl|W`0+5%I@#eOF2P-iQR$YyUa(&2gq&Ru-p=Ck=te*o&W?v>_%hMXA?ON3Ft zELSc;Bt8|5->t6a5y%k;R5(_id z5Hyb85C`bn^UpeKiRvc@WVO#@l2XH%uoVh7zWtryzDiKhM^KSvelwR?G zNw{l??u#$`%YNQ)(~S-i_$t2-Y)lBd?1^@xLnNi6;MZq-RJ@=DetIp1YZjY}N$}|9 zEm||LKQQga{kqG(1^OGLPrj5IuD*2u076+alnn@;t!Gk1bc%CPDol$P$&Y5X_Rf

        -5nRwTjRflLEDq~R~34YADXjLAtO5jH0{Mw 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

        =kS8sf!V(#y0{?UiOC;l=B6Ep0q)(~W_KBr>wZ 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

        5T_NQ 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

        ae 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 #|nWOERL&VbfWs&{fs&z+^V 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 diff --git a/services/web/public/img/feature-page/feat-todos.mp4 b/services/web/public/img/feature-page/feat-todos.mp4 index 6e827a3ce3717fffdcc178b1ff4c68d9e699d596..4e5d1bf4529265550e0e02a741b748e6b8d6c7a8 100644 GIT binary patch literal 225988 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

        A z@6Kr+KiZ0sFUu>;W$$G%yLA5Qs`yJTHwrvi!R>4vR?$vFbGJ6TZ^}tmL|VyI>p4_p zi9;|p0-Xt>`(%wHK;rsx1>(G-{!?dKUE(WQSG6bm8r;3U7#Q7QP(~`z81AjFh_~K+ z*>3s?y;)4H#k&Lh2ro{eEw5%dWn)Z!&6D%~0l*cM zZ=)4o^vs~3*@T1v(|8t($hZBsZZwGaf!t3hd@lPgpt$$olvD7{Ju+*QTG43-VBOQuAoVBq0R>gKJ?vX3Wflf!K_6EvXAFleETW}1da zmZs%=MR6^g%{}63b*2zn4I3I+RZMbxm~T2Y=lGx?kEuAb{7rMc8xoWI*e zjNs;^fWe+Colx1lZXy>CQimoepyX3BW~QPalbKS*QP8fIBN4eeD9b{~I}1NPXnKk2 z<|g{;JuXbx?ht|A%5CRvac^pee(rAT=WHeUEJku z7~vE?!wVc}npjYRb3||SCtm)xem148R%vk^lU?LiLWd7`td3ofxas}0TBLsU`5gON zR{4|_xj4VduIxA=yR1pe@v~q|5)u;n9P7^=5oJc`kzOaaa%Gq6*<09dS7wdtt%g0}v#tmN9XYC0~C=K@7t4cNj-#Zqd)??xJufbn< zmu!>fGEK;$%y^pi2K8BQj^VjkB48#)B3&9xVGzBv6xSbRVX6_*5*6DCm6G1vIGpdF z4qcq-as)1rS;(_lhI;p>kn=eoX;rZo@q|-Sz{gPmv&nCz8%4%aOB)yAY9n=I+LJZ=qup6rj0$H&(N?OJiiWd zx^3U+ov*_wAtfu6W{X%DIf^HOCk~@|h&Kp`+`q!J&>A}*Y13{%hA0OJAmEUehv^+z z1gYVnG3~RZ*Q!mb8)Fxq@_ixO)^Fl*WG=u#zV6F|zZPYGnr?$wfun+5Ya*pDi@KWn zx^9u1rsT`rQc?&%s^z5%p?xwDU&NuEzAbTc_6tlc&Ce8>D*CT#3L!q;%=RhKRl&F> zY)oet2_@SzuOm?P>9^o6Pa3tB7kEl)G_32DN)T_$quRr5XgNsG8oV1=Jy5TYoiD)n z8sJnS_x}HGOlscX^#$?h@otW7E5lh+^@ROKSXH6;;(EK`V+y@)K*zv^KW4E=kL(_5 zTW@Sfj}b?*od3QXMM$AD3*Ferp7O<;4#yiM*f+`Es+dd*h}Wd!;gU_y8`oFY5zQ$v z-c}>4&>)R((WzOa1r5Z{&N#}kqSfs3uwnLm9zmX4Iv>?7uy6FpB`lXEw8WK1R@E8) z+CkR%JXy^IW7wuMJp(bDq%upZ_PC%>5Ypfxz|lp=RJ(FrEcZOxk;waoDz84JcClhO z=zb+`ElMzs;*k;bZ2cUJ9vAgplP>6*GQ!A5i>nz_4!r$em*RH=pcV7CHRAFA^2HBW z1H%wQ{S@$_`O2-Owr_hn*{@V=EyxAx!_+Eb-oTA1-vOe6ehQxN;IRBOzd;1wA#k8j zZee*RsyM4%fCeSp`ZMv(te1bj^5?So?_a?&&>F_0pg|Y(Q5Q7;JQBV1vqO%*$`^KK zO)WoZ?~C+;>-1mQBv9+k=5!F3o9^>r6%1|P`j~|da-0KZZW^78xA`rohK zizg3kum_2aKE>jk3E{rd*w-jlNvr7wC{1!v5*^!eWaBOtsJNyyH Yc6!!(_ix5 z02IOz@@K^MTIU{`>Izr4DL3OKT(A7mNCSo&f8k0J4qj&AN=G>1A%8yCDKa3F=A=FU zTuA%rJ?|Ft(@bm>t+3rEWfV#jWU>UNvO>1{Hv@0XQ&XSEbQ!igM6+7va2dUPG=FJ< z1O9!NZqDKmf5aYl=<$C@=hk*fL~Mea?ZB6nfV+P7RkpYNWa#Q>?;DDog0R>xN0hi0 zeK6e&8nHF*EmVl}Kc;M)1+7cfCE?fUJlg6&pI3y(%eXcT>>vd6n$y&I7dgW%E*Z8) znrN(7h|U|tm^btC0^{B2$el#BuF=um|`HPYwcjZ~q?(V)>{T zm`Pd|^a=UZ&@D=eY<UED2 z*4=PXy6lD+Icdx>fHsQ-PqPL$+SuU2^O;KL8b91*$g2bWj7v2RIIUek%hUBK` zq?ba<%LbS>eLn(ibb%M*0@N-XlH0{+y|8Hth;+9#&3Z)SV$PSq@Zhtj&pgHYD27`J z=C58(7sun3t*{>33L@BM=7>4kj3j0)qRM<1b#cR}o}Y_D4_D7secilLfT-J0qq1V= zS3bR;CGYsezYBoxM-Ae_%;`7a z#{WG}7(N@W!JLmM@G) z#R7tZ%73pF{A*w-7-@w8D$8#p4=k<4kR`dLTXq9z0d)o|6D2Y*;s4eA2(?9#jK_H^ zWj<7S_`Jl^(~dCeTNUAT__UCLD{pj#a7M&P*0N&Hsz;Q;fDLGUQ zh5aA9VKKRyh7^Ld@Vw-S@fKBkgCXa%6!~`BR3?h-Jfw@l~ry__L#mFOK ze=n?01i(@-ZjIvLpNP>41GJzwumf1fDv?3;?|{L5{>N{Z0J+WngGX9Rslb^t1i+1LIsqGj8LT;2{&4XcQEYQsUP;`EH255R12+WR z<{pQ{q4XCEP+J^H3353~rIbnl4hC2Uda83gBJe+4fV^>({r`9am51YRj#X_H-t zBluf{e|c3v0CYG>6SHKQHE7h*L9ia=Nb)}%1HjRcC#D5J(5WI0)`0?(eB}1g7X13} zI`|^62IN)pUwC~ij{a{5_`%j71d@L<`&+`l#S11Llmt2b4HpOjEnOTS@Hk(=l$KJc zf5Z*|o@>4Sg%CsvG7w?}U5N}StN&pi4wmE7FVJVdmNzW%h%d85xMqLrNytdzCCBOA zaR8nbYEG1e;mQKy{lj(qxYOHau~NDncwDmY6t9YM1!r@}n@GZO1AxBUPn@N`b$VRx z;9IQ$qTTMa%Mi0;9}e10N$N;O`Lo^;exJW5AE5jUWH&gH;6}OF z?WHBfWcl78zwY`W+ickzZ7@XX5>f3Jye=vKlz{rjd1A5N3dUL1S4FTTWeiQ`}RrIdKVd|6;3>>MEvadOhn za@%FBD7v-y#vzlIU5pH^nOm!{c2XV4&AOAW+^ZH$g-wq-yZtMcHmt47D}NM4ji_-| zZZRzfGVz43X78Y&$s$jq^qcC|g-=Zs?}TRJ7a<;N!qE&V#*wELL;JMm{kemJ;W4in zYkoRDK&oOJC-oypW0G&AJ1|gVYu^>r6u#I9=|W|hSgGh$6SLYr#X`17I_rL|l-g`n z$+atVaKfA%yUT_8r1of}o17IINvqOgG9woid!!&Jmb2wrWs|Z@TkGKSN|M!7xK#hP z&2%8o3+>aRzJg97^x17{G&u2%A24X4%u!B6TsjMvD;%<6lsF7EliUp1$K?X+{y!{a zghzyw3Ym9JljGczAx6+ju8WXsxTMmau-&8;C@S{NLu1+#nseNhmWy0TF`Sgi4f|Ji z%!-RYLrX&Tn{UaWu6T2K4Rt==5$shw+cE0i;ul5BGUVZhigu}<7Uh2%eA1ja6sy_D zi%#+?LiQ-bUyl>miL-JugXX|9Fac=3G3-LZ=Ju7`kJ-DbyyKRBphY}EZHlRYbsUeOd{L;HItq8HVO@sxNh#}XLe1+s-A=R`_`n6K z)2RfsOBCHTEjpR*l&U5o(PQh647g7viPj$4DG4Nz=6!X@Vhqfnn8p)?F^t4;MVp_J zeAMHl>td*Esa;doq<@ntEL>7IE;({S6!$VJU^;<4d3AliVj@?~LM|}E818o5{6zDU zHjZi`=;@*9M+82CD@&gLIZ!~Ih?BGqu^{WCS30}1%W-844$M>f7&PWZ6yw6ThiL2%1oh$Buta96lE*YB9t`z2LvMoED`_s>hoed&6dZ?jx3( zz=o`D@RnKn!Ad1JB>?gZ2fvpk)xQv+ z#NK;8dN+%+dRfZB>L}nJvk~ZU8s4m)x8|)Ohcli^VE#@TstAJ#$w{5omb9$EsFglS?h{Y-oe41C%!=FH7knN45NH9p09=g8`#kSoLhGKv$waHF5{6v}Q$u33 z`D2*I6E@F?FFz4myl}(T`zB&Lrhso$oc?9vnG8BoEnTw-Thx%5h|AYbjjerGuI2`* z6NcH-l|oz4Z6}s6i8)>O6Z1>qd)bqG>qvNgLV+vJ3O4Asj?X&Ej6w0l3q9ubjjbCzpsdG$21?M@!# zNndr#Idp(G!{h$Z?%ojP_!_dD`*0@zkaw~wbYF#WWm66gjDzV|T`j3DAfb_<}xcj8CX z?m>XmXQuw*X@Q&Pa(!Ia_Y_AE0AD_W1ni_Ok)b5}_fy|9f1dhY1-E19r;`FETU=ue zT;Dw!pnOUDCMhdLCQ>fJoD!a}f#~jKL+z~1+(iL{mL7YmAK0y1VVS`c>K-#U;5mbJ z9i&Vvk)wI=_)^gC;0ed!3#`S#mQLsb&N6+XXdD3AW>QvT`|<1u9+(V3A8Z&GsA<^_ z5q4VucASp}yw0)zel`(2dKi>}9@^k>2!P+B{}X5SSUU2j^!I_}PaIZ`A?OJGf9E$; zU64L_ZZ~B4?H=t#V_X9O=c2E2Ko?o@Jn-Wv%@P?#GXMK#_U|kh0OLiXC|$P}Q&1ug z4KC^3l!H2yRKiw;Hr*i{?AKI5&dogDSBIQ01ixu9(l<|Ch%wSdslH0OLEY6zfER;T zSZ>JA*Bpa^f5~%0Jtgu4we;ZOzE`MowcOXL_2FQc1IsL~<)f28ZEGGY zibYwq`j@sbF69!fn8Rzfx;Yj#f~szOv=ju@IFX75XP^DK`F7dXc#j|kB#hL*B7%|a z3qtc{npiIJLIG11-n8qC7~W5P%i$3QFArNHvd#h-1Wow|m3({*6U7bZQ21&t>yizuVebmZTH&(O@pQ%Ue2aK&rqlI588=c6m1>rOwHQHnP!LO zGl(gWeR6U85f4Q%U@j&WmW}1X8mwT3`k>ComKA({9 zse;*gv1YN<*9b=Me2?QKqVO^UJ`YWbgfmhN5pKrrpi+4z{CHcdnCp;BuX@BH@{M%Uel2Je()jjI1cocps+&qr7fl3(b?In0#yXJbUP;4=ZC)X0@ub^!Q47sp%iPcvnEpRHW zxJa|Z!nkh0cA~L3mJPqylv+fXSsgpYWuBVn=@hCYlY%MLc-LoVrL#EZhE~Pgt@t@K zj@}+W+*6TCV=;xUagGFTNBUUqeblUMJ(D^`SW)HA02yP2_!b_5!FB3^EskVy237oS z9krC5R8KzX+!hJAs+v^I%4m*K)wPO=lWEn6)_tQou!mVerZ99z1w-oJbs>|-T=Xl$RvPxn$V;)7`>?W$@G z;^~ua4&c0Zn;iE&Hc=_SGt1 zGwEnv5?}4!vYf=>!~uUw7?Ejh9i?luUO*mklm%uWajK*z$DGlHM$X%NOodSmJQH2@ zS^p13RwPqy4^KWDOA591uJ&Qw(l719jqfj!yldPq!Vfn%J4oRe!36!M)y$bP56)Uk zt%A)V=oFnhHz#cxRdO!g*`W8caX2Fd<4(`Q`<`n=tIbe!7V=$oW4XursC}1Dg^J4`tbq$I<4}Q^Chtcl(UBJr7i??(Y zu2+uGLf6v*t?mAb=aP-p|D?R1)YSpIbJU^3z?N*Uv*C{6{Y6p%E=j}}=pEOuWGBUD z`D#d?TKhXV)uIi3v)7^Sho6W_(<#$NI{q@ZGrEvNu<4*Q=(Q&@te+JaTNgutjK5x2 z#V)vS4Ot12OMi>E4UMWAs|~7!8Mo4 zgaGsF8MffiYFR{0d{t!{8Z8H8J~B!Uvz6xzUp1CNdwj8UVIY{awTfOylYH(N?WHVQ zuPXN^ai2zuiP6HK11a=c%d>BS#SHMWw8hi#-G`j%JALj{{7tt4+>ShS_=ZjN$wyNf zX6l21Miy5u50CM%-W|ez;hX8GyttF(nJ9XX801`Qt#s7=jN@2%rB zJ_vdEu$ouLLnjTtfH5DA@!#z^MrobhBB%ZT=z8mbKAzlv_>EIsN^y6W;_mM5?rz0e zoZ?zsiWPT?yA><$PH}fB#h<0^-S_jmdyapA-Ar~jlVm0{lULB~+r~eoK~^{sYJ3A>yKF_t(t_*!BQ5)WV7@`> zQl`(Y1}YWP=flN=N$XK;Kf2}h$KgW>zam0@b&X2|j>QxLJsOd2Mnewp)blXkYzdZ% z1Tm4!wTe?-JBq9ZIuTL$#fzmc67Hu-!glLv-^0csf_JogquIFI+dsR|1iARD3R$GE zK>gw)=06rFo-wCtEq#>JmbHLuKz&>9bw?PV@y>&vYzz|{j{VE8ZkE+{QTNz@vQ1|2 zFK-1iMc-RwlQ_M#(^3}CcA{(Ab?{=fV=5cx3s=aV%^>BwrRBj#$j0slT>1l~{)WKfkN{^L!r%nR zf?DKS*?e@}aM+>c%DnddeA!wF0s^JbsL_}#z6@7>8Ei()jL*pRCRCoCI7|UVfruZ> z!ZGU+4Lg3^ZdYU6eb1T;u*-0~9d#mJX{)P57&%3))GPnEf2x<7`;2g)KmaG+y&)^H zR+?q*^Covr%%qcX%JhSN-=XyP=kSQO-QW)C`B4NYz2Mx~EDy0=P|kxMlxWkwD;1i4 z*9p{JSs3yg0)62#>{n40Rg;5u%H4*tF4mWz{9Qy^;aMwTyH7s_hlG%=gh%0SzPy&R zQBZ}C$?n{pR2a?B&?C!^?`0%R!i~3#l_`vM=r7!~i#s|{flqVoy=Qaz)nE<37~!C` zHh7dt6Y-USe37h=)q%slxXHCYe!3-E{8vD2oy`t|Hq1&_7W)DY#c|>6qy8MJ4-P$A z{u*2)a)mDP;Z3k0E(O-3GpX{d!<_GrQcdL*qA~}#LO$mA3ky?5qhg?8b4G{H9ZQ%>K$=%p$K%8Gpq=ibd9AB^jGRB%$qB?_WeQ0-NK z;a=e(`@}J?O)ad;QhtfI99mH(vVdY1g6Bp+0Iu5#RLmSePJG^y5E$Bcei*QUz;1yp zHJhYWwjsIpM7K{>Yq(K<_d#Cm(uukRxg2boEEZ0-VrV&_#(TJJLQmK#E7Cb1OJLWP ziN8Q6440d3wm6GDt+5-M3~u<2EY|&js6G>6fT@hXC|bOU$XIo7&)J!-f#R0oTX{J1 zTzB8B&aqS<=thRL+;Ry$i_gcO``r#B8gfH*k1nL~GT9{;Lj}_8+5JZ=tv16?N#X8vP=qHp}m6Vwt~9`6)j>?Ty{=&a^(eGFH_5^wKAM&nlND-iNg{lr?WT z`-#>iM~X%3*CE>Mx8|G)3#RkzTPZDC-Q@9v#| zrNsm5#X<;s831NFRS7Dr8KDu(6@Q@Oa)xGcW?n^A!h!dzo>*%O*(KoIb^Oiz;H~le+Bm5^uP3E#>zlkfxLPIGXFNjyw_^=>Ca@{=?mxS*Pwrv0O1xP**$-aZRxCxs z<6CTMHUt`ru$O0pU^pHPlrGQ^D0Aff&wi`!5BA2M2}`KXqbw{rPMJUnQQu_y5(6zvh0XK~|scV=k=V9LfG!%mq>!VKvQnD8};L4PeFM#hcZylrdEx3e}>VrByo3@-Z*3+R(uHdsBHH9~ziU#$=M#^@?trZ1NHXXMKk z2L)JWwCq2$y)xZllK!-Jd8!^H0ebcQOMe0HD@oy(_a*=+0r|e@5k$Z(GWcwTMR$%d zN}a<4X!jg<0-ykPK%)Q379xarj_2RlFfTWT|5yP;_$JOVfC2+zA_iIjm_O0~l4htx zg~e@#k%TGA7Z6vg_%(1F=+c<~SE3Ct+bICz0o8yp=|~clAxAbqMJ|*U3jKQv;YFhV zDbPRm_8Sw0N+>h=zh%>jyRmp}vkd-KW4-nQ!eFQ)B1jI48bC0 zFXu^Ng8~Bq8ep9w>#syW(8sv+qj>BE+?_D&XB{s+0XT%LztZ?)^uO00UatNX#XqhB zl|QopIsBjM2v!|s4#0w<@i_6JY;gtMg#d;?A*B@aKU*chhyLex@;zt^>WP4(&b)Nc zrXN5LthZ##evtW7?QeMaD>`b;Je@7^)o~F7huUgPHnd=lx7N#s5%3*Fbk2Vr+A-Fo zc(4dwbQRc0E8~k=ZwaLp2mjrn`FHu?e>;KW4n|ek&SuRr+qIwtxUZT@2SDm;jv$SP zYS9CX#f5!8`_qhl!)>s|BzaAl&8D4S{8??)$CWE%Xy}R=In1ZsrXeTj`+6+3%8Pe` zsxC~D%+sB$-5wRCH^Vntx zdA+ZsFZou@V&7~n#A`Uch=8 zLh9gq!3Khgs4WEz+b{&77({1E9l_H9Lcmcsmi;E2G=(H8$+Z=;8qS8)%n;!-5kg%Z zeRX1%ZqxTud!&9L?9u24+n}Ckd6u$xU$8X%_z;Nvt@aSePwz$71OPt6e{2&st-H+N z83d{{Sv-B;k^^_Q{wN%7Shj;KBzNtAT=4Stjcc%Kv2}DR2_@N>RBY5vRi64aJNo$%W<24IMqU*4P$;_uU8iG4c@9+h zT`7?|OvtLY>`oFNHe)sfd{fUfj>Nosb7R z)2mF*ksLGLDQ~ipy=f1>ZH9={i$^eLevEnU-p&~$7zBwwvJB@M24^(HpBEQFT(15u z3MUDcIrvA_rX*f;vJFNxjGFKOglf|_g!jdjFP!6PAe686^#+DvNaJ8E+9Q3-+_AVD z-D2#aNLXM#&%n0y?FT4PC1N8evZObeM6u}>=lKtd3-oZ}7q6c%1Dw71% zI))6qnH{?+DLFuw5KagX(|0#v*K9O^(}XkywaQju-h%f10A7Gj4F1(So(IBk3c5DUH zkYl!Jf>E>X+sqM(&>Ly+y0lgMxDTeUhq1$Y?!!G z$sPbZFG@Y(2w8OUu&AQ_O#6V7Y$2gJk)-9s;F0(Vs!y7MB}#}HPvHGzr`36-F+|QO zPGh>c4805SYkDE1D0jE9Y!U^=VMq8xpT@`W3lab$i}mG$gfb_O{_jx6=H&biaujMY z<{An%_=cd=%CYThGSRrIFUlaD&PA6v`B(Vw5ef#I4RPnD@}feR1$~Gh0()!mn&6?A zcz`75m+AN-pldJE9+bl8PQSCV>_)VF`L`OC=*3(B-0&rYKix4<;K@G048m#aoP292 zY$-)A;&TV9QOSodDAdADKEB6X`i4gf9sT4uA~ZNuGm9Q0iYW_?d<|d%xPs;XDK=<( zH8h`Z3EXuo=)RJ?541g`q70o|lIMp6`seZf%VAgJ-%PwXng!RaHF zjJ6w<*sf=UrF{(NeM7Ox>f5L#D5x25rR8=iqJ(p|!gW`oBGn@;$G+f2j88(k6)Dd@ z9#TiQi#Rk9c7i~^cS6*KGBY`#Xe!ia}lDmZb!~2N;93TwH!xkV|F8Z2%Oq)e!vF4g`N(bvhQAZ+fdS~y_D?Uh`_;CBz1Q&3Ne(`*L(+IpMS8Ab++)B>co0Txq3}y< z(%|67mo|w|81CR~#GFYYuo}nW7tQ4WSVaD15w08{+E4271cqGWD|;&F_9^OQ}XEW zaa2obkSoHBqmQK)ZkmXyJS%k&vuqvq-?f;@<^#@2&`yo z=9CI_z?#}Dp=Dd7;B180WoTs*gpKF$Yn?Xs2C{|afR}I<%DjqvvGISZWj&twh0Z$# zYK%KkULOn!7kaasd%~C$Zc-s{XW3;=)6^_jgwrz%f_gZa^$D5r=n5%a5$jer%EBDE zHY*&2z837aDt0Ni9G2xAZ|FbPb{BqX@*7o723NojP=L*w5hM&#xT)*o)Xy zNGo1ieqPo}-#5Mt>UJEh7(kZCkfk`LiAt}$Qx<9%tAx7-Yu1Nscr zbSim3ZvKktF~9`?pFx!Uqn!v_afSuilQyLx2w%a-;Hl{qA$=GVjlzN=tI)-Q&DY}_ z)rr8j*`{Y>;a?^!Uxd<;#Q&#eoghDwFu^n>8yWKMtN(NkB}p5Rx^5KuK{?`-`0Zkw zi${FfFJyzD*w67t7U^W@Lgnqpq~bw@N@=ss3u8hagf40?(he;H11@jEvZpaEie&J2 z0xtGojpn(v=;04&Ua%8Enik7gU#x||DFz>TK^~+F)n=#Z-mS%~K`EdO;@W^tkX07{6x@e@-m;KgO!wU&8_U1x4b+aGmml29n{(E^K`2pjDV0A%Gspf5!&~jDJU2 zRkOOF2Vq#QHK}q&Jb&3jpIi8B{trK z7(1+&twRMSEa^<}BFd!;1C1EYWOJ|YiG*-nP%QBs^M^-*Y=+ky_MtaVNp)|hMKlo5 zz3w@lvY(|OAK$EKmuOPx7DJ#^0^f0w1ysh3U%+z5_f7`&R)xES#*n#Qt)238wGI@go%85$C z;vuzXT~?aGTcgwMz#czZM}@6ReTpzTv4RL)Xi;vkw@5z{Ov0P}j=awBoxrz5h@T>- zXxVJ+GXtyh71ePwUG)s#fQ|YxQa%e2l|d)rk@4k4vmvK5hRLOA##=U7T1=x9M7h=z zv5I8yH~RaIj#f0WA{ZGlyIPWyhH+O^J{ z$W%`_{4+OXG+K>%FVDP#VmhYr;Q5DG(+CUOSY}d9fohY4x`Fno2UZZ>h!6N-P@xp1 z;ZM(NGL9B5u{DN$aPh}vRbdR}Kj|$8eFmV^My|WvVJd@)1zxLQdz_gx z3QSK@4JA&wPc4jdewRDkaNc<}{^Y}Qd{5wrj?oX{=nYGi($Q{zfvR_rWDI4rY;SNg z`XOOY@_Qt;E)j&gQ;mvv?j9BGZvRR2In2#d+o3 z6A`-ZsTiZc-FlZ5=-c7QzfF3NgqM*&)kJp+9B35po5f%#6KjAH4pmjCnH$yYv zf56kpocQMaRb6vW>nY7O*2ut{?uczid50pX7n|m5ZIg68P%&&9Uf98u$kcYpd@? zd_NPEi&<(W{UoHS5TDkS&(H&3UxOMQK0&#i|5#P~6+4*Td6nBX*U8q0Z5GrvRY%Uq zdjCA#JRhd!qP*0cB9$^Re~c^$=^R5O_~Y(;NAQDy>31&?GDy*LDEft;=BAw{Y=YlK zokMFQzAvIJN6M!*BXVshJV&Ci3CCxxoQ_NLZ*kKo1*>l`x<^o{3g?`sVWc^jqZ5ki zjM{%GLkN+x7Kj)Mb#0)1Y#G;#Ylw@aPbpoSw<&^(ARV@oxBT2i7=Dj|@lma-SaQ5| zLx*o&KS?5DX4HAKlUA8H=zR*kC&Y)Kwy7&o7F(na*ov;}aJ#px-TU zEmR`wNO|EieiJdjmh6$#1H;iVrIPxYY-WzyEX?%Uz|!2l%|s`Afv=EgbwKD>y;8`m zrsf1?(J5DU5XI)aSNwqF@!58E)Z$NHnr{))E}Y*zH=L5dKMv{MCEj+PfXO#8 zltJ-3mlD!RC->si2PK1#_o`7}BzPa#mg-G;z_P)7BHEUjlyeQmYlgc-h0ODUsn6>i zy7c`veJ`AWORy=u65NKx#Wn|q(q63!FlJa{Q?Ldgr5jZRt zBB>Ge4=LI@uwWO81A@>WfQG=h%V7JDakt{mbo_$AsyVz%M~Tflfh;1;h?I%D7eoD12^d=o4>|Eb80A-;mNbSiP_w2xn}nxl8$a+AfNjQo((W1&F% z<-IQ>bQ1WubYiqu%wY2U7F8@>!hB)Q&Xq9ij_ z-u&TQR*1eNk~k832p-2e#Xf$4>$SpLnd_;k)eSM-fs|^b?J0+FU>t zV-<`%kG)Q&SCBs*jU`y7wg`*GZD3wK*zg|0Dw#7&)-)#M7Z(&ZbW=UJl(!c3Dn(ak zKoy>X4oW}RxAe#genYI&EV-KeGQSr^LZ^CH2P)Ts@F=+(ZK^_?E|gmGLG~GY zmxuScE$(n$Pef2FXc+IT9|T>C3cp68l_u|BKZnG_U1R`p#BZE5A)zde-=Y6MCh6yh z-@xQw%no6j*NPp2g~c*M7)gE+QwCXSsFD51@wNSUiF+R3R|-LzwQrq(*#hXu0T3<2-;(IV^ip5wg}-TOd;h_y^#wj8Hn~&VQQ!Z#d(Z z=U>?4>F*j2mA{RTqHH@8UCIpfS>)HPsr$jJ*`u#!GtPV(=APs{c-)8tK;-QK>==cz z1a1G*hr$E9Y`EV!L`i|b5(0vAAA~&BWuHfa*qXTuGy!np6psG!?Nx1pi~DS?LLVmL z=if#n@)Uu~#IELcMg9i&rvl58MEFhovd~^U`pRZJL@!Y~>Cj;g|O<1>jT2phNi zWpxDb%96wX@U@e`9;IcM7Tu&D=r%?W_pErek;>5OC7hxYN|y@$pF-xKtc@ECKM^g) zbom8B1{T$UQyW=IvM*AMdWOLNmGmX)=#1>@vdtCIe>kY_)7`W?a>j8aCsBo?f)o+7 zZ-O-wfOJ#@(jOWrUEu*&U!C#;c#wl-X#tW#;Mw~2>JEDfUe*t^;=r}R;0J=+%ma1# z1rUP=LyrK2z^7~dx0nD}GA-MGY0ZJ!FbVJLX+y{|>-;sKiKI}v*8fx*EY~0yg%cBR zPqdWH1!+W0D&Xv~#|1+dK9ir5SQ4WS(YuAPv%)#2H4r!@zzYa+jfVfVDf@eE9R36u z>^;Gy0fhPL00<_-3#6gEz9e*JcjWH`&;ww5R%On=bspj!OA3zA$tur9w0Q{I|aJND+#iP?g8`J%YYOudNFZ(%698a+c4Pj7DC-Ch3Qj?Pd@d z2ha)-Xu$9X(PyasA2p$eU1EOO@t{Wk!Y|5WI^Wj;k}yBWUJPR@WO(KyxR=Ec;2pyM z3KRqloYO%F=E66GNcW-vdj^3~k(!12`GE;M6_`+bp(}?2G8VM0mDg7&f3-fYb&VP= zs?PHthlg0LN4_3^*!rwr5kp_^YNC~ji5F+FwL8^#LnJnnG7t*3Sb;jbwua<7CQd*p zylygJ>-9Dkd?dvJ!DudhpYQwn_lFxNelH@UmfcgOVSku?v_?0JcMqayO{&eI>o-)q ztHVM(L-WS&lsbny9|php&1~ zf5MaoJxlSINFTT}*R;Vg^FXioW*fH3-Bf6IO9YzMGIx51)w69m$zFjo@GlqzS7Omq z2f-RV)?X6MLA6O8AxxUNBUR^$p43WMAEBPKj%E9tT4Yq&@|Pr`V{-Fh3j?Y1Tur0& z@s$dv=7`1a^Q3GZ!8Vwf!cBrz7E|N&K40>F(m-gL9yxN#;l3AE6XiL!E7{p_*`*@Q zdXt+dOPApp6W!fM{Cs#2)zIcyme7joe0<~tBc0O9U34y)Gdi4W#e-!QrJ7av6msi<^=U|1CAr|#)JxMOruZP zfhB(ytSdrVu%#XgjY=?+@p6+nc;@3`T4{D>1!UYfW{20OC6{TfgN`9s(I^s~R>qYY zm%ibvd0kF@tC=>6YkxL8aoMG>Zu3n3&05}`y*lIh(j}!X_GS+F-Bac{JLWL;h}}5<_KDEwS6D!@mwbr-f^k;rQA) zC`*2H3vtq!f{j8u$8`86)BEno1-h{oSC?l{7&e0!>snc2;fVeqHoet`HRn|?wA)l< z|74~qJ1>iVDhmS6;G=YZ3hKk`J4>}Tc74kf^TcxG4yyoENVNh3Oik;zAq*D5ylzsWI()iLr~dq z3+0jD?llu#s5*HU?t*8T(*L|Zw^;-!Ww9kzST?1rlOL9MT(j;}nSe5KwIv=tbV7jV zy!e%=lq0c4tE)#5iVYTVr$v{Mb@c5wnu{>|Th3ioi^rslMr93pk}TJFGwtAH{nl+ImO&W!wJ_QU0Dcz|{PK)d&?d~fW1%E4u@~MR^U+1@v zy1hN%Qx(BOpH+pVjbj#Mc4klDmMKl0NFxUm-*+Pm|F9G7prF=tNfuNv^IB>5Bz%=q z6-&2%LAJjBXie?2Yo+oHzO7KqWY}^$9Mi+i9@g`skj@mDb$C>|zfYTjsM~p@KhcQG z#SOB*SYG(hq=v~u!Hp&hU#b?f1T}bKj2`&*>qelXn625f%qZYUeQBeD%n;M7Q-EgAbsELHk1uFowoT z1&1`m>dYXmxp8tYehE!FSCj%SIa_m_0);EZNvV#yXdsYr9QcMgG6VCVX=%X+cVFM~br(an6w29mx) z5(PcrQd2^ywuPf=Wod%R7agXfH0byZiF>g=wLNT^SprMc)JOM+uw#h zUeT3$to#WF-O8Z-2Dgt=e&mLpEH_CoJ!a#_4eL*gF+FSa{*z-Wl1-lW`QThjiTkp% zvQ`4TT=qMg_L21Reo4w}UIkH`-j3v>N`9}3>Jh>S!6Rp`XBw8pShsyC$BwU~n1?LK zI2+6Nl*5tldej(c?)2F$+Q$v?g%ycg*g6=|luC|26nBI!CJXIw63;*fz*=zcw@mj_ zy~otNzy_n;-at5&;)L1H_Ncnxgs9poO`Ex2Qx-V=sHrWGwN4lDnxZX{WfG z6#B}Kk*|72X5`;xPH!OKMWL8N;T$L4!`|Y~iZy!|nee#zYk#wzJzkD*>F%n=ee;%& zTD55MI9f<<7p_P(=pEPI@uyhNcD{nKL1_E)+Q|CH`^|ZQVF7$mo03;2VrOwCke1Am ztaA~}4kYiYDLOSKyQyW8pygZZF{TWG&)G%Tcxzl#gP zp*-}-!0%+yWu>^;hA_w>Nf$ZrSEj~@fL>}L(U+QqLyE0A-q*(-V+y}P+A--UMx@=Y z8f>yncJbK}=S7pS_R9C!c71r|66T-peqCGzln1yQpv694KyKcKPB2ioSY*bUO0T)D zc-1h`kjv*Uj-cfVv}VnpVfgZtbd`oqZ!(Q!wU_L3_r|dmB?J^TY~@ z!5NuCr6w0V=XC}J6~miP?G1$oq*KVk4d+@_Vz_xex4vgs?u^C^G&td_onFH}k;9yA ze6$w@I=u)1$`^}EIku_r=835xNw>_2su>;L3WQjIz?hXI@L&eVo{@wp^xz{ZP~3aX zV<7k8c%kHk=cLAX49rD$pm3L3(Xzep`5wAb+fXwHjWAtLP@z43uq=tf6{*q1G1ot#t& zf*#wYgXd{;nI84FV z`wm8j-a{I5JPV5{R5hQQtumFhwB8oFK7ge=(Fna6k_F2G(-E?2!rh^m#rb39v%y<% z$@C`Vo`Ct{W?=yzjP_a`b~CublANLZhK+k$dKKPzsI~&)sCQlC><8^RnYac^x;WzL zTCKQJ@-gW{2lFaXN2i?A!MhV!BE|Z3DX-a(pM|{FEGPIH75u&5h}3+sMX!0C@@tA8 zZc|eQ5u0%M;lz9eUdB<<8=BlsD@X<77WO`!rHZ4KB_OFq73-|L;U^PD(T8kagUw1( z_oIO<73cn;_MqM2b~n~nKv9*TZzw{#s-k;tEPWnOMns#F8@D*w4W{qc%o9!2W+e(6 zkT_xc~Y9 zCN)oGYMrEM@q^5LbihBC4cBZhe?xJ`@@iH75jU3vn+jRjc!HwefWeh1At+3YMoS_@ zASE}8z(p}&*YPW!?Iv*e5Z_)`Ikl6+Yjoy!5OIeFjej9J^P@^pcr(K*+)uv0FXK^PF}MD~2FxRU-x){w zVu96@7(uTsYXD&x!tkjm+y3SgzVEkMC@qk@V?J_lmzkPB#7PSXRUOkE>eeK0_iD+& z^TQ%lF(|!Qg3a6^F!*tq{muNl4m2KPj$*J7)pk7^wHX9=%kP8x1r~3lLWKRU69)T* zOYceopGEeI7vZ|73e7HXuVU4hi9Wc}S`iabe}k)hHa|0FOAA%CatW&5#=An+!HT#NGXPEU*B3}2Csk8 z?)flXlkY&)PA+IbbZcNEzkPNRQik=K^DYdl7B2ux@cBfLM@@YvExn4gt}3-TB-Fp6 zc3B_w^Xa;0X!h}PK*CDH-kEuI;%=M6k3nrT6yE%|A2mnxvW>_vhhKG)d?b|4Uxr5I zu64>a?4daLCW<$+RXk<%4r@Lu#9rxJ;R;`luM-r1Kh6i!_pW{=MEi!Z=`#kqcKx;c zPrc&~EVdUSA!&k>Zq(xZJ~|$7SEdH;R`dGv-e$j0JYXu7t-Nh&^o0(p_-No$U?1f$;M+@5Tj+S7gnT zfGpJ)UnNPE?>W0~jJeFuAHOHLic@lg3YqK}PL3)C6L!9#OgQ}b1Ha8(yQNfjlEWPz zIk$2+Zf$43^~&Z%%MLDi_UCm0zSNdFRhyj{6{T?HfmN732g(rf$8nM>w(+__Pn@sT zx_#~x9Y_B17ZQ24#;x$>8_}3wY^-V47K=!q^3@^~vmQ5vJW_2RK67xA6%zpazcHbZf| zwE)6^$%S5)ZB-EUN^Z{8}D!P{FfJCG@NQZ_Ku(v_Cqx-Z|eF5!MF(c*x4z zQ3PsX<))|Wyd6%9)Vmwe8Cz3uJA)H%?VDf-e*Jnz628?rFBQw&5gfgWs2r+TCp{^b zkg?-SGvX&vN}KHzy*bH;gSLPfO5MPF^DXk+(F2CYW+wfc90XD>VhpnTO=Cl!_kQM2 z=3o7HJ}<$Gj4UH>aj?>|KQA*~hg$C`CaY8TKLbgLNht&iVO8n`U;X7;=?CM&YU~`a zA%sSpXOa#MVRk#$Rhf@E*6Ch*aNIPxoUreOKtR>bBV zh<-1Qvh%jgjk!joYEmni{ERivjqn5S`kmM0r6!1a4~GTA0CUGRLY=xkBdqDxHr zO=oDvQTB0e;}N9oWrphoR&LQXd)Qd0Sr2pBhse$5%`1tn(nTLOs+@SSg0xJTnu03q zq4&(DlX@=I@Job}Oo7YqOYekcej&c4do@yNiB#viAXb=tf7sn&3{whHPp&PC9!mm) zS*=qH?oh(}`2}+yw)Ea+TP~C;{IDCCB}Am4*v)8hJ=MAEuFruv!8fOQ`ou;fU<2$D z%0zWI{HEhWICEnsED5HNM}+1*vok(XKhBzo^_#?^3Pi;Uvfdlm%Y??$Vim+^QA_q6 z?K24-*+Sje!qj2^plq-7#QX^r1QIHOrN%x0-;!7?%-z^%Z%|IZy8NJGJ*Q`$C7W$z zGBcjgS=;?x|8e`X6O+QHad5FXOnV&|mIu|(v$V+hSIfP#^AS<~WL4EY_AEiBMwle< zbx*^CKP0j#69PSi#5^Rb6eq`sI{8hL6XrK(rHnlrhg2*oV2IwE-f4N@+{dn+So%(k zYOXeFm0p$f$d}N1!Rh0;i9b#sToj(;E-0}oG_VEMRxhU}zUDN7Le7%mZupcLUlgB> zGG#Z8bVc*|axBd^WAzT)U!ucijjbS}{^05gOScQOEHu4_b@^GTt2%+HxK|dzF#H5} zv)FXnvHQMNjh(L9AGc)5w6&leL$ZzC22y~X9=%I$Sjt6Jl!B0QrY~5`DsZnb>E zN*`Uo`4Q+q3GKpO=UR|CGos!)obN$HZ}_Xss2~5sQ%9)ITo0Q0DC>ulu;nMY)2A-n zqeD_IyPsCM%HeOK-6vT=bk@OpA3+QAuQ=7_g0>5PIYm?(gI#8NH^wO|@{?kiW?;C% z)3Zb|e9qTq+(Z(LxI5{nloXBJgrvUfVTtTJ?4zJ0l*-y;vDWaHsLIG-q2X`8))gQz zkWo^?<$4x_*clNqt{_8F>LYNYy;mZe!ald^NKv}}x{BOK1j18XOo!Zk1A5P8*l6^y zjSfq=VIPCJ6hFsx`&{Dw^`6BS>iKauefBuPK7Q8aJc=s%d)JH%o5NN!cmuABj^g@B zr`kk0DZTWi0|Z#d6Z1R2ht}Y4c2@(SVaCJ?3=ggTu{hmuOt~PAz_U&;o!wT=IM(|w7kFVeMAnU%yNv9E(C#t0xs4T~F1{^YQ{E{}jrhE~4cj3vx2|ky@@o1Vcb0c#dsGhZYI9s) z7+sBz#MEt}j#`*q10yI!9jvQ*ObANg6GQD{h9biV_JT0qaQ-8IL1&^N{6(=PIXj$z zS1T!@d5yGer#UhWgS3_VSdBJ<)Jh>G)^ci*%}vZa3EDEO-SOu9ylDsWl*{*+;7=)x z2QzNs(Xy{0aRd(^V#{UE9T4at3pD-tAdPyj@SPR2RfbI{7;@Q*gX4Kx@1MMw#CnY) z_~Ca`e%fRC-Z)s;$@Nb$c5yOqquy`_U?1;-8#&}x!dax9=Z9aO>9r*0lIv9x#C*Sf zgZN&I$Df007fl{&Z_1r2LP4()IpyT7X#&XuDM@rxkXu#=I#92-?mKosPhCOfAjMsD z3X2Y+q_pMhjVE995|#2HKqgD|xiy>iJH|+>|V6oV>0Y3x8`RjOkY%>T$tK z*ww=57N3l$)>5+!@f%dR z!W1eUrv|#EZ)#@bduh7VeS#65La^XA1X3L*W~(;x#JUmtd<8^|djed8!;;vD)%ruX zV-Ky#$ApFOD$}$v62+sgL96uPgAN}uT8SWY;}GSrPRrBkQ;`Dc`8@KgfC>}&AH{i< z=Nq7R=eX&}JC})3%RK2D)6CaZ{eAG*HDLG?-tw}17?LC_uKpTskPn0WCVT4Dg1gJ` z9o>1HMoS99{l#Z!NYT&RKV)Qs=yWhk&0Y0^~)~dlW3`= zYI>0{yGx%kUNzx`fLfJHa_aC5rHVaG-t`R$k?D~p8U4^J><5e)P(c}aIz-%*<{6e}lWLu`)yA4rC?@kgpB!y$f;lIg z-B%gEjK6RX$MfiZRjV^ppKron_)ELsBEG zA`Dh?q^4g%7ZD$x#jAQQA<^-;!H9Os=_r=$(dP;E2FPrcu=On+bQwsLMzleajnk$! z)r5#R{Juny3YJC7p(%J6dd~ECyH7S;6Rt&}qQesnD+^3U)|C7n_(B)$a4Ru-BoE>%7b3ZSeNl70<(D z?e1LIKX+t@lJOLE8sGZZCY%L3XD-xIyyD+X3he%wexBst=(l|q5S_Ky+1BDGn$ z?Ty5}6hnq-z{h1!4`chK3q(dtOmLeIrOwf2arocUah{vm`Q*^>vhEV{{SsO(!UFfGzaQXi4QD?E!}_Z z0;2ub-e<=_HP#8M=V`Si16=TmP_ty-yc>y#BECQCxIDSCE-cvEZdXGCR7Ufs5~N;N z2O>O2u8RCps#x6(8DiBw4Wq9+g1I-Nmgts>c}d%>O}vffHR1gsc5M+I?1Vgl57Q{w ze3h;#qvE^dYQu#T$$Eh9^>zHz)e`<_K)`~Ak;q3<`p=gxaq32|U5TNglswwJkassr zxO9LI4}f<;w72`3P8ZqMS{{hcFX-Z{H*uer5{zqkOK{E{{cEc^0n+ z?i`!`4l3MFTW3jl*{Ri3Yiq}>#?)D@Rz%OZsEncN0>qDFi&W=ze!vlZj`FpUPKV%X z&o9*bl;UF8k1_ug>dDg`3ZU4%+Wd!TOeE`B@(-|<>;;fd0eYl@sdKuFDnh2Qe^Iw)ZmtBv#x6u&FUk4hmx(N>K_OtI;Hh8af7 zzzgKlQa>d$U}dunxPs0LTv73{wTk8C%J^JaOn$NkH1d;=bkN}~w~DIGk!d4m%^A~1 z;>q`LgN4^!kp5^g-V&K;J!-Q+sjjofvC+F!dD*>0b-jfy-~ZJ%*?@_cUFU1Ml|1J4Bk*zu0Nv9vIs?2h%c7i z+e<=niZD>_bO8$-sagsW?iYggkpW!Evgi=TZurdT2NF&RT&25n8Mc&xhyb%&#*Tbk z7OWht*p*K$IIc*4Swteqm`EPMyo=WvfJ@(3+yWay-(XhbupIPKO?(!?0B4}&%*uGE z<$-M}m5f>~(|CngsX;NVtWK0HjMOY2s{j<6mF7mL?KNLr9NGS^zy_T0+F_Q=YX;~P zzPlKCfUJeUyEnYY1HDlH{ZSY?4Eprfm`+bIRo-|Bf>`W%2&bKn{b&e|V<&jBFc(@V zC=c_wBxtEWCyHJ0Sel$bHhk8(1$);KIzPC&Vr?m2JC-cn-f-8x-k8NWasCFJ9=Vi2 z(S1fC_zClykOVt0#D#aOV{3h}nGIWm=Awrtkre+rkwg+C3Xz+X{DTS00@_lYjDOf6 zJZKP-?`~rIMxNw~+Z?2*CD%6ofNS6;7^)t$D;I>0vG`z=@ZSuFPSZ-3=byq7OMU7F z;pOK#aNK+1r!P+c(Jn#+gl*SV_4+PLHQ6AEc{<=&l{N0)CaCH)X4<}R^hrFmB|QfI zF2H>U)!B9=T-_)!AGLuSdb=er1}W~k;tMmceMka^4sc`P4mE(6oRhlg7|_)=#48I5 zvzkFUN5cp63hVIXaM%MOtN94k|oYp*V?g z|4m=L${E#b6Wz}3Nbipv#T!9UmC5KaugBU0KD7^oT~ zUkrRI-PP3)^$Zl*WTLiHf5CJ->P1F)mODwVU{fCNfQ)s2MoH5dQYkIp_ii$7+!a~N z&+@&QzC7j|f~yxG#Run^ET5>(V!c+}^T^7qbhYyH7#BwCu@oGpMpI$jQpr;#K&%q~ zU{Kgc&IL;+js*X2$ZgWurJRBHZc+ZFv;(b7>zA_@bL=4z{11`CQCW{54^(OF1(y8- zluih4Csh2>JbU+D?0hgqLdxZ5qz)wRMg|`k5y_RpiBI9WV3f*V@q@!EQt_>Z*JqaE zX3c2?GFm8Q+F)|M2J?BjX7CLE}OFY3J zhKo;GxXq8dH7BzY8ueR57N?tKOp5^shb6+O%|L!5;&riQyDkywz|3`L%$j1u`-vIl z8tE{+0k}HCbeM#5n$kU6cIf0-iFi?4;!A-2B?lK-L<^X5;YF`2<}ZH3@P~JxMLil< z>Huw|pN1-SBU-p=g_MZjCo23+BRE#;AYRfe0=v~6q(R;uM^rhCB>Uz>UgvtEh7ppsJ%2s?32P?oY;Sw=|64V(W)?IBT5QsLa@=3pO4B}QfC)7-5x`vdT?37qVfZVcJH&|4JfG00qXG__V6d8Yw? zJv@vDD!jCLhHrnMs$MYhAdmhi>0Z$lTTyyUF#Y8ePgg>BJOy{X@R7~%g+$D4g<2C* z&EYb!n((8+&A%*&CxknZ^p2?WOF{J|t4ve<-X`X*BGHmCV^YS--PttAN)>=#8|;BQ zrOxZ8zK18S$6D0eh1Zmm1R2k>2V0Gc|MmW2WwZI8|EJu3-DqH&$_L@q?^dzpfh?%a z!JQtKKIz4X6<1=h7F^ich-MPG1Z04(!$MA;4HDTdy>BspbUfE_V5-2oV4mO#7-REU zMC7957KG!7 z!Iu-sz&`2szU2MUO2LN1(j!ws28vf!BuDgqc$kQgb{g~-xipZdwh9+lJ<%zh^|qAms=EZxUCfL7PATCH?KB#0}7*zrNTSVNZR1FW6@kt_o`|In_;3~SPB=k zDYSMwY1MDS(*wQ8Jhnc-?xFr_Nu}KS+PSfSkKJDh3-f@d_Ih;vf$>4FcvT30v@Eo2 zwtMaa_Wy^3y`#2-{pb79E&Jbc$z$H>gbpDFeLYRpXUDzCtR)-v#2FigBR~8cX2}97 zuJx^o?B03>1SdDKrnK;cO)MDkUFU(M?K7;7GyJw1OtvhsAYlaP!Qo>3+(Xdgv3q0K zSj@lL?M@B^KoDo?C!S0gTFvwZspx~cfOBO?U&0@YbN~m@_JJD(t3QhokYGvN2CF}3 z!=oR&JiBb4c2V!rU&+-S!|&Os8&3Z}P#$T#tXef`n&gHpJqSKel!IQns0HvpJeIqw z_PEU#+br;TCX#LI6`EhBFE}*(!XFPIH=sqMEM@sV-Se^j)7?F(#yGh^J2=+;@XMbd z=Om(NBU`O_9GX-fT3Z#WHn=UMS7>a={99%WBulsuLj( zP}2u{bya3#plczvnQI!()Y8WO5a@g z6H7K9^7tG#k%O^cNL)ZF7@5h%-4B<}#2ec+0fE&eU05ZA{Rq%jh6LlDj6oQS(-;^t zSKfY|E)BisgI-bv6EUwS5WpDNekd*Y{{lUb-J#3ISB<_BD$EwmrLLuk2uybpIx`K^ z9bLHfq5)N&LVTIeNToGDnh!cv0yd4D-m)->R{e&@6qMm6674@ba=Be=k^Kf@QmJ`Y<7&TQ@eaMvCj zY#b+GVU!|~xDzTaUKVH)hZXkE%|Locfg@hoJ$&((%k90(KDj029)_GK+cPk>klIaE zj`2fuR$53kLt;*@YBcnsC1O48z(V_99ALL2hP~iYi0*kr<`e`J!k1npb7&=4(;R?2 zCs5iVH6OOr8AEet>jp7#;5{yMBkxBHaNYk_nu#`&Z%aYH zP2QJ9;ibTW2bKlKP3v6NffRkz$T~Gd=P1Wv@Jw<4>R+>h2Q_I=v-|t2gVJHE;UDt5 zuN1GTmdTLOPWxuRinBsWvd|w+u-cWP%G)h8P`c&Gzn;HFGq#K0u zD_hyeDKSp@?ZQc657oX`fpk7EOnH_fdS_Re7+j*q9n`bJ-HSrMjXPgNkvz;yp);qu zz8@N4)B!`aj@oOsePPOd!rMslmR>y{PysedkRL_%Xp)?{Ro{PfcY?dyNUAf%B29A z?&B^ai^PY0=;sbiAL>A9v4{;HdGCXCYC3Ttw%u+%oP>$6lL62~4bkjy5V^_1}mzpr+CN4fov zH^PKQYaJPYk2rwN25H#hK!w1VkO7Z&xVtjRDVxdCV%&9MeiLfaKO~=hm<;!AhiT~e z^g$kvTd6RV7~#MW4!MnZ>2uOPt%AtVb`M>a=&&pq3#loE3rR37s)O zL$Jg!v%q;!b>zAAI7P#(e=`WB)>eTFLsXEK`5OT#=yC)L(w$g^Pi}1$QiX!i7dwT$ zUT%cmq87oz`VS$H_gfcvI6T#ywIQ?HPamF>~4J(Ja`qHWa=LM z5|5!rDQgXuM)hnDC+~~t8-3~pw%t|i%4Xnx7+^G@8y7Ctk;E#7I-UpUO|b7=^(Yqn z%*7)u3k5vnCAiH%nfp-)7GofK=V3>3{rx@6j<_nd{=cytUjYZ2gfchQF=v^<0-^te zT^A5VX~>oP*)NPB9rIO{KfQ-LC>;PisLrP7O1)A6aaW#CdHC?6hYGBI(KSkE1;DKuJFOlE$$UYzq8`cYzmV^S_lJadCrU!z549|tdF(X*F(1e>ONYE(1NZ3pzqYO% z#d`Xxuj5=R&#<}%0PW~K8V;1s*L#hi9hcX*>H~rn2`S6_sCKKIvSu{|UEn!`EVZ_!L9-9+ z=`}xWNh|w+Q!uIR;QwzOL9yU#O@@+@_!TqeB$8;Sh#xIuYjaLxBF5q3djCKj z3}4#R=$c0y2uJZ`X#$NfPER1p+xr>OjQ*OmkEt;k}!Xe&Cqb`A$JhbVuiU$p>*9MIz*dSL)@IC z?TfpgpKd?LU$4hGssz9~g1(7*3z{h_kl$nYgbp1R+BFGq|boSHy1qMukwR z)ccF)^HV}8po9z!*uG;ryvdPKy6o&7NkyR6HJXd!vH{TB$mut6)v0=`oH4%b0bY3- z@wabeR~ia72A!ozw?0tEEYyi~YTbe|DsVk;$#|&L!TjG6V3c1au=9N7SdY?A5IZh>lClfTa4JQHisFox{7hvqwF@r$8scsjIS$oUi>gmnYVer{#)4m@f(7n`*u~~I z3&?UcH&a3Pj*a%ShXkM@;Y1Sjl^o1Fhp7=9ROBlyS( zWjwUjObl4l7#?EEnDX5Vk`*%;;cXtq{KYsads^cd#S@yVf2>6i#-2u2_t}e@Fytmd z)@3xp*eAXBO~7qs*sBY*xXzYclTW^Cjt8Qq=foYJqt1CDhe@pSD%^l%%hKsoY$mUS<%vYfLpQ!s*UX(4G=lk$CEoIkRPQh{ zQ7dQ>0b2nk^wPe{-7o~RF4EW)-(Sk`Rr}(@&shfjxs(v#kB@e*K{RCE#pFi;)k(zPDTYL7GELSbBKzR8lUVsAqa1Lak~h0Ws}_kV)uV^a9! zQxIEg>>w{w!F+#b2@c+%^gz%Cvu$RmezeEN#dS0Q8tm_6KEfuPy995oLQ5|cnA*}G zbmkJFs|#nO*{kXkpvZ!r+N#>pn;}%NhVg1UiLw)op$;EEbfj*sxxV?Kqea=Ts>aXh zYH}I26n_gL_Mg}+0GAu4x}%ap^vBhB8i4;^bP(x=bZdYA=)KWrPHI65_ZHPBX+$`~ zWghL(k>DHb$*T|Qsi#e$G(5Eb=-is*Fz|kmwW-5l2%06TeJ|q3&R7|8?TXcEg?Yjg z{|r)!+$%|V^0wbN=My-Ov6LUrgCX-0{B8gfvydM{PZ>%xh(Q{~5a9aF$+H>x;EZUc z2fjcFqCuXi5QfuGbsQwv@$n*qnx?QS+nmB>`6r1VM~mybGjoYeLKldcO)$iLWdA^IoilH;hABVK)^a7YRBPSZE*t*R&4SO@j_f&xfvnD@mYp z6Kw(wX;!&gui;?>$iZTW>!e?WCb&|k6jEnoLX(wc(Rqu?RUA-0%Y#C?^qRcTV&tkG zX;Vm1q%n>Wkhm(hXN`mg4oGpyIYxLLrW9Miy1rj2g>SU*ED=|BTs#;byzKJu_Az0+ zO6R!h)Q3*PWT?JusyLprK_M!Dk=4o8flmH4S*=Tm`X?n%<%lM+2S-RMh_}H^%6+m^ zBG1`qKDDUMQ{vjYdo-_q`ud=E%iuiAPwq{SKz-j-G4Q?U4cRJ|^Sz-03e8c#$$-~L zIV%eTp<>6+jGXd*46Q*zw4YLyt%GId601;~iCh)cnEW6L?68EPV-IK@HK=Z#( z?~yC4!s4=fCBMwg>(^O<_j66BSCvFOZgNX^HhyB3p+nC042>vqto6YqF$fA8q$PhE z4ffM1`t?*CNnkML5*4TR(jY%z0&gEdG!2=TB|`fd}T~mAilb42xe~;d29`*sFjp%8 z!tysA-W49!DFhuINlCdEFP1I}Sy#h0jg8;Y2_5rpweh=*n$T!@Ogx%-Punr*!w$sg z-R(ft`VctmvK0?IMZD#0zahhLm}`D8id$qp>LR5~K+NzL`uX9glhp2Dc$Kcn*d9~^ z*MEHG0^?|#;Z$<pmjs-aG$9q?kF>wR!eeIBxGKCJq()^b{#$^jOQ_V)M6l zW95?B1@5Ze#^++xE>sLS#eas=(_V(bOL0bxkm^B5PCv9!#W8&==ZeqXJWvzEgJu+W z{Q5T5N^>@SwADvB@@|{}__`6zby;4gpH-&5qo^r5lm{a-)2hu^h7zU?eV>LI??zrApGI4LS7jWdfS{qQ@_HwS2BL-|5}>UJcolD7*RaRC zp82B4h3sx?ntcqOv>q{~7w6ZOWOp`GC?8xFL^+H~ZXvn*wcq3N5_2SO+2OCruTjho zVrp^-yj-XP+!w3{BPJAgU)#ex$5@s@MiKdcATZ_mkLEz{o|EUZyUu_bBUgUn@7o_^ zS7iaU4V)7Osro{tYF+UHV-*HuFaE@2~|J|7my@7paHoXj1RlgpPLZ0DM~cWX}9J2CjU7G$!&A zuSZW#B?s_H_os)4Cn#$$i%_AVU!JG%qDlGP~Of`e!<+EMAj zB4ZPF$Tc;!>pr$oXAHv!cPIs>D%XN9?LHd&dtlOF zsoK0a6X!=gnv%gp0+HSNsk}YmRQ1p#O>hIDg9CAv9Y(~uaz7ar%Ao!qvFA}5^C72C ze+b>IT$2CGMZ!Tah7h?jUw<*W8F2ATNbiAI%s@ah%^@q~pv@~L5=7@93WKgK%lj*Q zGL42oqlJNfy4A3p$j(%0E@P@(17@#m$U#<{{sGt$CDA$gkIcj$a||rDn zfVvBP){vozm@pknA38@7QQ7YAol%G4)Zpj&>`;Ct+5T2T1(#`gUI)`c1Q zrEKrdE;Z)%rwkB5cx+q|*wY7h6_sH%Sxzv?d3hXONj6Mz2VmrzZ9h1mWdxPwux;uE zS{|g+$I|S&;edWy$MOQ2$okwm#2}og%oUx`9?rfxAZ=d-!@OuEcptzN$w+P!H;*cM z<##xcGW8^7f{h^94%TG0Wfc5rBIeEnSy)dpImkwm_DgkNW|fi@%r#PeWuu+24huqt zj6$k*we9?-^m2vjMtN4Yqn!{mbqccS_VaKd9`1{*qLybrVH_TyOjs7}HyS$;)TG=V zmw5(>UHno|)?L*irSXm^MA;mS2Qlmj>3DX0b=Mpm+-YoQXni&BFsXX_NNr1-_rPHl z%RWbB2eL*FsL#>0h*KYG3Gs>Zl7O^x8KKp?HDqc@*UQ^F$K4qydtrJPF+C z5A04JRXGr?S^I$vBX2NBJ#ZF9y=5Y3GMsG@ozE>>E?|9oklVQhjX>Pt=fXrKxX=B2 zCK6LrbJ>7p)iW1b+>qvSUDX&-n?NSvd+(JD%*U4Cjr>E!Z$b}s%Sr{2;Uy3{Sm7;k z_$Bp-U<4WbgV3NTZr2LS2PKs$*?(GnT zIUMbZSgjJ~0gj~Tc+u`CQ7mTw8@sK3SULD{^anE~+xt?Am4KIimk{P(!EVsw$BS1{ zT}~#*VtLlzg!G0NjF%y3Y?qoLZ1ZVGhfuR>$eHy~fO~>g2WdXxZn3Ll4L;)}`9EzU z4zECPV>^}Z%4gU}9#8b`c{+3@AqRZxD%mp=&iBexTqy$Bse_Tp8Y%b3FWiV&C|w6`mRR~uV_Z#7o7*es_~;4-2l-k=ms%8pG;8&3@{v#@Nmf_JTo0A} z1n@hzK8fK3#LvUhUuDIk!FqtzMCwTWEKb8GF1bJ~!zh~b>kel*$3#D2iG zAoD+q0L$Qq!`Qg0Iyjy>H%;f5T9&^$k3mg_^Q@7AtAp#x7kI3IIta9i(fq-Ns4h^-PL?rtylClMr&Y;6yT!KsV^f9>c~N&T_!+F_h^Ij0+sG)u0)fRLv*2qW*3OpVYsh#8 zU>#%4S@f&rNUD#(&)uQpcvyPvif=WQ!X*vVX1Hwkd`qWL4Ns!9bm@(f*?doE_G5}5 zF{*F+?sh)MBSQ3`V%^Q%qXc=3T~*Y>+b@yY>!6J2{v&HJaWj0r{iNdddsn~E4z)cA zrwE9>+DwlGSF}aT?#~2Bmtlibnes1ZyG8FpfZu^;tcZ(j-bU5n#oi@9irS&g+UNiJ znCVv-c3x(}MTaRaXlRTXbYwf}O)KqP_enYmCrm>OwEjHRX%=x=dUFj~>oB;Ow{dAh zpqwtesrzZ4h0|Yw3?#bmfi8o(_rOs%$j6T9RFY<`6v-&gP-*(WGypJMmg-2;CK$Gd z^%U1r(gL+GfbVclzH`{d&o8Ot2aUBm=tF$O>_@t0el_?3MKjCSQ{dv8(yL%ES#jOs z2Pz0>+C09Dog}?6=Pm2@dDSf)W9h&wRldwP=p&NXsfkAW&%PpR5iA%aI7hM>MbWfv z`ja!K;;y9UT6uRphhcjntFONM<-jXbbAUYn+(#9rciI4Z5dZ91D`QK-5g5J5#GkkTdFoEmT2?!*= zOl%FPLzK**y{3@Kj4TwgfSFf8aB`(rDc%OnoKVxetcWIlF9!5FplQy z6x%IuhMoEA^ZA-t0bJGlnrs$2&CytN$d)u8Y?0>X1t%u?hAb4NXeEx?{wv@y2Oy#!yI?8JTs#VelT z(CtM+Kqcbew6%WS96BwiB2vQS)laZ^^vD4UAOkAT<@hLoLwy0$1*}y$7!*$_C4a`#mYDhE}o#MyU_H7-9g%lM4=hO=?xC zP7%>}^rv5R;|KSVG5-oT`_TG7bJV*WR+Ak_uR_SCGfYDspzp7Cj1mr0^^LHJ+Qit; z0AGkb_Lt>p0!w{?2m7xg@X7)Uuv~jlNnPe`a4bD4`85bjW#TX6*6= za{iWCCGjp^b{N(^XFx}Vvrs0(6BCXOZutCNteu;Rry2s;*g?e!2%y;||98ZKQC_x; zLJYSzVLG5?Qwdve72bf!@k2rIX@Iv)dXy0Yqd_cMb;+(5)kdgjYxPkwLih(6m6-XC z{dL6kZPlGtbIN?ox80LGp{OuH-psIX4nq1WRXbgA?--G7T~mRc_bv8JY(DON zrYCEQvQ>6}51*1VafXyKN5dXA zN}iRCi=n;@9+CP+p1N0_;}>&mc*6jMY9-nH>xaugaA;YDn}g zEIs%Q7N!wAWOG9e8T+P*I8rdhw`+&26TgAFcG!FcZ{Y8KenqW1kbI%XITd1axCX7n zi^I0M$CL}=V>OVoG2xjkg&{0c28x`Vs%MWGKny1Tq^~?yLkxsDtYF2>UCNoFmu1}g z!LKbCGpHBFytd=tEv~;;)G7!bLg@=3xg3khdf^~@$zy{IMbK=9mr=kc+@K?_5=MLz z4}XkXN*hNDndZz#0ny%K`BQhbrUHq5uDMoP{I;0s1g|BQxOw^$cuy6lD0^T$lIDfJ zc{6a~S!02|SxhC{sUz3~c}B4gvBh(wu;(RPu3B_3_Ft;`-YArd-7_n@2ZLD9lj zsbC{4ZrMG>T3w7V#6X>(4lv@dvd_c@!tiQ_0er>MGm%>M{IoCtxrjMKZpTo!o6<7i z6x0PKB>@w{lAte_T6_b2pMG71vR{mk7jG< zhY#hs_MsUlZS?<qEZ2&6d!Nk;PEvsbmNG8yFk(fN%Y zFAOn|vPHkITv z_Grnw5giW=&uq0s!pKL4kN=~Q0PrQkso{{fVCOb1x&z#&@JZ6sNf1gWD#FmhE(i zX|G~#=1-KzU&#dLT@*13YOL>zi&YmvGwxj)h!bT7?blj}oRvtm$-ildgzeP|7Yy9zegt%( zxCpWAk3DNCwDmZbI&%K=*4b_xF(lraYIyoYUC& zEvIktlWqq;pFVaN5-#?E$sSaC;RIHC@`Sk+_UN2hp_)pNin^5m|D|UEVz-w*1^bWE zP9AW;&6BW&KU>nP;8M3Fb4E+6yK2w!x?yRcoCNJ`UZ?%5w!-*v!vN9^GgY=gF}hP4 z50H2PE&OLcN>oUKhr)g9I(k)aOi+r`>4{L;gjY%}UXU8%&}T5A_t6~+>#X<1n6aVz ztM5&I-RY@6AukD@>}V@q4)VU44RllfT zg5z%?ihK;D>ELqgd8mKS1aaS&{LL2C&%?oc~OJMKWFF*8C8Qi{v;3hETR=FD-g80iLKl?~G z0k@&dG!Wgyo2hl5o#)=tGqBAFCLn-BobxHFhP71Y(-MD5u@Xr!wNTvI%&JX;0u z;(PxEmj3I(HU$lvS`L$ZmOxxx84ctZ5)YQtCx~zU(C*KDyN?a9CfTZs<4U7F(?b{_ zDd?J%Gl!cdpa-(xwRjuQbEKwj%}=d;;&lZYS2s^*R2Zb6wts;sJm<6;#h{T8M2Ai<0Fo7kTiM~tc>sNv zb?9dZ7wy@YdAPW)!fZ7*5`c`bx(=^Lzu>RO+yVJOx+$JepISB4B=$~eMu-Oi6Knu{ zBIyJ_ETU&NfYyF*gvp($2(AU81Tf972>A`1$8JRW|$~AB6)X*Sf zTKdTXH1!G~QYrUe)W}r7KKU534p7nl|0>fp)MUums1v?cWk5dahQzY%SVEduOm~%A z&nlqtEFkg68EY{^13qm1tZu?Y?!AXWM<*28N|n6UOm0rvtZX5sTtvF&-1<1Jau?+gKQNiUq!hwLq9}drl_%QI|JkdP5!eYG+0%Hx#E%T>zqo@@ zFfo9~yFSxl=dY%arXTgl_$F4QZU9}43eo?8lh$ORh0?vR-bud-rMjxlp3$9- z_J#_Z%93(TFp{HkHvL&Nbyd?qg^;p};O{k*cvOz$ia3rXc8ZwLZiSJ@nzBrWOVYWJwzen174Oil3rtu1y%HsCtVUM zxHc=v)+~zBgj;L5D=I`svt^zv6Y)k*lkQ z#e?8N9ZXbyus$Z+{H6Evmp#0kn7c7e3gAV>7y5-m&6=F72xE?tCKCl_VvZ2eU32r| zQjQ}%L@%*Gp3zTa`=dhlFmNn8fy0KG;`+2iRTs3truU$L4^77^qIAqSrpc8`B|YZz zD7+Iw+$HacK?0=JNcST_;is7Qye?H%*F@I1=wxG;tX(VvH(EX2Tv$#cpC5TNm7Nnd z`{PM+Wa9`Q4!N&7i@Z$lK6J!Nm44N%_TYdhr9EFIuTT}lW|ISnA!t?PNM}F&MQ$4g z530u2*pFN$C)wM-DA21WHQYNH*3SvwJX?wZA%V6r8O^XR4YXr}fdXr5zq%-FoorIXC&b_0=7BiQDO|K~ac1 zGd#GK_2}|#*kg3}IHBxxrq3v4)VLLqW}&_kS3{m`@+Hk%CnNEqT7RpaCgBbrXjiihqiqF+0h40 zEFCbao{oBD{(8{dFhMp}K9B-ei?i;79?|vVLE%@$9IKlVR5Oyp^h`}O*z#{ZmCO?N z&*H#Osc&&#ojS@55A%m3&+|L4or7(-fllKH9E`*_TVybPxI^SK+8^C?%~yV^(9P2_ z_0UMIQ{^oSU$7rW>jyfG%Mf=$GwHX#RgA@uq|?yZJ?dQ3$tLDNg9A2CeB7 z`#aVdDCkQWI+e|Myj~iHtfOP_O?aeoQj8aE=rSW!74nvoZ9XUm&%4*fiRQF!?{S(S zRH$}81z-P%ZE1*I&*U2gbAMRf?IO)Xu}m)k9=Okh37x!>)!)9l*Ua%`s!j92$VXpmrwQ-2u|_ykfi z#hbecj+K(oayQJqls%01iQ};s$(ZszJE2A6@WwBhw9#Or`0$fr@i9Snoj?`HRS{387*Q>NiKj6LD$V@OPjNw5HYSdfWgTSr+z%#X zHm)|GOw7XVyyqEOROS<~dG!ye3l#)!IJE&rY08v@MoaE}Xr2qBC9l(o9RN0{kxPa& zihE!PPEoFZwf+@BheUK<;a0>hfLLfX`UAHX^~A$QY?KHJ%%(gW_n9v$*>jQoX_JEl zmj=K!>d}Vrx3IRib);^E*GM>|~SvR*WQvkMjQ6!=fnRD_uj=cH^ViOYx4TR`_% zpAYeEjjqVgTLz2f^q!~thCdu0!nw5r;X-gH(eOM8if_^0WfPj*6W#$b4sXp~uD33S zLFF=l5%Gvle82Gv&wI^Ny9FwS71q+7(aDaPZ;1p1lJ1LAs(UfYmYf#&xO9(%q#Z%3 z$mRFcH9NTGEPU{2u04^(oq3xjHhP_;V>y-8ZOyKcu~ldAHG3=<0W8LaWH1*c#h1^z zH7x`ypnu93O(d(n#_6*fuJR>$fk~-!n*6-%nA`!I=}9K#kdBd?X;3=n33^7J^2)9X zj7*ZRxZO%*C81X{b}qLbGD@MU&hpuftr?VuxmGS>hF2nINb&!*^SHEpn~?NRaM0%w zXJV(5jls%73U)D-h?z5zbR!;jk>sqn)i2%Oz0&xvCCwG^5bK#L53A~e^1@9=3i;`I zGY4B`ta&-CU(EN(8-IY0zYj)#{E)T{)fiof?9BSR>_T-scVQ-hU9-lO*p%~`c&_BB z#n~^M@g~SJN7Q4!=&JPr2xepj!SV((cMxsSZ1g&PJ~tOSN-Ux}javXI$M1}uYyjJo=3J>P>LE|B|u*$JQ5gKa?Xb6r5D z<5xU9m%Olut|>7}_!y~c~%J)ztG0R~B}!A@5{rI`p_N8Jl5L!7($8r)(4sKz=X zO&>^L=Nq`J(J_4_VzBzDfU9uj@^Ud20lQY~X!Nl1B;B4cSghL5;^N-0@~KzlJ`asg zDAMVY(0G_y{(ilhKC!11+XH>XS#a7>V#$3g~(0Rx3Z=G&0akb*R2klsik4sg+{VCqfvA4kHlq4{L4vd?=(@SS2`pPbpg_{VRVc$sS>5T>P+XPy>klq zbsa$hj-vISm*#^W|NORS?i^~#Y}-bPlLJJ-{(lXL)Q_|*kg(&3qDoGXz}FUNFgjCM zt^Nk6v*W(8qOux&{Bjl0X3&c<9jrIKZ?LvVq~c0tBh$&lCQ zSl>`M2A!N)NpU&A(fMO)*Hg)KR>g9q)n?)7nE)fqv{?h{J4NiC@ ziRJudPi<3)rrwQwG?9LhlH5|CHI?@6tQG>okkSEC8XO|a4pF*;)iZX*2zG?G!#3SI zo@1enkSEcF^9D@5!=km3w{K(G%Z`Ux3U@iTUz!|J;Icr~T2XpyPJ4{+-?1>iX?urw zL1=LzBx$(9$O-XTD^BJ(s>T8V{pQucivziQUp+pI5X&y4y*x4NjDBkcKX}qXwhC6fPI}2uUH~Kj;izht_NbCT zAHxebtqXWhjK~O^T}H~6d2~umV<3zzB$cV+#g{e=s9|3&Hze2>8aTp2$mR%M zTFIkTQd5cZ*=pi!iGAfWuzxULXAWJJR5PzUvV?lrCZ@@-XDu0m^PO!vg%ny^zk^+P z)0`VRvw*Zal^9IPCtx3z5!VT-mesNl$mt#(L?7OShn4g{LSp9Q(8b-weeW{t@NR!) z6=-o88OJ_SX2yeKUXwN`I7&)kj48xO1KW204qhk{~PL46R zLUTI+Wh-mSZuxn~jdn%IVojNJ9#kfmG-m`DOn=n0diZm4xm&AANb#C>4#_dEoUYt2 zX79nXuNNH9U6-;c7C%OnK?STXnE|}Om9YmDy|Z7g_2Rt%K|sF0_3Hlk6IZK%Y3(mg zxo;T37Ljg?+>saJuv8^oG!()^XzI-WH?7DbMbjY|0G||jO{ZHkWyTEpa6*qaq3Xs* zuS8$V^*U}gAm@WXalvhMnsr&Ln8qkrJrE7Rlx|;J*-!r5)gVNT7p$I{3(*$H;yu8d z6AB50gO*qQJB$8Q&^c}NddJ6Z)k^DeKjZ@6_(9bl_I06%We;+#uuj*KOj`{S+4h#XA zk!b%K$%{)E_!CP7$IEjJa$RUzG6%tbp6=s8i_a~K@dvRn0`(9sriX6Ije(JcP}dOS z(GjCF@@xK1jy9YzV%w?GUk=Sk>stX7+3(OCI2`z#h0!txfSTX_U6}|YC>(M_d_UKJ z7dP*z9n}X(aYg(sk%IYZ=J76nuj$B=2HfA2fEuirCO;f-1`rbep0K}1!c0GRJ^VRB zjy^_IC9Mn&7;ytZ5b0GoO?FUKeZ#YJl^zKNTz9o_Eg_&Y~?fzcwcRP=&?wASs{64ltRs-H@u1%qkOoB^Q7Zund zZS4r7gQ4i*=2Mo(;3L!h5ix>gFg#$o;f%DTV{~ry*m9sv zb|CIpNHKM+6C_yvc4@ObA6YlPX#wfTab%WQlJDkLPvXlAx#!ngUn25eVCN29W{NDR zROKOmH;Q{|xuc&`&L{`2wxqe3MnPx!e>@)GwyQho;9qk(Tr~ZGH(G1M8>L2|*4n|z z2L9M+#Z(CHl`^x-dDUOzF60PcFi4l-WGV0&!uSpEp*?m+zhxb^s~WpLqKY5=f}q`U zK3@BAY>$l>5PDPf+e*q>1j>=rI`ofr<*+QSgx)}h(iCw9qRHQlyJhC~S4XtI$;pe?uJ#x91nyY3?m6P55@Mh$?S`Zy zu!`|mqiDYH{T;whLGC)&(D0iZW`_HMQtGc1GX25r$k;N92wszlfJD@V4ElJ&5{AE2 zwwH<62pC~t=qgFl`fVJXEC`ybDW#634>g7%SJhGCBb`74uDXTp-B{uGk5-X6n~g3n zARJQ&9CCJ2C&{{BG9UL7md}i21-Y(If)o1rh!(%L0vXFm(8q+!a7v^a*Tl2~nua(N zH2G=`0r*KqQYF(G?yfksQJHYfxW{^zg&_+!h6dl8r;~nJfjga{XZykSllmh6ab`uO zmI%WZI2Q@OzYeMSJ`wo*;~X|#nEHVn^Xd*@q=9-opQ(A7{iL_lY9xs=6OtHl!gT)} z4vORX^j^sUS1lZyC3IbHwV#IEX%pd9hc-$aE<9ZW+vB-l+9h{cJ8Mtvl68BcEKKCP z(&E@!yyVT}b#9*Wk`sbhhllYPFU1Tv%&$Wl5QBAtNdvfpOE9@Y9N<<4Y4i=e+f42r zM)zH6&Th+p6fG=BxG_iE;iX@uzU#`Vn)_L00J5?HE4o0o9ZzW0Ou@GS9t^ zK}B$AI1r(2#cEkQcXW}bM^dQaS#C6Fn1@By=7>ES&WIE@VK}`vrSswJLJCuJs^b;B z!EGBL;fAeq_+m7uVpQMOl49{`SOEM2XXX+->xabjcWmOyYAbXCr0}nx>co@(2g&dT z`aEDcS)6N|%Cje_LXQIlGFm)<_eMfYx)hL`X}l(aJAfTit;lRW54f(3q<2+YA@UWM zy?=SmO*(DUBmFk6g3drw%$l3^oso)gsugrE66Q-)JsUxG`2!*9?JbE*$Y6XTENwS{ z0)Ab({q=ygU;z4$&;-sPP3h9lKGxL z>LUfOy9=b1-#wE-z6(vtA_q=c$v!rL-)LP*Yl!)kg@O%dnF_ROu}3NEu&Fyz^7}5^ z_@kn-!7>MUB*$r|EtDsvE>32lL1irKiT8YP_Gv>Wt@14 z>~_yJaoHKGnXz}d_O*6yU}@v`HMENSRv9f|eHAC#YpDbfzqTbbF zx)cv?B@aXPqu(mBg6njdbMy|LH}1*MILSkGg{~IS7SK!SZ%GR;79Yu(@uWH`g*yuIwq<#Jo{A2vx{$4x2vpZE&JX`(3ljQ#77;mG3lEnR!s)K8o-6*BrC-t4 z*ty7P z?C*wzsS8*29pY}$D|ka4to6h^=ag-v93|lx+z~yg-!Aop?}X)DfR?C`%%E+LW4Y*5 zc%=U|!FlWl!yQ@9S%nppMSOM=7pCe_&N1?_&)*h2Qb;k!!#8%D*c~Qmt_|i?<$}B< zlOUqQs_dE19A)=!1sXeF-U^Y@$1C1b9|f&((7T8s_HTW+;_4Y+2F#f2>kb|<cAKq^Wq*?@5wNH8MDhkf8_b!}lB}D+8tAw^ zrW(0gMmC_PY7fv40Bw_UfoVk?)O@knTi9=NYKJS1D+A9GU$=840CVYnuQJGbhy#Oke6{ox z?-0QOaHs5V%j7g|)|J|gCfg{sr1ZbmdZUEfq!Iw#v`lN#Al`DkE?g)SG$&Z5 zcvJh~C`Q!^^VD;11Dg?I$5ciI$>aR(q(r&l4_c5zqZZCy`bQC^(XxvEHx@D&(a&?6 z0FLI@4%`C1k!jzSD3d(X;9a|KNhwZUKjk2n_Fj%8jGe3Y%WU*a(u!fA-4B0|2Bt6vb&;V2u4C!&A8anl|G&38vMpNr|ttJets|e?>c51 z`tpKFWZzZW_asG1FMasaCM#>VESl}EXtRD4q+6%iWNYHlkEM^olbnxXpxa%|Z6JlW(f^ zMt2`k41rZ4fR|v*9dwaMw7g=MCNU{keyz?1_8aVr1d^A|U~SW<(p+`pluxgSAe1O1 zVQjveJ`&xbUee@dqUc1}2tTtS+a3zw69cL`kOKtz2c>854;1uG650u*lJOiJ&1jsL zTO7<;>pxy->Cugc|94e9L;sMH7YCR2P(A(!bN=QwisL3`F#sq$l#3{JC(hLwI1rF3 zH@S;sun3~;VEVTA*ek6^xs?NO7P(T*Z%8OtG>L0RUEpA;6<>z=RAUd|gK!b$cOy_M zcLPqQ7bk)vMe%4oW-aq*ZWt|br^t$coAhFlO$2yM_Db0^Bf#OY_uCYton2=S1|ES2 zH0rOMv?)lsd5pag!Il!PkM`)C`iZ2S?n3<#e93i^5|sNpJ96#wf{a7v)Q3;uu?^15 zUN0&87nprZlrA3j>n&fe^y@@E4UmulL-htY5|w5iMonPbW901o zk4*0w?Wo827}O}zMQ5KzvByfSRSl5f*d9JKU=BL$Y2#7YYp#Fhb+RHX36K5aCdaCI z(wDPYpbU)lpy#ymRv@_kZgmoQv_TSl-h+WBIPN)Cu7W_Ij}5P_6;0B;txuRRlbtp z$CKl#(Z?;8gG6Q3{nx&{jJ^jC)z~!H;#1hh93lc>fR&N;vrgp0@x`k$m4!3yzzyQE zAGdyQi^!(@?46z%*LspC*DdhpIFVJ*}eHPPp@yoPhdpKokhSviBp z;OlrufKnOsukMG3nplhdPKt?$MNkBA+l&l>UM%Xj7TdoIG?m0qUPCDe4Kdfd?`@;y z7D$>$+0)cFT}lD_!~Tmf<6u4nG*UEW=={^F?mOt+u-QHb7&ifq1pg|!jjL6Jq8~S6 z;)T3uOveY>A6N9>+2DWPUvPrh4EXWVe+Ze|kd%ZlG$@hC3XhFsbz$Hos5yIFz_}rK z@2bM9SAd&706*#5x3-Je{-tJ* z-aR_%m~7)xEl@S6L+^v<7^ze|aF8ulkYm*16kqaIIfA5fBI>357n(GP3~Qkpgb6aNRs`47MZ)A;;tls-EwkW!3wia;KyLJ8ysvmUh7=7McM4hx4~I?TkwhE#GbwO zqY?9wt7DbN3#(m<6UH7vAK;F<{S<3oA%9ZrhCmD*R_^G-Sl4evIC&Cy44?7P_LIK~ zv18R8TPFbW+4B4~RPawS*nU_pXKou$h%m}?@8MovlV7mLUJ$v`&ZiB_qyaHG>t$M+ zdTW5M7&o=sWTCg^=p`aCF;OJ?9SaHp)j{L&JwewiISNwZIRR%!$-F7UU7w;}x|s|~ zObE?`4T>0F17my;@I`OPC@GaVZLMlPbZ0IS-zDs}0*zbb!WW$#8b>9TK2dQzF1p?x zwZiThw79fyxpd3X>1eLwV!@Jo{DDNJhyk;_WXMu5KaVf!+9ul=B4&OM!WvYau1j<) z>sNtcyqt<>V$fz5$%8dgf+6KeHws6%Z)ea}P8??VZ%7%AjohL5V36U76z)_i;QR*JKLE@bT|1~bsJ82237$0bmHTU!>q?jnf($ekmMIl+TotSGJu|4`B0BJdC z5v!CZJM7f<(S|=T0z9-K_%+rm^kiwn%e;OH!YZwp60K&~d&6un)p0G z(I*MmUsF;@l=%Wj!CzAd^_6BaWJ=Y&Z|c%2Z&ZKJzmfVKBIUXRNop-3gN_yFW};L6 z!Dj7O#$G3r+v?O1KeT)82A^!$Zf|F{94S@OiCvgj_6H+)2Wj)S)XJ$`~c z2Fb6)+_UujTEW!D=)-1}l!2qC;`roS;aOtW?(qT#Uq;KL5C>G;lnc_Lb_r^M*9^>c zocB5}4QL`)qx?xq{X^>up(esFr%lb7T`Z0jI(Os@PbJqXFl`KAn-SL@Sz(KBs1X@- z(cle|rGuH3cddt&9omWSz*+gx(pxaF;^K?%yOt6ZncF=Fo7LzPThtGfZ5tq*g;5e0 zR)yc+4R=X@{K^xxMiE;)`Zp>11xtC| zMc*fur?n=lI$B(D6kB}!Xt|t+J4DD|*gs1C^r{jFlbRs{C|~4-@x_5SBu4qq^qNk* z>q&<%tAF?|o-ri7n!}ec+Wt zoOPzwkGv23D^Drry$+$habAd)lu-TW5b#mp?Q$lll@{+u$e4%#ovKrex2r0Nf5;j^fzaM3E z%zL)k84QBVl{5YdpUmh)GQcjwZjqz zNM%9CrtCRBJAw~j2)x+R`k_SV3nU@J)j${Gi8Sb=7dUN;49R~wSMDdB`tZ{YI8S%c zkpd2|=SxgqfNa|f*OPPy06OkqkB z``s}KR#F(dQ27lidnGxoanR9n|8_Bj?M;+f})|NB=FJub^QktlV#LsO5LE^Q7 z?_4iW!(Y3EY!|+R=bzzkiC(wb5Ju1^nV?4!sEW1C&G^TTQKuv`A0 zyi~70Sn1fXw%*&HkHz8I{w6S)x9;xoJ+@=8n#cZTpHw#|;6ryZo9o>;7v!LO5jq?A ziy2QQ=C>LQh|)9~PCp3Dxt*A>EKxp+VDMfkys&L0w;dRfr;nXiOC<%0d?R(ep`ZW0yvNRg z2A{hCd*FDq2hw;;zzEBKw~p{8CT#5bD$X~%=J0RiK`KG7c`F@p%n2n>7ZEf1n#oWQGe-}^{bmt#H=Z-I?S+~yuR)aQp@;R- zJf$k`7ZqzOPpYzltIS@-fo4@^uf!*;BKth?rRoi3Q+$_w)K_ggxGXUUNNib;rGUdz ztc5=p)t(R$zy;68dIhPDyFW>MI1}PQZ(e+hY4Q|Vhgy!titI%`atJvp!(0(x(cqnE zG7Ix7XO(>X7NEmG2>8%6=iNmwM&FL~UeN(>VfZL|W04LI}<5;?R@6C~9zEAPrNpF?%h40&H4nUJ#7r${PQqCn(V57|1_GunxZ*YD543IxpsCC3#B1Rwi^u1@C{*UcZ0XUHw!&R_nPI=oLM50aK;GET%S9u zJFsXE9>TKFDNlBtO~a+<6x%m6mVo&DfEF0Ut0=p{_0;mBcfpV~36AZzLr!#SLZeRj z@Bwd>7Vv1Y%*g8fEQAlICRA;Hzt;>cl@D@g9R7n^{7mupVYURv>~`!I2PSeArk%SO zK>~}jJ}8D9?*$#hJ>+v*nAu>B@&&}Q7y2y=`iG!B&mUGy8#|ytG1KRAOq0f0^;Uw{ zD$r^|G0o(L$KYKY34Wg492imszD<$blHaN}iWS@mSk{B8-ayEsgijWY#HTI5^B$v_ zW8%I;{+gYe~B?K%{psZqetC#-^VMJ=DB;RdVypSTnwXocjHsqG{A7GS#5 zo`p1mirn1vvw()Rj^U&(-f9qEC_(apgXQKTI3y`KHTrI}(Y$#Pb<;PoPqdIiiV=L_$DwX}O=p zZ6B^B+jh+mtuz1U{|(T>QH8%6<9V&w%^GBr57APJrWWw6n@&CSFT-Vymt?u!hYbW% z6US|J9Ul1y`lfl1Q+9VM2gxIhUMv9)A#(YIamlyk(Uu%G!tXvwl6M)!3Sse=_RSJ2 zVTH>+7U>{yyb_ypXDj7W_lOUNBT+6{n3)vVnVCsIp^Q))D+=^Mq5b)r2>Vw==gO7G zw^%*U_h##!1*dKi6+@UX@>e;uIz?)r;$x5P4ii^_7kV#?xRmlh-pTivMJ=ND7ynAU z!ZS516|aayw@Il!EDi?ka2(M{EmpPn00+2w$o>DOv~r*exVF2Bbz@+PI5>nsTIh%C zI`dylFmQ9;zHHgncvK6{+Uk!%Cvh|{-QhaJm23Fn4;y882chO6(=m~Ef7jsER2q=y zra@c8-jffq_we52q^6l4wD`px9zhxZpxoGKuCIMz39bSZIP8bFbAc{6gBhF=0HYCt zUl?o$0IN-y1+}xoYTK0nrwDlH+F8Bi-`T*}MMO}_X?4P_SA13V>E0;Cv95+opn{pg zB+7m07a9!(XQ`2XG}Ox!aU1V-8Q1L|Aa}n?IZV@W&6jRY<65C^(|XJdrHAQ zswpmm%Ibiby88RvBdhkN!t2(ZJ>)*DNxIL&fhKlrz0|8C!`?gW$obH6v)p zPrsV*Da|5Dj{bIRCGzcpLpe`2|61o*eKKxB?aJ2$$a2y^WRl}is{W&V5Qsw$G`b*n zmuEJI!&89dBgpu|*rGHa&e~)iy>8B4F#5?3DKq70YhzrzfzdsWwk8Rr!#R)}utE{R z%?u*u=DyuuKO_*(3Iy1JbSt@yXua)oD;%!aS2z7kYu%RWr8MTl z${e^MIY+U?IjoRplQ7vWuhBFUIQGuz<6cA@X*zkyAIl4~8&1yHe&Y5Iw zquOnV>jHDZj?2wLKsE0%u=L!`CxRml(2<16f63c*S(x^n#C}XyoCaSN#O zt5Dvc51Yi}Gf*GA9(FQPioFx}l*r<7XgLg0EZ_Ly<@dgj6OLA!d#q_!$YzH_ny}lD z^H>F0t{gj(Z2O!KH_*bTS~U{n-{}OvLp%mo^n?5;6_t`zmuqpKR$>94A8e`SG?bY# zaSij|qeqa;M}JL=>Uu0~-=iQIb>vOlkCs3)Gnh}agDwDXpJz>&LqNDJk;;R1%lUmBO}(rHQ~s0(@4tg{n>kZ4o7;hEX~pXzNu}jk zgtD$^8vKdRAC04TrKaE|=U#5LDda2R=Bm!O`#dcz+Fv?~--T!1_X^`9p8K$SoeMPk zsi%1&v(dVRUoyD#q1_TOG~}AUo&mmajA6czq2bCTEa*gjtP5SZG*pbeK6kx`u$Te{ z2U1@s?N59Qpra2`fuBcbwQVP6e+rD>kBmfTO7X#Tn-dMy9m3h`r2xA$NTDJ7vGR!X z4jsbS!}&M?EawO1Y^*@&;yllag@XJ|Km(qF8DBm4sdO0|hf<5))BDJF zT}L0xIP8M(Z-^1xLl^ri@^L*%>de+tioF#gupXs_vLKF&B8-iL(owiTzNR?Uo!3`F ztX#dD=w_38iTU6+VV&WfDoMkd@J}e8ro08Lw?Jf6Gr6Dvm4kfr}nh&ZB&@%Y2y(#=OKiDh5L)=#5nvd zlsd#;8sgCVB=61rhJ}F%pP67TQny8uoW7wnELGA{vLH?v2xS}CTF`9y1ZE1xiN3k$5A(j9c$i*W)MJd|GBEJ#7_Cx3rX z)V@03_gQxgZv1@}(;2_)xSVn19Ch^`W%T#yYN74opEl3LvS~$=Gy&|7XAZF7L2F_W zZzpzwp@?O0&;Rf~_setdBA?yx+Xz;MITAq0qL>NXnFOkK+%6>J4vXz*_Zm#=M6;Z% z#oF_f{w3rYkGZlURCC#?@G=);BmLI3nCMLl28zcEr?g^X+2x&)MqCx4+PvP0^_aJS z`wmRj6i=SPN>=E@ljs^|4xsMI{2u6_cv>xr&{@B#J8APCmwclVtl;;Ov9c*7TH8>& z4_F?O*q#u56s^)uhHxSVcbE;7{re5Wc&Xn60t<~Us}?IX(ZKe=F%O1=894PD>p7r= zNeFru8INqma}+qG5Rg0@qoMaqdOp-?zOdiJJUH#kC zDSM;#tvNM%auf(TD4dwkF(8{8KqucysTd<&XziuX5$7KdRU`a^73T8@0q8)^d&=gW zg{i>dG-`6Qi-lM@3*}T?5LscBS!mUNI*aOn#!U-qf5$`a1l+(ev19dBoF>Ww=sRz)Qq0 z__4QZ<~e#T19X~)7)>7Y5bws)bJTRw`clta+$K6HIaBk|ya7*4rU#Z^PzMj0E^g$M z3q|#hQ}ZG%b*Dy7x@6hmzuqEU$3$A0(UY!q?)OlUs3-8zLCD6Fxv}?hh=oZoquo9L zomE84<#S{qYGbr+zIIF}fkWQ70_#3-wE~Scg0JS1N|x5v_iyNNVoA44ozmr7K-J9# zztbF7mYe;0lk{V@(;-Z|hX8Y+fH(`}3~r;m&EBqBLI1a4>53}z43Qd~&Q#5`?$^Ut zP45vz=cA|sKcV)OGX^JEtd80`Q6#u_^A3T{v0w*5v(w$j&9as^2~M7V7EZ-;Tz^)D z8)8SWVvSx>LB3!3wwsTij&g^xA<94)h~E z)5#<6)u6={SQOB>5^_yhy2K34!AXk8E5U~7&nn%IDiKYU7z3s zu_I*iFcWhV+K;e3^)OAbSdD@+nXe_f35yDpTo3?#W$_Y~Y)0jQ%)#v(21@(VD zWmlC!g!Bqg^;y2;vJ5hD8#2Lz*BE#OMSq!#nwUh?dY}zn%d_E>$(2% zIC$aO06kUtPmRi!ukoaa`Lg?@EzX8XmLzEtc4ImJv)O;~+Rnuk#+oU!)@nX#Uw6ZRqx8FB{;NS@H|8Q0Xq@xa2+D^p%j)_?_QD z3&wnEh_P)#w)OKsuz0*Q`M*cPPhY?BlVAOlyCvc=Dd)UwY4JloEja4Ui*gk?_bM{* zIP)>5L%xnwV|d02-2j8hGrR<<5XPVj0QsBKFMz%k@78cIojujv2*}68=(NL&eR~%ma;b%<2F_n_d=#Mz(q$+xc1VIuewQ;NMB%My^usFbHcB8#vd-N^V%oii6{)6*H{QouJ%}R%F>(d>xRgvV7oCFc~SJTrb4y3rmmAxMt136xWm>D z+B9$FMFCn2+Pe{u+P(6b)bOFmKyHph!PqCthHDpa7G4@8QPGd>7e^Hl-{a@y{k>mY zAb^k?Zhm=0g&2Wh>P6bXG(P3ItT4P^ZXWBQa9vhoZNB6Bz#N z^tV}Scq3p(!H>>FaFMQh;spsVN+ATP?x&&_wXcRd(M8cgMS;n>|KwXhFI5KiRXn`f zu74V>T${L_ov$lH{WzvonF+t=EvUK0Dk(H;iU?-#ez!_^V97-#?9jo%+5Tx=vRl9W zma4zF1dbB?{NH6$A59S2K@B{FKl5*L$%{Za6G<>kLvR@Z>rKhq=kfVzg0EbO9~AUO zg8S%)K1}{k{q4}BPq>03lEbgczq%A!M3qwA@2!=bt7+X&37rnBQYTO1^BBA2VfN;a z*DL+{?6Wu}adN1&K62x1v*W9#2e3cGkDVlHpgz^d{?PsTd6FXIB+(dT|ANY11Zj>5 zQGYPiPvv66wqv@LKGy%2A;MuCVjB>5Zt?QxGiTww;>@_I>yBI7sf`_9K%x?{Mp}Ozckb%D@(0AVH7D73&WMmP4yQdCDYd!beDCCKCZ|#G?gcCk^rM%aT(C z>A_~RX7CmJM?|H-s6@`ztDe1|b--IPvna6W1b0lWQtpg9NcvY>Eo^nkT$HgH>SC9t zL~;3oR-nf-$cw$vr4A@2jWv{QbVCV^$9cZ^vSS8Vzx@3}k9`wMMW$Gn=P^fG!7X}w zYTlWXZvUHkZ{VRvI{6NW89kUAgw6e~sk&AXil>KSIDc+0KxUibhZcM$pnQ89LH?%k062DET~Yi4Ui=M0O$!Q@e{j^=bgF9@<>^ z&*W0AtVtw7`AAlT%Le>V#kx}s86g=C+*^RZDKd{qLt(DW{Lwen{wA>#!Q?D!Q~W}a zJa6Ug|DGQ}q?*KJ_u28*HmJ0b)h3~)hKW>3wz(AJ7siy%u+b2}cV(m=Dc*u<#rA2s$CPI|ytt~lTPoL(rga*4cQPgS05 zp|!vU&SgWHbP8hFVqOwGL|I$Dqv!neif8E%+p160r!CeDNdT zJ1kNno#Hw0O_dCZVWt*}RU#pJ5dYbjBbj@K-auT(ScW*DJ<)6^KQpQYGV-K^ZfyLi z=^@PLn=Uub*g71m3OVTir>KC$bcy=9AJ6mVY#ByC3X|-`M7?%=qiyi2L#Vd^YxKtS zvqtqB8{~RNU!Q`cY;+47#Ffxgn`&(8{SQ$L?**kW`bugqX69s0Hm8QC|&gmp{?5Kf34Ftym#?1 zWDSn>JwV}eTNgZZ3?Ojj*n4_=KX%81BmqtBpMu^YoFbQ8m2+$aOC737(b=XD_eP;l zK4N>^{%2WNX3t2V)XfaWoPPkGmkSP4(bSKfbgK}DTkUSwhHhy{7K@Fwx}c&Gj*{>C zR)l+8Pm$@Qp_newpP)x(tv1*ihuY$|KR^rA1p75=;1E*K{>>dX;Z1(*x zxJ=ejbo52KBl&$cVAJB9_eh7qQW9gbSb|;ztv*>^FA~(S>;*VThh98q$>o!NMZ_NHHC0LH5Hgy5p9p; zS%1i13hNLg*{oT)JIDn4XvcYNL^)Xr$0VfAj*x$qahRlmg?YoJgjD}VCrYqTM_57? z$F9Cr>o#<}t4Sl{aQMDMeNYzs9v8N6q&`x!G1x4WtIF6>*852d?K!IjA#;b02@L%8S2t(kl3yzk_+$EXKp zCI_`RxuyAZGC%2vutzFf(-S5@*2oD?9-xE^7wEdj9C@$^aTjhyo)%p7D(uZ8gn7m~ zj%--RI$rnGR4xw8uWNU&uuO)!ggiw1-p>_-BBiCY$W~kLDy@&YmM64}3H3jhyRJc{ z`Z}psWB1-6q28edSUt~-5&R5&U0BE4^Hb&Ws!Wog$tfOZAv?;#^YgK!r>$f9C9xkrshF!>n% zODibBEW_^xB#(H$c@!GxLrVp;U=^A+vqJ74mN#rEnIwl*ZD#oX_3FuJMFu{XvXNf2zje$FGl+x5y_pc&A;ggrNHhNb-yt- zKc(>g5-sh%E1)US(DN?HEyQ8Zj?00f>TEN{R;^B*jtWi_D&QZWvh*Qy)zl&P?5bwW z%`ZBgEY`yEo@{%6$KfSVb?N@^o3dQSJf`K>S<}?1?~m_dXOlFI2W$Zt`=eW4Fp;YL z+>myDh5oc`_lAtmo282mr>zuv;RbUfewR5^5k5UPPDrGC7u7{=su~XdDuafovlI+E z3vUX?v6{zOY+em;BfsD(3oQp=(SdJ$6!)Eu3j(2+iG$-G1^E1pt^%7w6nm`f#Ait4!50Ost`u(^30Ul$3`%98rQpyQDefss)LX%IB?4Q~a^~|G+_?QvC ze@a12CSYUFl=38Du|84?KJmNldLERydO5I~S*T1CNpSFlAQ+Hv2|8B`d>o|d0frKA z7sCGX8y*Jg(mB3nc}g3eRlv@+bmaLt33vsP~HH9YQnMakZn0 zLz-(qH=&wlekDVZA0@s2u~JlL=Uk9%k#mSo>97(!8e{b<&-}yez3g1KowUd0#B^ORKMT?7RHPozOTHkFHIx2 za6R|u|2Bp$MdXKqD&}|@hi0dbo%dMdiuak@O=``Rzq0hlzzR#EreFWvgx1nez)BGq zl5gJQ!+k;%${J z?4{<)wRuIh}m+qwE%oY`dCR`wBsr@ZQHy zM|QY>q*svJ8obQi6>7{7IJz4Ww6vNN!Qs^}Lvy5hkn-dXM9u~q2TH#lB8@xYOoB<@ z3TzMMVzvUu24IFMv%(-e08k)DbOR^u%(ua<#vV(x&1$FPL8I353{edpb+5`EP)TrL6+UN8qQp2$}ToMk5FcP+n|aE7`STWa~!Mq^p)!fTm*(&iX7N( zIXLC<1&$w%@JVBM*|%6>O;W#-@jX1!>_t|XcZhN*;=4S*_{M!Zu33kimksxan9_-( z<)Y=BdptW@<}V6|;h|aOjXM@-04F=~c2WS|L=*7%Q`pTAM;JhY z{CnKdi++}|Gp-^%2oPx68b17*Zk36wCOUB*Ogr_$-M%o5?>Vh?h9%R4-=x0XE1gUV zY#CWDf;-PWQUm#grIDSTNM@4#`RJI@7?PRIL@}TpY{iJ%^9C=l7p(8lw&bi;4#5LetFV z3CI;#RWbU#AyNjXRACs!!h=t#h(kPFnkrRpqOA+e;mUXme0TLIs+H7j%YU&KNA6Bp zy0my1b6ca)g48skI00-ER$>O_*c-l2D>j2L`_6oAXOYt1mGODOx??dVN8Crh?@L>$ z>?N3?$eR0jjr|nHNxaDE)m9RnTeW_eZK7Bgg`|Hq{sF80&s=zHAayS8mrTG@?|%nC zeB5MihqF%-8$?*G>-F^(Hau$84IIcX*g`Z{>Ouk!pkY#^R+zl%o?A)Y(ifajHK_q{ zw*&kpSoe!0%goq)8xM0Z|bEeTpal1J6Yf z00>$A6Lq=GYI(6!I*%Wy-aVtQy(Q(Lx-JE;s_Ud1ilAxr#I zmQrj^)`8zA&gp&hp|x2vS|OKq_qE+hR;Z%CEsibJ{I+cZw;{Uob9Jnp;2r=Kz^d~H z7-IYi-4DH`$y`jEI!(9Tx}C3X{>r}$CodWJ zdc*i;Yyc`i)xYqMR292~`YKogiBHg8#YMUt{Ev?SOnA1LO7(S{t-;c1x?J*^N{~JW z2578BIHkqQF8s!WAa7K;7|+T@;=X?m0A+)oE0bwC^@iYWxFte_qZh^ItR<{hTF0S{ zb-=ude-ZwXbZEG^>J>Nn1G9N=l-s0_v&s!!`21PaeaoIg$oGs(w(~qXE{5UVAR4Rl z8rRf<_BQ;GL@cifmzz!jtE?2jxoJDIYlXrpKGu`sl?Id!jcSj}MD4W4dnOsgY{BW* zC%OY92g&V)RQuRmLi)IAMhyBlNNU&SI!cyHdv~37z+tt)q%N9}dXo!0K1lip&^JC2 zexxV}9Gzm{rf*Mo2xkS!k=ip2fDJ3}u8v*WXlW&e6TI8)m0lqnv?d;DO96s{$H2P2 zNw3=~#v!Xwp=5PP72n|{9?{~U5ejhK*EPcKxY8nTiarE`J&W6AuTWjfw^KvAO#53vS@VF7C6`)sTTy%a z(MQvImGg*#L$vA4N$r@*msV8dJX>RkRQlI62mp>RQ|91?lwY0@7@sdTEkJ&$pdR+W z^uZ!LS!D^Pq5CYJ?C|pxoE?lE{CYb?^b(DZJ`$*L(Go(h67-rGR=C>$E8G3}mEX>g z`oU@+dB||3Y_5z@#CQ|@>fDZ0DUehK5RGBZ66Vh-+GzuR^7YZ;OaikQA@{|R)?kO1 z$mC(S&G420qgdACx9X=qZ~tdLb~H7;+JPLfxo)|te7$MO=^Wqr%Gdn!F16%m0}fsW z`1}jg+;xasWUkj6H^AxOyBE&ce*5hwBR)ji*7UL*ieRk6ss!_SxQ4zkO2rb1+4w>L_MR_g9qgK=mZ#fR=c*R$Z75}*~W@n;DYi;f+ z;r)ERG~@fD8(XjADlXm4Im2n)m|LM*Vw`B)MQYnQ3^hwmDQ`4TDAxi5_01j6u1VCZ zuRw(CyQ<>!M^#fjOlITMhZs1Z;pwG|*)a9u54=l&Nh75=JBl#T`vZ+<_^U{+qOsg< zrYbKRom+{IpDVdM3}0BHA(;$~y6~ByuD?KTTu~TKHIo3)Ae$~8|Xvm!D96X|tMDjzOZ2k@SCzd}V%!92<8M*@CC8C)=~xU~lf zGr|z1w0}QhM}A3RE(ypZ#sa%mq5Y%Z7O$8JsDmBb zTl>kIRyV!Nz_>1urRZkzv-=e*$C($9R4YuRelVgv}YISL;?i4vezVK5qix~q<=YYBH9F9cEf8&%9znh zc0D6t(}u;+Ndo`f_EFvNul|M(jfWoPp_HT4Yj%Btos8n#yS}O1|4r^V()ogLz_5Y; zQi>qHSR(Wfn6pSoAdcKql65AC>=$NDly(+;-p}S@n;J zt38^61m=sU?@(?=O9&+`>J z#c86^7eAydDPjya&OcZ{5K}JMT@IR~nC7_l0GluI$A4JRkzT8;#6I(|sdaJ{dZ@I< zzr3)78ITt%rdYGUeX#&+Sp1hQQTa2}T_js7HeH6EZg<1|f&2T7_Xryo_9;S_Vk1nE zN{4Ozd}LM}%jeK@Z|1HKX>bw%4=&63SoW(K(-34?SZE5qgn3wrF5B?5P6ME~Cl)E`W z*44_6O%jfc6&V7kT^_H{o;TJk{G#90RjH_NAd*G1anT%uXSc>!E+6whL&1gf*gFxg z345f=uq5B_$U82;ZJ=E=d^XnPFru~20nt(d02gcuqUJ{ExV1VhmzDYbUNw!%Q*Luu zE{+AMUMq8o$d_lPX;!5GMMeFp-T*$PmIJ%Pr&s@uYVxObwzyz^2%v zY-FR>xAymch;KzPsITtn44FC!$A1%Va zn=H{|K&Owr1jMSFP?e()&-@$48d$2Ti13(c_gNZu{Da*bDs@Xs3t1kNB?`1&LPGI` zGCD@V9`O)W>u{5yX?2}hYoCAb&Iu2+Unqw?y7`u%KY9A_ovk}r#Sq72)FlXro5MH9+fY zI+2JkAKWQEqMm+?$EP5Xi84VioW6FlPJI2%t9pAd9;z-8YEWkvnM!$v@OztVyKNr0 z{(#1@iV2W&#bU|gkJIC>v!u!Nhylrp1TjwZjg~J&RMXpw^nMjx`+jjB!5Z+Rlv zd_*kN^L>0Bf=meM1Q`1T4%}qeZkcp>?n4reFoBD*U&oeqM3YTwIOxJ5 z&MBmw<(GPQHxhI$m9P(MM+s$Dgh1wWd4nDYmhvR3Pyw%SgGaZ^eJ z#G}Ksh=f6C1o-;_S$#lY(Ncu+F{7m?{O0D!Oy}q-bV&!lvsX3oS8)WIJ zHj;O$wbDJr@@VwF&<@x`FGNUvfaso1Z_jx;#sq)}38XKmGm@dEH}XQ<9rEPTpA~lG zBR7engPcn;HflzTU5`AV|A@D`^xf$fTF5JY{jXY`qc;^_uk-O#KCfc8hww$sbQrtr zSd0->#()3Mb7Ja0bgm3P$EuE045PDVH{w=1LYsxGlUbHWveKdQt36-sfNb%v^JsIpI zoQ&Cu!Vo!>&Dg$4yi*^o!gBG;#zy|;xk%sM=v{m9sybLsY zt~Qe)ELktSfR-%9F>4RRd$QH7dI+WVf;I_T`-3Ab+|3cK{=v3xoZl#h|U9>}cPX4|@@E>}Zn4GX%LGBoXPH>lAhn{ri}@gQlW$ijU{ z#S67yd-E=6|#+@GlUl5lvdbt(0QH6;-&K) z!BewDoa*`Q!3ok!@Ao1kWHCQhI83(q)_%(B3k8IRkwZDUNX55DjCG!9CKf1|CyM`6 zn?3xLH!^}5Y+tzco)wBTxP zMGQkTc!0K64ZNIGBEA&IMX%D|bg&-;y$^#N#F4I2;C*yw7q9B_-xdLZUH%R`6!G*( zqSdk`taOx^?)6&bN?KOv{^0FLZ@=4FMT3(fi8>@k-0r;YV&?0PbFRKu8s^l3iWJCF zts4BEZoik7m6K-Zw^%UcNQCV}U4C+z-B?V1Es|PLCeWVdV9P!yr5jPL_}74Ew?O9h z{O-{Og&CwnYnDuT8BVh*!hw!Q4L?o!z9}CS%Mi67?mHeFxaGg$%M>t9*iA`6OLuZ0 zRK!%CpDFpP`1J7SF02^+II(Npq=%YXqso6;N#x5Uv_!aO59D}iO{!mg)-}rAnvYAWgRuQ9OEB8MZUj7}hBeWYR8og;s_mxj{T^WtnrHascOmx2n7$zDo}5GC z;GWO1n?s3*spCC{t)+el%}Kh7i2$pO4#OLgOu}9c)?ol5v^QaZpG=dzQfCM8g?B-w zr8z?p-sJ{3#lDEJfl1*>4{8vQY)Y98eyUMUEhw+4N6f;HjkEIZF9&%F!2pJ~mahIK zwIb-TBxDBmCxWV`AivJR0-{BJ_Y0y{jN_Zg97%+Y2gpZ$X11CRT{304>bXa*j zjKCnZh|eZM>7yqDp>KxO%ujRcM*h+nH9@D@)Ke$*4OJc;$f`)vG+8_Lk!ecu6e6$wJ&&Eaa7bsR%k$8$B&zQl-9JX|ezP|?7!UO(4{P0aUT;t@ zK0Q1Y@8o4?R$7eUbjt97)I$V87^m1r(}qZwnnyFfSy13xxOl0d?_7Q(LE-C3aCZ3* z;rVXSYNwumsTJsSLYFz_or4>=S9$T&94bqEWKT0sTVYum^BxyYWKO~F+ZE|$1P-$& zSK7lguyL-C>qL%rQv(hJ9wLOpGc3E*$Yvht9<)_zC&@_ien!Me3D~pvIccS=T1*xR zfhKub*vnxMGI}3(UIbIB=upcl!0wh*9=M4&YD*+Kuwv` zm+sNL0&sPV}?~W@I3ltedc?4(V{<^ySY4&NGCe7pr?QE@g;vYJe(4u4IPg29xIS@ZRW_ds^;6niEF$FtQDgL99xr;N zzcqyQ6YkNVtmQX5&FJ*M+%DaLcE35N2j$vrmRyJ5J~r|_pHoDZeYP)s7^+?_!wxa@ zG1;itkyRfdLFWP6rC@TYWpj!faIUaRO~&i9H{gDU&Q#HTyzA!1BH&a_Eo9a9ZmtW0n>ctymNqcfe$Ms(G%!F{YnABzd!jA1i>^_ z8NO08K+d=_Sll623T=E~l`yVpt`K5(*O0A0$bf^wyNCsPr+Csn^z#t@P%)H9)*szF zQE7Agm<5dXBX;cliLb*-0B05N#+>w7v!tl;y7Kve234yEYw8V*6{#xfefw&HCj{fp zwI`O`3skf8vfof8kpRpfdslS|xNRKCZLADdos6X>n8p29sPR!0RvCf+|2T47-g1oX zQwln^caApZ&M@}}ZsYeFt};wY)T<$?UbH^hr6$=ov=|~%(sMY_mF%t6{vx3+_K6J4 z6$C>`Ve7PbfOQh9fWG;z4j>E}N4h~fg-!3OFlK;^EC&R4 z`=f1UJPXUaIkzC_$c8yw9btaupjGXu4Mw+hRC7E3>VLkT5U6ZP7FYl$HqGHg$ik7@ z*#AwVx2DU;45ib@;mpHV29BzYKoC*qG^(PLf3Ht*XPB0U`n*qba^tQW1RjGyhE>eF zgSDckW9MLq#Ux&cSg^Fb30xrK(zLlw%1Ua~OvXcgskjuQchQ`-Im}~uN&*{LYmeRG zvz94JpIn!Mgn0>DC4ph2ax;c=+a`^bNhem@sF||4GkcDEel#PSy=}Mvx#h~JN8Xrr zrv8+~2Q0SoOIaY4?7r6?;+pQFP&r{0+5Mg}o_xB0wSR)g(mi@#;c=7;G8EO9B?_=H zk@B0f1dZ>r5lUyBmB^7CZSZm=LU1i#&bq>^injX!Z4*ET6Z!Cq2VxRY7uIkpRD7%_ zuLq~D$qBH{I#ch)IsG~Cu^_kbXSTLVXW+~NLd8|<9S3qpe%0z(4loiQD80EDT>TKlV*WhyVcxZk9gP&XISpEL)1;^>FH*K zHa;&M%Www_%%SqjbFscm=b53i87NAO^Zv1a4}oqf`MJvoSh2R#We%PYlshTR@I;T< zY|;;w!wKL|?|vn9=_M3}V{ghKf(3S0Nml!tBO!-hviV?Yxh#!RD}R+9G8RK5M-J;h+{klO#MuO5+fOjYv3=# zGe}M6i8#NUpT{ESN}t@>LZF=o&(Nr$52KQI)i>Nkal1Ls6dz2cMnHXMZ`A}0jZpGB z&48)>0fdUKSOQ(0+>Y!R)OT>qi;W0wJIXQ`^n7$l_76aOZ)H{8LL5WbHWY7;=9CAz zIvpRCMOEgI_A5X%GaN;tY$X6#s3Zz4z+w`E6cUo!?^qlM`Nd)A@4f_gWi*>A2;Ode zO!ACuPUpC$G(heq66~f#j^QnrN|LXw^a>KT>8xxdaYWs&O`U$|dQL@Wi&Vr$YCrO+ zRfu#Ps%|ypu-5xvOyT%jpK@As1rmXlAP=$&pZ5d=aKDZYk6saj&1OSsBUeKxkFx}G z_-{-Y^mP+GL#W=NYGz?btzj-hIlQrUlNHMF0TvG9Zf6nmXZyfWR%SuLLoXT&@bia z7nk;P;r((39d`zEGtD&KLF5ROPuiho)Mp_F-NlQ*p1tWtxHEgx;y*~NDPq3T;c42M z!+(}v5TxGY+NK~DRVKZTqCU(ri6VPAZs2Z?o!01_sAh6*b6~isHnZ@Bg4g29F9xeF z+h1bN9m;aY2me3O%#aXkD${bS>$G_)Wu#CSfmHo9Xe6zzp)>BIG|17&(1K#8{FNa+ zE32>C$#X2j!_Ntb8stCm@S^2l>|@Q>(4>;u+moPO2+K#ep=O&%NzxP6Yp4BZ?;>{- z7um{GOky3S9>_uFe#J)(XH#vM?$=xHGMnn;5ebTI$T5{&(iO(*9>5#TO|@1o2oO3$ ze0Ve5NW4cN0_f)Y0Zf%g64xH@)Hr^+7}bi}SZS7j_-^^ktWfi$h~O@CZ~6r&A37Lg z?otg@O1T#o{yT#y6T3pLMlzmwA0sK?w|8Mk8GLupE`W1q%<*T*VwZL|22TXJmdP4% zpG;5h4iz0=%oL#l$u8@9k zNI=!E%aD>)bM2=rH2QnySZlPDBExrQX|CY8fJOp`@tJz6KdNCMmgbgz8!_%S6A&AK zx4Ix)San2uc1ZK+rNm3$GsaLdh|c3^tK7{sUAwjoJTtDqefdnf^vkmr9~;TM9lggk z8Gk<<+;$D9G1m=hq8Rd7@bXgLuiz`^$38t9XK9dGrE2fx=(-D8-^)9D0gkYxA-#ID zgR^&H2noVdXYO3K{6QQA+!*}j$Wd4g`hCl1ONqWi5<*XXKy_-b%*vy!*V#&Cx|s@G zMZj&JB%9|E^Nk(DtVd%%8ma(4k+8CN^gFzTRXi3ibA(7BoA@13@LVF1I0hl1UaG2GFS8B|532*I&!L zI;_qJF>Ku9OU%J>sNFBn2T#n|KKMrchAEpfnzTj>({EKgKo-)7wDo)}-sfD{6~d`u zJ4rFtr>XwDLPqLL9pGS#Jm2!EQ+F+9bMNI1%MtX5|56*ALB4!6qh1zjIKQz|5QOGY zWri-J7ar*8)%&O3Sos@rmft((K#N2%M#OGIh|)|AupBUpCVIMCi> z7;s?`%}9iSF<{&o1YnCZ6@?5Uto;`Ab8Cf&zgFQ;E4-s2a7F~Z(C@%esnvqA#1Bi1 z`x2lUm4dEQ2zJOKcTYY^P~wdKb{_1R%>@xv3Y$fx(e31))#AfT7L9Tb(Vy|rXAD@c zfSPLrPt==t=L`L8M{hi5rvR_Xk?$c;G06Zv%ZVR$z#J@w>(R1o1hqKy`-7_DDTctR zw&`~QudTVsbseVuHxbmNm?ZO{F@Ae$_+58eIa?*r%Vsuf=M}}r{0SuY;Q;DajSXnk zekUk^zSl^<9t(A-3`E~H#p=5F2$r7Y+J?Dl=2UDlkAvsshA$%fJAj$>{&uIxnzr{> zt}3s^Jw0;r zd#x=I zgH}>%$Z~S@S(YHKRj7t+4o6wi8^j95FqeH=6R^yUNKoLf0@1fwO9N4ypX_EiAB_lm z14Z>!{F*3gx^Za8Rd{r>gG-pnMp>WzZhD(X&4NLH48}=rywf#+S2pAiSQ6r^qM%_e zQ>`}Xa*Zna&_A)pnT!e6Cy#$KosQOvr2u8@NDd0t$CLol6GAA+!=aqggBxj3ag6y0 zk(CW_Bd&L|%{+T(e!8~upi?*U?2q$A7#x-rz;YJp5{B3YL^oima2p4sz`zF z5~#FI5H-x^G?(@rQQ`V=3sF9GsRyH9{r_KKNJD8L1aS7(VdK3MNb+ma?iGqOaY zQZy%h{>tQ~=mr(o&n@7^xhl_yACd-nzz*9PJAofCUgKgqH$IhQ@+jD;a!m1`75KW) zMU5OwLFugA>$Ifsw=*Kezk$@&nzL44+;Boi(;Z$Or6l|Uf_WE#Jh8emn5#N9Evxq{ z)m-JB5jWt_G@VohJ_oXCI)~tdGx#`WdJFAHyXWU;)rq*VxH99K4s1o^nxlK2=aZRl zF2VwcOV&R!i4>~WgUv}UoPdOvMJXBTU^j;6oa(7_A!E~2+TgxCEW>*>ZpUj@g;pH9 zBxyc70l`kIhIOV8HiIs_j{iT38iw8@U-k(WW`ayTkH%#`D+~0=yS^sm8?+*78!}01 z6nWVA>oN~n*FuD@tj2xvWYNq8?Llo8@K%;%6aV@H5 z1`LdlGKH8l7{k{E?q7d^xdhP5IWZRigC8fCZ zWJm>uJK%nJ2?(Eb^R>TN2x0kT-4~54mUCq;Y^Q5c1_yXDOn=AG)fYJT)I0v~Eu-Um zFd@eXip$88m^;#ey+e2-+OQBua#t?3^0d`S>UFGkgn0k&d!Tqw%a?~^07#7L!2Mag z3n;ycgwqGd1z1Ke&`Mr9W@Te&O`nS0PFda?go*ytU4(yNOpJTtzqg$95>3068C$bC%i-b1D$R1Xp4qQHdb=y>BOl3c3Tp2ZG|6M@JUUN+YT~1 zHOKuZ?=G5cd@CqOLwsZIFLjq~)jX#Bj$w>%EC=?J$Err9GzYz;IWT~awSpZoiEma6 zx^AH4cysSvk;je^8c&lV{2O#ptyW>Tt57XLRI73RzkuEBI%cb0=a=y<6?qn{JX+x) zjLVl~2nrFsL7W=pBsPW?^bl=EG-sV~;HYf(F}KQL=p8pTy3m5tB_EG1i$*(6x2*i7{T_|8WLhCnCQgt zD+c6$;2j)Z8y?dHYhqbac%4RnzSdeVjsMHiSgGXhiXQ@ke!ugt&yl=*5Qa*R-RUDV zK$fjk6~cPmgz?xZTDrU5%f8E2=I^~phXnJUc$)@YND%G$H&N>-i>_U>I!26*Sc4#8 zo;*mBgtdk?cv$xf_o<5pZEV$iM7QUWM1hy$dSlZJ9JUuz`W^ed1@ORrOI`L`0BDQ0 z=LZx$@u#3p53DDS%=rkr)uy0i9ki@x5X=y-*4Rf2Dd=VV@Vy*#^yB<~7=;OtV4Iu6 z!@j&GqxnJSM;19i`qEUbAf?S(#_uO8{FmfYguC2ZKk`e};#`$h@8YGC3c>c&GkcpR zz4Hh;!qwe}kB2C@_$EY}b+n@5~MbAs~F4C-!=Bp#KpvRhZReoCTJ*I;!8 z>IP@kBqQ`?q_XiaP65XfHyOhPjek8i6N7O!Ejw6#E3dFJ`C3ZaLbq}w{*wv2vutv= z-ak@436~MvQX#A?G*4-*>!%XzQR6o$(n*5VC}Xe-1r5xQusRGmCi6$K$+g&UO>S!q zH=bmTg5(n+RPRMf^}bA_x~h~0X~M3+rohL*SqaEjk-aQ$d>fr${(1xBgn$wSTKMDa zsDnGf>!vi)y($N8*z9%xd;dgU*0JDgQ0phrNeRL4Kw+MtXw+t(O z8VKr?&nJ^*tW;u+=E`3iyMYR@aUUV619;Fp`GPONctDXiJqc7xS<3uzLGzLB#)a8d z@#i*CaQvarP3{D~S5D1E>g#?oR?W%ZfWYk&*P^9!lO8I=4;L|MG+UVCN4V&gDU2M@ zqgY;^f(@5^7Yn9Q7FM55myWP86RC+s@4vG8rc0Hl=f65WMK4$KRD3!})PWdwNow!A zzpeW8PAu|trfl$4N;+Zx-0#v|(!UsshLOaf#Ds4=na#xp^7NSEelZFQY@m;_T#;Oy z%IFW{U~w7|)hhgME5^i!xyOf~JE!velIYzOR=s&w80+0{$jP$z-q@u0A8)&_Fu}Eo z$>P#qz7M-aKty$6_e`0cn%TqOq|2rj76FaX0M%o{SQEUVdAWwkHu)+!Q5%Ovl%JAzxfnB0k)o*O_Xw7y{H^``g@shC>dE4t*cFm~;g4QfF)d{<&JrD~^Oa6+;~RiB>fO*%0fB(o{@npG#J?3{tRfBKWNn}8chqJtXyMc@}B^1*nT_v zwwR4HfhUhAhXf_+8q&^$doIqlo+cnLBge(6QAk<`dA&aaMy`5D?kz8szmi%C! zGox79_>e6is+MT2=Nfm4Z_iv}J%!JQkW;)MePBz2%)j#qJ3g8!aewQi|3#v?qWqvu zoMo>rkA^X-lnS7`q%UiY(0+;r832qjWrRd0#kW&Qy_WV zPS2M!vAoyu9_`Ecbqt%2!Yi_#rNeEty??+t4cIn-O*(IFg2P@a42P=N#Af z`NyFrxN-qtix3K)DqUKQ(osj{?DX^;sEzFA3pH!;A$0%`bTvytekE4kXL!6=Y4wBpsGq4)q&_u<&y+9G$#V! zUTXl_kpY*4O|QP=9?G-F75~OG4Wy;9s2714D6{#-EWP_6jXi0R}xI&0k6T zlN)*K4xx!@?e!8=0!;;+<$hGMVKtSQLZvOF?Opv?@c#d_Wz0YE))e@p?2d)A#0u#X ztLxW!VN*A=IL0!nvr!FZZRbaPbwGg&m{9uh84=@R>12kOCV7kuhKO+*vI*v^m01RD z+p8t+9EL(~8ND*`L?Z@dck_Ud%B&El3yJ`%9> zzZ-QLyLqu4VX9E}_Icu=Y}L&5CY3?JyU&D3d)f_wXLYDn8{4fzKr%P=>SJO96Zd8S z|1d{HIeP18po|Q;eOLeoWokKg4AG&qtJOl!3fq7RqHpql|5xKno0If?@u7n;#LbM$ zXDvh7yCNJu6b6G+_M~2XOIpb2tInkwW{-g7p8;vymej8G`o@i#4v9C;{LCA*xg_b) z!G^;sCLQ4hLb@Ynah0|R;MB##p#*1}^pl~Krt-dNX9|FJqd)A&;<1={%~6bf;cLio zfS!+j_q#qd42+~u1;Hzk3N5nuWm~w8O z%RinHBL36i1?Qe3wK-^Jjx4n&u?bM3xLn$(w5yLj?ComPiQ!!n2S$>G{>70rq_I)! zH5t!JRWeqQus;g~yRovg89irYDt7*YDqB9n8!H(BzdKI*r>ka`z2!Eu5$Sx@HdMMJ zF%jYHH`V}UyJcoT;{jKYy){nKFqZ3nak>$ef^5S7dvCBprw}c#HxUrCG16o7?#Usy zZRDn#3*D%b5Pb>q*$zhfD=2BU?7Ri@mDfWB*G-Ual{_3OkjN1$<@oES=`{^bSBm^4zGa@6C*B}wTOiW?8Gi1h;g6<0hlv61ovCpG00ud)^E_d zx=i!(ibOnS{9MC2gRXVCf_kxo-HH6MVVrK*jr&c3@A0J<0GK4wv)6!q+Vp|*OJ8pH zrV5RLu;0Qfmj+5J`;{i&`q-g)(TpCZXQibr6|pI>r@tcfR4O)^zJ1(0Yuz>@ADd)Mc?YITU8hNL~DDG9s=pna8AQmH|hb zeOH8P8YBS|-hv2OZfH#FT z^bOP_P zC^qO#M8H&y#ns6btA+2eaabc`t$5hIoKs@*4SgFC0^Un@m1#>9=k}4QBPju~`H9k% z;v2KVK(#9S!oAiz|K&n+laN^@1y427WclSv&YCa3LzclA-PrRiqhK4uVqxmawf(xp z4G@Ey5u#uG0vC(1D+TC-D{rkZEAWq777&cf6T!iVZHRH z!hvdMesOQ!@0sfQ;iGj_B#n+GKVe_8RUOyhS+pk(thbVn3L%LtwjoA*q_PPOTc(4* zSjqo8PbtQ=+zQ()?!6f!Mo&L6aHUzy{N7O8)X%`{m{vZCan-YFLBi->SEu_s{0#Ko z1g^z-1B;7m9Fr~(V^P0YM*ic)4IS?)U!X&iQJIpZ#2&tQV{#$c{5(DCn+f9E2V%bS z7KlB6NB7MA55m9Lb0BAxlCb5^dDy+|Ywnh8RxAzt{knsT-0hy-&{xa=0OTRlJUp-d zOSBhQN|R@HT@ScO#*&Fjjz6%tds$ctladbh`0|v|iP;&=)2rn{cM!9``i z_*G2yBA^txT7Ak+BGj>yN5_Fc*|h5DK*OF9KTYjEwsWb<0qHBksNe1oc1%eMwQigs z-DaI4a^gAEno&#KDLr`D?$?JMnGgVG@ID(-@00mr(049}Kv$`6H*ULV^fdIHkgkA$ zlGQV(Gb;E8k0pqYAm8i!I}C*6wSS9`kgtK2`FB}_{UD}HgIMVJMQ+DF+tv&B;7MJ3 z`^q;|k4P^N`>VyLE@{R=aFh#gl#u~Me=Cv4{z?7&A}kSETVQfvK>86Vh{ac&DV00L zOw4)yBXM#Mt+D*SY2$X`;pGL9*|{qlBgS*_K%14cV|oqu{pF^EX1MID+}Qin*o<;$ zk!Ff{BuQ@^cSRjw>*9!77|{&Do`9V|=%nK-%EE}rJo$HN_-A}#r!q2T&#Ef_wEMg9$;VDR9VpnWHDJV1xA)iy=;@4!46jJeYmdl zaMyuQHqlU(C*Qe)ni}OtPS(DU7UMKjZe->C#}j?nLxdy)vTefnBp`3=&YScUi?PFc zwNO!ZyE)$(9kog6%xu296WoaB)^*>>SVYBF>TOogjBp-4p7vqYoRZ46&)sw@O2u?Z zxj6{k-a`;5vfBfz-T&9bR`wLt!`k7FWOLQRM?ZTNlI2x!Tke_ME@ruQ-mV&%#q4%6 z-k21jdxl2b+hJm&tNI|sG|!?Xz`XI>mDx@j0vr2ZiFjSs!Zo=AL_bU10BrWft42~1 zNYri`S>tsRb05;>tY^$JWcor+zmo{4tUoaqj&L}g&WGa|hCe1@bVy-NTVjR)QMbPL z4oWkMFvPS1Jf9c|iijA2o^lY&ND4{&Ffo5gMcQl+HF^B^~G9~-kiPx<<|*64-8tX!2irWOe+*y50AC=It9E(0leEO27!2Oy3&hwB*u-DGHdQ(Jb^ zp1eP9u^uN89aXowRbG>xc~rTSNZm<0i3~Exf1DWRiZ0MeXFurl^S))9FYbqhZW6QZ z;M27Mb{Hr{n# zq;N=EP+^&0mUZnX+eo!hS%9~UL{29S5H)|~p6{eIVoyna)N{J?66rJ#Od$kSA-AdFnaJMyN3CYSgF< zx7TARm2}|yivDK-EgEq=ZEq4DK(7y7jS-+^)ukwBs{+xKxZWLo)(04&!uWd`I-IZ| z6~1I{L`v*;(0;5>FhOrQ>e%^aO-AN|lDS94Q_npgkv8@9Ec|(O3ZoTG9;Jlp=;gz8 z%)=7nea5QKf&R8%N=pZn+PXYp$bZ^TIe%d&r3`=WT5_#h!XHUAvOcdJ(N5yka5@i( zSLhaY74w#Kqmti830JB@a# zQKH|N_3!KE#Y6&Hu*6&_mB|fjkj94zZd8cm@MEl9XTzP~5I#+S56+_J285O?hg}`f zu8E<45(j8Ub}fLl8IlDGP!_D9z7jf!{ZcNyT@nFxqVloj|XRu(#rwtykithLso+{nr zcbOn{f_72Ns=Oy1Fczlk^_5)3MSOeWVY*aBFMs{>2*v&#X;x&5d(*s=4M9=G`KBhV zgs^f&cQg*D{izwFEV0gu;kSc9&(NWv(Vzr`9TBQaD^K}I435?nAM#wYU}rQb1<#~M zDb1P)lUy|^O8RX_7>|B>3R(b+LW1`BgQjMK8B00YvTbew%uf2kM~DBn?w(N+*ClzT z>J5MqxHgh*-mJ3K0Z?9O>YZW(TKU+Uv0gwM15hM=9Qmm$hKp#`Rvk}Ql<}OZaP#v! zsw65N(vaXANE`ww0|*)3Kjc+rKE~vaEf@IHsDC6DK)Yg%@~s>BI(0eDfy@{=fdIEu5v%BUHUD29JkZ z9lVHS>1B_)Y-j*j{LiiR9){7V&xv1E+av&Z;!@E~A1RbG7^%SwBI|n=Mq0ScbQbxK z0Z7k*e>iyu5-QtLc`vGWHLo;%te=cp-hp)GenVmSN;epPGT8C>#J@0Kh>i7S6bfL) zFA;UlORh`3Mpma9h=qI)KvZ+MKRtYno6lvC_r1LSSS4#HrP6grV9Yn%i%*nY3p6H) zI*i~@sgE!Kaa{=Kdz^?v7KT#38MQhO8#Nh+5Ty$wyOh*m^*!3FTU8=jBamt^ecMX$ zHr|R}f?Zf#ipHAA&T>^Z|iF@ns{n z;wel(FCGl_`VQ+bg%3-;bbfad)I>EmT!{!|Cc&@6j6S}Pxk(v{qrxhR*5 z+|OZ}7gN6bN`Ku>kR-uQ{pOjff)mK$(?XIq=1H2%7+Ct(bdUMM4qaZ&pw_UgUVNc> zJ5ZA3y6-Ue-JNU_=JzMungCsiNi4JQ-+wX;5Y{`=+&fw3{9QgVd1<63Bo;1C;6YAt zk<>mHoXY2(-R-s31A!I)+&7AawB=Nu3@u}0)w&Zu_|&U=puRsbk-VgyxYN{NYC=JX zs>vY+5$Z9a;f>a#J4uPx6fl8xLkDU1gHuG$fVjG~&h$y*30)e_EYl($IGEl{YIfgll}uyWG={PBA=;;%s*Z+U4FQX6DuK#Pe(Wduvo7Zd*TjVPqePvdzGz>vF8D`Q$VDLtI5=Toni6m0dT=xn6Et`rE+^Uw1O0830+^x^2!5Vo2-w6VChtfWa#MyNx+9&2#(^=|!cNi4jKpGfr<%Z~d(YN7V;yg_yrlJU$nvZ(M$vyr&V0h$jFGD=z zz=c}I#b+OdsOFX%^jo>C26yc8cujz>o_~dRF?gvc>vl8O3qpiiV8L}lHMm{GDhHKh zTcec(P(!?pTKXV($k$Nf!cJtm5L3@e#Y7LHUy`t2={x~0n=>>+EdT%m01_z^IaBC* zf5zG(L(Nis406|PrTMOy0~#I8DSAO03xX6PG#@6QPBz6Z_XiatFE+}k@%U#f(Espi z*7lXaAk`sq1rE>J|6**Z(!6KqUH>+LV=oJ4&J zi@Nth_KyKX?6AbXRzo9ULSQxl_6M=4HfVH-Tz`~`{-zw0{QgE~4D$3G(j8lX_$P+8 z&W&*kSlf8|jSATtv#rCH|vCQhHP!(y z4I5-UM(>%znJP4TZcB-SKghBucR>XTjkJh3{9@d?d?LSV=Ot|Mea{$+DGth8lx-1O zC9@MNYf93}24 zOV|mSb8HnWE0&u;+bdkLUlmx3FCV(cwQ&6e9EOW8UqB`44P{(~>xn`9xl#qu^1& z-J8bfgq(dSQxAO`F&3In;<1#Q_K-p-)FMVCmV@^o38lMuFUvXjG^V<@c&4p|(RXgd zq9JcT4#03matWGo6OC5;AjG0zaQp()^S8M!M^tK5LRP|t;-h7mT=I+QN4s}G_qdjV zP?~1FNonRxsCV163&``nx;IK>+q>2PmwqlTUmIpp*r55H2V9p1Lq7p;!})zV8rNMf zl)MIQ>Uo>_YaAMW{sJ1>deVPw>3GF3NMmRj#<4!B>8IIrZ&bc%5IR{(2?9tqEoPw! zRB)9L3cA&lowl#vVP;pyx{O7kAjKKM70rS)Xt}T*Z|eo+^B}i2o#U|BI6?5@gbIOD ziQD8Npm=<5!CWeL@jDds_8!ZqafkO}pL$Yl7C+@x`{B&pf}Pz?wjwgv^B)qJmk}!I zoH!VJ9NC>?ZMj@A!DcN&*XAydASG=l*un3;9&5`ywt`%(QY$xz^tZy%*grG&Nxm-* zT0A@Y@ssE6rrF93gQ=N5$Q5x@5dGw<3*u7UThhV?H5Fg+A z%EefNiZhv zN8{RW#kibde2uqrv7Ahry+(I1Q;fYC52;v3@0-~al}cI;jN@cfv8lVM6zH&WzZ4o;2e0Lw{z1*W2U894~jKHg8i{aKBjdQDc9XhMmch3oTBN z9EL};eJCvqIP*X>QOi&94b@GfW;{8Lg)w-!165qGr0ns7dajV;yc|-4&b}4|l()!I zkx~N>vC4qL)|M2V?C$4Ii8AC3*~5vFlL*eY$_DpSXK*$%3ojn=*WPP_P^HicuW(Wh z)aP(el+Tj-pG5(6u|EHZneHI?w7w735t78B?n$2}l`ad}UvZYYLTKJ*HF1(B$y8W8 zd`-Oq%MFVypie6XjYKwmG zD~|t0*=&W5Fz7ah*@$fiU+}ZKT9)Ltyp!Nj#+XeVJ~ap?Jkb!5BWwD(k@ND{0#q2v zv+{kPf`J{URUpDkZ28%;{dP&97B?9d6%FHQ#!COc>8XrfcxhDl%gToJW|I3IgZ^E2 z;Lu>&As27k~ zyJ6!Msfl@LGV_$Dm>b&884T)Yn&R_J!3JpZ1$BM1ZynFP!js5^=Z`q5Q%zJWtoIcJ ze-9>zEGvU;CYQjjkNuC-v&X7Mot{|bXVN%fUFJ_nC{E@YG4 zmf5ix2Vk;U=?Zc>yT=%DlKu2Ci4S55s)7F@eSIza%>nNCp)4ewgIi^lQeY=Dw3ObF zABaX^hNq?<8tZrO7$AE-A6eFRIYq_Lb2(1Gk7KrdJ46v>VY~09N89~enXutlt{Hy) z4r~A5w+Cq=@PRjI`x#xu$S_eIwp0c-2vj(<>%^U>i`$vFc{>eF9#lqm^*~CwMbamr z-dPE@I?VS0r<2Kg>VukNO&6{2S{MO8nKonwK%sh&k+;My^ovd81a$BoAoll|6-QR_ zRmjrCYst;?`;ooWpE#Na9g3(DG|C(86B!lxEDe-gzNbPwnE-z&bIFaT@!Wpk`~`}D zA4mGA#QA4^$A`1nwUUQt@rfSm%#Osr?$lX6_@z;Q_k*#dRK(qSJBVV!fUV+<=jhXg_Uy{lJ^!?uB6)3)R8Zc2xR)vXwAGc6U@zSEN>? z0P4!X^~yPX?DbCbUT^WeHf86(CWrk87bJGhRtGV8^vLy_kt`6RcuGM7z69oz&g zePFCYJU-l3qI$M{H%)Erx8I!P8o{fakf;!;zk&6RB$x|+TB`~jzs-t26EMj|+wM?r z4%%hx!YS;=muI?%n!okZJJ(UopF zye^CQ{Lq-D8vzLUhR9=1NjMCFVRnDsyn0Kz^GYzMq)FXY6thCt$zWSqn6K96qGi^SwEpn6WKWoHEY-Hv*{ zKjMdL{X*BfZ4%xoJo~`s3vDBT$#moZ>L<@S;RxNer8G!Uke(3EdP|dEkv)p5(Zx%%jKc9vyj<3efRC0ORkfVn&#{ijS7s2-Efmp;)UX{RXfU;qL>03@MM zl%@)27{B>y!C2;iKp_9_4!cKYpJe{Uh#-<4V178)n+6|xvJc+y_VG6U z&bwq*!EyYfDW3o{V z9ttdnQq3~xFe^08#q9Kb20f2>U&yYWqCHMIQ2f@aP&n|NueYpHlrLfvzn`*_cObR6 z4@l`%?BT|8GukdP2v$8#Skw_3p*zgB3GAo5ud~AG47DlEHmtObGgG}0I;w7n<$G+6i}KTja+=cXWw-J z2d%n(l{XTvp-iMMwOuAT**+VpwKo=sg!O!Kv5&2c=%6A;n*1zgOB07jw zVcc$wh^OXCZi*V9H||m6s5xn^eb5hJo#}^1Pl3mjpqiI4=8S&6fZ;i2GtWD13fbql zSsZ?qg=4+(Irprm_Q$;zEE|c_4`c>(WWIb-07~dkOrYl7UMmKef?EY)U9~a9hJek+ zOzj=9h1npSPaaDx2WwaMir(qE|Z&r7rA;NC; zAI>;WtO8=P)`wd%ax#OTognivKneujl*B}kn~JriFjHJa>3@#lm6&Pdv=?aUmj{Fu)ND;$Dlok zDf62HnAXuYE840oeAk6Ayq~tGmt+f{y;JYblusp7FYf|vI=ap)3}hv@*hup*2Bd(l zNUKm{3xWp-v(K9CHXsWKr%l=Q93)2NAQ3x*-y7b_uXyk`m~l7 zu2;YWH7jBv>M2m|syaw5a9P`G1!aGu3-!|_CjD^ps#$9jli4;o5tP=^$|;jfGEQzb9*PcfgX#IS{e zD;8H24Na(~ViV3(z8Kc+$mkFy^=>k8R0&kobR7Op<~esFpV~0I%nFflZP1n3%`O>c zL;I0SMkQwtq@(MqNjXegL1UEVf$s+)xp*lWfLh43C%R zf2#Z?|E^ShVdR~UWzhd2{`L~>qXPFj8TPo z&M>~1%L1k#$&_Bh&u`Zf~{ZMgRdQ{ zBDGvqny`?++>fm5A2#PFmdHHTgB1~d8l&|;P1jm@$ozY)vhTCIAAD^AAX$(3oIIdX za96Kjky9h*s*4W#!xl;$`nZyUazZOg$Kzla4e<9~wapNjS!xX~^tyB*fQH|5-mk<{$jAp1Z!(j=8*qKgK2}yvOfTz<;>X?hs;ZTw&5g zMN`3~->ywi9wX+9>0|4P;1tCJLh_832}Jw0AxEQmYx*JNC|3du-F=Nc*Om0`GtL^r ztA&}L+s&`>H~-n7!kA@zn0-DiqSWLbtzg59c->8@2)lg4z!ptI98xj44#3f}-+Q|B zoZQA?2BXU=0 z6zc3Hc5%TGGCuSw=+Z(H`~K2}c7*xxs8m*M^Vax(jTsZwRuS|Pj;@E~skylxW7QWE z&^}PrQq|;Thd*Q*CyqNBVTN3CFR#J)1Vb%!*X4p;qJGtHf=4s53wt~B0lvUxOaU=Q z*JYhQ0sS;=)BiDS>S#1i7T^C4$@~XV#oWqSbA7J0TTGiMHudlbOEpM{odMw}rC-R^ zj@^cKyt&v0g`yjBcty6ZbQNr(QcunX!xAL-jh3>c=NAk#twR@1akqY| z)G8$@Tz&f3BEhdpoCqw7*Va7?pkrmi9XB%R?XU7|qt2s>lmE|X2d6*zh7xQhp9kig zbuF!(5b;wTwdB(0a^gNdyxQci&Fpkt7!h9U`q(;PV`koW267na1>a*_Msr7QO^D|T42*afOIIib64CZNJcC@$6WLZQI+HV%0v-a5ct``F(h_i@nGePu_Q= znnhJ9^?}(}VTp~9-sVLd_m{!&l?~_(*JG?_=<2|II`F>CZ=CIGwAd;e%uaa>TOTt1 z>C9>*!8dQzIg$7Rx;gckd`td$_cx>m@sYPD6J-5ulf_Y{BV|M!p>$9VUzxNL%i-9xpRpJ|@8rnK3PmV_l8l-~tq09(2x>hjInv8qaJ0BUyjP9zY zbyn`+0d=s*z_^Eo&c*`f5Q;V;0A^l74pVPyIs4x#j!=yK=q?TOFEksYTibk?EZr|Q zv)V`DkRYLxH-k797{os4+cK8Iaz(955^gP(g5U66Lv4rK!!)Hmg&6q?Ql*D!exF2D z&{gurT|;G&xLaw9(<4fA+nC*Pnly|x%{Y8sO7`sAiy0u^;)PMa>0$C6#{E>u@5a?K zGW3{`LcjOMRWAEy4l8fTct5pcyrK-flFJ(_E0;92$WLXQM}gYs;DIIj%2RDH)N=_H zY>7?h6ARMW19s;(23H-Ymmzn$umU<(ux9PQ1KOn5O@Qe*(?3Yljbwz^XB~=R;XLec zOQ&`lIluS|)k;^*(ityd0K1dlUmk%XZbOBn3YMY(rx4QBcs9tX4I^2^@5=69aGj;&;fd;-r zu+1PEadX|9WjNH{DZg#r zgg8K5nq0?*%@-H`kD*G$<48@+vigu@4T~b{*SMwwJT~2r9g`A(#ihO^bhUiX6a-ph zb(55ukYGb#elh*(P2tgg0p{eOOe#S9U}MbiaUoOtDrP!;7Q54fRN^T~2jQ;U!@!h* zNq7JM(nQd~Y|SKxUVn`yQ+vJdrarl2uMvu@on%SAEx|HQs7KDe6TE}ipaFytQJW=? zhpL>*^~a`@5U6>+els@D!^!5tDJ8DbZCFLpfyrxqxv1bTynixMB=chjZ@o3VzcZl3 z#D>G!y|$}~$0f-|&n{t*I({fp&zQRPkp}e}g<22}vlP>E;hnD5wdU`Q3Yu!WxB-ed z_t@l<*nAzRK7u+xs}^Jj>xM+!-C+zT@LM;*t&OdJoDdJ&l624h-vJAqg0QttpU|i> zjaUcy%i7nW-7kb+b-B7nB4j1rv~0gaOcuyB)A^=}zx;`NZ^gXhp}*f`D zf`x)>AY=y*0*f<*v?jJd3I3i9+-_SUQ2__=tOr5X+AMk8RyDvKACxZD8cAYwilJcf zMe_nFZlTh->-}*?DTKzvd!#g!EG@xP$onOS4?7D%qOfKSjDz5uM@hW2AW{$}9)82J zQ4v_?Hrud*d7hR5BnNvxSsO3na?Eq~UEIcion!?4N8Ib=3|qk(Bk#qS+mOl71o_Sv zT@oSdV}sTEF9QS;{aSE1QOgRy#o=d|wDQ!|eY|krw9DMUVNkp5ylQ_3Y!7w5aBv zvRu*vQyuK#n4w<&#j4DhA>j^X*hj%uw1XY)o*o6?*oo$jk8O=$KkWja5%BYKeEc}Q znz~l7(NdbfL0XG5hZzD;Wz@;;x+>*X_mpB+y%A&J_?kb?I3Z|%jxSD$Dl&LDE_B{d z^xhK*!@7(NM2qV~q@b1(pph$1Gjj8ePB~8azL}o7!(eP?{2}F@Zn7Bty?^EQ0A2&` zU?t)O+$&sn7N?sWeZFO9+s0@ZcVpD?7iEWc|N+HE{N&-fiH@|47 z`c|%d^-`nlI&QsBO5sWfg?TEW4G(l(ZIY4jr`(*>O%Cx!{HBd`!mSe;Z3~>}$CPAu zPN-@VYD9kfkN3aL9(9w>*0G`6SKY)qTb;#MxNf^NYqGXrE4)zENL z#APXKv82kG93Excle+(y^xj4WZ$rJX_BEAm{*GX9K>y6||HyrLS=jztY%vfS`lmek zhE+O^tCmJ=_5@D@s*)vB_(ZjSp&U95A1cz7)s55Iu-orW9U4cF(x6F534c zUBrx=wvH@z&y!q9Y^I&U+lwN@ZUX_+bkVFJ-N5Q2mF7&k8H7WO{9tp?l`eWG8_*KQ z)I7(@&^RIpEyR3J;q^CrZNeRT!@KMttF^sa`4P?UOK2$}XWf-4+`B_od3?Zw)6nzn zeaP5hNj>;TEnS&G8>QakK~~`bon|6U{?1=XqBVa|xIj{_b@6d&o2UV;mu`erR+0$R zRNay?lr{tW-*>RdR2G5#+qmPl<8x?O6ZbQCuz3P@u*uq`w}y{m{zfIE*OQAVv{z&v zCg0VvnPz`J7;dLCu%zxUy}Y=VCb69u1%|WVdnla0;9DA3ft;k3eE*ieeG_<#-{RZw`R>;ce3}rNorYyc~+5B1o*E6uEQnE;Mypco8D2v zA4@6Q{2?h;8hKyli;M=0K} z(^rGiO(L#B$aNKns>4?-3;Y!Eaby(TM?+uAa=3*U^k}KcTllpP7Kd0*ewrFX{?TVI z_24smQY)HeB<_xJ-yPACShwn|8dlOO3-1m1u{I%bX#XqNX#@UNF`4<6ZR_HCxT<~a zg_(2XNB2f$z~Fo;rvRebCZCuIAG;_h?&gfoC=umy>-{g#Iac$}a`{~LlYWx3qAN08 zyw-pt$Fc$1q``YfdW7RqtE6AjPSKsq&u|BnJ7gD2jcNt<=4eK!%o=pr*cn2S@)O5e zKXdh~Lqt4X#R0Jul2$qCxSs!MqV>hgqx4hRR|x#a>_lYO&=GL#?O!Yh>DVd2%;e8f z=z8~Xf<%eO0lokQf5quy*?d#55yOPdx)uJC%cp-8 zI(#sQ5=JGQPj-?7VqmiK+LDidBq~^~4Vg>PZB>(UbX6{QP0$MI*M$sXbG77h&zBJ+ zaKo5VefmjSx>^*I;fU!fr4EqaPzO{G2Z}2^Scao~nkPE_S;f@tGABeZ1^|CA!dtc( zS|9_%)m`SVUf4_nOvC;GW?Ze#T(PI6fGLb}efHA$OWfPMmI(|C(-f&0|G)GXXTwx& z<+Op*EtXMPrR@n5)Md1~1eqGTY@_xWYBI8UcHMq~+3iJjx}|kFk*v=``_ID)q+0mq zx^wra!s8U8U+~C4zC9Jghxu}9G@ml_`xZFx(@)B)k81*7xY7UYagI8P5Hj%M1<4m= zNhXqUzq@VcFyo==wC!xv0|bV4FZ@SB6q`rDXZ`$Z+#fWJ{pl^7(K0I*FkZF+|MAb+ z^GWOnRj6zU;7BLO@E(9gAo~68a3ir3o>Ij|`NF&5K9JN3bO-RueGmdU z5{JU)f>C_t4rL=N{ef>IA-N2BzUZj=w~$?sJHBjx@C>$SiRNM(+lTZgXu)Y%$Uz-M zpcbgUe$~?DU5mqiJyW8!z^CA2{aZU%Yzs5JMDx6FeQ%gO;nqcy{ElUFQ>jm3aQtC zt8lI=E8!|})00+k;!(1_;y3a0-?~{XAI%oyf9#9r5NiQw9j?UT$*a_-t6FDDswTO0 z^IR_0aMn0P@`a#hl$J?E zb)Y}S#&bN{mLe`9r}jOmYL-`(Gn$9w8xz{-2(C~p1nycXZZ7R8W9N?m{cFd&; z@@Td+c0tJh#Uf$?BG3iUN&8CK;YY}af^Coo!)rz(mS4aGs?@2dwCA8%t{ znL0(7H)t1a!rVM2qO1Sz0-hVBA}<`WENUSIaz&!(JA#Fc-`b_P* z{|IC6UrnkazX<4CWp9@XB{KH9ovH%l-&{t9k+d(c^U5l*>A?Xn7EL_ll)g z_3LoLa7Q}x#l9v(*xR&U>sm7|o&{$`&T<(QJw~DMdH5qeD7<+hE&Ziy?BHKiXlg9* ztcNAlm1ZG&;;RW(dYLKd+7W%Je89330V3E z0-Ox0XVFh23nG++$$Z(>9SuTik%6<_UJK6G`{UqZjIs~1?Dt!4%dAabcBRK$$u2b$ zvcniwSF8zcyFYM49$mCI?W*)Q_M?0v@!Y5VSlVhO8;0PK8D4Sea3(kVf)@Kjdc0JL0+ z0i;m*&AXm%Bx!?}Wx^@hUHT8tXP9=zc8T`@sL2b9hcS2pY+$WmW7|?BL=||b1zRW54)_d<4i6qJ!|T8Y>7NDH^W``rw0U>H zG~{GyDlYahs@=t;V%=2eHM#IIjGx8kZfwO(ThGn!L(y*Vxw zd-%n5H%$X0OYJ{tp8lxolbM&Y!y4Pf#&0#6o{NK9JDW~S6aN3IAkZ$rBgP=u)@Z~gD8%3CA2?7;8@8}0k4 zUt7sL9FXg|vPxcg?W{58s<`#W*9{4eVv3&q3#ihWs_xu!=IkvMx{_Z=c!Rq5EhfNP z^;FF3cxtjnm!<3i>gX zD9rPMMCA2eG5E9v7TLk&cK8$r;>$1!f+JahrxQ!5!Dlh6;krYiu{p;H|?Ri0G zRrd_qNq64Ktj6;jHHzz^lXYo zYU+%X_T%csC-y(>`mH!PNnrDUd>&PDjDr)A_|ddtRul$TZUF71uuSl#3a2aK&iK-c zg9|*^WgvsrTov*eA!bkv%36m$^%5qstGr>^NhP>qUyiktE)!O-_vsT607`UeO5oMV zUfobRhPz9fJOd3j;uq#NOV=}3ll0DLvP)4*JQH0%x7M!N-{JBjKS<=gaw>F~ieJ?S ztPZa;+vtp2c7F@f#%=-W6xCpTY=+@)^wA<;tY>{{q6NXN!>o-;4n2+hj?&P#6sKN* z)~ZQxFA2WyuAQ>Ro=LQ-q%r(E^i-TPK;HHEC110XsPnHyW3reVHbFPE`zfcksr(&& z%(3CmlDlJM@K%@ETaIhKH;yl=85K(4bzp5nQ8I7NP#xz|*&tU#T8JjW&kin(7LQ+dk? zrT*p;>CxwhoxBG!Bndnz-ly>H#XOs$i34STVPL9IRn%hO7M?7@YQn<*-RBNLv0g3* zk}BS9_p@*Bm4B&rt4kh{pH1IKR+tlo77tucTV(RAq$lR5)wK_Y(U6GH$xO{!`XRSQ zF!e*~6A0KM$dmYXqN%hAgtOJWll29DK$8_qofwOD1J{vs(X2=Bfg$IVOIjq&f=?u^8Y`lyAX zRV{1mQ)@;d8X@j*t{}HPYefExTc^uLYC6t++W{KBX_RK9?mxZ}_C?9rtzELlLq-_q zo0rhDFnzZuv3<6315+AFvZ>JHT5i~RO)@$?zSA0Qjt(Ho%^ToI1al4G27o~UAbpJ7 z+x~ZL(=}^yd%Ff08n%?Inuz6TXa(Ak0aONn@c4u&1Z`{#tA=s zzTX#M&3rasYN>p)?HUr41lf_BXmHJ&=PSwM0KT@0c zM!sIVmZdUT_J$eG*WWIi$}F3?2Fm(X)G#i%F?l1QXBTxMPkiMdyWFD}^CE)4Hi#cg zs+wsS99~X$zX8_gNx#`4O0wyZ)b%`l8>0A_eA{-IC#)5(N!Z$I9!9s;w2i|MFvIe~ zd@@p;JuvF_Ze2};>*1@5-ZhlqlsYJf^7Sgj>&i_e8*9yz)|ENj;k@r^Z+hkZOG=5u zkuc$N4f;TH8<^zEthyE~E=k5{gBz8U2-HK_;@$V)$p$F+&yz`^R3R;PEA3%vo~Nf1 z4$P}>eC)jlgqKohS50k)J&!|wENLp0a3CGW@n-|n&7(M{FL^j5<$|C337{?f)-3Z5 zJ|!+-J>L~T29yu`?TDS)wF&x+xvFDF+CYRGmrY71I1W@X@=)@V^N-S%5ya?3K2!tu z(I5i!xW2F0c3#C&Hf5srM4-a-740dW<)~OiBJ|e=P{@e_0{Gy*Mp|HRe)b^@#{RJp z=?UV5Gy7|#)X}>-0j!+33dH!@7grW_+6EgropG2bjXZsk@da_ik(Gn{JOqcr;j9&@ zipZNk91Foc_xCZyDHeX=jalK|-ozg_Mr(P53n0;%vd4d)VA0G{@ZNF^nR`9?+2&{n z+m{3157ZKa{}H(#uJrg|{H`8Nr6#O{TYFoiyC0K1a7Ah`x-+J(kZSf=0B6AA zoNtDS4WIi!KBNhmemSuNfW&OYtG^<~1S{csHZXU%1+T}A@3raM`4G^#`5w3PR<#Sq z@*VW2EQJ#b7VkS!)ly-`hPD5{V3<-No)Ggo$1)x!5JPZMsz)y}J~t_ zEz9Vyqt5kMIjC4qt}f!RCD;h)ifV&)6eIOKwqehdF@27y-d}!%jFX$}yoLRw)@zYDd`2G`~vgxv+5w2>>_?x9F z{07i0xaTRU6J4c>j^@_|gkJP^U6YiW0A7wOy5hihli^7e%xmwsOqQh~h=i+@tP~o` zcr==7ubzLar-ZRv{WB8UA++g{_V1hMM&$t6HlZ1@4QBTa@8_&h2;;0~whfujoO-R| z{h|5P0J4pY)|r8gUu&(^=3NG5oW3B0Pl4bN^jIOH)7;KT5$BPTU2k;gpp2mDvAlHk z-&dk6IF-_45|UN}2IK>bxwQsloCa^89~J@qzAHXggr^Y@=Ez4tsDtT+lIe?2X|5?p zYx+_4NYVkgOuWL6l!1|wHnOXBM3%qpW26c258hRMGb)BAb^J4p$M+Lnjfc+e&r$W{ZzK zsqXpP+fLo5W6@`aJmwGmKnxFn9Mk7_G^}`GI{|0e?OUxamee< z#(XfO|O5~Im{){+&C?;2BuJ3;o@tgH@l95SZ0yGas%{(8sP5?YLwUP@j z9tl7F=a9fuHlbzzoJ|)edP_9IUia%P|91!T==iu`0|+y-e~cDc26wyo$WvHP*5 zLyijciOIt+K850J@(fq0iw%I)9P|5>sqt*{UCl_43S~vG`xwi|5iIIwZ7VSw8$f{d zldsBfP^7JC;7Z;r=_JZHKzc6Va8rB0VmEL(h0(2iMjq*ySk-;J(SKPOU5B_Jz|9+@ zY9HCr|ES7*?bSqG{RUm|)!0X8GaVZW{;hYVzC$JXU3W6x9OaO=)W0Nv{c4D~hoypPv$CHX@*Rp-(x+zNu@AGLA8$pRNWTkCATk-;^N30?ljHANBEI zO@?P>6=mlsFMzu_P{`Ne-KO|R+gU-!;{=bxvfkM*#LUU2fi4>F7GiLSw=-`WiLx6I-_1*OMwxrC9NI*`tm^QRCXeUOpj zy*uO8r6H>igt!uzI-?9Ym8N`gF;}5&#ogV(PJpOKh+r~Bu4}^}WoE-8(BC}QR%PdM z@xp&~Va6f<{%S`EdQX}LD=I3`LgHrHRMNOg?@s%hB_ejx88kPfF_bI*kQ7SgRe13B zOfk-nU)~yw;ILHw&F1+63s%OM5qUyM&|=}BeYO60Io`6jdhFzcH-$L1d46*#bT*k(4?h>K%fzvy#DX~=Z|T6T}5 z>N_9F?g3$bJ#=0%Ju!O4)egh_4Z7k-PSK)mM?5I;v8@?g7NM?6qp|Aw(C$?Vpdbw( zqFs8k56RTICFhWR6*IK9oZ@vcC<_T^g%UyzeoGE!BWO?r9cbSL#N;FgnSD#1APePT zAzC%WBX$PO=~D8@&4Fj04=m<(2do&5UOak-j(Q?2HJP z;z?$TfMAR@4?=>WII&~__cluf^%h2_Z!<&C%gOyC_N+Rz;%#{R2>x036$tVy0)6J< zp&{YJw~$OZucBxu;49es9?NZ)C;lAEJ!z9^qAIhk@Dhh3i z5u`{(deFBl0e|cyX%_Dv6b(k!m43G*2HXj#F4R(4wh9dfXbusKgyW;Aq8KOCSbq`C zAgO^%Wuu-*8-mt(!l7)?laE)SxFUBj=^Cs7d`U#Aw`=eqkPn}|_lcX32Ld%1-38^; zVvWPma$=or9?y9PMVAPEXD4yj2A!cYRjDO)!T+P9ctc2&ev}|(0G6=>sYy$z@1*Un zV{tiy65bY7`tTabG(CP`m@4W;o~;tJ56mxDpslqyU2$GVyW@e&ogf@Ws?ex06+w7_n|1{Ufjt8T_INeBW#>yO|Ab{%yUuIWY zvZLz!R?oNtTvH@7SzrJs`SGzaBn#Q_cBT3(OTicS>m3U}4in9i+iTXvOM2vipYXA1 zie_Hw+;Ah9-|IH4K~+|nb}FNlN{t-_IRF(rya$#FJ7gmXKDFdR6_2zCF=O{)rAPNB#8%S}u8f^K7%uj}SSsL1Svaw5i z&}#`+%3E86c^~Mf6pf2264QT(LojaK?_kGgo8qdjT=B^jcppnSRP=dxK@N4RdmZb6`Eb$II?`^m^dRbUgPdDQMlx2aFE#QgE6FD) zQYIncUichzbK5gR79(P*zm}D^lKdE`ik<+tD<$J2Z97G=H61i{#L5ZeQclh0LjMmi zu)K5tRaJ7PuRkTnD_YRGN5~{Twyg&Pb}cw*$nMljBs5MPpKQLG3O>T$6?WmiCk6_TAnq+ywM^bMhT|QTYaTwd2XtG&0A#daD?UiyjPJ#rU zLWV0Ko1WS|sNZHj(?FZ$@(9qt-0n!1%OjO40^Sh>`2((eB7@k43 z;G-y8$tjkl7_s5D44xN#E|p8=xnz*I2!#|B)x|tEQ&m6X7I42>0e*QGK1|!IsIU4l zx(FOQx&_ifB9LIwwk*K|`S!Eq%RGF)XS}rg#AcBRz+P`|ZCf%6=x-PI$gjg5MO45C z=la*CkcGD62dK_-Au*)bOOR+@^15fQ6ai7v@*^e4wUW)Ej+fUVVWJ>qN~1j7II2|* z4%YFf5R&7$;ypkZ#SHDe2{={j`~SbTO@z#4mN{fr88bv?nU#VGeniOTq zSTZIenKPtO8mNp#rjkbE?|#_Msg6G9obT`ZyZ)c+f3>e(t+nrGy5IM6uV<~j*WO!7 zAHQ$?o!-kFH9W>D1{oVf>(unx4!$tIHNzp(b*YYVgeh8(w{3-y;oF`A7hTS`+|bfu zI6FaY&@9-V$#6SMy3fx(`1~c6w5ia9i}QC*6&}>2df&!Yd@Mt7+guItY1aKGcOIR7 zM@AWKlW1WZ%3>D6n^MCxBBt`uk(}C3_@;PLzkX7S+*Fu(d-nw_oN3d6%nbcT_E@F{ z?|Or^w6kX~#&*RCPVGOYZf3aW>YCd|yJzDr47W<&_d24yv!QYFUF(Z@TidO{c3zKn zdTaTsI;wsse%O>|aBa_O{i~zqCvScWdUoV(OeXs&dg98&9s3_NlpjBxWwAOZ@Vx0A zhXj%S*ZsRZMPj-?oIm`YVMey+a^f==9=BuLXLYAP)fAl%6;YFZB9-KO6sdu@CqWw#irTwM4PBZugEas6m+Y4 z?{?hALPiged+$Fk$0g3Y?M-j- zMos$IDdO>&T=6@i{r+#qU-`e2G5iqpCaUX(ZZ4y4vdG#S{#FseE3Ia(B~EJjtDK5{9PHY$K3YC9XG5C3pKew%{&+oSzkrcD z(FJ)E#?5zJqg1_;#5n7ee9M2z^=lNF6%re~Ks{E*EoMccj82^5AV@tDH_>p(w z>C|@ZS9f#cVnTb9cUvTdzWg+C=&G=7{d?DUe(Mu2uGd|Cu6z45b1j*vA^*CQpZ%RE zb>#O_htT84-2-=U_sKizxKAkS6f<(X&e;2cLO|f#>B>;Ch9~dOTd!hr(oef|jQQX} z_MUGqO4E1Qb*wjkZEbV8HBm@%=;^G}UGf4ly4@7dPCPna(IT_?%o~e$d{Kf*Q3D&d z7NnY6>8aMAQF*mG&${(ysLCai(|lWcvm4v|4fgG^@pwO2-b2#C3g8eU)iCWW^ zJYyfHVy_dVwJ>&ZVH;re(0#G#Y1`}@;)`qMuANI1v75BvGGo|A5=!&IM5CK?1K*9g ziuk=(Med~JU7HDy{5bQhwzS!BZQq)jwUwUr^Xs#Z6A#U=2oWwF4SyA;WA3!)-bxbq z+2Zoha*`?UrW=@|Yw5fdb+P4_Di>~wljqjSZX;=AJQ5pr|ItC5__TuKI*zm9S*9N9 z7S|KcDyw_GzaH#G#1yOuKbu=`DEhjKJ={R-*wKQ!Q!aD)GeUwR z=e7~~@7OOW-=p%Z`&$E_fu|lZyB{NSfS82PrF|ST4!ut<3ec(NK zwbZXwS=e|pTd0wdbjxWGL+QJx<5wAQ(PBY(=}VVONNMEuwv?ydN@ovFQ{;cm?LO=o z8T8~MOKGUQW>ri_@rK7A%=8-u3!MG>Wc9~pHd^f4yoYl9{E7Wl8&3#bi``o7+2L?f zS#{e zz(nI(KIeLCx!W!~GhGT)yKsj&Mhtg#G?Od#2^ePH`Eo~es!?`W>)Df)1AGcmOq1|c z0ONw=7Ex#83`3s!r7M`~61A4SA9(La_JMIU($AjGp_AFg2FK(d$h(fdiurS=0qa#; zxr-}IvoIkhTb2En@8*BFaW9BhWmAAl>h{)9kN9)(SK28*ywHh^xjAA#;YVjVso{S8 zxfsvJm8FGI+b<0J*O9C>3%OjSxn+BeBhdl1mMs2LQZ#1bqw4GO=vEn@++%T_bAm%% z@x!DyXMD??fGiDpgX)Smu9aG4gExw@rY-m^8Vb4wOucs?7ecC=S^79Y5R8@F`buU0Iofz{3?s!Uos5^xkag zuOtqiaVUwbTf;+jP;=y{B!i`AM$6vFS`5P?RT9Z!BD!ZMFno_`81(@u(@&RH3YkY` zPWh(34)@K7ICL=vehwz5ktl*GUWqi6J2T(i;miA-aZ(qe6*^LG68AmR-eGiB>ocDJ za#j_Id}{IaWNrSsi~K_`t_G^AX*Y51_{?t~zay#>Pwc6uyJ;eH;8vP}m90rc+0Zj% z;nQJ_5R-4yYL%SWJ?5tqy)8aI!A zSO~-8*zT=%z=~X)CSE`h9Td6i6N*p;N^`IpsU$MzZX_alD0z;y8YJS>Q@2{M;m*js z4mjp;dxi3rbJVfY)cg-PqlvUwXs0XpM!ZbW3O{1%M9NG?QooTq>Jl!TmvRsNO+900 zjTaHA7~KT)%A}IaCDO2O!Hs9+7VaIoRLvv~!S|G*Y&9-f;OeCXKk)m7GO{tunxqUB ztbu~Ne-`BMQog{)PU%AlJ(P_7SprQ~4K11lSN&*y3uX{1sC(*rp*sjxw;!xXJ_FQ^ z{@!XL>?#O$5tT%t$WkJrPKXPRbshqPB5FT-Wxv3nHAd}`RMq3oA&4_nf`Szt&|tMn zvZQd)!k`qHp6$8SsTkIZW(2&EZOd848`;t2ta6k;SP4GL>9!NPJ|6Y#BZe^>pdoR| za_}8D({U8W?{tp2;Q@2s_zc1)zRE1SKoY0@~NQSmv`f~ zVSKzzH+MFx&A70>p`>+>?B8sfKRs{gtKO7zbaVVJkv#{DFNQr)Zn*Sd9OWaH_l z4`RaBOcTWjj9m@hRPr_JU0SQ3-L+(sl7}<*PEX6Pv*u6elzbD>%lNtPe0|#C`?e9O zzGnISf}Za`>K@EA6TeTqDbjw$8<)26bteM5dJWZBQ&(^JR+q)R)_+eZ9W{P6kx{7( z{n`>5mbDxd*=jn<{fFu==MP_eN+YQAim^ZVx_HekSIaWW#t%{xcE&3oILb2SSE`m! zjXNpL1X1t*(B&Ivb@d9*9*VLQtw-5qE@NX<*KXY=Rz6g6WTj6I{8s8Mn`gGpOhyT< z?J4?)Mu+O3ZCcCe-Cb=tDD$eXqI8>ggwBi6Z;B11LCQyun&kE+ZGXuYCbl(*gJ_pn z&%MUY6w~ILc{WSLE3y?k7$v`3?;>EgaeMyIMWbgFw)(sR^G+j7jD05S%LCWPLcV_nWu`?T7Fd`qc5%Mul3-{O{rzA~I>@ce3@WtZZ z{Fj=?osE^0n)>=R48=mTtc+{tyG~e1_u_@~>+zh_Z-`^ReZ5yoVb@lCXqG$v_6td) z`4eh>4tr=YGE%Zxfv##l@6}%pP-@=07}i?SS#We+kXpzQ)|3AHsnfleCPc+IvKg_o z8VW_Id=k4|o+envT==ECa{sh-ta7iCC-}A1r zu?ybWBq0B)k>$ylT>xK-hu4^RdBhg2Ui1EzZ~Ji+qP*SVJTv4h#Zs-x%m*b7PcogS zI7n8EuQ;-6owXT8VpXAx5shpwgWh>?$=Z2C3!US=a3@&`VJVUx79nOSBw`fxdAps6 z46j6}*7l#PDMB@F=xy{@)%Ff~VEBr~S~`^fu~sG2g2PHjS8dTVTcL~`n_^9DmogN< z`lRFbM?v~$B{H!S*v()lf%QoznozQ9s6PP1WO~8uppvK?aTOhh3kM>mzO;_8_2H#_ zalT2VEglS%Zd)6iB79^|%gC{}c+wW8ou556xYK^Z^tDQb592q-l*8TP*-CaQ24D2a zl!qAXw>FK*N@S(=uAI+kFIC1ibHYFjD#<3ox^BT?HzX=!@AKD|?s=&5s+Q?^%J^)=wXqqBZPo&kw0X_< zOV;~pOr5~4BVF_=$qvGni-FKymuqyJ*{S4rF}Ft!-4#em_zOBHdR`-k*N zs>F|S(FS~JDRlMIR$+-wrd+ow($V#O+sMOJHZ$!nnK!s3&j-BrWVm~NjBmWhMUbD8bKWmOwNeog?Rkm1o?Bq8_X+k8ul=G}N zU52-EtTl~%&zp3J4ad%yYvoOwce-+gl%2AIwaF=+aczl#qS zwGpS^@z()^r^GKx0EHUa&4Yv$mKSiqRX^cdT5s^QnyGiU`n zh4iBfBdX6xxzy3p;L2L{2Y9GNUOmu1aDL^vQ)ifEW2R;FxvuVd8bO|Tc&jmw1i4j7 z^giNk!L`Xf51vR&^7_BuNSek$Mg`YJso;dHN^(MUKOdgT(vz|jUuok_+xlT;7D7}-HW!BTktC^)bff*VT#rXnnOXyzd_ zH{1w;|K5&9SPCUA;RIWQ8lZxuSpKD8ln~@U3WA{ppGsooucN$h&c$4nq2d~qlb9)`Ss!Y zqm1@n%II2FM%S`3x|WsE^`i{J)k@c2WKbunB)<5y!=s-xgEtb2%jO%RuV%Qw#Q}MmDJA#kJ(>&Gm+8|-F`r>YkYuC#A zP7dYu8lRnLeeFNjKdarQOi?U9|6tkyU$A+SdUKC$XB?09Q7(P8{0JJRuCjdlx4mQj z8(9ab8e)o=x;Ur04N#^=Gkzi`iSr-MN=ufxPt=sH}_Ty1Y^O=X`uo8W1jY%|}!nuz?3`QXQA3KYjD3k669v*&J~ zyZIqOx~MDY1jW?e4OrYaA8(1|8ii+Ttfi_YDy?pC2TicIp12uRcE;pQtfseG-si#X z-!xt1%O`{fscCWr?A11o8`*Aay2>0;w$CAM?uD+?vsa9jk>5CUCcVy>J9pjno8=Xv zUnP{fBhbEJ^Qo}JyKB9+7OzmOlMY^8Fx#bePGq0oY#-)a@{c}X0x_#XFHDi zJX{eR?7CTCb4M@R#BP}xy`4pZ*+RN;b?#YLSOYHD1x?u$)a~7=WPRUW=a$NcaMnBR zxvWp-&rkWaU)ZrqJ#=ihi=%%>TRO+P%Rxo)Av%Wsjw|!ur60KSjqwAMX8!3jJdZo? zXulUf`@Wa>R-EF#Gd1~pIY!4UwWBYu_Be3bXw>uO4a+1IUtbOnmR7na_5DNP1Trp;R(ol>f4Sx4Kr&g&+Tu9;U4Ij1uxXO0xx3IAOO;%UjNqeresjVm8C zp^Nmar4cNzeSGyI)j>UvCv;Dm3$`bfKV~KunL5?;@fMxQTQTy@BMxSvQ=B^wkJQc$ zJfJ&zf%6>2h>GYq)BZ0}=e{&ZckwgrZM0VQugCcu&=5%zKI*C6SWsTqRm)JC`^EHG zlTgH<*^O>jg)z>)7e*R2<1e<=4Dq zPUUJ3(n@_E(r;bbxxu_!m1{nq+`-;YGtoj_k$D5JZ~9DI#ZBbSj@{~WvD@XUhjFZr z8XDT;xeG7cE3g`(d#+&6%#)EwA5uAb=HlB9E%U@?dmXV4+Pg67lB10+jpYx>I!T{f zkyoz_$$rfFI8&17QEWh~YSjBP^TnAJoHup8WgFIhP0ah2iCZh*En0VK&D(nMttIN8 z(vLa`=(I&{mN(pee@B@^_lQ!`Lz;(*WP3-dL)z8-hm*DTzb3(}r%0IJ7pkUn{JXv~bc_3frF6PN5w;BsRO1MOEoc!jp@SPEdMJ+Ub7XWMu2vx|ume#N2;e*@UIL z{;rk(L({R%ji~~hM=B;vXgNl5x9LfwYe;@zHk10q@zF4!DIg)J1l>~a)t;$d}sg5BVQ$*rTSHizA&EZi8Yku*du>? z*Xg?MEyic(+F}$jRq{@<$Li$ON(mb#OL&b3UBf z8BAp!ts$9{e(VBYQRt46`4szL6V z_vy)Dz0EY_bQ*lNw%hN^f30e~a}TFf$AD))&1zz_YPGO>1m4Ugv$P?uvG9)zjjr(uHh;M#s`~3k zxu8pDn9}6-(5H`B66H-($6hfLvJ&#RsWdofC|m8rk<-+3%lHy?_60ZZdO;};&p{k< z$g}q{6`!|j&rfu93|@Y|vf@GRQ96SQya@x6g1slzCL39gujDRuV|}rkR;NYL(!y0g zKBTgeL6q|#4Owpo`Pu4?!gPZ7(poc!Jv`F9&W}g$(yPc-H+g(!HnyVSO-9y{>UkZ7 zy!gt2mijp91bM43(~}0(H}(e1g>$Jf)?6=+>-${VT(wEf@e%K1jrA2T^CSAT?+7b? zls#1`(o0rfm-YVJ zcm3Me3I>%o4s?%wXer+xe}1oCY-kwngXe*y54Gj<94rB=!nT?@1d3c1PL4}(Iyg_9 zuk%5~St8(ioJ7V@ef(1hHb(1|apiIZaIU%&nR zg_qqyWjn2lo!}GSLZ6e;m1RrfH+*gI?OAzhx4m1U{4T!NiUE?`oH10bL_YSB3=*|{ z98K;_r&_I9!a7J=cV#pjGk9<++QvZn(~bjWk>|Ab-VXeDmUUI)(XO)_m?L)bJ&c*P z%HSM`1w1b)vQ7hf#aRoQXD(( z8#kxDGUeWd57?A>_7>mTHxtJd-nbPvP!9K)UpAa?URj}NTjrXo9v*$kfrvJ|-RQxG zY5w5!dtV003Y969Z|1Ezdi0qij;765;EUUElCitgT^xgiD95Jt7X0e5LPkf_)$a;E zFbNeqGH7wQY!h4ArX*WE*}ZJn9&at-<$sjT)W|5?qd)BE(qnB%Z1J%9V@136mB17H z_cbESElS=?_>EqA!>f=cbyG;3ImpT@%8Qg@miLOFlv&~miAVp zZ5~K5CMjNFqhmZWtrC4ivSx!xIqADyJJgd%sT7}!k$>bpFxp;ak%I{|Kc3xsYSXFd z&{J3j>AL*QyGSZMrUJ680&O++D$;&kdF9pm<9YgYdqk>^)zE3Aq>ECn})?m6kl z$oYZjO_@6#dtOuE4;2-UiKkyVM!ZpZr~7BKIr>M_<3-1^8R!mey?l%0#(Tg1dQsVq zp4Q7r1Myo-WaMG9fs8HhG@F0MO5Vo>v!>ExSP!-4Zhq7p9fz7&jAcOwlJmv}3B|6Q+Gf^zoB(@pk+P*X znm1IpG?iO5WNonZLvsJeZkB{0+#1IT{VQ}QXognxh|b$?IrWA{uCF&^SBU1D@%)3a ziWM>AcbRu9nJ~QRywX(i@axcH0}iFBi@xvs1^hd&4%$Ue9qO;*;4yY+*qxw#*yusd zi%Na%htBWbuROuTmR~X#uOMV^!W}U;tvMX|7c@-3Wd{2TpZTn%b_f{M`;crbUG?N^mP`;Ht z`yk-X>j4X`!(QD;p5Rg5QsYH+w3ct^LB08r&~I6eb)xb#5$;>SSVW@*$n4FVEELZ_o#uN;oP29nAD5QueDmFbKqA(oUvtuV5*0;0>k3B+=k*=L zn9?4$+OwSfe1*}9>A;|U=Cyhq{uKgq@0>N$Ei@^oWZTYuS{a$t7%feA>QtT6A?b6h zfiY_s@(a_Cho4`YMHKx+e)}5E_Uaxz?hkD&v;sV|>6#5D68IO#ufA^P^v1L#f?4}R zj@vyaD}Va=(7cba@a9QLCe~)Th@4$%k49Q{PBpvnF*nE9kb~s3Y_K{Av zups>DTbn4>z#WVUcuT`UC3#@sEw{xtJE&h=2=~uR3`TEu!aq5`O4kD_v$JD^dredE zH}wQ9chtTUOg<|uDrr}inlQvE&f7AnJQ+Wkk`xo5no{1hncYsN88uXnZ5=$o{yO87nUP9c+`g})0lHLb zXDxYG+fb7x+4IJ1E&Xak5ge~_>*W4YmBhReZ!-3nHs&O)`**pEZBsFf7QLS*3oa7g zF##8k!(H=5N$X6qw}y!MUULZLnHnf6-z}yurZ1_rB3Tn3V!6hbOje{6=aHaO*zGs7}? zY*P#yJbl6|C5pREt#_Jf=w6mES{+AwoCjOW-xy|azrE`5Q%k#}indLWT%@nDOM5Py zQybWMzGsqs$Mln&yN|x{9;Y(gc@*3BVB64h3oXgbny)E7e3}1RD%g>dG%xhN+)`rw z=X625^u`Xks=i{LI(AaVBU{fLzjKGL@siK_&BhMT65gkKiySy_x99xJyI51Yf#h{u zU(~(T{B~i_cV?UUw2V(`3-hi?AmIoz$oU**5@nU0adh<+EsdQdmwEW>&N*=^PgT5s zR?MGVHCB-w>~l?boY(TfHnmh5)A(&#@S8*eB{v%D^k~GlOwez03suDn6+!MfG!D-1*M7~1I`@_rsEQWVbxfA)foMa zsoBH4Y#Y7}jVcH#q|&kH3~ck+7Je!UaqF;Rw7r#Xqn)g(iy!1Ry{?vSl_Sy zOxBZiY3^jFGLJp}vU3L$%eNktYFYZU)n{m>!b=ay;0)i1x%562dJ=M``oPxs2nDWd zM2=FnLB-i`iM)oK45SBZ&YB-yEjLo3Q~%DS|J^Fq6p`fesRt>M*OlTN#M<^>d`$9i z`dLQlcJsNs-4aIOc7Cnf->$%BO8A2KgF0H>w(P4luWWcMRP?6%%)r)_hE?&rg=eDL zV%O5lIUT>5b!>~~etn9!g{H;@HR6%^hwTHI4{Kx;Jp6Whm3Ya6W0P}xs~lM==mXMf zy98#drdHan>?%vjM$q$mc? z-qpK2HfFwItL>JKH)(?cw}>VzYa&c9i7DI~=bM(?BvE|g^PO1I9HMsDqucji4Wq_q z)hU&pRhVfpu^QOoz0xl=@SAt-74?mQd;=*GGx{rRn~k3L%p@0tUs2lpvD-q8oWs51 zWkA)5>-zV{H!>eF@yQ~t+qT*%`Ahr2WsT@>wBcUkLzgQ~=gT-B8sf33OxZx%cP6^} zosZXPBC7pgtwd;_+n45gN5o!{p$luO=APW%$dS2wiu3Cwr_bS+zBd^Aw$n zf(!2nK9S-bt}9cm_rJ{$ZR~!iH1OhL)s_~WP~Xn|`#)P!%!K9RlXdZ5&owo_-e#+``%x9=h5*HLL#uY|R&C!< z`%vJPMuYvDVDW1g9Q*lpZr+Kz@XY!OgNl`OzGT{q4mX)s;x0zzG43hS*?T!NX!DMr z8JN;iEl3@vyhw^KHw`~`MK3US+lJkRD{FnVVr};G)zpn)F4GAsw?Cbh2z20X zPfze&Z}M_3kL8-})Vs?*?J*%j#BLrB3LV$Qgqf;we_NmImFb|B=~tL<`t);2NOhvB zZTziu18f6qa|aR>G_!Wm7pjVna1*<1Xz?zZa_rw@@87#pjk$Fod1%*Edt_$TUM$k(yn27XL-S;buw{&yr||BZ=VhGp)?~|(V$qQ6gO#YF3GRB}#z;rWpw{XG8VRakjJnmP;3cNMP>C%k~-k7}b%Z(3jkSMOL zI&yxz{jg8=$+m*1@i*3ICU@3*s3lz}E#hGzmm02^u(#~K$9-|_5nbE*R9;gB;dN;_ zUi-ctqbS-hS-(HKf~c*ZLBZ+9oMb58IwAbY$mcjd32htB&WV$`l^Wj^IjwI-GYz;j zb%>rnqD9si)a3Iee9IAyZEuT`*+MOHt7L|Uo$?sRiyM`sn$V>h+(G=Li*DO4Ttnhk zd*h9Fr_Qn+M|r&mz)(W6L*&Ll1bS-N6YHV#;zv$T1}?WH5fg*dV`yJvu=wQ zV2jsn3m?~n%d**}%d)3-Z&)?nx)Teu?^w7EY_F0yx9o-0!iC?S_JF-vCG>B-x>u>| z{r*+gJ&sK}sEqLMcoQ${>j_=gPIz0=) zo%Nt_hPL1@$DiUr2;u%~%GzbMtzA~z+GVw^T~-^PN)pq5(uQKWaL<@kC57`RRSQ$b z7tDb!_91v;-)Vvw%eqB`KBWhW#FkYgu&g41Wfckhs0iI>h5-eBrAY9fDw6nxqQb=i zWPYVcW?4nD%PNvxR*~$oie#5nv`!^S?)GvocL*=X$a08OZGv&_;54I3$`)O8U@d;E z=9#2=q-PN2!sj3va4A|#dXU|rNu2U4G(mQP9HQ^-Fmc+;3epz-5k4*s<7wv+UKTzJ?^i3^9lhWmWTMXB&YKE2%%qZH{Jq92_iWQPc?LVxEQ;Cr zhZrbGZV$($fE~nGEGx!hSuqxW6$8tT#h+rBTegcYd?;tTN|L4eFXx8(X;T}1CbFvW zLYTHu#SG)7TNjCpw9LLXzuHqT$MpW*UD=7S?)2I>p8B?0-SmuBIT%fIa#pkW1e%!D zDk=7qf6OJWljk11ZjOfn7F^1nw#7NXb=qhdUpmarmeKXH2Ggrul)8ry0z%XYbKxfZ z!$OD-B6XD{cm7{`Pjx@|{$Zx=#cdiaN~yZhhsN+#HhtG@Jfn<7)LN>jT_%~%+8-Fu zT(JRqg2eM_L(URDV`E5_b2}I#B84J2QUlz+Tg=a0oD8-icp4DBTrLIVEo&Y9i~lgK zfs}+?f^!*$Q67K+A(IaOTGiq^7_KOj)~KX}<^6aXQpRvl0p&}K?w>vrJ`9Vj1SQ`k zG_w9EWASq^DKTx!IUMt&48r8ZE-NGMpUODmbX2JS@|geb=z#U7w(XDg2b~*& zF=F^&I`X$=NyVZykYFXKAkSxVnpo+9|%DkSyshJ-VbXMstZ1hX8jW%AZQ=e{#-5>ogjQ{FlBmRIVWa_ zf3Ol}d4~4~E5YFzw;xyv+7l*~>XL||PL&&jQG?(x>M-tw@ILx*%%gK}t zKRB^CTr%ZyGLlyi_iz= z>tc_-Eb+&~44&`PwB2j(=78#GQ@gwDb%Y%TU-yMhzjvG0ezA!ZbW;P-m?dp-QU9{yerf3JtX*F&@p{5~K2J|Fx(AN)Qa{5~K2J|Fx( zAN)Qa{=OdgeLe82>jAjWxNyD51h>l;?lr=D%;?@D)F*=bp7hPT|F|zjHIGzpVFD9@Cy*>~HD5!2j3&{L=5A&cnZ~_me($ zlSO??@%}l!zwGCy@#Nq;ZYb^x{ShzpvhaK;&HGPFLaoEf1C)yFAFXlM`)e<{y6%npMUG$ z!f^-l|MR&2wx7Q{UjFD0>HL1(`DtF4j`P2Z$N%efg>OXtVG%kzJ$=fAD~AMyBy$LT+v=l@sz3Q`l+ z#a~=sEX~`$jq|_t_kVgG{kMMoGTuMs>%UzOe%bF&$Ls&r`QqQk_wSD5f2;SOo=^X7 z+?xbjNecB`QOs--{s98e*Q0=cmC+_ zAFkVf)c=R$|F^7D|Ma;1x9h=wTm64KKfgRa{^k1ePy6|Ai`T#P=l^f<{a1R};QhVb zaNUF+@Y?TtRvAFqp@ou#|M2j~g`TFvOU`%j)D_qVppVp}?;NZFm;nv|wP7dhqvxoM zkzm_E*djX%!H&w%H&u*)wSY9h51>9!pQt?(fa-Gr=vS3E0n}!x9MwVPs2wM;T$w1? z`F<)x{i1PDpFBU6E%mt`>}cGjvBY72$^RuAs>=#58)9L*2|(|4A=UxNCsdBcLF@;> zSE`k;-3p+-QGX~7=u35yfEs|}EC(!&hw7m303e$HfZ8F=Fz!No(6%xk_FZrpO zwMDv+2DE>TuwC*G`G#U51egP2z)e5};0Dl`x&ZPCX<70U=|OE%0T%%Ek79TbFa->O zFaT*q{i38rBh*rZEwciAwIHEWpzfn2Ti0m?iEwZ85AW&bZ9*PT^ zBTfK~hvrNaK)#~3s2++TnjZv;xe|c-ME!FDC{}1rpgxfXY*Bns9Yp}e0hOb?LUp(R z^gb=}8MQ}qg2r6~pnCQI8kZA5^)CUa4`f4rqd7wD`~i1B0nh|C0!R-kM?T5|D5gjU z^7|BE1|Yu?s2&29DFdni$}{9M$_r$70ptNRHtHYcCCYcCWyuc|Q#2N8gFthx0w5nz zA4nUjk94X9-w0^9zbzI@kP0W;*ZMF*jzvrfMSK}qx?d41d0`^hsHs^ zqq-=DXpKO9AfO&)9Be-Wjs%Kei*f_S5^0nHrUB$1iXG|)^^5vPeJ21*bBy{%b~HZ9 zK{Usl0D6wbTk;9{fyy}nRQA13s1Aw|XeG6TEsDub0ObN|hsu|L@hOmg6kFuik{!hm z%_o{a9{~A|V#7%Q#StAly8u*oDaVj51d27PkH$o?NAdlBY@`ddTk>fL_EAot=V(k6 zZ=?^Q0-$3N#mNjnxqv`+6kFsQ%0C0(2w}?wTa40E&SekPRSzQI4Qv2kA#K2aPKdVT*h~WoTR!dlV1w9j^>q34X8e{{|vIDIou4O@zC=qK!LFT{WxM^L;WHS1M|sUW(JteIPs1jeJG>-aEA`Src7|KtNI`?>w!)&EcapyTT2{=WAG_E+h8`|REa_27X= zYYF7o(?{^vvTEUU40^i~G3><(0CMcbF(4JVg<&sc08_vlhzGI(WbeYTSJVKkMXzA4 zUfBcwz)2tR0P6G<0F3~2&`SdF z0V=>wzyk;ez_;Fez$AwCfe(GKhW5en&osHzqeSpwk4H}LZt#CQtgKMh)@m4JN!tg+KqfNvN!BL!Fh5Tlv1KoJ1_&3wdg zE7Ae@JHMps0Z$+eXaL?}II^`sJBC|{2Q~l>Kon32bYeJi`0hWs9fqTTb)CW*I0B>q zBN&d79Z&a<0qBEa48yIF1Wp6*F&rcK#^{IPm^K0-7>=0&*ac(*UBD*{ z$Fd5L!*HBAz&M8E;s(?K@R=(bsK;KVS)*1)2cppN|F51&#t00ND7!#;*j} z1LuHR47ZL55Cil9C*UxU2SCi>T!<5}0FDF2KqrP1BnPwrh^1f&0Pz=`!*D_n3!&{8 zP8f6x4`VnHK>+#_DF^z284M>1^ChYb3}QGj&@Be#Vv#@^PzLm2IC0P?9spbbsxh1d zXqA9*Bw#)ysQ{Q~Nk^a;{yN+?0DO~rgyA-j0^)!f5Dq}wjT!*NY2!5vw+Z$)T?9HX zoHWE0{Vs&GIRHAOYcZS*F<=bD1K_hv4~CNkow6|3vJgMncNk6%w9BmnK!Y6kAO|s& zs{^JnoIE!G_2pp>mGsIRA z{4xLy27?&R5b78@0p|gDZp05bV>sgo0P33112AtUy6_iIGXSV#xd}J`WCITXuvx7D zgn%gww@Vsu0b+qHpbB`2;jD=O@YNdT+8XBH8ho+_pR8Mew;0Zb5`g)#u>l}gZ7u;f zfcpUGv1I@tCboM3=-W0QXaK-ZTNu}l1JD3Gfm1*c&;-EPcJml+H^gT52!^v41)vXm z$aj0lA&1RCDu#0eyJH;i8pAn3e4N|?m{TWc;|#}?b0CIu*#SVmE^`>pRSl@XaC?Y> ztpMc69>@_l3P2r*1ny!ucO?MI+`(7(9t^kF3b={k_K^UpfFFm7g0U5x14Ce_s z=m|b}h5?YLo)8PqQ4Hq=vG)R9upb3P29~Kz#PE z0bp+Sf5dRUOaR2v*AX}hBmVTIR?zAkh7ib11Fx(kxfDe!d3;`%hTMz65 zAVz86ZyL-+8pJgn<~SY3O&`Z_m(~H`=OuR_27p|-bRWZIhyXBu8OMNJ0LIPe0wBJb zoB-&}+z)`(%rf9E0P~tf2FL)mKoEw@b^?k4Xq&?WfS#OlKr4pJh5X4i2i{}2%j&>M z0Q6s33v36#?<=4+4}8hX2j(!`RVcd(^L}+2!{x)=_6^6SBKHLN!Zk7Yj0f=)I zE1-wrYGQy#7_N3DAPT@-)g}S=0PwAD9k3ZN24MWUV?Ytmi{a{Fp6a&&prif>a2J@x za1Ct0R^T`QIoJR(Y5@NlIRL2N=!OxEox+I5IRPbLC*T3x2Ks<$cq@A~APlGi=D(dfIk4SnTC4Px_|?47&r^$1K`Va5AY2mn&Ac%03*N| zfO<2hfy+P*@D?MQ#RJTM7_b$v06a1LDr(>Wkb~i=bbtsT1Go+JVR%MkAQrfT;h9zf zYXN!S5>O9x1D`QGGbO+c$N+{wFpvh^1ReoHz#N8WVE{w`GhjaeeY3!LEET{5;0-X3 z;aLR$4ZsHQ1)_m;pd5Gz%wTvnMnDXJdTdsJHxLP=0A)ZA0QJ~mOm-na8Gv!w-GOGH z7l5%iRs-t+@Q33BkPB1;9l!{NUyB2v{aQ6(CjftdeQh{!0VoEbueB2xo|6LL0;B;w zU^j3Ohy%cHPKX01#DNpyzy&^WL7!aU6Bqczbp%KPihw5IB`}HMxgqAL4d6cT8kolLJiLG+U;?-T!N6G{4*)GZ;~1Wo7+?X!0doLi#tSjyg_!Y{0x-|K zy%?U49Dx4#AA?hXrE z*u}WM|2--A4Jt2N4-ZuLkH;C8#UHKW$=z$~4pvrs+l9tBR739|r`|qa7Y9xW^x9u4 z*JmHRPQccGUj_Xf)fV`TEeB3RcSUUYE zocY)ZZSC!Cj4Xc!2LBIZB6PO3GWqf4{{f7I0H^=0VPa)xCtIT*(hqKI z>*{3WX<%Y+=V0_dkA9Nm;$&n6_%ZQAbTaynWA0>RXXebuNoZ`~;Q7S5ax(jgi-pkL%*w*j#rS72dj~UsfrY)p&+PvN9exBhW}ZK``PhFF z_kX(vc2p`Gzh zUjGa0XTZn&vl)br{{_RxNdLoebokHk|Gtep_}ICA0B0972R>FpH)A&gJ0lOL|5EZ( zOFy3chZwt>J6n1EAZ-63KNkPv{FwSlqLHnE<LY@A&I;0_--Wx zi`g#YniJ$l+K__Mw7c`1qZfpemVMLa$;S(qZ5pa{4>#@Cl>5%WqolGPlIH zs6e!TM}az@pnXKpi;H_h1epiAiNtg=cX(@^I+Uk8B&l}(l$9x7V^zbuhs8L?)UfAV zjc5O^w`e`=j`12nA}XTAHZd5^+_}!Ne$1t79F<5^aza?mFEYW*`MkXW{7)AD*L~W( z=Hkn}XNAXfX!W^QZoY;Fn1v;^N&iZNc!&bD^S%BT;?Q7fB4cg{_}{1BNJ6+@?Bs>J zWv$=MD(&h5PSoa+9fYM$B2VZS!v2c}l&^M$Y0@`0oEBolicHnVS z8=M=OQs=NEa)m+jxsA}m?uIp8ca8CjkQw)Erz?M>5=>-2>oI#KBjb?OMo+RWdOAd+ z(uY1Hsd|MWoy$YbWgdR~i)~r1QXxhcbih_%8U8#;>Os#Mvmp0%$a88#X{vg8amhHA zjQAW{)?QBx;)Ad`$XajRKzNxmopLLFZ08@%$q%)Kx;LM%D2Za~W}6mmDmt258SWNT-zT(R1#KueLUnCTt6J9n*hjEVX4Q~vUl10ON%6ut$z)=6_)UK zI8bp9jhTcn@yOrf!7ky$w{eA$7n-SMvJ*0=4yCjt!M2K)7qCffNA8|KtVGJW*jbQ_&P^7loh?-h>RIMmq8#H(f>a{GWA*h(6o z$L0xwtyU?XfmpEGnU}d(YhxxGut4BJuzD;F8aFLRDobYu(1d{)Ls2~6`F!F9XhA9T zALWBGz{$(Shyjlr6;a0~2y-IHz$x@RZg!)?!cC7$R1yh%JEbaXJy5{iC)2?byibIiC(I^8U>8*1>WjwqC}m%jU?`(51R>tv7GpyWUXr%GNC*7-1-P1T$LDseTi*1_gHO;Fr+ zEF1_&8CuFYN}JVcpY9Y}rdhC>cBq0nPkt(T9)aZcf}mhTL;XIy&nxiWtk@*|Trvxes>7-qsvc9w)hHgMWT`7uppM##QZlHt1Vm;S)_?g__Be2c^t++Vo^c<~d-g747<0 zsK;;Kl{sLmz9QShI;k~VVuKT4zdaaHp%2*Fey!$^r8Jnok0NPlrE|I75+?)HvW)2b zD^x##D4Z8~1*#brsL`ast7|tNh}+Gh_BrSo`9D((?~m^uBxB5G_`i4LJ~|uGAwiNj z22kH#P(kk}C1(;ly>Q7zw#!4Sj2I^$pU=!r)?CiqHR6gxz$&fXjR4O@@-z>M4D}xA!r4B$awByk3zZEWk zLKrbQw`WCnssCuG|7#g@a@Gt%f8H|6T5|ZLC;gPI|7@)IP1dV!%@A#^lIGA=^vq@8 zXybI-MU=>bKv~&c*iW_k%?oQGxyBbJ+QDABYQ}B^j-^nZT-r`ee?=d+t%HG31uQFa zU04f!LMW2pp3R3g+!{ZCOJ$@IIz*OtQM=hb`*5UD?h-C2hjmdNzPaDjkoR^&8vboKPWmkWWGTb_S!nEdv4`u_SOhuv`bj2TaE96GhIChRk4;>W13~ObP@uZufeB z<=$S%1fEj_d-gkM!NOeoP2_4Hx)@(_0TQJ)f+1W#UDIxjSA>k`Pic(6U%-5=is-o> z>@YBeN(j8j>Ewv|q1}oo05*`c$rU@C*~3eib7!Jzu`;MD{<;Aj7r)>C!Hg;TQo01w zB2PRb9RD;ie_*x`NZPl^!5=eL%_Xd|D5p}HuxMF84WQXRQ)-b~!N32pL}csLC*hV; zx6y@%q>Jcg9gdf|+D>Z^_mv1mO!S2}<2xx{p$Ws_Ej4)9p+G zjlMDg1`DhpFjOS7S=X0M$-r!r)XcUjvtj)-Sur*@>4T1_6_n^`Tc_dAZ8O1VD4rDh z$tm(HV%5_yp#a6%si4`u=TkC}&Tj@}v@sCbP|l5*eD)6Qc@aq5_73P)B*?IKbVypM zB8ntWnr^RFffPE)uBx-1E$51y)BCf1jJc3?B?uGhA*y+0a$MD#u|myJQS#iaTL$J9 z(wgMY8&w%5Gg<2SR*_~B{BA#`gLhmJej=$_fdNSImkJ!>C$(^Kl+URB9HD& zrapb~k6;($H-0w|(=!f{c9Z^|Eqg^NVtac~Yc@vH&_j8--1m1tFo=e!jYnx(IG}ym zT4})2uFq+G9B?1|I(}=EF{>;$ojrO=*`YR$*^TU8BIKQtA{BWC_nMv(3Bgw|5K{KS za!sbmP20tW4vg6?rX&2*s4esE8hNoJSOHuKAW%38ncr@-X7aFq zuBX^OtHszcmdy9)>-r%4>Jq=QJSO+@$6LjS4J9dhAR2_!Q5}+731g+JX;D)Up(Fs5 z2#=atvqJ;XpR4G`HeuAl8>Y#nXt}BOjbWI`?ux^tfF+cATkwea0F^azHpAf4!@G0Q zwZMPg)m`_(tV@50z(pWOV!2(pc+QEA`33~eY7`@JfAxdo6HiMhqwd&bP0${1lLe)C z5Y6_}O{?u`WOT6je%+{Lz=Kun1YLq@m-!vIzo+ zr{R1)+?f;uqJX<5b2is23oI-?>RYRxI$#1s5lRQd0o+<(UrVtCff$U1@t0|3t&5 zkahP(;>Ypi1WHu))lIi>|97@2li)KRd$w-srpH}ir8K|(&wMN~T=T9r3ZG}^rR|+> z$Hsd^#c{*>mTKb9z>eWHuFL9Ur8lim33pv5#@wsmyyO6@>W-pMd^7p}NnWr()MI43 zpsUJei7OFqiv@qSi(wjV6n`- z=U*#*Uq#1BcyUWF#qZcD)CBs>)$G>D2_NDuFT5QF~Ow&cno^86N6cX2a7elA>!`F`9_(cr^npi*F+okE@EI zgNFS6KE52%nE6)HSY)=lQn8Y_n}i3{$HgdySFUGJVAU{3(t10`fic0=lNHUZoqvT> zDPJl}#isK3I&x4J0Ak}NAcF(qH#7#A*|?>9woDH4I3D33D4XX?-u~Sxe74+s+WV#( zB`h$u8xY{VChCpJm-B^3+W5xY+LSZ;aTa+MvDrcCKjsd&Eehr)MJ+7q@q%YajR|2N zSL2q6xcv2AXzAUuP*VQV9P8*=z&sQbT&Q|`l@M6zS%(3t<-ZJEXg3ZO5orJDD*ImQ zHNUJi?QRm*Au68_{kH%I#Bn*qaMS-sya5R4qw)O~8%zFdP!%**zejv95spWjKig;Y z?Kq)MPs@B$M)94tFb*}0R35X~c#O$EYI&y0L;)q4xz%6qTgM=k1SQk07~P7M;CspgV4Y}m ztLJX}(cz+*|mL5`X+vG4%TPdJ4ioRb?GXmQ-19)!qm!XG6p9|_v*<*M&O znmAt>A=TVBn5Byf)+f}MF7}@jg~ESpehKjLmUUz`$l6!MC2@h!lj0C5kJQVa<~wX` zMXs+PB{hBBY6T=cVPe>$@+rVUBTu0nm5U8OzQ`9yA|w(&^ZSiBU5PEMoP72J362|C z|FKpEBib(Vl|U2Gj?syVR9^HYj z$MdeO_i}C`K|YCoPkDH}fc*v!zPrE}y5ztR5UuEBQYOSby5Gu^{yWiG^+VM#%uAS6 zXe{4v6WrM_do)?Z0PV~eZp~E1!AwQoc)>(ZyUUAp{`fFmUU(WqS1xC<_C3w{M8`(Y z`MJKXJ8%A}a{?qa9NuBvCT5J`BJ@A*sQ7KjPwO`+OZmb>zblqA;e3O~2{x1>+uQ8) zM*<`2bg~>cbIQ6leF~LRf=tqJX-hqK85T?D?sOEPtt{h2y2t}ryx7_SHclBUjLWM& zj%xhx=yw&UbhXZQ|EARGr8LbVuMHE~md;Fm^A1SL&{qIiN5iJ2FeB)lX4}ILi#0UHT&}W$;vlH_ zj|Bzf(iLoK>ilg!(A zttPH{Y9mJsO7+wjLM%I0^Q7sR@<|^YnFqzTW|et_F`x+CQFZHnOi?RoOA^<*lqg#bBb zFEH7TYb_#evJ5s1Vrj8?gsP&L$FGGwcW46X8Cm{WVBOjEFgaYIj?pBa-}!-hsy4cilKY9bMZeq`$~s&1LZ=!*yBmKO26q7gPC;`>(JyVU$6!pt zE_$6(M9_;Y2&t?JOVdO5)v`_Afa7< zM}e|M>-8rQkmgt5{sGZhh}Q-n22YQWC20iu`@czT$l4mwneh$Nl<%Yyx)ksX#DQq$8UD5vIoH{1J zc%<3Mp2id~r^WyZ>>1WG_!zbjZPU(-5vPm9P_9cL|JM>2OpYSHdb13UU@HE}!^`EG z>#TuPYLKa)K7ol_c^0+eAteaByGsN(S){A`O4)~-A?I+DsQNh47{#5iRTj`m$Nz_` zA*(Qe&CCx~j{ei&ZU=`cIN{rv%Ed@W2NOs*{48~WM5e|m-e%cVV@w)r$nR(hK9Px! z=}pLh2!ZHtQ;D}j%k-zB%S-7@j-VfQxB7h$W}2G2za_2&XVjHk9ipTOSEj@nOLPU= zmZW|8$f%z_h-aTyx`pH6r{5h{%os-)0vM5xq_*`hxTdbq_K0tCGICQX0F6;#>b) zq78tSJPb_ptE+FfO|z^l5W?Zj|K$;kgaeY({{U^V>aUN$P~y@bM~|ACDAtGa2Do+y ze`g+;#JTFt@`&IXYre}G*B6WEHB|S|RGkTWHrRe*2wJW9cQnwCl;EWSbm4 zv*PcI5;G-{XJWXPVqC73H;o|@7Z0M-&5b|BsXyn+H|DpG2vd zm<>aTVo~T|8XQ~_*3UbT9lB9bXNmw`>|2>yk-^JC^xp5xCe@!GS?0rxM$J`Yh32F` z?=1AWqWu0^>=m7oueZ>$zsRvEy#LrIzs(`a45EKsc;hmY`kNolwc9_3c6+^Y6jl=6 zoc`T9$6wQ=kxiT?bysxV1LKZM$zR~XgftA5*TjIn$Nfa3C{%@$g!kkwpa4G*)=a2? zvGBK1=hap>|G*iI_Y~LesG<~>76-Mt^>pyE(!p-^tRVuL*79W8qJDT*)>3e?57b$G z^q01zU)B8f`umGbOt;kmLwH|of=xzm&o29$BHvDe4p`nb!J(okXwi1!61|wN`6S4I zV0|O5UPw`B%rBkJ|NV6QH$H`qNJs1^l{N$)p}r_qFS05R#-`gkedUQ~vXRJ+&o;Zy zu79&Fg6pKiHf38zdzm2-fnaKDnLheG=n&3-SsZ~Xk+E4M#2!OGZF02 z-sZ@CLy5X7@CBM!ZA+s3rC>jSAvR!vxIMIUelOq918*va`OfbTUe803O^x47xNm^` z98ckpl)Aiu+<5;#?qDK})$H?8JoISDrTHQpH+Y>@4mNsbK)Y*Q`}SJkLR($))Z;V# zG3sJEbH_d%eG9alm?%Xv2yo9KoADMb0rUl+eawOb3|jx8=1+cMPBNqMDwcu9spTy| zmtnhQ*#DQw)Za|Vkk#El4HdA1-=ReB+Z);ZD;V{j{<%dMk8t2;KC2k4z_$_m4Rx3E z>S*U;Tl__c%mMHlg#2?d-${QT-zF!(c~iK{e8!EeL1k0n$+raIhCc2_ld7y z{q+%eL`D z-C`5(1clsa_-VB?M;COaAMgX&h?~5qN1&^Q)v0b!vQuPR%T=@qc{w4b^PSbA)|u#b zCXE4s33*}IAA6}<TT^S@w%y8Et-&+jIN#f0}Lcmmmqu7noln<{_ z0cj6Fw-vG+tvlsLwI-ZZda-%oiR0C8jsg?En#zd3`=T}Z6Y<$#Y}6Q`UFkwLnnh3o zmreR1`V?hU3?Vcoj4qGzQS-Uk@e2ebB71Xy@RFX?CN>b2G>0)@p&(c+V3&^E2s zJXzpo$P8#MsvO^2zBJ#7$J_@M#r56*OY55fTuFB!{@03DjzG|Vnq z;RrmP9Q(`j@Am+AxSiYt@I(IO+zd3Efd)i{75VNg0};=_eyAL&NigloRhmQdo>w__ zT5inHz-{`NUN3mH$8OTL@)0#0(S3F#wD}0MhqW$CYV|!2hVLnj?C~8(B=1&mD1*RYM+Y zDL0pV1KPVqT|h}=(PjYY$4XSV{;xBd*?m7rqXIP7wv+BM8g`{HRgFkcnwyeMC}Z{} z-RrLakyT=6DwX8XR}d`xWERWmMlppv5UW%?ijd;S-^@ai_=`)G5?L08$Hd2?i$6mk z&(F8kYAPFqlR7WJIf<_QY)uTM>8Se>SEK&0!uiDz{cX6-2^@D2z7-@*+4Q@NP2($* zu!L3S`2#ZhZiJJGT+)S_(;aLD_|U&Mrwi(Vc|rST2G3|dGUGcG^VoeWCjosK3m|_X zTm$0O+btDWo{?h;L+0=dlZuQO!h9JD^y-B=RAb*=cxQpHRhLHPYjActvc+lT87rJH zap6mgRK`o{nO5th{2fh zJf}ZwY29-yY?*R!{D0N=&Cdk8Qrd#%o`nXj-sY4*ML@w;UN~3ph0Q3PgWCwjV;JJ? z>`hBu>qrSgYm$Kp0W)0cgV7cN*T0v0a!tKFFjljo%|3AqY4y+V8N=v)s%<2vHd#*E z@oYy&>#SdkCr^EPcM=c=#dJ<(o$U1<$i6cvY5tBYY$N0NGI1eTr+v^a)*3FmSvq7O z217CT6cHYtuk^y4IXU;v{~BDP2iI(w01NH5k$Z$mrw~!Wc1Img%E|mgig$2#uWW9a zkfP0d^7VCTt#)lK819P5Vx4I;X&G38C??Dt-Y2`#X5MiZhTw*55bQp^cz}FWfaC02 zW-u9zNDrLYP4>Lp5lLbyw_bf`rRSEn~Ne zd$oiuy}4p`{qea$n2T-#Ivziqp(@8|_3d&bi*{3EIQyvyDF8eBy2UO=DQaY(SDbsP zvk)~vUx9>U5Xu4|J0azd))xj9y+!@YW#xHxd;gKG;;!r*W_(@hSK)MGZ#bX^#)LgkmpFbgKCHHy8lhfMf z6m+_;a3o~9!>V`mmH5pwU0i|sUuM>Pls9S$mLvn?Fe51=V6yt?-Lb!fu6QzFHi6;t z?$4i?tN$`yypcr={l5>rP)a#EAtc0F&G3qvR+>ltY)S@*dp&{fQcx8$^IF$Gy=Qd3 zD)K>{U6X6u-pT85K~v>{5rMwI0E$zG-+2%CKcqyR56g4B@X@Q7p|0TJ4=EWzP}i{OCA-Lpm?LbHgGLIo{Un-_;2`@G=mGYNklMI z4iFrF&8a)E#f1Hw%aWq!*i$ppz^VpX&-L%BD%hVcdc*wxfh*I_ZvVm=fAD6bQ*z{L zPUAea8NTP868MAn-slYBNMsJp+}*gby7zlT={21~ed~1itTQ;0+SNQu?2pGvjBihE z+Y2x!dxAn$KK}#V(?*Rre-;D50EhKKA>)*hedtcIw#0hp^>Tr?V^2mW1Mj;7z2t68 zjPtdg0P=m|a^y!0Ofa;wA}9cc&T_aW??_;wQd6{qJVD%3>N9M>!2pk~hlTB0TUxVr z;~-krKmSE=@b2V6cT@}Iz)G%Krp(jLuPCUCxEG(&&ka`6AABk50n>0FEaIb2TAc1c z8`1^Co=!v)y0F2qB2LMVB=YA^XBBH->-@(FhvlqgiBkA^an9Z#aaff%AcolpACnmDqC)RF9m44Ro1W8_TPIo z9`+HYpJk6tX8mFM@`8_@dCxc`GZMH|sN-SNXSe8#PxM`4Lxpwjo!kLM;=MGv_Xd;g zL6jwwzZ4``nLQg>Rh_$3M_+?l1exMX1Gn;Hi@V=ub=hzzgAizp{xEzJ)NmxE0S`pI zgJ@gu-7*&Mk$+U8F%)DISbqz)Z`{< zt<5_1rGH;m57^s#fmr6Dm9*D{;IiIwVz!{P>}F%2p&ZaC(t3pAK3cRewsb9bGLT*jf==4} z3wGj%pgEr`*4W_`;)W?A{la<7X&6->+$!#>|4?zHFAdmas;xrqPZ z3Vv`paE+hshDf@+f0DP?8c911!u`?~-FLYVh<>$pFryT7UZ2P%*A->bK0Z#Ig)<5w5s$bhSPgH^l9op&f5%PK_$#nVBr#Si;itZjLl zL>x+^^rG-dCKIkjYg`T6g`Ib&ECtL}5esBXH8 z*K9?t=BbvxRfX!F`zMWzy_cE*>C-75w?xxKw!}Eo-9D9;zynrmC2a2|lQ7-%sksW~ zy8ogaX-+oUzo3K46;m<`HTHe53B6H@x)L zcY=MNVPof;Szyq}IBSQg&G;+EI%9aKkBIG3lKyuEf-G1xz3lsm-1dqJtOBaD>-SYS z{0X+W-A zHq5K$vt^C<04p11uma5lW7v(qpDA3;B~+}t)rz5fZsMlpE7EkwE7=NRxG!RUZq#XT z{IM;QBhq7P5<4U{F)t0$wOmAqRfuPe8;MYia^ViovZVLW!wcNMCpQ$5dY;%RttOVb zM&XyPI_^1<>@%LxMa%WHbzPcyc^ggt)Y8Wo#c)rKJoL|g!7pQzLHau={Hk*MeT7Gm zND87Jiph5vhs7ta?U45rYupWnl(GjVoC@u9fRRYC+P;t{cR{v|oKH~Z#ejQL2aO4P z6aFqoa1uzLe>eC2oDc#fVm{&!Yl$C8W&eIsCz+l-c0(!wPm?Y`jVaW%yy$j1TAOX< zfET?AAGQ!|=#*}-s9v8l5pOeRQJV%5+GJn|*4dw|Wq9WJk>*Ots8L@|sLNv&l*Nun zAoh)NLNhqqyxEpH{Neq50-u)|gXIey03Im!;pC(S7#j=hz#*)c#WOvKHM9|M4(t`4 zL*yyrJuChPJ<5&ujSxmnI1~%do5o&}oO~>>NT#%h{O?I{qxt!q{Uz$|3CzLB(^Rc@&U(`6cCkVg)dDp+GhjI6~ z74z~I@m=K$p%3#2R^%=P`f5?A5~)zL?S8fJ4r2-5fRo;WxFFl$nMhZfV;Xpd`hw)J zxcppx&m0uT1Qcq1{3@7K12dmQv7!qUBT&U3;>L1tbydJLs8IDhz5f>}ELp^xq#}P9 znx$S6F1bPnPn#?lTZump5p<<$Tamu4br!oc)72so+5Oza$<7Mej1}4BPyMrTU4q5Af7{P8)`exGLY(D5aF=6WFm1KocGM zB3wF{T!R9AIf}v79nx0e3PJMOBT*L54MPA?= zMHLfQIcKc#ApvZz?P_gW(=slKD&IK_@6uMN-?>;%RXa*2dLJCC+XF~%*99nikAe#M zxwi_>H*Z7ZpuP@#4bdo{S>CqmY02(O_2fd;-^+ULdMsCmrxt!FT{Faw1pFuu z>(Yl_#9ZM+dtO-})9e{AiprpYz^_F+ln9dupDty(upy~^%ZO9Qb0{iKgsYquK%r|O zAXwrNsfL)V^v9FLdp8X$ZqR*PwB_MTf*?tINqkya)*XdCKSbK-C#9sxxztZc6Ev`T z-P_61^>Cm}OAkyal*sDp64s3`p6Bkzq;syCJG*&oU_K<&Z>=i=0uKd4fcV9@umYFf zza%riM`?Ac7lg0rVNu)u2%Pqomn@8(N*nAd=u|?^Tg_EvXxxdI@Dktm{1Vlc-3+KN~4OROsoXlgq5%*6c z_Ko7M)rL|LBdt0TcA*SqlBd}h7e!3vLN5P|HBVeVBnqnWZu>2ylJkvzY1bl*;G2K7 zkIrfKH)I;eBwr#eyJb647m}*mw4v>9&|*On5lJa6DM2hO)sZUG+IZplQiWa)0;UGo z^PsDwy2|l%$F=I34^GZrC%P+5+Z~zA#G#9}*7>f|K0siI#32+w=2sYy+HlJF*?5wT zE^L_po#Y>?EX8ec21BCtM_gPWG9ZCj-RqLSBu%(R=6C%Wzp;=Gc zZE%VC;!RNVMVLa#6G12J5nAMAWOe!~85A%W zOrrjbN=S@Z)+~kL#|vBeKa|-FdpX)w2;~-Ajch>Hp<%Af^uM#{oQmvdHjLW8wR8U# z;X*m1g27i+FKwiUMk+lG^+s$1a20^am}M7o=b$$y@zT}gPM*2wBPuZ5vMA4p$H8A4 zoq>jRl!aP{ov8Kd|qG*ZiU8iQ)T(r>7dk=RQdYxxstypD{99qjL5rKO^UKA-; zUU^7~aQeaD~e}1 zytm5bx1B7^a?jYN@Ki>ro*Mn6Yb;(s<^G%r+5!P9m&Bx}))%af^@aeqH z3oTSqUB--oeR)sOsmF2a^3uXb7P#+uFAOl^(R>$%=*2=JNQxPd~_u={r8={@-l=z$N?2D3mzDN*em_g@%?C}_<0rXGH3a;qPrqnWi z1-udI)5HidNIv=I5{TD4Saax}OTt8NspmmEaU$VhxtI*TBJJ?{n%P#~MnKff_1j(!=%|zvRdx(}PjTEY5bzc~W}^b| zo~)Dw4kg`zE4!gOGiE19<$et9OQ{hW%Ce`d@>HAqh^|})E-Q~fv!dzD?eWd9=t|Q; z)~~O&zF6Au-RORBpCnr5);$h>83=C91^Y5|A|a2Uxa{aYBi+^PpQJH26FPZj0%WGru+D6d<=`Q88OeKGO%dgULCW!V4P&i&M|Qo1w)MFeP9!%FNM>{A2%3m}KNx)g+(@*S^Cl^F>5?)PiRw|3`NQ9< zHJ4YGzCNkMA#~&OT)JaEYU%Yhaw?HkW+dA~3}WplmgLZL?Cr#hB&`Fz{$HFE%ym9E z)0q&1qka+pHAPH>r8;u6eiF7Dq8xOU%Iwb5=CG1tFa4*|0u;HT*cSathp9^Qp|<}k z_HPhFz*t@xdsfJAWKualvgxrSLFOP^ycDLB!)}a7KnvxBtOPl#I4U-m=mA_@#i+o zC7fM2L6s3#pRCUK3P1m1IT?WIby4_AkKGmfN`^Ha)%YIfWi_0F@i+Nn&IjwjG>tIwSZ;R#tGiY zPHLz)yQnZ0AvvdDs02GyC?ZPOj;vQv5_j1AG#@{qNuk(A1!BG7_6`k&aQF+eF(umE} zq$6lZ>l*ziUlHi$e-lEf-3Op_^8-Uu(MWeuXuaKu0tP z*%bjJ8B_C6}*nO&{~S3=P#E#FNZYzZHIupc~EsElIhH>LKYCiYA(18 z)cp#$KUCdE*%rf?5JUKW4X-Ag$^xjxBm3je-XzRm-|AeWZ7mGQTLtEB;%Gi$5hu|m zwHy$6K*y!Gj6sOH6_&!YqH7b6CahT-JbcfWVS9Vh5MEGLQ1wVE!BT;~&U$fOAk@`9 zN>P#>H^i3V+adQ3qDf@P9P)FxJCKT0KQOWT9-or{6tN z2IxdBy&D3LTYJCR&8^nj|A_W|e=k{8%0!=C?ssN=%|zq;1(b2r=6nMhKtU~~`HJ@T z-;#M4S9Dw=Ey~o;-2`ipSt#CNzFlhdNJAFQHuxFXSiZAdXtODRDhZwL)W!(yWq)D1 z_~9cx^;;~(vPc~N?h+Bw5Iq`pUJzJj)IRuh2LkgLIYdAHm?YIAyswkko_7~tl_KSM z3S*7!*2#d*Jmrlh=(imDVhT@XzIAI)P?WX@)?uzT{4(|W4d=GlhC2?x{5#)Kp=49& zB68MRew>lZkNSz>cZVcN_B4T;8~4I;j1dGr^S|0isG2FGQ)8{&IW$;dhOS#qCj*98-8kVH@n@M9AsBR{-k>`R| z&)PKD8<>uPiN`*jRkHjj%N;i>_Mam}sa)>+JQE1ExxDq2X;Ncul)==UXv%E|<_0i| zCLz0P%oF{ikTx+HXPx;4D99mxZY>vg^p;_DyGAY%)yTHN0%Uyn{+GAB+#+d=m5)7d zOHGJZz@BbBQzc%GZGk_62%<#GEQ_R3A3EZ5NRfl3-rw1Jmeax7zad8XqD6S;i-5B- zPNXRM-O^SX5qUW#QN5#S6l$k4w}9%ZqKMlipvvj7`R#19ow- zw}Ap=_oNekb>W?+!CD3Rdb>3&0jS3%G2;O&6^lrrljm%WBT5WM^kK|;FZvX@hGvoEmk_qE!1gkonqKJ6R_i`=@;Q9r3gCv65j!e6{ z9bKgFpzhL$Vxrx3Q(b976G();KbMB;0r4IWZr=ROY|TQ-D_TP03#PTlSoC7eTg9C+ znWKnHgt(8*ir1`qvB?2;@$BFP>34xBQsZ*<{^i!u73A$%vi&Xlq6jTa{RUZEr+Q(5 zs#T6ceM&Okz;3Ur42HW>lr{fVicOT0-p$D~nk+W(;16hM)V@Y1$kUWchZp$OEB<97 zfk|?^7buWW=hy0k-a%BrD4cRizmNA;;^Q|~z7F+(#=RL04!o+EZ$OpG)c<0(3`!Tu z5z*>mh1UPh!%`}764Hakx+fDp10!bdblDI!S#mNCuNbqFQgfm(pGA+|12xosT`$CS z+#2x4z&FGER_?nMd9{uaV>N#b-5}3L*g9{>KL((UMA-^LLU)W9>N1}d-O$uxTxYPrZE?T@@WlymxuxMI~i&t&(V*6N12{vv6b_&{euoe&TI9cNO~(_ z^%{9~U7ujGdB0|quW=r8Fs91`lg~>hZw$EeA=d7}Rs*(h%I+AVHiaO|5bnW$8_S{T zup(2d$!j*+KAqXY2VsTa9C!y8<~j}UKq8auH;rG-ZG<6Lgi}+CAX%Pin!RLRJr~-c zKSud3g&d1~W*~4f|7%YDa(57We(HlGyJ4T#QedF?L<*h<|9=29K+C^bVCVLQPpJnB zH-iMV67>}f*n9|pqO{2q<634aa_y_sx%1*~(LOI~rf)ka2?M4)seAG4Jo@vpL`emn zt$>BP#tAQsWQ)wWT(`zLLt%#K?=?5btml+R-cB2kbEt2EDw=2GE3dbAP8eQl0*;Bh z<+#oFHz^G7-w49{?mCgoG2PHfP!0A!CMRuwyswJ@STOQ_oc=9D3~yF4c`FQYn;(B2 zT(}4w@<~rKHqV2%6J*&eUNM&EjJ^Fi-^wYxw7t%jLJ}c=*7r%GB1(1hImPe)a)IMh z1IzX0Ta*J0vmK*zAv)jJ^3MlB-Q?4(LF%f@s-6`%GhUd8!w*S?UBc(gYMcOD{N6=5 zz_=Ii4C^0R^e8Yb<3Arbl{G`9QZ51Wk!BI8ax=pR5;nAaE{Ib9G%v~6I#UR``OIh| zk*Gu{Z|XRJF>0*XDt6kyuHfEsC?amyo3!o6IycJ{CYZ&5Bi0+%(^6kQP0C5IU1vWc zA5P;I08OKf$BU5mzylfTmy`_8S1zTs?Xf!|9(gR2HzaAjX%a&n-)~W!8Ss-{19=!R zfr_0ywa+DmI8XG!p)UveL5Ylxo4IN4M!*rD-fA?ca7bCdIVXh+M*u9j&NasK{v1%$)hB=HIz8o||UE~URy_%5rlnA2q4!9l8OOE3fm zYUJC6nwak@eI6q@X0poL? zB{Nt8_$iMvuG>n+mU46_Zfk9N+LgB?6c}wOnv5cM@;ZAXE$xE*^9L{R1JeoAQ+F~50P{GA|*%s)lYM!aX{Vlxt(iX^C%V`%9mK)agNJ2CWFA3%J6OC=5zPWsu?pr*cFPM9s8Hv1yB0bgyLN0k4&#t=VHOMm(t?P+aQ` zy&{77^zJ9G`M#QmTKrB!sgx&o$X)>Jqk0i{&&WrnGzXD;#F0ryA22+b$ETQ?WaIl3 z==C3`5goj&EWeUiM}J}S8(0=um3+4e$I!3@Nr0Aw26-uk1C_d0Pc&}8NfUne&1s*r zBsm*&uuepbW9*v)x%-W7rPT(3EPW9A3DePlS<%h|BxMSIPIDC0H{X9sH=P5>_LR~P zj$~{fMG-xH2G}JTCAdqqech)x3@Z9@;q|A@+c!v0rXE`>J>caT#&kd5{+^c?knX6y{rr-ko!_>s5m_5~nYJ*jF__^6j9kzxK=0dx<)ZuEjY^)t7vNQrL*-Q$%{ik|9vQIR}WOb z-4H@v$m%e^2s;$tvs!CLCyGr9{zm`eLz96BcE|bZF$mvpmh3aqk!&RUl7Rpsbk9*S z{Q@q9Q3JDd1T0svd|n4t1U1_2%Lj~A#XY%lr-*-O2C`%H^_?k5$D*NLmhETqf^`vBeuJ+GanSXfEFrq{n5YX^#49-0J za!HBsP)+pX-7|P-wW#bjY3UW(wyE@-VRL@HGllMt6%C7I5Uqw@d)+}I{i^Vq)^-~g zVeLN28Mag08kqVgU1R?WO{~IFh^u&S84EPduxUb1$U;^$>Kpen1$14aY*x#@;0!ke zhqL;gDMSK6<&SBAq&|DvWey25svv4Z0r)a{CWQa7{yydnVU>#U$HiRDVJ4ww@+q^^ zy45Y#!bK$||G^QPJVyQ40L=&p${VZFxH_eQ+yA`M!~H~c?trhc2%#I{LP<{!+ zDQ|Evu-V$ty^Ltl4;Co}5R55WLvFLI_$K8XISDFzPBJr|Mxk71!z!-02FU-(HAbwiBEIyqDluVk zHp?KUTJf%oEMIP~-k{?XG8o>_r_wJC)gA>;oXnpl9(5!gw9Vu{=HWap*LN)IsdzLf zJQqIGRx>rTpt4W(rabFXkhZAnhxup~?*6CELWEUu@?syUnYrEp+9ayI9A0I3!IMRC z-hTUiz@`z>z^?rv7FvLJg}SK3P3p{?!FYu$`RK~(vO8|$JT-=@1$7h8-sxP9;>QY( z(()QLVghdWB$hYLT1b+E`gPsb0{zqG;zhPIPuGH_6^?#N7JKB!qJttPM1UZY zU{=cR&Cax7*q;W{uPMm;Ipv6C$UNg`KK)d1<%P96C_lYAb;+eSe(BMg59&U?J&=Lr zf04SOiZvTBih{Msy zcsIE);wz7HMn-&kHsHHUMVO%$l)=i~t|NV5QTP-TZVRy|RQBDLsx(#Wjl7&_pv%`T zdR9D^koac4^nfZp7d~c6H%#v09D zj_iL$s*|1muI+=I<}Rcz<4)54JL+wic=NLo2FDCR*R{!z=I#;(e0W4dcDT0;I6vn# zM)p5mq#?bY`XWwp;#0x{q`gE`($)ZmwF>E)TjUtIhg1)w5G4iHXUqnqZg0@!NL{Q@ zS$A-xjc-u=p3)nC4lb9 zI0dHXIVP{mLtwyy4eSm03(Rg_E*?Dx5#ZQgxf1yYO99qoS{Y>%jtMYjWf(n9v1(~R z91Vhjw~v~JLd=(VggbvsGY2VuFJ9`B|1;9;yV$vh8C7VHof_6psMG9fzqS~rgiDLV zgkD@}i)On$OM|8>Axzd(ahwhH_;#)8IW z9<_M7VJ_6YI;U(z>_BcJ-qA|2r$Y{8bm;Mzw%svjrQzQ!KS~WUN8T$$>|kW7QXV0c zAl&7$&=s;bp!of9G7Wl*O#iG@w+<_aga1_CCb}*W@sBvG%>ZzvT_fm~fT;6P} z!fBE!Z)C$=;i94-{O-t?#Q7v8G5bu%#m$OXvcUyd9ild2vJrK(nxm`^E2 z$dbR|`+B~?Txz7eG^2C2cH&nRej9f9@5u<9K{P>nbd#Udeb0%hFQ3TXeOF!R8U3g{Sc$bF1uU&cJFQJf11 zh~4ax4{~)qPOeU+QC|B+#)5Q)#z28ail+I@5@gol$d8;5s3<*+9RmRuf`+4CGZvXA z-yjd5aJuBTmUN7o?K@ZGy)nwbWKD}q2oU|z(F?c6Cd zVg({Jz|e*?=OGBj9zR26(0Nsq3D^Pt;0&@-h#5t5Y+-0vnt~BkfYD()w@O~1ra!B4 z0=rWu3O=lRMYUI@N}yQ|JbELw(`z(ZG{7sxe_z{`0p7*$=YywY&B41iTX!(~ZqXa= zQ@_RX!#$}Frj7PEAz#fvyKAuAq{EQx&9EDjdT$@>>ut4Z1SGivtss$geQ!Ll8534b zo8?%5e|I+YI#m=d(H;9DYhZRtnRWBoJPEjk4gADb+ojejWI)JmC`V>p52~X+Ccrk2 z)y`eE%7oXSwy#OxcAX66bgeWf8vCnffiQ5qX#;et4;#Ct$P)&zm`jqKKqNzI+ ztYuTolekG+*s#SL7&4F%dtip9P4_n@aj$M6;A%B@>j1Nb`Y6%svdoTRPEZt$TWcJt z>@2>Nox-&>-kzIq1y-vr0MMuKzgcP>rdLL$KP1}8sl#Q}v6<0bPU0O-2%)fq?bYoU zQuz=4JFQ`kIlt)S{X${NA-I;-Mn+_!P9{pH>V~i2G*V77FP<|)* zpkxxW!?DyY&00olny{IKzWA(%R2|N>EL+P8P0t~EO^0sdZiXJ<3+7jaG zpR?p+{x5^{E}L8H(AZk$(2NEuJ9)pd!CEF}1rSNd`*O7ASTJEuOyS7>$R2VhSP+i2 z82H%b`teeXI45%^d(GiL3%iQ80kU=|&uf>moKK-2p;CwdSW9csonJ)InkQJ|s&-cj zlttEI8EtmNdEIPXg;7ST< zlPj4bpZxd9vg@&3Ws`u6K?2A4;47VY{4x)RQy=BoH5pkK6-^8P&RvErtPU^vhjZCj zS2sfvCGs3_Yr0~12uQYe-;Cbt3xA_Nzw-KN&l$c;ecAExI*Z{RvU0`#fq!oX%AR`= zsnXXNzCT!7ILIFxCIn7Yj*TH%aGTW#O%+uG?;K1$JzugG1qcagzboAz!s`V+SanhttDrs2V$VL6iK=8Yawaj|5=5khr8Fmy@LOpV zX+?*IpjN@1mrIg4#4CmMg2bT7WuOD9O( zZS&V3@sY=hi;$Fh$NEyOu4f3BNwL`N|L$(=G(BDAXjt3(-?dl{Y-RvwI@M_F-%#u^ zwS2`Y>;GJJ5O{U=_!R{;kY_3i893hT*~;{Q=!hcXoE%S@k^Fbqkt^est9~>^BqRFT zAs||wL?=VJ{A*k=5nd;PCA|8gIXz;<$~nX^o#N>)l~jl?-ekjs(%V~*us9A;iY`7j6xt=>4SyfHHQ@(vF{$``#CM0 zaS+y>Zk2#g0rq0&lq+bQTbdPoMdj#^Myj^9+_dPVM%W z=cMBR1kTkyq+4uK&SfkWNvK}aWTUQp6Yazu05yZJ#hL{?I5Ftzj*>je-Rq^o}^YEy)@hY zc)qZ8r%H+XTbb?}nr+;}?5>V`g!(;9n_5<_p3D%ZT}SMi1j#U3#NUHqzoQ1+T)-!0 zz4yH4*>9~cJcUrvLr1xidzp;+Ldz6~KqaMsvB&mY<6O_Tr}auHfnnVAf$koI-=7GW zFZseq^;z%MLeBX#f26vV9vrD{dsW!<>^evrm%8g`-w=0vKVvwL@C#eR|H#18_G7+% z2{wq0GHU@Xh$>3cbR7cL>?DXgwXf}{2zg{O?c9M!nYe7k!Kl|Xs5?1DAoS9eN)nHn z2bjJpZ#w=`52DgLPvFM$p)rc#YIsauJ*hT><}by?6~LAvn8->mv&@^sb`Z`^ZoX`9 zI#cN?W>ua;BYcP;6&71>XB#b$61pmdg-KZ-hK5O<2{+0-=1dra|Nvu)k_d7O|`Q)JQD`_x6MxCVl zwCc+7ma((JSJc2vx%xOt0^h{`UYgme@;?8e}K#;IeR04TCXGH z`j~wPfMhJvzpOqAfSt}t^UxJZ6~<)AED{uM9(K1iItC9D2fS& zn^S~LP73ovC;WAqEfzE}u$adO&ZTT`;aT~$s1 znL~(8pZOA(KI6Pkd8~u+_w>QEaK+%+<(k=!`!G1w=r^K~2X*DQaJ zI+DGluo@xWSlCL>uQMl}L8vM_&!@)mU;TbWGowFVF2bb$Rv3(Zyq)n1Z_e+Cr=ZSO zKLcL4%Hg;j)u0t{bkr`~9Z2c+terVr81D9hbgU+U6+t|t!> z9)hd#ZSa^nOA8qj#j#F&{Qx`~YCN^AW#`dL$6btZIum0*)gwx)g%FLhknZY>gz9fm^2xA;gxOZYM&2K`-zIo6%1WQ7aNWH zEVa<7_7{~Jv$(@mx)d=;gk+Iv(q!~YNL z;c<@aw!4P!1Kg@GZeEBYjN1fF`rCd$5H$0^l)e|u;Dhw>Gv^de9A>A&loEr?3*84k zXnNf6&w2@~42YgdZ!Lntsn~lZDHtMpovKOQ7)|V|5AOvCjv+M)CK>H#UGlm_ZXfk^6~eL42}~~Tq?CwnTZJd9Gtmh+L=DTM-H?jBG@Y*p5=4RJn~z~4sR?`AEWEBt-(5vYRgBWIwOqlr`oM^?rr|8~ za#t3AUU5rPga0Uaj`Q8f&qGm0Sw5Nq+q>t*mb@v%83hyhSBADtar+ZoVLmLawia`< zPZIl3@C_L!a{+`kD2y(_j-|081Q^TzA&2nI)T7jF0tSo$Wk72h5Ib-6=PB(099IQR zKA$FI3jMZ6)jpcEs?BP!J%^@bAM&huX-gWU@I3gHYJ~ zQzANNn8vuyoB}1uuim%hsit0H7U%h-3OC_y@o(v zfA;)OU~V%-H>O|oW1x9}m%9{X#ym^YY$)CStw|HcIXwM79#1Ws(~Z5Ryl>dcP4*j( z5ac`KPT4q4g+4=n(44sMDZ)fPt;Iw3gd&;P=a|sm(Aldrqzod%J!e;9X$Q}CqEvQ=p1t#WL6A+5iuTe&WQhKT3fkxE!X6f76YeaUfy zzthN8LqP}hMyCmQ^!!t&IwXvW6X4SXZYrfw?W5^s_QGM2Wa=W%&;o6`d(#5H-jukJ zUiiQq!y{1DvLZ%Yq6rRQvGN#3#6bEG0Fd^xOrEC1R$adTGP7k(;0}h6oI@6@cdr;Z{S>>pD z?Z-d(R+_ck{Zv^8A&?x>W4%*P<+RL^pM&^E{<+ye14xc14QxJc7w|nAE)l}=_*{N2 zNPvUA1skNE{mLVyId{%jD{)nJqY?Ne?QN$FqZ`9)hrE!JBfZoY0(X$yC{kPMjgH{y z-^c=|k)Zo(iWhE|Lm`DP)aXGoyOwaY-zrW^As|KvZ*wp_F|<&aFavf zWy5(VfE;UH$V(i9)|S!7xfsI$eQ7m-nCG#qBUBL8<;QU4CO}kPGk@6L^$XPBA@~7F z{N+a3%7z12IggL@A&&5e*?_tO<{N?^Q z5>sg~etVyKV~d8FG#eJM^i*$_?*fyq%tqSui4=Kadv^NC;N+UytN%tkK*P3a(6a38 zKaK|G?sET*YX;`Z-M#-@;$M-=%YJWdbM8wC)ty1#io(LQ7##ys3Z)~{p_FQovp1UR zFuM1sch{GW#yVU=3*|(n0knUhP;@f&(;%MD$X&~dY{i{|$wD!h2h2d*J-)Qi175sP z+XcMkDo*pKYZ=#7@-{>CRb1$c;a0BC33T57CyVQSMg z*`gtsG@&uX3b1uA+$$HKeeB!^+I%z~avm&KfbkflrXA1MRxY0eChQ(-UXVGbh2Wm% zjqDL-7|uoiM~&I!G0)^r5|v@TuXhil!@@wilm*%_rpX)=d@jTPSWe^u6pLRPDQvW% zb_?vlgSYo5_zb>DbV9UZT^1OHfsZ-+0VMwOuT8CnKo?NyLCiQMKI2Sew39Vx*^Q@y zmXQseE37wc>zZLmd`R+F)zoYTUuof2ed^3?E=Gx_#Xl(d7?B`eM#bJ0ZB%GZwtn^R zU(Cd@ebU~!i35Vd*1R-^low%-uV06BB7L|hLPpJ|@Vx+oB+D)9LTt3lTkB?Yl=RNQ zB2|gw5O!IsKZsCa+w6SSboq{}S<*RmZh9Fm|!9Y6nD{YV~KjIaMyG#sR9irD2Vy@0Agq{b$GAyyZx$W9>ViN!e;3K6;8o<#D18RTq35Nt16G z(KHPx_Vk+-9F4u+cZ7(4wl2OqMiZ0qf7Kt4Ow{V{Koe*5ov3KmVSq|2ic502Jj(qt zcHZaEA$$|rkXp9zhu@8?=vwET1P>QLs}IkV@$Kqsbi*V-;7NtoEdl@Tv}d%3g%-_9 zuRl=MJR}OlrQevj%1H@;hdDw4QfAN8@(UfJFy|-2p7U+|Ln|?@vc&^5yuCvV1ozDJz{<|0m%uI%e*_pwVZ_{Yx|h4hw6=r*Qp6(gYyYzeah59f z>+vhq3k?iM^1)xu3mgW>3|P@-i2zKDqd}KO?Sndp`~m#;i%6;Vi;#2U=L;zHcD015 z6K>Wn%h_8}xHGqFyB`uT6|e`X6MY9q+~HHGh3z$0O0u9~2p=&NzMWqvWUB3rrq4>*^hb2DwxM4&$THis@t6nA2zbKfW_5gNCv4`Gb-a;*hzslUV!CpA(0R}W z-PCP5(chOo7CPMu0#Xf-vRxlzA(a%;Zv7y740>)fAI$o`#pivBt+UyVdcF6EfMM$( zRtt*}wYr_y2CzL$XBEwg(v!T0vc+^ec?vyhgmDGdXMdFXiC8)t`Om(_`pboIp_hEW z3oq!dJ$Z#&B2^QYCn^LiaFWhX95wWk=rx1`$ApYB#5)?&7?_G&gG=>?tNJ*w&8e%8Mi6PhJ)q|FdNU8Eve{fTojee)x82hbkgs{ZnLl037g%>G}P=k`d zx6EF3z&`(dX}PK59LuF^G4|$K2T|+2EW8KjZ?Wwe6MIRZ|ETX}HGzk+DcASVB=1QH zefLP58o{&A=z+Eqb; z>}vRygASgoKH)o_b=)<|W?)Q`iez<(U#ZvkqA0NX197ANRkVH_sD8M32!0C?`=x78 zsBA#vCA-QJWdy_3WTZ4vH4GJ+TS-icnlw?u&e9?bQuYWR4j#&A9FHTS8%+P&*xt&F zN}4`7Y(G40Y}^O19HLI%kI}yah+4WE^x~KeeK#+YJwatsSrnIWe+TaR@N9N<8k<7pDBJTs(t*3W;jn8uGJ8wy9?&R(WwC&!EAJeP(7W^KpIv?!V;*l zH}B$bX|Y=8iF!ND=L=I|#bA>RaEb)y#S0meq6`ST>?!ALVm7Nd5+PZW1OKXR2Zvb`QJM;@M9}}nJ%)VQ{m8$ zI90a0(M&odx9*9e&1<_na?3E?xJXy<6V1H#O;nLW|LKVnDoa`-S7wZk0w#C#jAg8+~Tsb{Nj|qE329tg-VAg@+LCxv8DNp___cB|(L(NS;cNO z71=DS1Ps3*#}UMJqhHhhB0ZadkQ9x@<6RiUM$LUG-e0%fXVOp#OFAqM9Rawf|y%voF`$zdpmdl2ZE(+{-R5AMK?!rZ!4|Q(06-p~%p&EG=6QS1-53t3doA}`4fZ|!4lC> zKh1XExy8QYNZkj)DeMeC{ z;Bp2Jzzn&vGWqndcSZ0~YvJtA`uplKI`c^tV6y{Q;_F9PP3QxZL^naN8t8>`8-av> z8*8I`=yZQak!Y7M0}s1x-_}c07@w#D;1!rkKGiuaYRd zQiL>W4+YqiC3zNHrSY<6v&Iy7N2AhP{C&&_cm>8zY`~D%6vgJ?=4Yq`Ml?q!tQl?) zX%CXT)Eua#5c1qdg!A*wIQwP{T4w2z6W-7gkCMDA+X1{7&XGY!h8SFTqGp}-vY9s* zcQ|S{ns$p39x!y~)rt-DYu92NE>y;qj#|3&bBU5omqnt(^?M_3q}S!y<1ScMJ^Z1A zYe@JP_A}O3uR%*(!(GzL(gb{Z$L(P=h%7+uv^+4EpfRI>-!e&FFj7C!M#={w_KGKJ znH@*=#lh@h;;wBnsF>|Qq4AUjSIB0GapXCL^Gt{SOro^)*Dn9~o?)i3@Z(BZm@Ao2 zEP0@@P%A%5aXc9?>Ikp#39lp-JZu}w;Jr4qh!v4JL3=$B)(Ci}1H|-L^_79*xm8mJ zN{rltwSR^kW#w~vCV_w&x6<-%YQS^L{Yrx4OOStMQC=#Y2!xis5V0XD4)m*rG9#@R z#585l9?|v){oHyI+9w0*ktep7T!>mwL_kB6G$MfJw01#!}^!6tU8ZdZdt2cjx4 zE;O!uXwfDEI*-SN#Mck@Jf&T}-EWu~TOGc8F$``rA|TtoA8=gR|KlAJ(~LTx{hZXb zhfe_DD(6-V3@yg4+ygB1Kq#;3@TH&MUSkI>!7kzJP?cSIh-R$=Riw5htiA$@cHPWU z*h>mw4vDxH`W<6E*?ZmKip`xEZQ$&OA02kd8r1pU$Dyy$Ka_;qluX7z6c;PPV?qjm zpa6S`P2q$tRF4BM?Z`Y4^3>1=L)g97EcX>&V4BcqW9%HF^Prq>cErzL2AEM-trWYq z*aJBIp}%S0kq`H{_Ob!5+~7!4)XZ#1;;iI$)m>;ZFPB-L)!iP#Dh;V3Lb-xOSE=pm5@o7T z$E-)Xu|xyDi{pGK_^#ah@vi}TD5^K2_OGf{t+|*oYJfuv77a9-r?qgrzqUFY1DZBw zyPQLz=p32SdHA!DrdT~f>~m$-EY!zD%OPyva@k)X)CaW^341r9;5Ra7lPN`nUa`MB z61k2dy#OMQSUx@f<{Q_&B-{B^9n$` zqt@e85MBK@sUH2seP_$el3*eGDZ)J+>qWuv@|=Wu{(5jt>E&nod_!vFR?PDjNPDCV z=3pyEe~p|Vucg&APU2lXH--&VsE5ih@rhAgwypMx(69Sly)k<>o`VJx4fF2C&ih7i zjhP8d_Xk^IfURmpbFyd`m#>k)?h5=bXC!3jK z8lhQd2`V^=dr3jHtwqL!nmJbf?pRTvHnxVMtC?G$ka2a;)=e@bQOWKg3CPU0hr~Io zPyaVq_o1+|jh0Gz0De%4@f=)rU6K8ZO2lz2BxfmkmAHnEXJ;<5BWvCEtlk$vI{PID ztB_bBOESJw2&vdNz?*tkBscld!A^%q$JBfRvVNeVTTnbdTM@lR&NTqBPvvTOzz>Ib ztmZd_uiZcrDndhgQSr`&Q>^~;MRScWLaixCzQ!3lER75haC|G) zo;1`V5`)VLm~qq5xtE$VbxHp&uc;)C4TBO;>R>l4*S;5Q9o}Ho)fmZ2W$s=yvEJPisQzZ_bF3zZ9$iGvPyQRz`@Ea~;VAXB*`cs=y-_jTw`oFhc z@^)C##IKN-vdsT8PjY6x2mV}CxO0krjI;`hWAsaSs!gGuxuZty+i3grd38rZ39oxk z<_itr-jsR#?&h^zhP2;0ZI?G>(OPy{zk|Y)5<$zLU)bAfiN^7v zIMUw=*7vZyRF}b<)WKys33P38;D);=5ZdFQ3c)De0b>Qe(xWTVlobb%9%w?OJI=R~ zL;C773y8>-e9hvoCr1i`kA1JbK?&D{W+??Vw`%_VOub&_7>Q8Lq}ah)!dDWf22}Ni zOofAaKt|J#x3j4`r5&n@fM*=-E14cso zxJR`)`*#p2v`!Ua_Ux?ZiW-g8Q?;f9uNq0Nw1X_#@1(xddlSPm9%>#1mgeMtehJ4K z<_+Q7LWde{oV6>Sg66&CYsGo!J~od(s2(E6J4Ykmb&{A{%k|Sy`q+?P_qdTqx0hFH zDnLyOcKSx>RAQxnYQxR2-#xa;WsXM1c}9?HlyR_FoNptqjAlc)Y@g{Nhrcj*Qr)HgRlQkrGe_yp>zKyhi8KhLYQ>1r$9{P0#3rFz6DFeh zZ1R4)Bz!{F92Hz5!z6+j%^rA!*CR4X)ya%1%n(%(hV6CQZTl?qG}_HD5OoMwpMko9 z?FdMXm~~nleTr_+ChsVjVItclEDWJ-JZ4NgLo4SRrE>6zX0YF)mlZS#uBvXro;*tS z5mE1yRQ~rnBRfK`6)ZK8Qk&CT8tc*rB$O{%-i} zKZh{(4sJ_O$a5HiOA!R$80Wd=)*BRS_-lc$A8H`gSf*aR-^#Uwqs$ zUv7MHP@2)R`FvQXbtrlMP*z0y%)*>CqeX)=r>AxUW9M6Ja}QcWqTPx@dV&TsuAsbB z2Lp(ums#>M`fO}j(~~p{;&qL`Bt!0rl$S}EiRY+;jF9d8^|ml|tK3)_6td|#b8L~< z^^-=gKcdb&o{`R}Dd7ty&#J@r$7;EoiKdssMYYQI_7s}B`w?{S#SVvGO$|YS>@K5q zqVl;Vy2E4e5+Xv#I4$Dm^o`nNc%b>~6b@s}cGL_gH%DYtFD0;JE6-3o&BrP1s#%4VE%X z|8;2U#OvQa*7SfeG!;&9ndC7Qa{Fj-^*q0?-hR$%_;-tMiK zDcX#*NRrL1*`exk$|gP%OV!53`~!el<%bg__E+H2lfGqBJt;eRzR0Vxj(~RcDu-aF z1lSMwO;zZ$<9C=PUD+$e^C+kHMvfF7j~?60C>b6@#j#G~9%cO`P$a~L3<2b&2V{SC zori3Cc!Un(e-H)H@a`5hOdAfG=9QbrfGK=;Ye$FYzMbLKUsMwIkelruQyWMdS;n^r z4y5h*6R>UrK7KX&>#E@c@V- z^_Y+rey^<{=~fFs)7NA>oWjX0?en!9ueM7L|JDonKr5Q@8xNNQba z{JU!GD{qe>_0R_RCM1k|Y;fX@{MY*?=GfMhp^ks?COhC)=(GN-&twU3{Fwm&hns36 zG13vxB)GA(d0hSX4%Q{haVfim>LpmYlum%WoWn~Z0>aGE0OLcB$zyU6irTr#?jySj zPxZXaH}U{q+|>LFxc;D!=;}~9`ecG^VZ3(-5n%lsS~18<fibE%*xe9)6snxJ1 zbiKh{0Dj8=I6UyX?$c}19U54}9E2!C6dAgpXgld%?Z`##E^PpFKMJumH~yH$Xc8cN(Ac+$r>J>b^rA=kiu&h zDu9ZH8m2xuuo4*=b`sJ3ak{O^L%p#-Og310GoX_n03ksV=bjX+KtH64KaDM2GCW#cf)Uey%SlFjy}U+_J4%d| zG84L&CTL?|fid4*JwGYw&vhT0c1zohQ&6gdPpZCUE^VqvtOXD=SLu9lkmJNg2E2~j`&9>i=e{}(K z_tYbrri;zs&e)LO!M}UJSWIL}L*}V(p-GtelKCZh4;_L^e(s`?SRsMQX7gC(Af5=_t2PMG5*PH$!Y*$ar2w3uwup;GCqdpn|Jbtz)XUnxvd1>9m^wd?<$pPzz;sW0$n^lpD zqQH4r%6(714a+OHJo|~>ws&{~&lLdfq={z(je)`ZV<~lnY;aYG3y0=6eKH0FsT~f+ zQ|~fE!4}+H3HfN#we84&K%0r#zW_Heq8!w_0_U(FRZU!6$5SLEY-wvRV8oYLfgO8R|MuMn=TnQ2rAM_+im$tLO~k5U za&ba(xI>uUWU2Ax#*!}`=(14+RFJGcbPn8L*4m&wnCq^uFe5-U)rHwaFB1+p{U$D> zyNO7fWjmz#xQ!w66jihA_yJi@q7b-o9|o)qg&2;79TyJxH?fHI3eE5K*8db z5J?VkC>36EC$+`%Wca@kNRR{lWl|Y^uOBrRbguu@Agau))G`ZtYsGX54Tofkbbb1p zv5#vl+k(`bfRdN=1*?w#vA@^^`KsK(4IlzJ zKdvW=QU#f;oRco3b;-|kBp>G$iDVy=*`E~L)blEfL5~j|cNdpqIEGMQ;|5_o3Zy8q z8`7etJ8G6(P$jfhamhmoDXNCWW3d{bXub;=j8MCS_H#uJ&r?@oIbPNv;)Y>=vH!^(N*X$!)q`sm8R9evOY4{4 z078PB8$)e-m!815&0Q)(pnCZ{9x0Y;iP`jNmPN=80hnQe+WNN>*9}kfdJxM1H$ce0 zKqW&v6qas=@A~^OlXf&5CH~<#*nFAM13&`EX*ikX48i~v3!lKtIBuJ+z~({Ojk+|v zR)TJ}1Ez&FU!fn@J~DcdFW1p--6k6P)KTE z5Cm|v5Jp#that9QMAy#-483)FEPh(K{4Pl)eWsW?)A*d;C~=ZBCT!Ux$ZtW)W~)O6Kasvkg>!#Rt& zE@0X?gi(O+S}sNUkdEx%9*d&}T?f65lp{oglKb*V?Nsc+l>m_DOATk*UfDEmB=&(X zewEAbKQnX){}E#niu0EHT|pY}MtzOQPNWz8OL5nr5%N4Z5Ioh53oj(@^kP1ddRs%rsQY3YN_N+J0!BQEam<$uO zx`R!S#8d=~roeiv&p33;@2#o#bhd3>{M9Ei#awVsF!smi;$)4uS0ocdkb+K)h15bV zG5jGM4(E8^wl`?=7;@1`HdHS1lqurZdaTHwrU6HTP(7a%I!UG4MH3B?L)Fnz1<^yRgnRz!(pwOX-K5ZB`oqr>&S z{qbOoBATMr#Mxhv^DvqJ%bgc<^b6IMcKt%SVid3IwF(CXe~bAtPP-gAcy!>4vJIAE z^UmndLUTUF?PL#XAzAl-_d~1w!bK=ry%a{=Jo04DVYa|JH@@xorAZ)G%3hub7xMVQ z6~jc>`B0+qL>lw7w(Uve*Eoq+zv7x|#fu;Mtt+H!NYLVM@kMWY(6d0+sGN^=ZiI9= z+A;l)U8wtX0#XuXL}S@!Z**}3l!zfDARB-IkH;`*<$-BxbVKn8hq+X;U>4=c_Rm|( zo2(Azd(A1CMW7?P3A)nyT%p&}FU>%A^^n?CW%>9`g!%~5d$$9TzzvNH%u%PHlPJNvkZ z%92s*xD`p_#FyOy9LRf7%<9U~DE=8a{+3~+?I&|w0&ssA%5531^OwNVOu!|!kdgvy zaMO8E7AC~-G{g@_buYL;`7N`6G;vLR+@X^LzWa`>!gt+5e~{Jd^b^d>EJ% z@M{$&;OsUm7ka<^yysb=ECp&mS8ubHbv8>M!lXhjfcuUiGt~vlE^ucB7Ng+NU2g$bbb+&XB0#ELWuCQ48?P^WP4~ z7UX;=dn+dU6w*EBDtvb$?_%Ps^X&U8qZ~iwJh4#&tn-n&oQphghrnQE`Y8i;ruftk zxh$f@2?or?=Cju3v=Qmd1O+uPHl$sg_h$sX-lHaxW5=P@;y(&sWbkJsD!Ma~+9547=BPX&}79%jm&y5DdDwA8H zpSmw^|ChcqF`2wv5_HU~(thA6=5@)2FnJLGsF~nvZLH&PheeKAVM4(x2q0buxsnfo`r_}JB%^pb}c1bQke+_~L zW4E%Nc*8p=#HXKsdeKBtH)lv~*XM`y7v2r|wY+MLtco6|)p&$mmI+aA!(7gRarf)} zumOqlF%*81tSB)1liRlfh|OI%j;*D6>t$dLkP9gBifzD=#u34r?U#A1td%9q&m!-< zY-wExu~5Zh_sxs8OSECy>iXMSF=_5U)hYqn_hnHe$?A4~!RH$pgem;V2sy!X_-zWc z`-iOyALi)RO3vH{2A$`kqP(vBRT-uFN@96${0!i<%|Hc+Hd>y#y2LiZy=i ztgTb1Lgxp;d;5N#0`px@s6{M&h=d;1zZ=NV)_G@lZgXbW%T}X@0Y$R5JuVE3qi;16 z*o{P6Ibx#RPWTu(ODAT(yVZ2%x0))XS89|0Ff_qxR|t}uzlMYcltkdz;o-L>Y;Jhl zAnIH^N&24KjDxP$>J(t~s=~1a*rn4oQ1+#uNE0tu(n4LEX2dzmJU_hUkxV-l>mK4^F~v9+?ZrBDcn~qM zLt511;DzCYbkMly$nMT#C}tH453y8H4-U~p)EL8@pz2DYqQ&mq2?x_@9$;=;jzSY8 zNsQKo+{I@y>at=9;%#Wja}W5y$Um=0F#EW< zY~$oNTA{GFsek?XHKqCV+F}e??QP{g3T?C(u&*F$!ey!~y}{*&nT5PcdIh55XZ;A# zeY9Zb_;UgBSxVp;x8NVn=-|Sn&=ilMONi)t3yKIrKwFBHZgt#j(GhER4d$B~9|VZx zIrv&Mu@17{0$rkoq-$Au0o>8?QV2boTxyS<$$lMQMN!qw+nRmRGu2yjAF(z-Sd>VG zfC1pTYrRboa4E1;P9i%b2SP#C%rTXrjdiYqZ$!GyU6CQey}>Er?*19oo+>DTE`&bs z9+}x}@Q`iS{o5kO5)J8Sf9_R}y#0ko3k_5#rnL)fmWG--kki{az9~i@H#v=GTY?U; zU^@02{%KO@T~8Se#@c_gy72jqp#$_goiL1$n01{X?UkA!--v9zedy%Jp)R-0H^X16 z-<~$dEe)#WO>QV}SvFcC4;s=4qO{-xD-mD?;@^Bboz2BSJR1HKkdrM7(I)4uT*KR!YxU8hljj2l)AkqQJA9@dc^ z#&0I}WgDXhiB*8$CxuHKJb->d(MTm!B*)&6DpN-qXo5z2)8{Wnjz;31Eb11@hp4Zs zC3pk*#d`7C5i~vBW&4U(SV1+N)$sCYybJs&KiU3mzg~}q(%GEeEsG${@!%Ij&&e zLa+)HC0TmH^p$tf>v_$5GG(h9?)*=XnyCoy&9Y;-N2Pxvc6JKI$jMr4jF?}dha9Ii zE{x1GUZ=ClK$|bjRUT9+R{?dT%rf_gNB5_*1_)*q47}T=(m*~^DZ~=bO@u=NRw1S$ zLgm=u)~Lqg%iy&weYn)--io`IH*H;Ubxg?Lc?7a!MssW{)t|XBV$qAN5eSmQ-6qGd zF*hZ{jX5_(bqF5&(8se%WTMW3PB0kt#I@v=<^s%xKhp)TR+ppKfKZ(e`cWEKfBpPh z$)Ptq5Xj2)@iP9R>FZjUX31JUiK*J?7wrPK0bTK%|=^H1OuvLM@7gjOu8lbZY?ycOYS~@;Snf8tx%e9|Y=d)*AVv zewRW!QztBSwfwA(Xplmy2?aD=)7N~u4g4b{9v z{W59~2=O1f*(#wYHco^976oI*Qa_Gx?wkVYyM7>n zhQM;mkM3MnKPJ^eL`*IBVp;$G-Xh7B2Kcbb{Iwqd6xVjX zK2BS$@t7d%{G|N`a^_)dskbh>0RvyO80Z@dt+1hnek#czGa^ z2mkZ~&YGnkvfjNn2ZJhItda2kDxYV%@_Q;-3+QqHX)BC)K>m1Nc{^O5m2yM7Q&zDX zfSdW3wzwg{7z6MOKA5sha1%(}5e3Tj%* zPR+LX)bItN;8|eZJ+@_us&9xKLA!gs0t5FQ%s3AhMs<&stPeoC7;5+7+^B`0{FtVR zFeZklyF9#{Xr^q5MQG7lmmz3I+TJ`WR`T1zAT)IwgJtR4aFa=8!}^(q^AMt}B)}?LB>dqLU#d*)k&5^*z%ZMx6ekiE&q$AW`1Xyrcu~+UpBMzb0aZCXZVt z$i!9V_1Ew#4!wXw_#!lQ_bcK05a1Av0;<%)H4`~j(snz+FH{zll(}Nl0uo)CC7Jdg zQql`uqV0URxP8d@pbC}?pvlrINW_ACN4}tpQUDzs)@s#6HlIPKYAzr}W4g5qLpI2J zlSW771zwuke1#$BA3NuGKv@#x_KgiTNYkTa)6gFPSBY@T4oN%e(`++0-+|>Aa=$~S zmG-y1iJH023D)yM5{sqUhxTRQ(^r!_FW!}FFk&;H-!C~B-jsI<<8c!EK zpSL(etw(EMq?)EkPoVdSm`kYKJaRv=FYD9funOB zVqjko#`k!V{4h9wQfoE_F64&>nFTqzSxqZY9_9uqFqKvf0R|NcU$^w&peRE9JhRx- z#KMa8i)DB1{g&RSA}`BrcTKtk51kIvO0Ie>#Sd5b?-f}6XxD^(DS=qPW<5jCbhVH` zSq>-`pE3Ngm5v0D=&1$u@!ZBT_^B`FkG64)3KIns=2EWkaUcn?jlW%~gV7TF z|2MN0ePeo}5j5%=ex?v46sZ&ACxjv8C=}oc8{;;7%j!nQ z45iQ^WTi)mwCXqyT^wb9$f}Eb_0RRjI!V36ga}JoB(6>;E*8JoCE6my=LPxZ^aLA{ z?KaLe(Kh}o+&i1;wF`fVjk-9%g94`Jk~Y6C+&SY{EeWzIcs9~y%w)w9rKDsIgIB_f zHV-0OagrAinQFM2#q55AvOf=HVlf}DkiXPw@pz#Q!HXWLk@yO)Ae>!}e)g1Qdw|G8 zFss0ou-t@}a~)vRus+`bue9=3{Fw<3RJPugWJ6~Wo66?}(XyZOBHn+V$v)WGI+N|n zAek(U-A7dQ0QkDJd%3{AATXEAsNaR!AZomih}lQw5Dpgf2Cy8~y}Bkk4x7MPwVY{p z*T-~uy_Kv-+D|WUJ-^frk*Ye#PDm4ZLuP@N9utsjL!UwV8=p9G-;mOV7)YyOgK!m` z#^D9fF1Bn(|HX1LIu)KL0@J~C7=T;h)2;vwx zEcB5v=OX@m4JVYjz1-Fry*U^H5lH3(AcL&`FB#A8Ttsy6RRRir5Bp?pr=B=?tu;Fq ziEon^EgJ99MjaplXVzSm) z{qt%GqPCs;7!%)$0!h810VFFH@+}UN5Hl*c>q^(x9Gv>6ju&=Pgqz>P)0`y-vp2Ah;y z(4#~)xfP{seB-(0*I`+-842sjQY*~lc|RiO)2IIA7l?an9SN0fBa3#B&qc;fY)0`J zc3FD{Iidpw*eBbjW^g%Uq8X&`v6C_WLjnj6RDH9EsV#95et`v%4u*^I_4 za8dqrOGw%1s?YWA+rEvRI(dZD7JlLdO?qQ6y#Qp1`kA^6^@ynaBe6`}3NrgT@TjZX&a|&nZ!;lEQ@Gk2 ziBoCZ^PyzB3-f~KIWm%LWgXa51YFM9U>PC5_goEZVvt&;H+ufrAO7dEdAM7DQ$h4l z7uC5JEmY?(!kaE*8I){Rx-jzHMQ=l=+%_C&0IWQ1p}Ex0@a0@w5L?^@@-au`5mYS} zy+`fnk+-ET=a8yPOEs{r4s zLvc2@_Q17ijL_0mg+UvN2W`6uLgaY=Yp*YtQlWSpjp%%oV3@THg&yyXAHbq)dtIU$rkfnycUVVeeO9#$d<0kqZ90e9wKzi=YR68;Nc?>04k zLV8D;dHG}PHeN)^9APOqgtLJn0&J3f&hzM*HSzlNN3JLTY|hqKLAIPTidN;nF>YQh zR{&nlvdgd?u>r6na7Oz9KgZ~$W)_i(amrF;FkLfOuNojYfk1j@t_Nijmt4HiU0v=QF~Z1;+yj%Or{H}0LwN<5dhMDu#Q_ruIU!!fV2V`6(i)BRNMQYFAwk&W zm_p*?Q;6|(10}J@TpQvemjxQll+^M|wK8G~s?N^sRBz{rO2*PP5+~2lTp)Yy_xUSW z!x4L_8rA68(l|QlF{VS_B&6A4EMzs`K`+8t;^pDrYhhv10Rm?P)NKWn{my&7f=l+% z>;9vf1CyRS;5ewm+8ZrBO$apY>GvfmeLJMS2r2B=qBdmR zG{VuqpQ=|)0FG->5mDr3LLl_^6O3Vv#8If{flbyWsPJI+w9caw&$BgWq6oe***#K} z-T%US<*Y*J1@5)F*muif?5_-QV>FV`;kaLq$jSDxKK{|3_RL=QH>vsfsrMf%d|Ect z#%XhrSr&(Kgw=!0=_Sb@mI}k3P;Y|29CLP16+TaMCZYKQD|s^|w7Pr|iF~f&A?n$a zf0R>o_~5j|nO`Bu+ao9O4c+x!o5Rza=J@eM%gFi`(nsVVmyBE6lC4esfm0t`d5;$a z$vWqA46HC+k8Fhu2P9y3T!D5d&d>Qomard5VBNx#Yh znk<2o#6AG(a;OHHwp+K6s3l>ux zTG)qwPO=x1@|mMUco~xn@+EzBvAljm?vbZix*|zeO$TX1D@M0*^z=i{ZWJc^wtUTs z#HaD3Ff%z1#P;$+N2m&_K_C~`Y?l_v2$vTw&<1VF`2S)Td|jK?T6|3mH$;ywqnqlG z_z{uPyEucI9m^~DSnQ@w)OEMDjBJ61YD_Zxnh&wVx$^!~A&y*AgIC~w0s+j_?n-)x z8MP~z^n27)`t%ph^SnHkvu&&|dDz2G$m7O^fRDZoT^35?1sY%f0DUwiK>zFgf4|BN zjQkdGvK)jSJBOMHj~~T^9aLPT4UnlSXXq4F){eVS7Fl>eE0H$f5nU5-lq1V{K9Nas zk(VTh2NIT-8JRA)04su;v29TfB*p%mZ9>D@4s*Ht#H1(9y-}3KQ3r#(tUSV*1ZeS1 z*cuFX%j>RI{2XG9b!*Y0$j3%ya6V5C;s74+%Bk%K-r|L*`;*?U+B>RM%~JmsSUp=| zW3&{rDLF6bP=_WJZ{=yb%gQqV{C<~_l}ziRna~b$X6OK+2niLE zSfI!WE69YPr$pYlj`A#nw}O-pQv6}x>qHX-m#w3hdg+S80HM$S@*ViacwQ;E|N9(E|NdBCwrJ3PC1Sf_Ai*1ubSD;AD4Lh>HPG zNYQGQofsYTSapcAwONHF1l2C!EY1y(mq>Q6iB8K+WHlAxfA|z1M=2v>o}WTqjFyZ( zr8+vcd^FFitx09l*XFtVa0EuxA!PL5F|?*Rtd>hf%HP0?G>WJdR*D)L1gE2#eC zA^PBO>%)Lga7jN>3swniEaoDkP`xi=Kq3{BtR8m;i=wtZCB#113$im|9FrJ};v2f} z_0E6q@d08}awL`Z1O&zFeq1s356TzXq*BWad+20K{snaXo{3e25G*Vci^H`Gs$oOu?f)c%I9NEcNy{=iX*4_8)kz|VG4^A>m zG+NrRH7#}p-T+~eA7D}))q$y|=yArt~~t>xCD zbiS@Y6fs2DiYwJ2hxVXdC>g+@RYVOKC~=@xtR2R_-*Atw?~ywtuvO>Ni{8&5K)z|% z%Fr64XHig}-^`dJFP6fJYLiP}=e7sZ{GEumv^}FKZ;!o&epcB>X;QT7Fagt^^>Q%7 zk=KKobyz*fCTmmqe91Cv-YjyFg`+7OXaTI?M91UK7KQ3K!wOh80OD%)Ecp1+n)=M@Y}anUod;aUb{ zGJj^DwX@n)tnNaWn=rjmIXSPM(V7;K?2yxY@IrttIL@m0qDumN6V~H{|8G(;8UwP1 z)Bpsu;U^HD4C>c*+QRk|*7^s2l;9o zh0_1f1ht)0KW@KGUi&Q6SsOmxP^r-P76_Cv2EwbNFOO-=^#Fwt*y8I;1i?kng?x%2 ziJ=RhdpFJS|0j@|<&U$Ems4LKW%CO#%er1QOr7b#JXln3;W_j~!#fRaLCS3eQE&SI zG@b@xm=h$O|6rLf+@)u>LtRpbEs(Sk(t&*P6zpK_k-mkG|aXBaPkd zC4^2Pa_07=&JGoj|0$sUsnuz{AK_C^;9Gq$@~S7%n(C8@#(AF`2&lC;w9+g3p7jJY z`KCIl_n1X>mKec?xEQ6jPj3TqVk zSu9Z;J(BP-3;|VGkbsP1A8iV$lV_JKeJn7=#K*q$Dx_*N9Czsq;B36)qKt8qr2%N8 zFfyPFREe8}OMPN8Onyqu#;r1R<1fGIvpN{_wE9GnePu=%h>2p!|5Yqw!0~nQn+N*{!eTvt;#yjB}K0rpRP^#rKM1C`L$-2zvH2Kp$2)|xQT@VOKaa8U=(FldX5<5 zy~w4?Ig}NS&)?M(i@y;j@5ljM3^L8A*j6plHTOZLikNrhVz zBx|n|i~hT9SxiRtyDI>i{>vW8ZM zSPreLuob2ea?&&{fKy=R$_G$uq)kS1d`-D+BzHPR0hSmX@#Jz-zlAzT+ zrz&B@UwPkag+Xk?g2c*DL=sf_nIp>&x&ax&PgM(LTLX2O&<(2=gnwneGCtPtz52Bg z(7*G&&%`JGuwY5gB-vymE66IuhMGp-Pf4d@6<4xqjY4N20=Si_Xytk#T!gKZf5ER9 zcfZHzhh_0uj?|Gxm)`d|h0Br0Jbq$KyH2F|W}7M@N1mnyC(7#?+S^c3$`2@S*UpvW z_zyYXMCoFDnD#PVhAc!V`8Vw2!z}H9MKNV1kON`Mc-Lamc{_TpJAn>^#w&7-L#c6> zfD=~k84U^j3aqG}po$WkM?|Z7$GH(uiWBvRyaK~iCO)Fb^}RwU-&Gix zjyb5eJ^9Y&;`~`9#Yhc`&a-y-YF)+2LI}Rxsv{&2d($r}_((uv-zfS11}%7`QeiLo z4T*nEYXq!&VrQT0R~!(PlM}>A?yb>fHDkWAzx82PzTfmxUxNNG9ho$L+|@omYE z%V|+%UnClted-6Vf=0&=uIPt)#e@M;=rnjR8@KZE0p|&Upfa!U$c{u#*`u9&XWs8# zdy3TUK%hK3r}55aB*b}TnL4BIMMPHOJz{mUB+X%TN9z>E@BhqV4KOliYFLT22UYI6;F9xT}*u zv*CaCsy_j}It8_w$)xHSfSFeapBo}PIBu2T2!TAu7czR_Z-e&@;8yQX==}}_D+Ww8_&hsJE_VK)K?i$1V2lLcU<$yuRS}hUhzbXRlAax$+ARdaa z@WaAMNL3+E6G=?ri&^pWe4}q8KHTw#CI2-&>k4+)+NW>q;Jbol{dT@@s0hQ3cvXZu zLS|6jQf5C-u$4BxpU@`t3)`8~&3*KlIAueUr4uqh{jdak0_O|Lw~aivK2z62FD|uO%(b%__YJVPY4g(h%l{%cd^(vIUa^9}>r6$Pyut0(7)6gsm zWdw=y(|5m@CpmIG=*6OIO|$Lbw-9cA0dcr#j5mQ7@}kVP@cPsaI2xS)14vrya;(BX zblIu_qakz!p^UVRTf% zB>$g$`G5mg^y=!s#2tsIAQh-Lom4qd7abAo&2zmK4M)#X5nXE!YsV#x54xSzKO_ny>X#L7&BH&>Lx4U7f~86Q!rDU&7%8Ifhh( zYOqNpvM3v*ROqP7oeg9rxH}<=nb!jd1nB8yU+duX&L_6y2Vm-0nG4Vvc)BrTk-X46 z2r~pgE!B4Ke@CGYi#v?a)m~EH4|r=nLOoc;WWyvX^vVLdBg=9EDUQ>mPq_b^4V3@w z5voIL93kGoT0Kq2TtFGfff)CG(Fw}4<;jL^>zXrB>byeWJz(e1HARGy+T@J0As^#% zS_*7}5mK$3pYm+d2#FZ&)Tl0rNoE6@x}d~h@P@W&p{V;^@Y}yzWf8?=`Fr3+o(^jp zKTzKL#|x++mV_4wk5b zj8$%vt)hb2o;Q$F$!6C;2tu3Gm%om(Ew{{1VCzvh8IRx{Q8k@*B47woJ5?wuunQk&~)%u*PFjg4h9+A`G_|uE8tw9NgO%* zwh;B#TxJ5_!-<1C=rk56aLu{4W58)rO8OK1CFf( zh};)|J^A9d!Fr!96}GK zcM{$;k9}>8fK&ZJ%6Y+<3DN?NNkb!2z$|=N477UKb?!QaK^xdux%eo-&=Y{qKp}Q> z@TX5hy%Q!lUlE(2vJnA1#BUaY{z>oyxeKR&`|w#n*%$4rnQ@k~3U}MCP?$+F2@>O| zozgA}Z}_0d7EhgU@E#y40#YH?w4^Y-dMLjNT}*-H_EUpv5`t`UM4W(zjqpoLuBk3d zapFoQGEst2OfEw+!zbEDg?gF+_+RbTm_$!<*O42er!{@q%3|wk#ydGsjYTZ=mg}#| zH<1$VuePWDl{4%sp0jl^Seco7&&`hbVyniO_%D$SsSbZ$AT?4)Emw*Bz}M&1zgn(j z`2{Xho#3n7r33!z^?;E40M~vq|1AH=#lQe%`|av{=c1pqujudBKJWD5*4Ny0mL7v= z77SBN;{%)vbWhy={O};nWmr(RhonL9eC&=31)Q6h+20|jj20)a52_`M*bZ?r`35lK zsW8a(K0^lJAOr-!YKccXDdRS78tkj)rg=RrYf}xO7}$>p%tAs?%FjjH_b}|R@rnD? zT~z$4-q~{&kP&^C8uY(BoyzQQ{?w#m#odyWEx74clQ2dP-OL%HtFO`X@p0aIWUL6@ z870_Er=&eF2IkPbpei8net0jzeK{JCU`j<{gsn^8&b^V7M+)$SmSzZPh!%Z8%Aal` zP)GKSN?u|ARyuMHwN;sKrR`<&)p!jgpd&U!V`0aQbE2e7nclYi?!AB_f^s=glA|Wj zV@8QQ(rgNNb06-p>VPh_WFeUM+)aDK2)96PWl^6yam}xt64KEyU5tk!)cIc(^u-26 z`-qPs+3{tcB>pXVxsrbpX#@$*Y6`J!$eK9tC;!!hP|;9pUqf)t%$ADs$=f~wtO#TA zw1vPO;W~gR=*P&ja2@s+XR=u>1x6G{0z4TL1s0O>e4~G9AHb8y144^nwW3Xg!_snq zwcN%9PuDyQeU4t#uFjI^8@jS`c_l64w_v5Fh%nVs?9w}d5*$>q9!)wUyCNB4weasY z-ydNF>)aQZ*ZC1XDrhErWJ3CHjYQnXa1qNeVziMN3+FQ&@p3>CBijajc=xauci*bh zH4665`VZ0$q=&%Dw5t?gAELF`I(v}u5Q<_u+iW;&mi=-A7K5oOEdWuqWuL>~%#_Is z?w=7eyUjFKLxQpuSm=gDNOfIeSC!IxvqMm>Xk~4gj z%D!+u4wf6VgU)KQR z`5#7}hGPhGxMQAw@~1P-UQ(y?W`Atz+i)KS(bH!WMfP)9(LZ}rorOVY#cY#VV!hc% z6vXit1In9!?hjFa+e;nMofgWw@5P2GoKp!JyGXlT~t%^9zu zs2>DBOPCtso{CX5U=%V@k*{qhmxJO*by$wu>!PKuowZyQ0(4owsE~93#>B5QTmvbV zLF1nFK}3Z~aPfbWA&%MHgGq6p+iXL0xc(OtXV!C)xbyL=X0Uw}+N<|EA-D9PBwmaZN>R2yKJs#b1OuEzN! zWl|tZ~q-$GksyGBSqA9>M*y7)sS!z47yW z%R{YsMusy}Z$yJA_BIARdQFWM!S@}c63QR&PP1=%nP%Apn!y3IUe1x{|Ig4;KNa?7 zfAieNqI1CfK&DL6*-rNd_ZL(awE)ymxo2 zSL#tL&7_OhQU5Kn=W1O+gJvrJlzp#4`NKQ4eJthywa2VqItPfiV^EL;Rd=28ADe4k z08x_~rj}OX-%E$3Na$j`nJ9M)`|Mi-&Khff{Zzly$ue+9~@;K{o#EtFv1(Y zYT**uU4YnpVc+yQKTZjHZuHauW82Z+q|`0Mfg`IDzh6>g(xk-n10BX9H~!HZ0~ZlR z&hrTT*;t>11ngp;O+lWqDXs9lUV0RTeS@6$cHMsCE$6vlc-fGE#_K6egTWV(xzEbQ#f!bcALg$!h!|^jI~?5%ncxE z;)A}Es@dGBc=^K(4x(^L2}d8R_HkRH0a+QPsP={8^$GwaRM|W9Eo3O?+KX~m2s59}U?{C~e#zAqE!eYF_Fu(QQ2LS}!BqRo!ppp`1| zL3m5of0cVSe}f|A8P6qzR$QUIJ5Jt%52V7<45u5s_T( z&<=$z#L4ZuOLga7!BT_GR#)~ZeyFoihaZ-X9Qnhz2Ww;wm@LcuJcxkO?o?EK{d?$V zz2XwbY8-j3QQp-^dO+~@-UA%&1Mf^UVRXW(Jc8X--A95fWR03pjgmUzL(7UQ&y*_Ju>mavtA`MX=?djc z)uh+q`#d}K^!0VciOxW$ znV(e|`c@<|ObvY?gP z6E-r$-i7N|Mpk$;j8(gk*w+W0dKds~F)f{rx;c7+ia+Kp25ssPYo}JXcZ|_N-I6w< zicd$;<~;<1*8{CAmw4kWo>z4=E(W4*wrqlX^PR0gOzQLj-F@eqRAox&h{=!?f|vgZ zlo|L-rJ21QlTiH_`P}a$u_tz{%Fz>5oh#&%z^xzxtrLdVh5sq@={u)|cO{1w zgj&j0VX6G8SUh>GI0f{M{qd8=zU_cVpdqxik?m!-5zjpl$bJPgzip>NEFpF!b6U=? z6HC6hG44F!qrSk09_s1F`JsN0(hIYXN($6Y(VH5uknRk41WU|@&FX8e+0yhYuGK5W zMP}l7>OFSF9v<&Eo|#3u_~JivCe)r@OuZHl7(+!0%Td$Y&a*xL)-4zwx3ZNperkhC zXoEL$eYci-KLnhU-bH5$PDmNn_P zOy{i~S+q~+p%LZlRwgFfr3t%WaF0AV_H!wqT4XVQS4Zdbt1T?({drD)Y-)36DeNz& z@8)m)b!X%BSs3~lP~~or_<7ZOyZU8}W-wqIs&~TwOJUnYUSd{Uy%xfmXi47AI1R5q zQR6L0`!NkBp-xUHCUR;*0hzd)y9H;ZZXWpn+%$IPQc1GAZTB^?i=AnMnjZg%WPj|z zr_;+6N-ajyv<1x_@Gs)MH@_Hk^TsEApGyMsUv?3f>^Lg8b9Du||L*@0uj%#Za1&Cf zW_r$;X=3)__DZ0_ovP@k!hUf?Pgj_!TaUZ2X)cRMM$&K{oIJt4>M5y2pD)mWtzB;t zek6oU{-x#@x36Nw7_%aws#@Z|^4Cu$ys#UeYWzE3?ZD!40RgXpwa|$bN;N5U{o8P^ z`{5Zu#cQoEq$E`wnO~RM?BP=Gt9)lqjsOL|rk~K8B2fc4gm{xbOh(!;Hgp*bb*q7i zU*IU;;IvDXc#s&JZra2kx78jpEqset+!R#Tk59HNwW>0Y6Ao{6f}w2Azo@@)4ZVX6 zivPLbRxsxeo8{skRfwk`g%fQ+9%a_%L{YPxFIyBLEO0iz9V8XrNRreIBH@?#b+Y1`qRF(RY|>&#vd|Mlr@SCiFkS(=!}vYfDx z2xw^xuISSxX60Y+nVJKxvG=upqTZSa8>RF#YYdjV0o#J0$2F`w_ve*l+U)aiGJ1Ow z?}JPKCJ=v8Kp7nk9cf=_UXgIajBEfvve+5G(<$}ZMK?T~^TfS{EVu{VuV~j zn01_H*4T-3opo51&D!?wMW=Lkr+^}zi%#k8mPT62MK=P{ASK-$qS7U$l$3Nxmq^2R zvoUudIB@Nlr@`Xen#xvP(f_beKQOMJ*3_{G^r{1N6a=OlE?BU&o@ose&|$^H$?fE#wYz@uSsUv^ElW~6`gRhr^u69P>oS;oeW;y;WoUcm7dBLKaYl)(Q` z!Nh;FD_oB zl^i&*)5nOZhm3`N)*LcPlbKS4;$&**GJ=*hEK zt>(;EPV@TAEwMBf60OnV`}VhU*ugu|@9l$KidnF0a#0Ros&m0S&N>*)*6kIiW3_-D z9J*Z$y6QbU>KHAK`2Ev>X*Ojyw1IJM(i+U#f*A_@P>(~Fc*U=xr*bB5BF~Z|W6;}7 zR|Y3e5h_V})Vx{CW!gl!B7Iirj-v)PPz8j@NVjN}e~8d-b2iq&KfAy1b@e-M)6o=n zxRta6qz87em(B_Iasi{I&~m<_xp z)Ot!lB!7Szi5jFg-&6OBMJ$~ z*hCX-d>5@*6iNrdM9rO>p;p>ccabk{6^n556jfCjA!%N;l$P0!uY@E~XA z<+&Se{tD|aaI!2rx$f@pTMrPfZ412<}ZX-lSbHsDoM|Qx%bBPNk*63=qOWjB~s1DTr z@+*;QIwODdbPnv`X;<~hQkGrX-Td$J+Kcb%Q|P}oOq>Z`3q$R$Wa=T(!X+KI7zY+HA>AchHs6*76T{$lNFvpYSW&8<-S7Q6=2sBqKiWXs& zuEtm_7NJ$b9RRZC;fsL&@^f>GQ`=>+JY_`#*JW|zfn~F! z7|I2r)|7*e{h8g;&nmR)PsY&0eXN_B0 zZ)<#)*6ciQH@2-2z?(3~mrk=20fI}D)U)B`0(+x|;qZi#wWA-^N8?;ZqACTdD*R^e z-gIqaSJA}MITWYdy|EP|fyJf{M;pm>zB|Fl)nx@ZyblukgvwNN_b(0XDLqBYC1YGS zFsHtXIeClQ@3Dz~x3XnXe(@q^Y_r+44i4k?Zh$fN%f;|pzJRG?@~DIR+LjLWmM+?J z_*`oZ!*T6>p8JY2Ij?t6d6!(D(BL1hPXesP<6YW~2b3nF(r#?l%&$hWyGAs=1+2b| zrDNDT96vVR-=?Ea?z&zcP1{_X3Be+K4#x)H!+*t>#9HIzLwcn@?fd-t95H2KW%ccO z+(yFV7wR0{0aw=&3!BkMyK`D(bXX8!1vl169-)Q%pAG!3-PYw^Xk$;Z)Fm#62;WAy zGY1d){pK~#KT^dBL>f|ERn)fH78?`N+sv^Y$+nkO=5g2dbKxx>+&+&g^Zyygjx|i* zwY9gbchWkyavicHcfW!_gsr0fvTvN>G|;ajS*JE|i?g^&YIVYA>7!7I`7gQ{jte-b zW@cCDegh0XIY^=n|GoECuJA7E-hx9e@uc&7CY~)r+TE0<9C))%iOJt%-BlB zAx;Q|bbJPj|H}%z@kt$FX$5C4S&6VjGCe-I`|0_ZZ4BN>TW@L66ON}*y7sL>gr+L< zs^X8@xB5O6x608XJo0Yo!O7G5N^bz?#^N2(B52dPOC%cJxX0T3rqLlxF{x33dx+}p zjM!fF7Mkrov~gAX%64Pmpn=zBx?y(<5ABvvXj`h*lA7a`TwLzWs&lDfE1N*cOQEDB zMS7!0qIoZg^Pgj6!{^YogdvFWo>U#>>vgw^(4${=V5(`K3uVaPnDV1leNKHwkjgD- zizbiD!^?%pfXOkUR(u@Gs`t7Rb2%DHK7bm0CZ!pi`*D-F$skjaIPydko-8HanAEw2 zC(C82J#)3W3x|wdO<#hoOJt~Yaq1$B+qkD|%&50$QyC`U(IU=D%)FwQw=`I1|1N?! z&!_vD{?&Su0P3}EKpNV%=BjaOzSPzaV$r+U3)h!JJR8`E#n{f7R~sxVsLr@Q(j4?L z=#*^U3}kj9C&=dAKiv;hC8F6Oer{J%oayVY`TRW3JXMEJ$srZ~G*SPB97C;t{|l$< zB;@Dl^7zatf>%H~erI#iN2Eg9uO3a+TaL};?r8z#I`&T-HNGM{95NukD)(i4*;mI9 zinX;IrbuTu1hLBw6zx)0ted?WIA zk>BzqsH;ikbzW%A6o|Djv9(q zK3)v*hq5BeW2`uyX0I_6I%eRQW_q)vwR+I?`|{@mLshRNQt zb47=%lbWZU+)O$>1)1!=ky_8ZW9HiGHj$C2W_-{Z#qK6kAHz_J_s`?3sLutH-AF!a-oz} z5Sp`e2ZBoXK$Y!_&!(>mBrNNg*t97Gd-Xn9so001ZTn4HO;f2YQaG?A@pj&Sb%vL? zc&~mEx6793yFL?lL1lHgJStL?Bc<>OPQ`j5+@*~W(Z9n_xmFfKni^K#iuOZ4#`87j zJC3>?hI^L*%8)m86{&J>mEMwCDwRjgl{SQU<0{_MgIDq^jj_A}*oIuIyVACvA(7p!@9~b~>D$t-df} zIZLYPGvkTWO_$S2#Fg=`76(z2icXG}iCMq;#m=$%MZoiK?2$dXS~tSUsYqo6VSb;2OE-FQ+htxQpi)>_eY3+-zoB0brD zA>Tp^@V$%vKlFn9XD@YQrhcYOqI8${%H`|G`B|_aFOJfv9B!26C{fq>s$W5BUFI^v zPIKdl-^w{-dnW#{8$z}d+msy#HUw;r=cY-g&iZ8@eQ|p%pQXSa2Y*|CdW()4a)T|V zZ`_bWoGtQ|Fu+Fqp18Mv?Lw^Df+#Aq4~zeU;Tc^Wt;)_dtOVJ+p$Tc0D~bgG5E`Kw zD3uX8Hz7!mOFj{KW#^AApol4C)h`y0gi81MhL&c>sLzri-aom2)35V9sY$KeIdILi zgei+8e@FpuDC~ov&xQ`s>u>gQnPK3E+5_e)Z^$yTj>|3{t4in2qd4f!D!PU+ zS!}2V;`0hC&}f7*ZIr%fDt>-~jOL82o=tpUP#8TYWQR2^zRK8f)gQcHXnPS~>F*6i z3cL;CaSAASOIPzkg7M}iZ8zpop?#tw?~8*+zkUk7?irKC;673%EHy!VLjE{b?)+92 zoE)h;3mGI8-c#|-CL>0_K4eq#Lr=2}fa5Wo-Y=;4dFH?1&%fOUkxV2}7W?eG<^c(i zvF2RHtxf#-qhfQN!)t*8*_IABVtlk?2!7FplhLH&q&M`m^`!TPtXP^i7&gp~?fu4i zdLerug}=nO?-w&3{66jWM_s{i{GQzSE8B929#XmbU0$0gyyWj!s%)*B3uVWr$^Bd6 z0#rdK`b8uG+{nVNsJO4&MOkz(0#h>ITa=J-zfGOrAI&Z2R9+a9D);>sSc;$c{`nJP zbi!_fxB`-*vqhX3@F(WQD-<=qviL(8Qkzx=)t?^N5BOr1nwi{5Q+Lp92&mnheL-i{ zCVSuI9=8mv?-9eS79mTseEJ)3AAYtWSg#(;__&Fqt9KAv#}vTwm^hF{JI{A0c7Kgw ziqZx-=g5vWv}S(tSq>NPm?NLt533v{Jf+PsiQU{%KV*=+cx;@NbqZ|l3ajXcLBG{PZ{lY2SBP@9KrT*F0R~URe zdC0KzMAH!sCUfYG7y5?CNhDD znC_%2BJ^OsWpICMl;z#K(80~6R4Qw&pC8*b7Ul<=gz|{`3T{I!2DeJne;m~{74efM z3gD@Vy_T!XGa3!=2x18t5qnJaHH345!yT`$5+^3*j4y3``xP|s3wmr@l7yvcNQ`AHy_;&MLJ z#gEYUO zOLTy>F$ZfS^H3YcqigxQ)%x#-2~)yOVq7}UMZM`~SSf#Bh;-B6JkqAyWfSx#oW5PO zQwWbfj$xf{gG;)Dw>{V#UQ|oLgh&v4F#U+4!OWvI($ir2+f^^uO#1?+F>&5z_yl~) zQ}8LVa))@8M51);;Cl`L03HB%WWMTehL(B*EAEm&2FqDDN6~3hS`GAj?JGnVAyDNF z%^)e|frI<@Gz~}WCIoKjH-$ePyoJ2Z^%qnEQt1ztl(MbD`N%xn*r#ng6|WJ$uM8X^ z%jLf8wh=V7)*obTWvzuEE{o6hbzLkqNl>Dhim}_O2nW2g8ZMIXjiwE!XgAlP4axB1 zj(;uu=tG4SK`ETcGe!&NJn-3^&}$`_6%{2;E4@1<&;e1U z@1V2@KSo(raaClKCF#XkMjXp8ByN%em0$<6V1i1lTqD~`jnDLTSpZyJ3IiB~USLv* zsE@F7?XY(rEi%^W&Y;`Q~#Q81PDP zP8{$Y{RWnXLb3&hOXBYFf-&BC6edz3+k^FjJi)&tV0-#3BG!=|1|UZOey&=5DLHP< ziVAsnj0DKvAy70n7FynwK>amF&_ob4+55*N-W33lt|<8`#<+)CfHWB5?`CQ>Ok-ZfSB%$br?uK`b-$6bU6R#YfodK|wjc(mexO;~6Yy&p0FF~XK2$@!OtLWSY{PW) z!^MH~8D*oM5K5^MVsxJG_(q^M4t9#;F%L0vM?wuBe&jpX^~(?~!fn zLv}{r`QXBBh}NC$RPWf1JW!&CW(bwUio=?k8kC9v1QihP!z=+0xYP?nM_d5xc!<<8 zSPrBq$$rd-RtMYNM=b!urvMF8INaqpjZ@hBZ<9&xemnqZhN1p;!I31l-lXR!J0QRP=?@L#hU55J=Pj2s!Ly`H^5!E9 zbO4DeVt@`3un@ux1L&#=@^$yZhV*7n4MRTcj3kc#D&*Ah$1fvz7Nj|r z_b;K66e#>Sg4+?<0RW1GZL|O|gEUM1k{~+PU6NM?y+{_0@9h__tC}vj*JlkiyE+4) zP#Aoo11QAHS~zp(2LR;emex~Ta*cR^&=iaG?*(9;D?# zc{6|#xc`6yY_np_f9cQl!+2Jbu>oKmhM9x_v+KSZp?$iW(G1;_=oU32jUktZprnF z9$Wxvo&!K2ZWm`>T*LbybQwX$HzcqJ~PE zAkn(i>;mB_?RPtOKVSgjcU1r)n@?s@d>yZDt64W|p`(B*F2g|qUfI|3)UCb2b3}4V zEd%x9px)sh{ejcHF_^hvtNf0&oXxP znhrv*oB=J+0~}6^=B^ z^9AkBBXIy&l1F8o%>^J~z@wmJ<19%N0+IM)-NoxELevRPQx(GKP6?5E=D1{Y1SS1k z&;eY;9Wg+M2g)^B;FkEKkP9HgXjY)yl_7U1acCGygGHl%$h4P!N~lj=$~fO%cN%v3 zkniw=N+rvOu|6E?`TU`^;={{;Z3tRze^}$7`6t;lEoPzbxpdJj*h^(TK@j3luT#yX zz%Elz3x=no1E~EMm=5qS6yDuTtL^|CEkJAuw;5^tf_knXGvTslpLj7CrJlE1*AmJWzp6%p+IxNoK5;qQ2-`~+fn10ek zUuN2e>6;dm2bwTJGn`8H|6={Ay25e4AWvCgPB z6)&0o0S#C}joyJib~;@8#l&9gz+T6&er1!Zv;zZuz+Up-d+_-`=^nXm4nJ2H0V)9ACVvAbj|WHr7@);};nfaTlr-=$_Q~!TwN5X%s*$G+9a#}`FD6As1*RUO78y~FanfIOrR3owP0<$6Mm(1gb^X2J8N)Ps;uzw z?J0JTZbcd>2Jr+qfZ~5A?60rsO5Oy(rGSVZQPiT`54Q1Y!|6RyNZ9iwO9tPR)J)9012UNxU9kJOjJY<$31qcAZ zSfOp9H(@axLt&?h6YnPUMSpGKD_9)tteoM057LL$B949NL)|&T`^Dvah2jFdY$JHY zkW>Sf<^oIa{qL^**SupwZjW6rz{w_FdQ-l_&WZ#{KKrW~Y5xny|4cOHN3It>{-iCM zA3xYf3X-3l2WWJFDi&x)`u_(DJfwU5q~)QW2yK&y3}9g}NzDBl%AZVu4GcljB~qf7R zcmQ+k(kpnaJavaM3s*$+_`ZAkd3j2@(Y;pG@w6Ez1Lv%gKal=p4i7TqwO%!q8)b04 z%Y}2kOZgP*;eUBU)WGGZ@;fuEJ4?nCiv|UA(iGH!eN*}e)_-YZKf?eWaRe^^^UpFK zUw;TNG7hK}wa!4*cS+*cbh_7W=s__nG^6bQ!wkvm3#UX3w)jI6SZQtA!P0Et*Tw&a z_8&`r1MOi#1efa8Kh*wb3Xn%-j~oTxWhf5dVFRmQbP8w! z_>DF`tcdvR$W{ejizTO5D%YDXgjUUHJp?b9QMLX-_wPwVDOPG2DFBBH5GX0&@a)^7 z96ht!fqQMw`B+DvOK8vR)xd=Gps4J>#$)UM2FNhU7qOWgW!|S#>JcYL`Iw1Re%hq= z=qr<}!45b0)MwyRA0Ym-%s+Gi;x`oVW!@fNstpMg4qG#5kC_s#(qUB<*SMUw>t7gt zfI2XJZ2d#AQQJ>O>WLP(^^sj+2(-)*1%N34nYR~DPm*8J!FTh z@;kGkd*5G;{qP6mU#VNiLx$k5Zyh%@lMR3=ED~ujL}$6_jhD*N4Ez%|lZ8qL zH@FZZN2-U|V}NF~{eM{gv$Quo^a_Zv>mQ8Z(jGD{4glX)MNzUzhW1v?NL0fnqyWSU z1gBiM1F$%V@yp*B|FuKwh+2H;Q>rvZ;H06(=-^P2OOPN4tzshL!nc;;7amZj2ZvY#)% zn|)7J^HY%r_2B00%U>A(V{=B^C@I4_5@Q=K-NmXadtBcv`<;*iw~d}}bhsE{nF|zx zL;uTPB>!V`HbJCZ6zvunP1o-yy(>-8S7*E5j`fNTHQ|&yo3Lb(1XO}7zx-hd!uZ$j ztYHRH00VPqU{P58^Ulr9PMDP2mD49xqm%(al4DX$*rVxljxNduWcVvdf48;JG+L7I%hj%P;!dty;TShf)D9cv@umIb8p~B_zj2s%&;cBo!~Y+e z#Wy?#7PO)OWOn=`HSlBwEX@whp7;mpQSJSYA52)E?AA@;%5@UFS9b^s;D_P8060}r zxf;kr2!LtE{2!)`D;ksD)~w)QW6pcQzrk*xQTLe|fC~X=IvDT_*&TM54N{ncsA-Un zpSSL;-RRBz(g{{UtWWlM-~zUC{%@}T}j8xAW+iC)wkt-9^a4 z<8nJ#ajOO{m6U#FJ>}jH3qMG9{x7osm5X;A4_$dSdL1AoBE?14&xbRT#VngY~U` z(qU1w+i$ydMT z5Q(|5{#EgRW8Cpy+bsx9fyegPkbMjIhQCl_41vBM`oj@@O5%-CL*Ny{lsnJ?+=}e~ z8{xkl*27@{0zDw`DM-nyqSyDExJlVZ^Jk(|*O}?RiH*FE4~Ff-)i;l3UVt0R25829 z-`{EYe>=gwV>WMhJEjCfMcL`L^vi58rhg?t#=V-kE5Lx$Quv!IkX-Y|_!yJb+ zUv6%j6sZbMJYj3wa4O7bcXt;yK3Mp4Yk0*~!5U1%46n}`n0liI<+tMw(i5CL5LPeS zZHdI1y)CC={eYMCgN}PqER8?`J+zQYmwp2E(-XYpXjdC%xUU>C z%BgD!j);7h#thaye@|`*_wBWyY$y>$hg?cDSA@(jX;KrF^>Lm%K(`m17ciDP`gGGsTu^K%1 zW99Nc4`+9vDb0{&uWr9XR@bnT`KY@nX%$TVna`^3_#TQwx8ILxUh`}HNPFtq!%A|w zxIK2EcNx;R2ZtDDmZQFl3Gvzh)|tu2E0ij?3_c;31=VyKx4TgEVT!VD&FA!+Kvx#4 zcH!iIrKyj>pXD6M2CwVPEig3lE@bNOhy+YEekhXu4MQzkHZc}5H9?k6LwXDxy(`nX zwJvPkdvoEk8#D9+m&N}aNyFl;I|*mIXj`QR&3KIJv};*l?F+Fv!TzB3=Xd@Cqm2x- zy$EMfHpUaHLG_tAhj*30H6-a$j4#wwwe7&uoe<5jC3lGW#l2@gR|piRLe@YVm+R|$ zvbWw73w#6CX6RADdqr40QchBAiJuL4W%r-hlo_?!wyBxc3n>WX!MeS(V0*`vg&4+4 zxO4P+%8Kw5;7?j6oJ0_{KjO*zNar2tv)q&-%VWVRbr{7k%AE8y5Pn0%e;1b}){%G1 zZt~Q77QcrI@{=*Ds@VCMtzgy=PkFM%mb6H{`}vg3XY4&EHblv!@*N7)@70)zcQGTl zSxfjiW5$nWn|)438^5s)U1UhVQ$GzKee15ZBtq=b;xGy0yGih{m5k@|!@-M7dAIe- zPkD(SEwS>OkY9Gbd2%vy`J-Pud(KnbZE>Dc>}m*#1c6a~QTzxE;j&XQOciY<8Po)x zVx85n$IA>m%Qne}C2`5M2|c@`H>4<6lV$_T+&B!VS5g*evq#9CVqeQPBRrkD5YTfT zyE%I6b+*KVzZC@O>X9fOheEN(ZW$R}vL`bMVHjls*OKVZ9!bj>f2A~I66M=&d`5H> z+z~6;@{5^>0?NRM#pT(2iQNee43zms?kV_QUWcBxn4bp$Yi0sVEB-*%&_Xy68pU=T z>^h=L>ZI4|5w3#ks+~9!kcgT0p}d(4X1mcP*=40tS#6lzKHYi(>0hTTSY7BdlRnu< ziGraB;7-g332zq2iHHHh$9Xl|dkshx!|uX!Pp3bpc>eC^ubn4V|9*}O`8p(mnO$MU zj1;IM?y%B=cl*N@t|CUf&+@ydMV&%^7Wx|jj?H9^4~v2&YBF5Pq$0szzbyiaxlE?N zwbO#O^QIKmOoG;M)HU_L^8xOQ2G7j!?HU}laoS39%{1T(x>D{I4yNY(()kU*sZR}> zeHQbuV@|zCeBlih9u0!0!<4Y3Em9uwHI2!Lt^aV6`f9L;PD*GIQ{_f~itb=N4M0#b zXX5$BnJmzkJqIAf&decr=GmROSEq-NRQ&`^!CdV2&x+(e=@)kp1R14sv{eK@mQzN2 zJ#yo{_@OEuVD5SfaQScp>!Tt+)WyI0H8oVIf=V(_`LGB9sB!?LLSoPlP~`9i;I+6a z8Xs~QaGAKR__M>kKWig>2PP))@Sj)&&;Z0UXBIN97V6fofHO0qq^19B%U?x)lW9)8 z*6Uk633#CP7c}E;^Z%To0To@sxt&HPR9N*R2IHSlQZ}UDh=IpLH=`zoXug>y=SmTp z`dl=~KblSncCCxNz0KE?4Vz@XJc{VARvUC5==ateh6=Xa(Z>%Azzh6%yE$x$Mz^zg zBUi(lsc@e=BVc_d_S|3ant9_RnX|-<&}eQzYVauaCt?fVc#qH)X_U-N`t+!YJsV8a1Z#*21@d7V znZoqS@AnI=)kw~X^jcZ@*k;lD8F)oi<(}xJV7s}XIYH2;=i2dEK-~@5q{@}_67Et<^ z>zmQ)=pzt6B;_Fnj3pK)Jze%o-cO7P546+%lz)gq4zPI4pAC9eJ`+o3O2eueshS;2(%v4qe{L|ZJu(@s!94=VnISKYr9SSHv2er-x&^-%ynfT#)~efU`Q zA(hQ}H2m+*S%IoG0Nk)}Q@F4&cRbJsuvT^tsO|s!q1dBzbo!ZT7td#E1pu%-pqVI0 z|7Q%^FCVG;EIhIu&XMpNbYfAdzJk#$9n`>6EPK~HGDoJHP)?MMg&l$;NXfhvxYd-}ye`&NJGr;2|F~K1O8xs!Y z6#I-VtwkyR8~QSSWYJRMUj0`!*j)&-aQK`^^a1W;?I4m@#DUL+d-0yfa&-=EmG@q- zglYG7)U0S3&@OFe=fz!8e8(DDP}I5G?Isu|$V@bx5u+Br_HAv^`#RbXL%Oy-O_rA^aPqRHOB*+uilGB-G*zHR7Pc)fWQ? zb6AGsBD*W;dvSCidu49qb{vmV#Sm*U+K{K=heZs)Dr1eiY(2o0rw&Ipf$)xB3uES_ zoUG>Oqd*BdTvRsB3M6zK$4aF+;_K7jGZa#5_*63rDF_*lW@zH$Q28q&kK#~UXp16c zhF6liUp|ei)U#A4Hye8=4P-+-sunR4-)c=ovNWVSVBjVR)3zg^VGK?7OBNLF^#O0W z6}a7Qq{Nr!;T<{E!+tesX>GkIMMz+o|A?uVaP-Ri#bU)J-blHBHd~cY*jHEOoe%R9 zg9<{bk9#oWJ2cz|?S2jCX}aD>Rk2#~yip!!*DksCx}mKe;-cUu`|xbrjZX8r(kT44 z_gpS#@jjc`{i_1=oM%UV#iC-XYy%flJpVHy$C~be%DR_f}=4 zrwb=6DI&geD)F~rd-z(tgyYcnYF{);YYRn{e&W!2Hc@kKh?T7sA2qQYi_5^M9+9Jy zY4ES~Y~z5dY0;BVC_A7Kro_qJ$o}J3cH9eW@#rA=4pGE+!j=^IH&%}RyG7D(hZ$8F zsK3X{6}(e=b^IRZV3uNh4~ifj)AYs6BK~qXWv6763ufvaw*nhPZ?3L%{~fsGM}U!Y zg2DKee;@O1Gx$l7YPDCBog#Z*__pEeXTztwxuNSYth5Cbab7rH!=FE6iRm1#={!E^ zMz&1o1=$?Z3`^8djr!Q|4XdnCf3C}A>rBT#ZP02jDUYHmnYkQhKi@g|DKE?Z>hM-j z#=QLQE<^9Rn~>;F7%H=BZzoB&7+0)n2vN!yLZZ0&M!KJ$2_;6vU@((r6q98_#A<}dG{nySJCqc!iB{r_(JH@yPlpq1l$8Ep+LOlK=S-dy|&6^^RG9O z@TIxm;a{rMHWaWSqqP(+km(0`rx#M6B8D@l=!?d3{{mhP2>Z8ZGdcxNMQ*XL{`$yw z)Yz7ljcehmI7Df@S&F^EQOz~1o4g@&dr;;dTtgTCxS3bLh^SID4hxaMHmbxebV!0V zC&PAwr2i((&iU58WC!O&d00!v?Ik4xV+o-I0@WlG{XFm;QkG_!ty0faID774X@0+v zZ4@=f7B4-8vo7Y=v^&QsO!z!=7Z!=jOV7m9o_H;!0ppSx!k>CXplm;hmR9W@Kz4~V zPju>uvE?AOLp#wS%E~3pZ7y=Gn)93CW->k@6UM%P_lW-2+i%DTE~ST9`V==c%D>Vz zElNt5~0sx zzkiAJH)dq}*7h`66LYk0Sjlq-4E)f-?*%Q%abHHB2w~tNG7p4gCJwEhSO3%?uN*O4 z4=gtezd5xH{vy!YT&RM~-kl3EIA>4gQBMwC7GYtqwHv{vN~ID1jF+W9G*!Dqn&6fG zVs{eHl#pixw_vS_`P`G^mE@xH zGyOW?T?_s3_A(Vc5v2C)^9y`QWA>S+KK;S=Es7s$J_e)g-Ql=m=i5XOIy1iMFZ`xK z?%FpOazW$hTMo?4xi)lx#QK+K=gWjE+qyzFuxTGx;I1@WE`<^kfz93KfM^f(gFIRJJA~7Zu5G z$0=qziQivJe0VLruHg4ui7_C)=b2URZZO#ev4Wp{$v8DtcvpI8o6WRiu?lx_j|)$y zs%iIS=^&oD*Ap3aooKgy0|5+ya=p)T8UR-=UHn&-1dG>QI2!`Ghjc>|zm^!eY;bo8wbV&9B>WlBIbfq2kncjDdj$I{l;NsD#+|RGtv$#q* z4$jd#&rf6gZf3FDONs1qFmG1cAUL3Jko1%G-_0@R2}CFS)o)5SGuo1M>@4?VD5eLz zh2@K0PS|_Si*!Vi)d^Gex=1JEYsfehk=5Q`kE0{1hvAWH@;=x8!BXf34;RXO)M(&7 zi@!Qb54RDKHnWvGh{q}_RvO@fMW_`nYwzdj6|xk$wVk8Vr?s_uh-zF_{GRBxv7Au; zG;1)B!C$uqG1!N0pmWeH*I~6_>?k=o`rdJ7&vm|t1-F7R_;)pUFEaJoWC};3Gg@Nc zZOm2Z#1~DHNJ*(yYA(y)#${iyht3N#kYhU@uO?l~OS5_lg<;X`tyx&6l^F>$VI{oi z@kH&MlNcG9q(=!&ha&<-z>800uuV(qsC_@pj`oCufb0klGFZo1RdO;v1l|G0;(h^KQ>kBSXedd1F`Wb_#A z4!$BB(wz@Y{Dr@Zs*i$?IF9Y|SOd(urVDMezp$&Xc;!qCV$5`1S2H0{AM;w7 z;0v_W~tM#MHF9r&JJqL*SN9qh;#B*|@H%Qbr z5;JV3ujE;tsWgeU-ta+wOF193n|C{fRMsrt!XeOEN zppWICb_t6jazN<$P=1}aRom;lfg*aRSE}HJf-IR$IyI&mSE1%aVB*o@eeTR^MHDx)*AkH_}w;3?JuYY*NruEq1Zy1W@#&Z-q! zO`pNhPIyXC76$jd+h~NueyxY{=;q^;JiE8y2!UJjM;&$1w+e>x&szbW;V-;V3O|3A zeAY?u`xH%v0Es>I_<(+!E&i6dvuS&5hu8MD1cjSyKKq055Be>O#_euwYNa%yW^`c& zyH6u%EDrSA+a6Nz0h;zUBGrnx7p%=VDvz5upKKu>)?n@$6tm%*OXs9m3@O`utL&s4 zcR(cnC_0Ngd%qiwvv7~mEPjtok6l4i72C{yeg~+@l#{x1do9fD2(8mvzg=IxFr~6r zmTKIU;E^EUeSawKW+O5)6~4Xkb>>x05^ih~o@<;?U)v{|vR@%i!_}f|jTDFHcfLex zp+pGD$4Sx#VR)_Oqs9A-qG$JvM7;dpyHM=1g>~*^{V87lLZoL?!Qe{}MEnhT;TuFF zn~S&PnrwkHoVz^omrY@LPnHs$zqw zH7v7%?5RR)`AoslT=Z}MZ|=X`9KgTXeb$Wl+$6ZSb-)Yira?!>LsA(D-1HP_pc6=6sJqNW$;*IMJu zx1QL`*X%;jRBL!BxMNp?<`Dfk<^m5v8nP;{e zL~^_AofEdaVt6;mpM-llm3ZGYc@+8l727j1h0j{PFza+r;7ncG(BEVa?KJ@G03;Fi z<VE%07f%Prx_RfUb(5>%%d~KlKD%mCOtftdtJqf&zUE(N@vzk|q33FAZ1$(pLi2 ztml^~=Pne~jf1%W*R+?HRTqy1syJwky+H)p$%A%(4o&{98t(;A6k#{gs`lwSH zCAC}v<)4kEnv~rs@)Sj>{j-QRkNTtMcS^4yx&XeFdl&$q;y?s_13@!w(9GfA>-NWN zZ!vm7CU8)^6fsrwE8>!aPFXT^Pk=J{`*d~rcyr{Eyu{N2rXj>fN&x@LHr9Cap@Ws|jc1B`MFZVkJE5-}T|D4D)>WJyp7x`Afzxck1kqcknNwig@9b2I! zA2b7gxqTr|@RVt|feUzq0;qqT~yszEVHcq|qxH55S|d zl{tFpN^AmP%|9zxGP`yok_dS^aN&T$) zfQDhH3URS2cTTw7_URrRDInA#;*E6U5xV>NL(i&Ez$pJWW9+98lk&6GZ+@S$Ox&7JDMw<{$^VCo1IB6gj0mbOf1VBdN* zYSY|n8l%o)QBfl%j)fpw7(Fw^MS!T4m`qqP;Gg`&Hf#XFFg23=|8e$~aaA^5-|(^N z?hfg01e9ijAkrWuA)SIqH*P8EZjhEv>D~&`t#qeImxQ3c$L2iG>%N}*J-?G|5rkPUsqA}Hw`Bow$~N`3jOfj+Rfa*P6yH+`ef8|nJI zoUWUY6m{oge#%BZjuw^2)0Fs=-}U>0^DRqn(Uh)tpY`1Ur=u9cnHzB>D8)mP%dco@ zlF_GeKhbkKSV?AGEm${;8*Ddsd{mwKor;SVeDi+2XdNc%VOeuck+dYDH>$dD->+D< z=*Rn&)8TVwHmRI4CfjM&^|roaA`-KcLD_xP0^}u)RZWQ3RX(PI?(Z-aG^?tl%!^q3 z-woBam=-;)! z*=KGswLi8urBtAjJ%40CuAB`q6LqYuc~sG+$XG&$eMoCFrzzT$mo*a$Du zl|R7Y$bRr%!*{yheltmx(*9RZdBn=SlV2R!A0=5ik`v(pFY?DJjOAk??#Y4zzLS!z zAA@ofj+!jQu&=N7Y(l9%{f;S=Ye{W?dSoIXZT7R89Ao!`RIuod_T!32q$ZRRhQD#Y z=*reNE3}5+1`_j!P(_%*%&PWSv)W;bm%+CYu`j;*J+jm&RXzwN?-~ABJ-^GP_~XZ5 z&GK(SLGK00vPIVVP&wwP2s|BKBrxWf*Y;))X?u+`Eys zUTEM5Z(xZY@?XN^%YZDKVg-`BKj%=~*TdN^uE^QPiA&{LCEr>+iVQh&)b;7}eaR6b zT|xM=i>9?RYm8MCL;7BEEIh4h=&P4~3@Upl@o`;p7~%HwUpCww#0LY(cG|LzpDgUY zT|6VAcO@gsBwm%>UVm1?5&A`(484lUv}5{&if$n8!b{b2_oev!fqaV9^W4Xlg`?9u zH|W=sw)M^N(edqchMPtzb8ylP9_F~&GqfW{FSbhVKm6N|F9{LKQXJ=ItcvZIx^cIbw6`Whbh z#Ebb^-^4RWp^_Fc8Uu>eS2%WaHOS@jiMz#vU95j%DdK(E&d3N*A|hVKOTa~0!@C*U z=Q#axa$cNN9tENlRnPQ)(1qnPQ6*BgLsON0>qVm7>xbHLZG(?f6 z9=|x83c^!h7k4gpO(Pok<;EwZl~r1+l2kv2lQoZiHC%cTu*!mRN%oO^feh74 zv?ZMM=G9ASc5nT{&CCIIsb2fHaUWCAgzD)QzV3@ux_i`9u(xEC%Q2SkS@bdA*glYC zPM@_>b{|rCslA7BYISrJFQsC{ajsV1LpXBzq{|5JxcEnh@m6jwl8WVVUJsiv6eVG5 zPo&Ir5&g{f2ggH+d$A1A#y`JB-B!$hY*asXOO76^P7;5}?4NNnW6zi$*UrDJzTJTz zUl^{^qYHV$klsZetgb{vK91cLs#j>x(VA0e8kBQ6!#+$iVIXTJi#o<{d{dKP3xB+> zH`PezkiyWUnw@P)y3WNhby0o$p=q7ScQe)IsMDV{E~7EgI<@|*FKLz&Pe0ptpj~oC%+o&K8S89o z4l(^z`%X`Er;U1FLp0Bs2+AH_{meNkiGgl$0WEz;<+eFV(yQ|eUKydV2D(@Kg5^ZT z=y`&>0THn(GI1z;($H|KB_tK|cAW~}&cX4Mz(N;8UkQ=F@jO8#DiuVXw25hq>znDh zzQRcUyu`OYj(9w91O8CDo=p&I^?*HTTcNo!cug4vg0e2+|TMVIm-n)Pb&$EmW7 zV)Wc?DExS^Jdcu>IDFeWUk^_f*P@YiCfdoAO*ZwY{`oT`PL3s@95$xLyiad-T)S)_ z(NymFr!HG0?9w$4Q~D|Qx6vQ0nV%j_ID9hqoV7{K*s>`#M#We&dZdvQL(=o^m~(A) ze%D6phzv7hEBZd}(IpPs;0UG(`m|tn_QgCMN5Yul>dtpK7`u8BiL-0btcwxV@q;%> zke#)WWqNCCCq1gjSscD@h_Mf>vM{!Vo&Ly5BWNMe9yf&JQXL}PPScD2OP*MS#`-zqAsYNq2TRIV|M z7}XVeZyOGePVPk<7j>lPqYRLqsa=<-wui@9T{D5Yz$7S{w9mjinj^EU7I4qnZtPMp z{E8~((|cxW^3tE^PD-V)R1$Bld!XxS4$YyzTaJ7_26T#+PatC#Rt1lcLP}{<$ z=+suhdjNqWt^mf20K2BLy_ZaX8KJDolMpz1AM?OuI{CK8oQJ0eh3yUuJzlLJZSWE~ zHA_t1yUE9h#U5&L=3&bO)*=nbVZU2XG&J}I)6^%hlFhW4O*)&8Figye@ei#6L`Iq% zk>$M-PmYhlc(xjP-8=yM+h<3O*F@(MIZ#czGF=`+#VmbUe&+`1OVusTo*>1z5#jYl;86DhA_TDid4Q z3drYtGzA1$7cr?{;GK_wNj2GiBi*MHqCK~Kw)pkUxMJ_PFZf{)0%#^j(Z8M|(^ZH1 zaXiia3j4^Pzpx&se{|H={*!f6sB*gd*Blp0fQ@I;yy zhve189AM?omKC#0qk-p3pJmiu;d5ucH0%6?PEMUj9Uy9w^FcvOp=wBu9mP8WV=^qp z@!rFklzlRs_Bt^oWh_7&<8!9rzYjoKYj2z4&o&d3d6Z~PZ$*x zp$^Fr{cE7C+54IeRR6Kc%;0RdKlI&ps))75g2@NO-padEA@4%b2O!Kvl z0-kf#&J#P={OFa}0f0f5m*zP32-o*xVd{0tL-eMZ#43(Zt! z{a2Wg9;#JiA7FVeze3UkZ`tQ4_5lzRkb?)Bqc!{wG7K2fdh3*>&qgJ{Rw3)U2X~)J zYji;703dwdAn-xDC&(ZN$uWq!gJkNRJI-TD2k^cW_z7_l=hX3yl73?n0E93aW)<9? zzca)1$1IF1KIXwDl+L=v>%DTlkZC8(VpI$i0|I4GaR<~?Zhy5W3;;51E>;162=T>2 zU?IXL5j0F;(`EhvZ7=RqFt+O0fl{(KSgTS)iGQ+y4p__$`0`-Cafi z@v*p@?+}_p{}MNI(1fPFWfeg)^v-lqI3wwhokiRrIjDDjI0#(BT-U>HuM3=1`^PV z*-FuHU;R9S?^!+3kTf2|Q-M`Qa^)S-pFxiR$eLa{!V*w`Vz@yu__-!SzkRMW05Ys< zP!f(USO%({p92UHcvrsP6ubzbX9{4TDC@+N!Cl9PdXtedD6JA&$=J^a-tQZE?JHY* z$Xce7gM1*geo+W$%et9hO?*9`tw6o(!{m(~Y{m{+p%DDqw`pfOAs!iZh@0^!5G=9>Vfm~qNTC~dl!fZ5q z^!_Kt(1j*)WxN@T>hTiQ#rO-Sh8B;k=1g!Z%j!^{&hG9^Cnmr+opoChY72k*Pr!GI8n5pYBePOQu#(Cr97`!!8P{UxjF0y zOAxk_xtBj`V=hHny8%EBXnOH2R(S0mvJ>y9@iE=aYS>K=o=C(G&2!RC^*a zRuVx4p+l9++ZTM{EitG>naj#feB@^fS(+pwlTY>(ZR+A|4i|}Vp$FyqKr?d`{#A#Oo^{`P z|3H#e#&YyAPn|oUzzbcOJM)&RT7A{#GC1mjgV#%J^0eISsoY5vLPgfH9lvxA?|B(X(kG&4N}SbM2NpW51Gl2eob=? z0N)>*=kwUvS1AVp81m|X7Pfo+R~RT-0g_X7r#lFnoPgK8Bs6LoNYZrqwtLD^#isq% zCdU@Tyn0o$bm@NavT7B0*S|fO1;m6c58=zGf+7$~cxSku=!(P9 zj#+DOgHogTt!CP?3OeNfUV{EdphPejMcfuqEeC<I zMW>Sa;^*f~UWKF2VRhzCCE~kT zKNs%G#E=1K&k5hLrz3S#>%5ZH;a{6YDG} zE6{5#jVW{+O|*qoJ_rfI3FsDebZcN4sU~ah0tP^JAX4xmWBegkI1Vto0wD*8$>lL5 zrz`3oo0doIbtPE+m7Nh)Wcat!Q^}tq_n(x>X*PFu%+BJF8O76$O{ZZ#4@L&9(q=v_ z)5{13S%5VcFLZQ!6%+-YY<3}39JF|o->z*xsbSWrG^PqH|FKVFW)=PICcUQQ5~*#% zW}_hGL$XK>AR#etfG2DTxhlNARzH&8D_IpjqJ2Z$(=PQ~1{4QsT-V=vju6+$*OFfU z`big7BHpwxCP}exJ;mG?CEsM3(fn@mfV#(hS}KuC;uG^zOT0{QAO?b&DqvLu00$q? zY_ADlAOKT=1>y~5)OkD8%YUVa>DPGZj%X(QKv_4sFHPf4g< zqhIDjKp<1kDH8w)*YJLad*f?yBh!(D8rC*|@}7e7?uNwQHqaEi)>9*Jx8)gJ)$7A$ zJ2NiZ#3A3z4I9A(FvLf2I>^QSVg*Kx!VjQ|DFjAAVMrPpm<*Vzic0w>`$a}i6c#*{ z5z7qF329dOFVkv@RpjuNu zoXZP_bBuc#58%SUOh+6tSaPdBfE-)YEQYg;et0B)fb(*ZV8OQl+0DZ1! z1z$`->r~~KB_$)aYwB0dUG^KJzLAISG$Os_9DE(mvM{e(`;zGwoIhhhB&~d8&|4Z0 zmRQ+L2-eyK`-X8-+4X-kHu?Q;vzT@rdv2!QOMf7<`IE)KMK!!TL&cxKoSS!95G^HOk? zph^3hsU0e zn{DR;f#n3ottmtcZy&q?aJ4UCZ~$xl$v~;==MAM}!qM}ecFdLs92C*VcWw+gDh3c* zcej|3wkIdN_l;W-*fn_td-syHtNJt}bLa3bGDML;cd>O*fPw+CqjmQ6ZTCHj%QT`GFd6d9gQ$0A|#J7>}B~-TiwhPU@ zR8!~Dr~MP=tmH8A>#9j#L$iw0BdQ*!vm_ekjtzql>$5NVbY~6^-d(9YQ$L%$nbZ1$ zl4fdiNnN7T5hVG&YCy&5SHt-t%L2QFsfgB=P#jk5k$&FP;zY)?s}J9_%#e3E3n#`M zNQwiths=!zcc~I7a^DU&+P(YzqImF+TSy%zPN5FUb=3kwWm-1+|fa zQiR=q>U-u<$cBfkOY>q{z>bCb!yX#%N|DV?)fTm@v4W7|cOwJo6CNA|J1#S4F@7O~ z0Tn`cDEjP(2_fNEl)DDv@WpeE+A&ouSSjP)7BEhD~EPZcOLXV1Q zbQf0K%T&*!;rj;zT0xy37S5PtRMzm%kraZKOl#Rk$nPZdDtTYmrkdC@k3a?Mp3BBiyvJ zY|Vs-yn^jssg)9+wB8%(PZk}kMp_$5AJ|6i%1*IHK9%a{DMpFRN_$6%I21-xyt5cK z@S`_;x!?Sr`=xtLtYG-Zl1V=a#rYB&VAWSqkrq!kXCp_T{GqTdsivZ6OxYqqf$rm? zA8FzD6nwXnmNzMv>{6u`w+BSmnZ$bQht_;rh<&&7m{m=<=035+#S)Evk$&+MDzYp) z?e>WTK65gv9s7{82PJ3b=bpQXfs|Q&2okID)~uRqem+m!k(T=F=Dy3z%SamhKu@I0 zm`=h@G5H*eXbSYL{)^yPDtW#WG3KD{(FkVpGs*Q)Z<`pQrmN*Ak?ODNYqdjuF`7P- znhc31(@B%m?T^j7zR#RLDgG2MwT^g$i=_YYgO;1$6yI_S>h)f)V$2bpRGi75TWq8M%K+QJrJle@uSgi0;l#Vd3bSn%rJ%ihQv8+z}e zTdg63A=b4#I`l80p2ki({<_25j(L^@nod7N{4Tax9ARpUq+4s*uq~Jkp}Hn)+H7+zulgK=jyhXdrtJ8 z?P6G{X0BU*Rx=}1<5oj%o}hTh#x$O1O?B3euHnKY+E97_!B9ZesW86H^UmdH8(F5&XY==ljX_SpI@_4JHZ zCH`IifkEua#`W-6>z)-Y5h0inpIqM~O^c!@?Nn5U_2zhkYSEB*5K9}&AoH``yD~0x zMb~V3i^N+l%1j0=8u>%?lAi)cQzZ?e%LY!pP#hMlil;%d;I;B5Aig7dXfFvvC|Xed zRgd;8UgQHQf0r#;>O{Md&;Hb|?uE>f@)X+B~Jh+S$% zxanHZoQb=M5H$UjLIL0JaVvRBo&Y2Fy z8wMGc&>;GsmRlB7IQ8ST&dWRWZVmuaGwT^d6$4_bPo!2X>u1Dt_R-8YB6)rZ4vGRN zra6ayL@};9KEMelz@(c;?(DWnQWIRf%HfEktK|i^jU-=gYxP*dQPco= zM&UN`7TjTJuZTyqn3wb)L2;mWHHVn6@pB#5zUHzfMMM*9HA61G9Id$Q>D-dsI9;Y( zpQw_Oo6LOoUQvH}Os}7Gn)B|8z8}EV{0eSg5Hh8=A669{NwIWHBW7YTP#$6izxz_= zIDdgy;fK1X0IIrI;yWMqS)30-O-$YyL&PNt>ZiHj{ua2VMn)>EbwNTwa6bgO5%V~h zy(b61slI+>E?QCXm&{5utRLJsl`=F1fI3>rnTG%popVV%iabxuPZ};1(m?}|7YrGj zznihaG(1%aT3=%++X%{V^JOYQbB*rzr)6ITK)Zqj1_q|@X|yyAs1Qh|i`CjBwFd?H zWAcOi;Cg+Y`>(n|e(dnG63u$79+H<`eFHQ&c^DoM?C6Ujr;I=)j0RXPE@k^@^0+LY!A; zhGB$*>c-q zrPXxE;%0tiO(Mgrq#M=q?MKDa87WVB@$SBDHT$Qbw5ja)0wYnq_WlPskOvRU|4{3@l4x%krcW!K}0p?^=UL9|8U5%LUwOf(CH+@%0kKh z;*#p19jy~`!b{>Gx4I?sa>41XEZs#c^qI5pucqHe`jyR)4c5Xk`e0GLV#PO|{J=n6 zb}IMJ^4!mF@C3mg=YA=^PU}dOKk4Xnymk zYP}yb@CegCOjS88j`|~Q2+aqofCIg$igO1#Ie!TxZJoxAwv*c;x*P zn3>4>VxFTuASQ@C)~|N@(X4N+3sYbV0>e*A+epGxg4=bW;kbQ*!skoYACCKG73|xKhv5`@HpDe`uT1_LHdf%A_gkqM?w$ zCQoyc0cx7dI-#IjTYqBD>A~xi`NNC*wZTTOPrA-(%F~X&NZE2d3xEGJeeX+`l`T~h zL6bv@GVyhghEs6tYmDhcO0CA0jKX|KrK=ICwovdyGqG$oE_OOuPp$IidXF-W{1c5$-)r-9F-&Pl`?lbWzWt zr?pwEpzK>F>q@fHHP>)m!JoIqMrv8+#H@HjZjTjvtmoed{nCo3^X@)zONbeYRPfwV z-)TqF?Jw0E#{_8T_chlS%o0q+fVP_0#(l0yZ4J~ZmRx_CDzLS{2U2Ca1bX)T4J;zr(VoCsCpU5 zUh|)Cgl}PHGb=QmixMumkG0B^=ct~0XXn4PwObWnC!Qh@_0W{ z;H=&U{{>I93zKXW`5J^bJg7a7uD^dAhrjMLhTD0_ESk*DZ%y5`g8FbDG+{hVCQ zbhFH^WH?Dm^G5sxsH7EJR!lkO-(3mfoOw5`>>{`k9r$#ns59I==ThgM+bd0hqlNK1YecUj^98rsl@|tn=xi5Pz3*f`!ZuG{jD+e1d8_rW zD!zTFTDwzeFwdr^mEti^`5-0JZ!lQyIrXsN3_M$Yi?}q+w=n1M=ePa%em+&EWJSHg z?hE&N)y&$YVK>>&-;(RjW`*+d&3?1wp>CEpmj`UDp2uMh!a?J!56xM>n|2XF7j{9( z1f2&C?ezueHDZ^#gSOnW;4A^@0*>X`_)3xu;Shja4>(n!QYFS?;P&`Vt>*6Ya-cSS z0Z;8c%XIJ!_IH^3?Po6{`||X0P&Rn&efMt01ap`v7X-4H&yoC23x)yo%%6B*S!!^T69^fVjKsfJz zKBh`6qcIWQ zbC*IW{X>{+kt?ovRHC2&YES@T@L1sQAZ*V! zUu&Jq>J%AT;N!;-52G5({BY8@cwfz9TZ;5BMAqKbRtj zJBv;edeNs-eh61C9CDca5#-{6#MFMQ>JCfVTl?a7_UdxfKl~xt2Gag`p`pAQzb17scTpOn4|p zl%i>-#>Q-!0elnGeRphHuQ-4uSr$M+oS8B~vT?W(+KSkwewsjL5CH=dA4u(?Po|6Y z1DF+l0971F#siY6{EdLS?Ds4RwT=aBLRd)i!z{bY>mJsx)i!sH-B z)ITbzXDA3jjD=T&ld@AS2mX0C$(5==dB|Xc&+-YR}&{WgS;=;Uvd4CT97|k%J`{xtqN9fhbwbzWq8i=!W= z=)0DmUMmAO75O>&!F7E|tXWU}=`$RI<~*wxlyf$?srdASWbUnU4chB4Ed`<)l!dud zD*IEHn7LvwcVO!GPq37ht#VIdQQ@RZ@iqFiNx(;x6=s}oK{h*`WpZ(T;R z={kHG8vjjMM9z<6GPjsl@}_5FOe83vWj<}(Rx-?HgOttsHhv210elKS*xTSC7a zf6Ot2$nhy&kE`70D>a>-kHH^UXC-t~!HBDnyTlgti(U*3l@7&Ue~9f-Qzk|K(2Qam zW8u6KEqNa!+%@g@&1<9Vjg-M6L3fJB+-t^ER(h(slu9%tZrJDfqsL|^o|Zgvjr+EZ zSvttbrc#B`uwj|w-tcN+<&hA%upc3V3(C17?~WH!Nw2KFE-C8jK+?O|78-rF^V=3n zCo8M*C%s&zJ)$pj#Lo;W*$uk1XbU5LS3J_akYi$6fCR35wodp_E{5|Ah4{5@Dsg@k znW$4j6AeCU+o9D}IQpOGguZN9k31tg>lXovDHex&2@(cYGBI&qj)&y@yy;)Fi9Kkx zp;@l4_>?W5>0qeaa?@~;q%5qT?86c@_blfyv7&d=o}tcdak^0OV_*r{T6+D9 zF`~T7*l5v=9w2~iaUu`BgpR+ZMV_k-v)Spu_m_*sgU9jIof}y(-VK45xLVgqM&bKQ z5zjp@NaEnT_Q%8#0e1bJDviu!{cq^s)IsKGuF%@A+BeVA_UzxIs9|J{pc-4_!KL=7 zoZHi5%dgkCLy!3LeDU#_m|uQ4f3Vyi=NvU%@ES5|B3#8z?LV_xCW2A^3 zq-KDZx-|D57VAB8Lkjk>G1u6eW?B?dUqLcn=WddrS^oU9thY0Eo}|UF^#>P*Rm<|b zV_Umz`bE%3GA3nM%6}a%UqI`~dAS;CCafGCba7%;)@}qS3yzvzL;WIQ9qtwKgC&S$D6t~DN<$4^T#W}JJEh5Lqn{c#6_5C52iKB{wSS&4cKip zv<9d@ef9R@)C|fh8Xl9qT!t4{bjsqe&1;j)4ePAa>U2(@tkSW>rS?#g)%#P*%ZE`eFF+*l z?6W)+Fq3Qru!C2x*auUm+^;c2mYwP&yGlm-<49osvhwKi@ma5wYR5`5M2g8HFWN=V zE2#!uzfa*Kg+%cg+ zPYr*^q5j=2Mo(F^gYSvmcI<@a@Vafo!^{9aGLP@#ElTGe*p*bQ7ZFbmR6aRPw|;Dq z=EQbisxg?C+keO}IJFVYepbvaH%mD|`tHiayna7DK%&;z*GNgvbM5+f=xmv4V*@v~ z7(~`F@-z0&gy4~n?-E@KaeES9^aZ>$J$r!v^GOLY}7F8mfG&U~t;slM-cVI__SYmaC#W6Vih>PtP= zR>3kfwxpfkeXK;hw%JR~`X>aba*je|m?H2>K`D;2fQQ7}bbG_ou z2#{j;Y^y1_od#col$dT3fP`WpeGvi#)u3Q(?R#hj>DxC*DbtAG*K`%op#?B74D2O5X0tk3;4mfxtJjPyi4baMsG-+<~7 z>oXdvp1lYxo60qDaa3M{a8BJ3g>4!K4Nj`PC zQf+vIYPMoa7Md2Zp>Wo0hb*agXiubZU&_OTs=k5h^vx&J%%fkl94;fVC1TFaH)f_H zCnt+qO;fc^@UUtRq(x_>@baG>@w}B7S11T}V}|0&#k8L3D@HBO2c(7sYUL0lhDdO5 zUI3cO&CG=H8+ZzWD(`+xmNekpkMQ;hH>p@!gF`uTrUQ*EFVDu^w2sSPL4~Ao@g_88 zjg^WLyWu%oM5&bhMKw6DNVp$i3z0t|n!jZxr%FS^&qO;1y+R>qHm!_~}7D@O2#)9E1alh|!T?)%F2b z1;_x}nuMhY4LA6w1Ax#u z&L#k}A5dj6D)rcewD+Ti4ZN@R=jR^$weXvGI|Jlbgl4dUn|ucE8xX($PJNH`qUVz({e?G31nUR~=skpYY;mx8O?gleK{W2}FJC@R*N?BV!S0HqSl+th>m| z_r3NEi8IzP6kD0QM&Zt8>s~dmkbNNlWBOJ?PR$B+0RBn%V}xJM4apX+_!}<9T?+oA zSGaNd2rg8b)7E)Q@N=;;YS(5=ksoW|+ky0;vo1V*hYpzKcTx}U;|H(1I;hUNt3Ytr zz%L_bcG?+gj6*vfEk1r!8j(rLyWsyFtQvu=2+rLaU^qCf+@V_|@FU_xFI?!S>`M9WUG7dMIQw8T#8bL3hmPR<4EgFI_1DHErM&;q!k(5>%G2(4(YGQTZO9M1->QsXSX66gC#5fmG1?ojGySB8;bEYSU{-<83gAsp3c!=*|O|VB|2!0Os{q zi24tv&&>+Y$2xCEU&?V0+PyMDAVUTQgrJM4lQil}YgLOqMqtSZ@(lljr4yUtlW+87 zH7bTTM`U2{k!XO++%1p_)KP`~|3WgCqbKoZ+}+kb)t)ITw**X8jtn7fV)>3G0}%qS ztOGdQn(o6Bn3>r%Ze8*~{#owMA2@0p?b%=hR z53t|out);OHoywaR=?{ga43T3EOU72l=sfTSaK6Vk_Hb@om@Y{-c0#>gOv9m*?QcF zj`{2LfJ}c|FwR_+8V`)9zJx&xK?+bq^;G_*Fvdf)>$Y3d1giF_6+kzRv9*z28MKZE z=_o)tL>J#ZOwtYc0>AqN{Gnf98JOZy57C={)j}r2lY3W)48(7MLj~L%$kzK$$GLI% z`AYpYfF$X`LVB?9uD||z03hDl9CH;Q8LCPXh5>5WfHGpl(m}E{aQ@S$S&{b%)B&K# zIKbZ=hD!@0ItEF=*Pt{Jy8ltc*^(P(rpaL+A5H$}9u zIIu<43tMi{97pr`>DTz{YojU`GI9xxu5s}30)P>kt^W_s^_kv`vN)UIaR__kgmXS5 z38(KKNb`W3(6<#0SuTBna>j7WyxeS6?Oo$N+#$ z#3KNfgPmZC0PvqzUqIym4LH&-V>kJjlS!Xv?^*=CCqOzfknTT7s{IWz7kIJD_2<$SV%(KN)T;VR24HqgmOm`I-^kM_mbs$Qz-38Oh5pOp1Mp*``|qbt#1 z*^r^Q5QF~g9K{gIPwz&?1)rX7C`YDxNFC%ZE$rxUZw0(Wj;(r_*Lw2hiRM6dl<1SK zrd3ynO#e*n2XPG|^aQr(Oth`rfTlTqsl4XP2gm3~t$|T#kX7vwl}Nn^o>sXR|Nuk`6m-*O_ z8m;5W(D(^v)q~qw0*^(kY~n=}(gl}+Cab!_+ za_ZE)cFskT#01Hu`H8;?|1GjRjwi|WBS%NLeI zRr@VbUmdSZuAZ8X9Fk}i46ZCkn+~vP%2*lQtCJz6SZqz)Bu()AvW%TecfWHVLZ~z(1NSGW(GQ^6cK-~%J0q9r>BX2IR^uo>eGLO3&Ie`n z&d-(j!Xi)r23YUqgf!DQiW`932eN`T#hLp*_K4K(sHqbS5B)x02?JaKh}r#BkOq7m z#rba3{$&~e7fpTaAejo`)uEUQHqq!G15Q(r1GIq7h(UZeNOL8G&A!9#np^jG*?$J` z|0)Cb7oGnzX!Q*)?zq0~clq^CVeY~aB9Ib65#Yl(&i^xlvqD8ypMv){P{>IJ@hPTD z0M<+gEWKs`ZO8P^R|KhDa1bUD+(A6GD-qxd#~cSB_KW4vDL?T90Cz9{V$}~ojsXwU zK-nqK4A;M`BVxS&_i)!05?p&X)r%C!e(OY9f2%1f^%}Y|ikqI@0B^DuN%r$+Z7wHF zh0Mf$A(_fe6%3qDQvL0bdFo!^)gf$D@Qx2X%U-Lj$ZUIWYv_aD{tWJ1UwnvZpz21H zHxK*bu0K)Xp2!=q=%4xHi~<4v7&_Cuwu;JMSMMwrF~ahJuXOqR)5~DQyWg9i^h;`_ zudyEi$T%5GZRGQHrpSyiNF+$g2gwe+>oL%XmW#`$aNRbS0H`MA1<6+sZ2;|4Stn*E z1x+*Gr~6}Xk2EUNBX6G4j$gq`Z-5_SR@jDS1pjS>!EX8QUO~Ru zr!qUne&)*9U1BDTImuT{k3ak(D5PjZtK?auEhaJly~VfNBTorQ+Gd#^MKeS`D!XCG zVo~@77l#qDqt^duJ=oBc>81EGOWohX(jA7%^8C;Roe64TLU2*Ro+Fbd`T56&*`-p! zqvgWIsg*zJd4+qYUyCvRJix-Br0SQZe0~$VlzeklE09&#?-YV=Z^wpf$MwcfQad57 z-rCUkdfmic5YMz$WY2TGyWAwLhj>8UQ>h0ggg}H?u8a#aJ9gqZD)Pg@ZL~% zBzQy-cz3}LJfa{N*sB{~=On^dlby@Z^+-#3cRW1W{v}p?!eFyRz3KRtMmV`#iPg$V z%EfV6FU#3szT>oZ&jBHQuJt`E*%J947TP3Z%NggInz4!(AzrO2#9hOo<*!ak$=k?t@V9`pfg@fsp6;W38jrPm!&`!}En1U03 zSu&?j8!JGWi&EJ5hQ1gi1yv~#p-SKy3AG6R37$`K=>i6c6SKns;5DMd!8ttfFID>g z5kQy+{Q9j>>Lf@&I%$yZZ!Kc9iPyn-LS=yKLWL>aWjp&|mUo(n=r=8nSwd7&G}4H~ zGMugwd=*%h8MHpe!pMIP8bggh5syF-ce;f*KHzx}CpV32O7$z3E^q2mX2rBkUs3tW zO(4{6fC10N>9sZR3v{=b&lV@?*N>F}Z1A8#3#+J?0hGfE$xg!g+lXAT+U3HVDl>u} zf{v*!?rz3~E$R;NvJ;qsft1zIjHJ+iJ9GdL21Kupwi6JQwQMUl@QorRBn#yy>wI_g zxqm^H?U-5{EBZ3C_q#ml{Vq&MjXv+)pb5nO>H6O4TkzwMSxeWr!>P^W43kIag<&7r2_va`01lO=wV8`v-bT3)$+=D+i4sG7#D{V8`Y9 zt^_DP2Mz|ieF!TT$>rXB#!Bmz0r|jzTd3mlx6O!soxvPwZUhHVFe%~GfS)vk93+W@ zX1xE$oErWgFJmANM(Dvy4`fOc96ZMIvV3V%Mu$-g(z<&yBK?J7A!f?k)fOZ@m@HDb z+V`-1wW<#&cOP+-{gNOyIy&f1ypepns%^dBvCY#ZFmMtIzb4B@^)qm6X%sooSDSy{ zUkQKr^z;wS2d{mXEzs{q7$3+{o+tt0a|NN<72qN8-TQaqHT$h>?Q(W)R6j0~&tIQe zE{JOW1Pvk=_qXNtPzh{8K$jSxKsc1(V^Q@L{}{-azzFlDCVp@Yc1i^SBLwBItUN{JcbR6==Rq=I!7V zi8+#1d-2_G{8)zoWC??2H2%lh{V&k6#fK@7?QKqQINqi?xBb>BQT*BEID@8U!t(S0 z^|V%*xuTc#>)sn=^_{@qfQ&gOZUfudV?yOg;IiixUvbPvnsXs)aH_UpUJ+NtX!?Uz zOmlhslVJox9(Z3)nqC>PT)NSU^M=esCwF`W+XBuy9d}2j-~`$*p%CPaly-#@U*n|k z|1tKKQF%1WqVPOeaCdi4aCav_2m}r8?(XhRa0yP(5Zn_89z3{1aQ6T~?~r%zbI!fr zK5KnzJ&PYqRrO3)b#--h2|Ylh)gUOM!wCrE062~yD0njOW&W=j@{cySV@y-EhQAb* zeP`VkI!+Jdq%85>%K{nAus)~S>`dbycF&wMRnQBOYxtbID}wJtK_XxynqGzfjYt4M zbXm&18w6nR2DmjeZ~cDyY9;>18LC0!hZ_d*1e|05NCE6W&};LL`WdvJESD};Z7tN4 zDFBq2RBWsNiUMEqqIL6;Nk(STi||tQFNBW!RB|jJCfJ3$H|8JAVI`G6q1u^S(-hIPV(AVoEQY9U`;=#f z{%MMD9i@3RJJ@wi5dnk;wPWvp$pffCprH@d({WlPAJnmLSgf(4>b2w5*k&JK!h4E57NhO3Wbl-#C+Mr7s1z+Bj%WQ9 zD&1p|5DX_^sz5yyf)DUff8J^&#BxSso-djIeGE^(sJvU8&Qr!;V>4cM0I1U)D$-oC z*C0fMP`U?=2E@UoI&*_`Xx&VIHzu*SCOReUI^Ktr3A3*~wkn#dOm3M1ul2y2tsrf<_sD)z|r!Lqjc=pp1Kc zbrGb|E0#I?pA|lI4(og{VEcxeWStYTvmw9qMI&o8*^qt&9xA5wBsge$@odF)opzF} z0_)cwEINLlxaq8P^&b)4(|CZLcIVxCm2IBP?JRBJmCChVd{;#4Hyu~>-)7kaBsXL! zm)zux@7r4?pkS!Gm08w!5dC)sRTL~_M7~jU844I6j$U0vQ(aM#-*vpi=3c$u!jT@2 zTQ`F*0KbG+rjRu#0d^z#Bk@3Wv7K8i%-OT1dMB2%%KYz004mKoW#k-mw+7BR|6Z68 zrjMAlQWA`=673>lb&~}rXKQi99ZKNgBG{p>p9I`^>%m5Uzrv2}`%tCNkG!*UHpjL* zUp!j_p!vOh_`IP1@{I5+Jv%?jDFES&lC;kROaq{tW5TM`*STzMU*G=&y@UMkC8$L} zBT_AwP=XJ#_}PMlE};wvqf=&1esl@wr2wJ9^TLh-$UZQX<%j6%_zA=%`JWZevJLB# zwr3lNBVz@EflGA9=3krlBl9K7XJ<@QkQ_v)0M-Zq&H=dKc2VNa$QSuWZuUnYyuMiG z+W*4QupQP5yt`rMt^DmQ^#|Uan@FxEA)bVe)%v5{<5&{%g>=7bfgQvO)-8SfdKz`9 zJa8N+-D}p%O{}yn!3+iFRHr|`z#$mKa(0oQ=Nb$|`r8(hnfKioKXm{ABxUXWq0Gw# zAmm?xX);nJ5E$$>dR_VNDKy7^GZAbN%Z0RN+K3ZRU_DX2VE;IGfN0ax7FIl#)ZWd$09r_BG%{eSB{%XSRPaiDP> zvG(PJKYtt;#v}xSf-cO{XEyzHhRY@{$UgJ31|~l*0M4|U1c>Rri&Wi&ppqgRdWH~yOmD{>`dAO_eL@$5fy z?H{H5{I~I0&Z)(6{`}u_Pj{2i2@to-pm6RsngOU_+C3Kt2UZ9G{%hJb`9#58fSx$+ zCpv%vhDUp=sm`NhC5g8UCgfZIN$7d6Hy z@R9^bIi?z)5r*Tb4QgCg8hV0hec4?U4-37eav%yKa)XHfD>ob)Txpit8Tn|gS2z?H z!iDZi%`wY69<(MwOdMaaEU5p?6)^1_KGgofo^bLKW!1;|^!};m0t)};kpXK*-@qts zyf!N%?Bg8M%zGq4vp+BPUx!HigE$IA}g1r-W(zU?u}Q@xPZ&b&Uvc*-RT*>xJmLW!bn-dlD?-@@b?r9nug zBC(`%I~pN8jBCx$uiK)Ayi>1jhkE0HaOtn+WS(5CevP`MC3tecSRwR&KVndX7M@G8 zc~GSJb^;MpHsz^{gRjsZ|0DZCertkvnTA`TPMg=pn&I*$2vOni2gnGyY3t20)kqsm zNtvqDj0>Kx4_!Y9yX)!D)G7iP8y9HHe>@bFy3H-G--cQErCf0GKaF7NOw_H;%sAVgF8Q=K3s(wyslWexK%#ns_w zWYID95I%f`&o@uchsN#b4>Nhpqr1+j#9?j=lc_>@IyH{BzbsFttc+3v0=0CuV<=qB5b!$llJs)0kAKwo6jpdiEE9S58XbyQ2ToPs#gn?7+S%H zc$?5FpE$c@W0q^oxJJ)@Mjx!qBV>|9C`Z%{+P%MajLtCe-MpM!_Van;_`qP;%bB@9 z$t0|XSD~tdO4Q%;nmy95%bw`hP=|_}kQphA@gu7Ar(XOZR)95@9vR&tu;;U!HC3~~ zk~r*WO|HC77_v>}!_5xNDJAPz;R&quZF=Erl_M|0IdArPa$~g?XU8?_Eva~->R*+T znVG;ALxLlpLUG9HVi#VNf}p;tSl~xqruRk4>}XFtc(wUIFqam+2W{$q%i~oO|LU&P zaEc=|lt|v>S4Jq`MrJJgk*%|5b!1Z#;+Qe-)JA)WDr(^?zF;72M~fG!?`2Yf{t0X% z^m~SxIM5=2fy*+(8sm_f6=r)c+Udz(`qSdw?`S!w?X;-1ApX;XCAn#}A?-D{$C|sJ z!{kt*Uu^<^>%u;wG9Y{`KjlnmD2^%!`#`B$6Ovt~>N#A7#G)h$_*5t#;2>CzcCBDB z+cNd+_?^6Tqx?qKW<*+}=?}BKbX>su0`CA7n3I4DtZkleZ|NaTxr=`H}iWZjZK~ z0>;SNhxa1yW812m?@}dI|IoamrUU2`-P=wL zKj=;yHp3038hWrKq@F~fNbFB#BEKA1N+r76_^i}58=Xf#Uhk<}clmk1=&RGKa5mcN z!f#tM?X*v_a|`cnsgu5hb~%k)-91jTyq9i4OAOS%tzQQ#+Q zlMO`YcD1QB>ZJBY1P%UQAu4Ig=PIz1kze~QWLHzww;eN=bxVrm3 z!Mh9*q*d9c3&PK{_uto2_)EXtENv|XPRYm0)FR)@ozzaHITPkRM0k9^Prk z8e{Yukp{g+dP!C!<>wIwwO3|UCSpWinjTR&o<`^~M_z#eZ6Jq=pEZrhy-d=#;bilS z_(55GS1i}h@3sH5bo5yepr*{)s7EL|jIFXUeO#*`BHAu~H}yqX2wC(_9{M`G6~2X7 z<^#>j6TH&V(a{3#o$W7Km~BGGS(=x0JcUdx)wtG$o^)3U{zI(0RsM|hS(<{=%*-_q zgil@zem2{UF|VX`zR1RJ8WBsf(Z!>z4_s2Bgy{_$c_}XKeJriX zPQkq>X)6%iej;F{4pur=m%%dmsL5SjQjH-x)I%9kbDEK*sYX@We|lKpF$f#m<}5es z_Ee;NSa*O|i*SpLi7m1zOD%WWkItb_0GluF@W7xM;5g@M9Ajx>+LByapI=d*)qJ1! zUizb9nNZfNl=a90Irif}f4pnQc<)Lj#SLmsx2ht%l0GwWQ5jLKZj)O>D3yiMeX>Vv z#db9lR<1UYaY^@EyIr@dVXSTPAb$;Xc|SHNUiyztjp2*fMm`cz^wLbR(dA zqXB(6d=;)N&~-|$@Uj~wakJ^qJhpvT0n;@!jfV33@KDppb!&K<(O z>|K?6q%CpU_xj&JkwN@Itg2%6q(r1dyjHc?f1TcC13BPQgu!b%{AnM5k5xS zJI;$ZKVUU!D=EG^ZHBJguywiP5T^xq# z93{Llr=^>|#~_L>eGP}0U(IjxTeFXlB8&G`O{*SZXXpcwNPcvNa_2O9Xc!Vt@V2(a z2PO=n!?K8JEJ|cM56f>&^+PHj-X*tuCkx4yPhsWuj!WJaWY5U{d8pXCWxTu|beUU; zbddE4xf_L!^~WWa&!a1{^gBj50mCXP7~5jKx{6YDh7V19TU$OQe8$kIGXYu#f5rnQ3$aJ z?Gf#*lblhF2Ma_k`uA#pHNlC5gdC4nN-q%{jhAu3XMrHv>gcfSgd|Kr&?}4#yY>-k zmIMuFrVS$-Ra&-8Lr}5-E%%xdx<;If`2=f&p)s36PClzGUB1s((TN|C>AR$y>#Trg za4P*HCt39@=Zl!8;*##{tLg@e3dxtaHHR#3<8{G+`Bw~;FbqDkr7pyUzxQXR@@)NanC&kj!%p88ihU(8zvou z_6n><1+?ZSY!YuA@v3R!d^>7Gb1JxQ6U8xVdoZ!L3_az=c;zzcMb?lhg%6h%^jgF$ zPya@A(2bcY89{%MNr?VMrHj|JFD0`OH2i2wL{+iqrQ67`)EUJiUt5zzAt99~P>*Od zxCHlmTdgi6GE>TI+~4mK`=~R=*VHk7q5#*}SJ{37gtzfBOZ87%U%$nvncX z6HIltY31`Yu*JHhehhh4a9zN%im}mDHr#MGLfwqaZK~JNZqTxqnLj!}MtU9p17;0P zv6C(|&LxsN>_vVQZG2Z4MgL1b@5IW5ND;?hmkfEDg|OeYAd+6lMUME9c%J~`O5AE!y`zZM)InZp52jkRv^Iq}6e?O1HE02saiG@L7D~d&K&OLU&R2`(w{aNBl z#Hwr*78gN_g{dj2(TYlq#XW-2cNV(zhTlD4n^f(nQ?Ws%H}hJ;sC%1+^-d(T4%_Vc}(pgj4(_NATUTGr+)$2i|vyTlw zOnq%%Qr^~xCK5J1oU1^pFYt!d_t)i#f8NB{Xgj=dj^b};vCuF=xPSaSQ;XdocbTFY zZ+I2M6+J!Cv8srFucoiBa+Upx1&Zq&>qF^5x-S2qvEtKF#f;-?%~{wcv5b1b^B^ z@}sQv>Cj$AuktXmr$Mty!<9OsCx*H0Pv_CIy+l50qR*KzIgT5~afwpi=p}))4l}Q$ zwC|g?wtZftAEMV#2_v|U2y@k#g{j+f+j z+SA6|SkV_;Xl$>O=B?RMxjR-k*Pquu6;4d{43Ek7Bw3)76RqAF;|?Uqy^l}2)Z57V z_IR#-^uW_1ks8;%W9)O1aPQ1Fi32Ufq52Ao5-)0SCs(KYt-_grmYYKMO>!p->F0dU zvk1IYC#cTbKiN~}kGa*o23+NJVj8h9-sSE)EsZ8H9W6R&!ZMd|dc{Ml*mAl>nr8UZRA@1bnt zFw^CnL*V*d33;W0?2Ic4aX*{k_bz^qc}-pA@KU}d%*PVf`4=V1!tmS^giNRT6B4UX z`v>9Rqmz(2jPq2%Th+=oS`;-oXo^@)Iau?{E6p7d~v-TO!DU-pUFM# zUxVXcm}i_x1R8KZym2|7{h4*AXd;rcTJ*w^TGs=aN1uttCtKeSi|axwmRL zy;JF?8qgp5eRa6*V@kXRG~R$kYv1i*o}A$J1U1H+TeK!}_sw@rPL1X5lLmeRKO1ZB zRB)k~HpNNP7OEB<7W3zEMp=VwD|mlTdFdT%81OejUIO96Y3KA%Pd|V*t{8V4A#CBt z-?5~ZbnPR@_erc=7K(H89JEYt7g!vekM(S`mu^!%)Pp6HE8f)-;nB%*^LX5v)rHn; zNf+rkV#RRwuF^kF<;c`6Lf2yVG!+ip&2$P#jxDb~VV7c>-}rt*PLbM@ekxo=k|8C; z#aY-lNsd(@tnlnNd}WHXH-abqW+0J6!Ov$B{z-UQ!mLeg?N{{l|>`*|| zJqHgo-3&?tveo8FG;=8L_v09eTGy{HLnd=xb(!98L!YB3ezlu2$NJ;ni>qx>O=d5S zO)cbs(md}8MKqDIskQGs#Mss@;QF#6$T`TJGOUu%9*b`RS*gZD9YHlktQ>_1nGW6b zIt#%{s*|hP%KLOX>;(GjpPZi;Zj^Yd(av43|CkiNU4xafq24AIUHT*EqJ2{27(IZ- zFSg4SpW2QEJ(OQ`b|3$^j3}UUS+O@lpS;>0;q-*%;NS@e%Vt;aaM2ot=NFtJHL}sL zz1$(rrv0P&v~h4ZxloCqsPj&EU5P=0fzZU9{mU$jTuWMn$PIH)AM>l8lIbv!)aBZ& z8fTBIQZx1&SPLA}8>-~!(chzZzG+E#fm7N}N1yzVuT_$L(+Dn42{aF$o>pCEsq`M| z6s+dakm=om(gVN$k4aht838&`taumTagEpI7$Bs5Ry}jiVo5{q#IMJLuSJ<@FZ%Wv*mQ zT`v{$9~w-V#LYUHh;%k4n4j$7Z-u9SOYochk_ zTWP=tH^{(cR8QP-MHI78(Q%q3iEn8vNe5FEKkDi7PVhl)u95hr?68#5OiMq+C4mWL zEPdd7Sh?G|7=G8s9`+zYNG`$LIbfkAvE6CDT1v8d;n0LEIc&0*_#7kM2yb5zSFd{O z^Z>tN7*RtsEp|2v8!aniteEdua>h;_=dCU_S$NE2l;dTl< zc8u8Q*J*F`Qohs2d$k|Ks|rL%;VXDYIO>o<6WY^^Lsn%ckYk zmNL_)0hk?lJ%5_r9sbeGJl9`$P$L-+x)x_kWik39rCHNj(SUKV_YszLKsn;%m_D|~ zfC1H#mzolRuw<(ZQgh6178_zV^EViYJVE4D01k;XD^*v{9EV5+ov4 zebKPy-H{rs@4jfOluqA?*X<;4#^70YKS4I-Gw=P%YVy{~>R-nt#yWCvLGYLw^!KX^Nw{;4QR}dyb30dx?FG79H?#qp#E-;DL`3 z%^HHccPq0Q%Y{w;*MFS#?DNeM%SHU_?T&gvQ|>>Q(Lud#j>sF6;!8(|dNQdA;k);(Wb523%5}aX zY;m+YZK|eDE_~D7BTdz;x&Y&q*$;POSW6M^HgMZs)QJG} zWP6l{b@%XSC#th3F7n>|8Tfi&^+}AsPIfR<=^@1tI&JoKtx+dfFa(UzqJyzhDgvOn zzuIW7p}ij-Ud{qw@3~$EIKW;dh)K0))6ASAJB8dI+*+DXUhwC9lXPSL{x6b$-S5vN zGkxQi9fd83|K(7x`mwPb(&`Z?M~;AuSRS;?StAAQ8=QhyHh=*n7xQ0U`!TKfQBy)utlUApWavPr z6Y;G97$6hZ`IFVlCCt0>i7Sj5SOZf2dL83qJ7tG`oBO^@PX>4cs1UH8iF4)bMS>Zo z-3FSdsUpwM?)VpO0sfagykBC$F~HVjnE!V3yFx;mltptFCLT~c8o_&;S5ksvseFcC zf35ArPLYUopSf;`q7p=RCBPI_V*&bJ5g7L1i7>NSQHHo@7sdk`CMEE z^Y0zN^S$&_YME&OM3WwXZT`XYp4PY?$uo`EvJz|@eCDZLs z4-vOZ6YEu1)|B}c)fvqCB6;*5xUYJw`)1e|>8js+u|nWibmtJFq1)h05HMw2KTCh@ z8}W(T_2WqoYjjtzs1qyew|iKL8#sFcZQ#nbiyKz9ufP8{%KAPdPtDtf_pto02;D4x zeD~@A2-B5u1fJ+o`}#|}UuxEP@wE z&4Z3}9R9+H?&Gct(6aUT<;m`bhXhYeb)j^ZQ7bIb=?TrIyUN5t?!;*!d%2{}jauPc zanLuy%&?PfNe)+UrC9ZGapCKNO3&|^`EZ6xLfd+EJHzVvf!Z-nd`u$0LjIb$9vzd& zu-{*MJ>sK3X|aZ|-B}P1G#(4QnBAi{&_fH}FLbN9rZ1o7g zVfs06HNERHmW#3wf5C7b1c9jFIgPEnI>@tGcf_m*+lB)E0Bp5NM z2=l_yGF$kYPl}o6Mxnbkm!WntqQh#L$wW9tb#ZmV=6l?-@efg8O6gcJH>BL5A{+ZRLHE51|(V{Qrqj3X`?BOx!`Y50`)_ev3`A<(e( zYI@Fo`C)@lKbUx|zffHf2cuB%-UrTI9$$VE9a?vG0dj*3GcOrB@xjylt&_qg)q8ce zYbu7uN}%;K)o}KpP~L5-Th`f_(p-s4u?b3Dqp`|foj0lhvn-siJ1W}*E$r*NxL1AV zM@IU-7=lWv`8nn&Ht18kF9+|d5hV7$nkLY&1ygI5&=A4kW0Mv!n?wo7QARN*7p2er z{7U+Ol3E-&A1yUXUE3YQA=#0*J9c5Emi(z`<%Et3e@&*W8@K2??>6`DWzurQgAtXN zxK>$K=?nqvOW33*#i-41PIHMmnw;e^c5^o0oHSlVNx=}U5A~0BA4T09ihlfh;uLVN zbm}^;lC;6Q>MnV18LN~L`_(RJg?>GV2hLqzd-l7?MvEklFq4U|UD1KL%PC$pLM4^-v-};7BX3VyZD+~H zuviE(&AD|F@{`#)`AFizG)=-qZDr54E+84&x{Q|$$&xms$EvJYSToD%zU!THR!q?6 ztouqx>Cx52tr@!{L?0OC8r1MYAiAZdR7Dot*lXb+rKu3-`jw!Rwl+ZZEhVId6r`Hw$Y`5rf{Z91oQ; z7skQztV?Qae^gYd+_q*vGko1zPCvqr5yC(CVxobj8EZL@BQNEHEa`;`Kc}jG9ZbSv z%W67Ymw$I{n}ASM4a#|k^bNd z#HBRIX=l~VdjuHSUjn&wyk4#jFKEyCF25pEFw=`O=MYx!w7YF%U>7rT1+Kac{Td`1 zfSHxs!^2yNNLKioFL)Cv(ypC$vfPIIbIZ22U(?l8thCqv=10r+>%bT;pZ=E};|0ky z-k2C@Jda%W$XJVoReG&e&?Oa!N*((IIf$}t*PGP$Y$72HcJ&YEWBc1vpG1lZ9q8nY zecC--(Db7e)KVtz@e?f6En})fh9{x<6PX_9Br@|@^1n<3$bB!b7Ul2_mV=tOj%xWn zfU6W7pP@Zqg*)S5Z!=mH88wji^;PF$o0W7Qe6e$rf5rPCd#-5Jdav3gtNyC9EA}Ga zKvrGCLchzy58*T)I{TXs^{TP)_QE|pMZ^IQ9fFAbFJsWAYYLwVYWP$DQ>aoRfsCBv zzKnfu{dZ8JxS>z?sC+Ej#+xZ3N=JSp-FH^mmARqcs5^V?N_KdB6r+Xvh-Z_pd^z;Z zjc%b|L2r;MW(p`4?X?_{IWVHjv%Y8F3oNz{VBk8WZYGnh!bEk=Jg8pfIDk!J-sDW1 zeCdvaIOC|Fl&p_3UT+cXq+iK@+#l^Z*hkJOa)7=SzwpgM+Vbt%P@jCtv~kn60Sk85 z5Qcq5n_4^4F&m@b+T;(s&YuKhET1*|=H3O8MMryW56nyfW26G|#q7a1+I$<_ak*C$ zW2#lW({GLX;E|ewN|ETpC3H?6ha+Rsbc*bzWwUcp5}O7$r9IRd&-}SVzNaG%@I9_0 zsqg#yx~mKzrIvi_ov-W)M5#;>)05C3j`1-jQ@hTs%C_B~{G2yh`q0wf-J*FUlc}n7 ziAPP+XAjnvaIrWy`&N{1Qlk1~aJyG^UxugS!4YL4*)*~CU0bBV8e=)w-6VprnZam9 zlCq&0dfl;o%P>|KG5L4gA&a6KHxqez-hu0@Xsz(F$~B3>;sY)-PvuP$c1P%yp55zx z96VZaze{1i#&3eyraC6sYSM{?Bk}kzY~R$X5aMjc$N5*RMA|FA?3I{Cp0P}QOdF@x1K#=Yqa#24(}bWN>7NfZ zaz#7kXbho^@C?xat`?bZ!xz+6ROVtNA4sxRKKt$Btz-9omg@G``jx$EC-RT3#xG-2 zhD!^>xw4^tNVdPH{6QLaSF&8dTly6_AE1Bx!56@>S z)J80q=x;RD7kDFgrT~EA!!g-ASY=|h;3{XccsK%U3h36Q?*NpNI_0?|$hI;Se~n+q|37VGe=g@DO@n8r=tuT;N%Bf%J9eJDN3)64S2wcAz4?-@aEk|WCo;` zWbdwl<7q&0DgQB~r+ng$CtUF4>Dt`~T$b2VcltD^Xc;?mq)Rya&kpB5I9N7)`9jL| zMcO9;g_S2<1|L&RvkwOjk2M39*6|GT0Q;^KP`s-C@PvxWxuyYeLbx3DP5(O8eN7h61CMa6C@xlGI4IQzbS{LGl!O)>j-~m2>5g-bn z1-6tu2SR~SFI33SG`RzwPXWG9b8H1+${yrgpl;ZgGy2K2$qH8rK7mBakhzcGQYq}x z<`@115wSqTXFD1UV{x?Te8zpX2L2nYkVN&5A^h}PN?Nm8$A>mC4WcLA2}F|82f&yB zWWPWt4iGBlIq2ylpfO-kBYzJQ2n~2EQeGe@ux|rUnS-(h5b*13NvvAT5|>AILuKE+ z0RRZBSQd5Pe>9CL3ZTBn=WhD>`P2IqWV`PPY5&6YZ~l=-eq04xlR6=jL`$=!JM!#K546(&*4ui6tIXOaXn6F(t@SoE?~%pZ)206x2)N)VRmH=$){ zBSia=lzZY9Jr=ia*U;aV3R<(*uvjkL$0#FcYuv@UU=ji#AePIl@b8dO z^4s{)&w-O|@+3B75f&ySKQOnKmJ!p%I!D>u^CImlO1^0l1N^0ZwRu2000SO#o(n{B z{FT|ye{q9fxu!f$eaEA0kYmr?!%umq@4h8X%b?etFAchN?2X8{04KNEIz0DdRLr*Z3~MnH&bxYCqxI~V!0@)r;j zY+S)v`7Eg*Chdb4^E;E*_MPNZx=p3%ke?O+5`xy4X8=Aq&p#bHAuv!B z3$zSf*s;~Avsq52cB;b)A-`WU$;W-WW;s%nu{kM6#b%wcQi^|A2wN2O_E7wj;`GUN zT!GU@9G;jKszG^E;^IkmRVzzAY#bE3UKFALCEP&g;#U*G*^WX<+Z7bGX6GifODAqJ zS3ogB%+^?{!-%MTINd*pN%t2^=B&-f0Q&gfG_UM>$?5lplxjA?$${ujShy8kw4^LR z;Tz&8s(${;M9|;@1>9Z{>c2P*3=h!7+6ke^`jwr49)0+02*ZUai-TiLy5PRjf&a$sG=QiwuhNG0Q z)pFi~r^K=n;q8p18rE!e;U7Av7G-1U5{iyol{N{5T1?39pm{78&ueqHCg!!e$X5C} zgAkN$c`Jpwp~-O}L0+3S_PjkidRD)1+k-LnP+MFY75TG}KP!7Ax6R_(B)9t_EAgHD zBzrG9T|EM>R($U{7&5PX;V=Tnuvypr_6%7BPI$3MZnHkf`&Ek5K3>*mzD0Aa34ZG) zY$B~mnW(#y9NycpQQ@p@8NOr{^gT%JK=_qP9NOuqE{PZ=?LJo90}T%-7Sdw5LVq_f zux!AK4+4sxQC|e%aCE8@+#Vr#&zGX~PJ}941Un_>`n*i?flt0!o3vMsf#`S2X^6o6 zzQZY>YiS_!3IdhqbCEmAzpKe*qh+Rd?Kk%KhM00_k8l($j3j8no{={csH7AH)R-%M@ z=<~V-+o(w?Jg<@GM&gE$Y$#DEE+6s(2m|Oc5gIW#1+aQ5@In6xSg9aa>Ul9eH~xNK z=e|hD!q0`?#(7nscHcuBKR)G~9nw z(WvoY@qi77*T?;=G~LMJ{ja?-_T|N-6m&dy5s1@z%U}H@j8}dT?UCR64vVi7@pthe z>@P#J#nk7{`$>SbRm5`N3_oi<&|4>{I^L~>V;^Y5=u<~F=s(1yyfaZ0H|l?*p`5h0O2pX-+F}PaAzf+Cll=1rgr#uj{Y_@ z3|Y?uG!boseu1&maEhj4`$Yhn5|FBO`Sg@+N%0)&Z7G(eLHi#k=2_z%v6sVgHx#ET zwE5(q=jJoRHWV$%@8^(w8JBU~J7!glH^oePs~pnK3MUe|Z#Rl|PVhk-Iz1OdMtytE z0#&lnKu;1tuyVpu%X9_b7*G())vNs1{?PEZXI~)uG`efkceEF8WmcUteqXtbDOtHsNiJuL58; zrINeau{uArT;iiSNN>Pt{Vpf zK=a_a`mkBd|BLLcyePSyewF4(T;O-rLd}pIG|sWG=LYA1+adq1{0s#$V*mgtZqK3E ziXi^*-vzQbuli&P#UpeHg>2re@Ue7rossMA&xm7&&-D*^nOyPIHxDLyJ_zR&JJ#v# zYfgO#vE@?$Ab071YdCovl^Dcj+=JE+QUvQ!n*EiMkFeYKShYu@v0F_d`n2TurjG(X zP?L#*TZUHiHH61uGFuCpL^xV__W@deWJ%F0;h=$+ljQ3SgL_drpLx+<&FGbDWVi>ol0}@v3#j zI$+?`QzeHs@q83MsJ9G=mJIZ!2+78rz1o(WIK&b>CvP&TW_#@6oeB#@+eA8r>Mmmq zc^+R%EZ6?;>IG90hKw|a=|>hB^Uy>=213yj0auEZJtuMjUo2U<;!f!g9&qNWF z1DJQ^E(qO7-o~t6!?0=UyaEZyL2}*y%GN*a61hX5df|+34$=iyMX{?zDa!)lqRV2j zA>9m-I!jV(-ho3LFO|IWS5;{ZU^W3opGZkGy9KC|@h7A9e2^N*boXb8`&aYD|Cd^2 z#@71p&~cZDOEQ&Hijyi|)9qNdT~u4BfR(uj`D*9=sE*um3=Bn9Xc&OO_K@TGLqUqq zV)#EOLcOTL>|zD{wG}o#i~3>E?}*XM;i(5s!@KNz8a_aepX_w(ni>F5^8Oz%&m!3G zp`?yMLZD)DuY4x-oLin5z$zpL)mhSvY4P)%(^8U-dRQBs4KxPh4)oZk+>eyo%j`Kp zByc}*|3@+X?c)f)DlL&G`Zms@H304Ku*%N72XrwD%t9J=Yvy!*Ur~SFt zZw!B9uvwLDQQw}Wx@5pvmHL!@O9cRk^y9apF z1cV3v^P&O&aQJU8NqjLvcw7%WHaL@5)81ynr#^B>!&=+xPJmt%+WzP{Aq(s;7Vr-P z|J8gFK&~ae9xBx_0MKewkMjVl09cZr${-{K2>F*o4gV8zgc5+%KP#q}qQ5~PQV{5w zBmeF*iP3VBhi(kkLkG8(4MH&A15DM)4SePR+K@rW@qkgZf#NZFUWXun2fUOL1-=6a z5$@<97}(7&@Oj4nf_;4x{R#hXy4IhD0H|(yCL9AmP82c?!pVwd1^wqe7{DCU(1A_& z7eUY9uv#a=84pm><{fn4e;-j47>xsoO?U6Gh49nL{57oO13+3VV!4rjcan%FWa>UI ztyu;|tb8lweP{>B0Ma5_C!`PtK+{e3qRm-Dyd(eHst=sL#DC@+ED5`tKpSW#(>m4( zR3`v1(l7(Cf&gqgV3xQ85(j4{@t=uqut-0N=YnGQ+R|70o6iJ$pY(jnBm*Ia{|edB zWpmRJ0L{UvvrP{`i9f3iT2e536`%t_o~QSpvaqrO^r4%WUSL^R8*)Gr6Ywq;1y4O_ zE+XUrfb>NyE9pP)!Q`tG?}HG&G)Lh(@v|nN8ezi4lc67LF?WLFKvQXEvPxu-PLtH` zDDd0-Fp&Hr0(Aq1RAsOVLy7gZDz@IPeq0M3j&j1Hd1Fc6LeUT3CKeNU(53Lzdt>?M z$ubt?Dn~uK(c=9tq5cMM@5@O578jM<2J2lQpPJEl1?<}ao>~uMUd}_7I zgSZV}_r8r%WByq`(%)tOUH`{P1hqVu5cATBq}`q#8h9K44OB{nPp!Yeu{e^0)}Z%)0(qNs4?u+Y=6lUVwd*!c}* zz3#y!J^1~(z3He@xHmhMP=>=*4EZ=r=#gtAdnCWa9oGXIGdwU-sVJl;PRW9{%}4bh z*fFBRj=RzIemr_O=!i{dn2P#K4W3_XlVq$wqM(i+igxo)vXLzkh-Yt*ZKWsI!cf16 zK{k%|H~b|+DsECjn-(37;@0!ym(u0EO5HAyOP)^nj3=&#ktN*X%FhbLP*S|rDX`5% z$Hw_axd5tZlTMrA{LfgZoMWsMwSz*!IGX{?uxot1-vG!o|5@ex5>2A zEVkckW4VHv(db_t)uv4*v@^F^cw^1f%TlvPJpSv?;IBNV}$LwZ*#380b3Yv{t!!J?}fAqO(JBATj zOB4Gwis9KXv-H8E?fR~yv8a5*{Zh;McytD;xL>?E9zWjRGvgkH$o^K`+ z_MmU3DJ=~3HcTAWv1bUs66&F^tfpzQWF)Dp8pB#!Tj=b%{?&VB(lc+?7ibMI`I-h) zd@Yve=+vlC%SpIzSp9{?`GXdVq?CgEMyl>wy4=HX81}|OUhwPSP|OCaJed=~6y39G znA=Uv$CAJ!e|#}ddvI`zWxx<$=(d;t>+##INQ1=QRALA$uyeUP#3=JQY)at zGehr+4vR9;PMJ;rU1D@(IpNC^W6CD&>AUrc8OsL}9d@HR zt9@PhDFnsG)0(?jyrhrEXOAAKZz#pG{9J<15gE%|KSsA(epJ~t1Nip%(Q-BU7i`w< zH%!7(ro+n>1Oi)LWuWkAo=Z~t+Q&SznoAsMI z)*O^w)@92%aYJ(0$@tV-lgPGT!^zS`(u*ClFA`+FO&~4g1b0Y+FkZ{~_!? znXy18lndn@ZL*81Ag3Sk7cphl@adxV*;Sa-w+?i%ej9Rf_3eSiGlglss{i)wRS?`> zR6f2~s6{0{BveMa{jF>lhLvtcDg>#iWlxn6iT`)p!`s{h%#;~QF{Vltc@1-ci!pV{ zoik&n=`zCBdzsb9r=jT}IL5&AA){Pj9|5~p=05wT-Kho0o%*5z(yg;Z>D7n`KL-Op zO4*)vd4`h*OyY0B9Z11-p$l=xsB})!disV}u{l6#!Oirr_zuvC3PGdpx3ayo^3l;U zz(pw!a7g1i)f;9Z8~OCEK{&;4&dUP({YtsvM3q1&p8q5!+WT+;QIo>W5OI#Jt&epc zy!$slVq$Vm9^vSA=;}o=Ed)u4)1so?{V*Z6F^lxMauN z=va4s5y&@}V#vOayK&`oOS~7_(>jA{sm_ zMzJnM{X*0v#vSA>^mItAv5i7XWgu8km$Peov(Z^SH&6`2CvDYKOqTE|vp)@v%&% zTkq2fde{H_ob+X!LA#faW8?YIVWN{tZSk)B>!y?2krmu-E_Q90*1chI{3G?QB(Eq6 z6w496odZgUR@_g|^mgE5%HfgLfeYG|+_7?Ew%~#<*^v9RUj!$-AYz_rFj|!=UR=lW zyL-Os&+&I1G(6)u$ug0bCu@R=hz5NnXE_DAuZfp?5U*X)p+6k>ybPVxNykr-It>un zy6L5<3#n<4ZrEXFRQG~^y{{D@6X(;CB+q_HS+2;z1R0BhL5;i#kSy?OYa7N_HgT1@dF&(Sj0mTw& zKw`3q8s~w;yyY!S*_LKcYpaz)kux+~W9$hz8D=QHWbTBk#pMr?-}@qZb6@y_PgD{{ zQ0dQfY9lq@g(zI?pF1|5YM4g(Vc8DJ%Y1;LNQB9Ce&rQ1u^`pL!Of*=71yWuqpemb z^nKckMD=drYrS8CuM4Sk2ZH#?W_W(8buvV}JX1&8!gShTroxgtv#-}@_jsVedMnT7 z?>=KlK*{tCQur>Bq|`x+)&KSm?|Mx}*l$iAfr*ZE2jdS>{M-w|kH&o&V4T@f7uqBb zE{2sEUWClh$8+!RtgO^X^=52u{(L0JD$1Z<#Aio47mFN^2!4~ZZ}r})xZyTL+mr80 z0$ra~3AQ^Sw`SZb@5V+T$?>o1+=>@FL)aQDgDo%0$QMO&>d}M6`R1IApr-veGclq+ zQgdhHFk!p0j#tmaOfm{H1B!vxq^t}G=w6NlC++zVyz@8R-aoDUMaJbjjl!k>ypiKD z^=pW)(9xLu9zXwnXuKaDTqqg+s<+rzRYtdd)sCv*@g(-~TqQcb8N z+RL50HpIVtQxHbxHu^hPfTmXZ$v70>ikIJe(cf}aY%!2Dg553(mf&7hP&y_%gK5fR zwedddW=@oyTTk+EGKbAn6D-w8qeZjwyhA1*xe* zatoNBPt;)a+x_=Vbl1EMfRLbw{uY30U8}uaq07um69@`^4AiPknmIaU0>#Q&&`tO&-9#o$x zRw664KJn~nl)q(HZYNsmK87o8I1->axmt+h#ss@)xfJ?e%1Nw_w9?HKqTtaysm(Khu+(GA30?` z+SY2CPB`-b2q|ev2q#!<1XJ|$^C=i?GFI?>)&eR1)K9c^`1kuk1JLxVbhoi8%qY>s z#Q%q`w~ni7YyQXgp}V_FO1is45Rj0N5G18LBo7@TAl==KfPm5^-GX!@AgMGWzkT%H z`#jI@dq2L8{4?*h_TDqI)|xeI){N`*)T+AavS2Ak>FoPeM&9HDd&|AhPrV9Jzot2V z5}JdlQNac=V1Hnd?tIwJ3`{REzOvFtxdx`Rn`aMa77M;T0>my`c{TLz1W+xhT& zM~SQ2F@v9rAnAlBir58W!0mGZ25js08&mq$G>r=Yu!iER0-gf&Pzd7Y0(hv>B%M+C z@0&K{{k8S__98x}#tbykww^8JQOf7LJySH$A@@_?wt5@tRMVAulLqfy5wp?M0AAlv zvx@4=hdfDE*9eD?ZZ+OXEPhbAcv;T5E6Lz5f;#N#q$eTq@%htiIx*~o0MEx73yCFa zp9?Nj(<$Fd7&m_cqLS8Kf+`KTcCh7pD@iN92e;C6~NyyRRX$^&_Y zj2}A_rApLKC*k3eN_}{??$)^l#J`N7Z?UKs8L#8W6nk>`QOLUH;kc^cPnyi*PV4&n zkr%Y7MZR&T^d?eHSWT%y4bYh;QrZ5Pg}GQ%^@ zOJYNE2j#0Fom269@cy01gZ)G3)PV|RwpmI5Ii@f9+QV6e=(0bSq z`#l#VL#Goz=u&I#rcgqn67QG2#`@NnlI#JD@CQY1Y1)~n_Ly}E+%X#$*U-2$m}3G| z@A|)n(_nv2cJKh`5ZfKqhaIMn!++ji0`(ot^q5os*AN*n`90oH%Xe8g1EoM3=-8Xf<+?yTE;Frg}b=P$p-&QU$4P)me{*?WD) zP=&&G6l}QOk(T;J)8iat@ALC0%=b3ohuXg(j%y5Ts_!dfCT~G9dpRLzT~3D7i&t6O zI0Bv%I!>MW`YD3_bHRSKWbiGjj(6YRxn_HQxE`k2t`sT{=iY8b0lho|E-mKVz4W0u4#=V~ z+-`m33e~b1;zht60c|4Oo$A-*<_W|QXj~jP#R7tmoZf$wwXBdiahxcXE|@k}WAZf{ zC78KFQ>V@AO&IbQ`loqx@HlpUO=Q6HP9f%3U{gx4DNH}X345qZ0c{L`Ur05BX;B`Q zjoCT~0M)Cv^3M!B@b>d(C{u_hn85ctQXohJ!!UYbs`q;1`D2m>pbkl7elVE} zh^|52Pl5*~SVqzreZ~K#IS3D@%|<9w%^swa6dr|eUu@xD%A~(84-sLEkxWW{f0U>Yh@_M=9I3#naNqP38x0l@VmqcsO#DhWhnIhTe;T zmzbWVO8&$l$&nd4J55nW0p16nxG1|J76g{*zaZvOf2husHp%nxf-&j~+w=kHuWZv^ z)H#X-k?6{&UI0Wt3rI~JWkK4pD+n}+Ysf|AaXo&owzY!$!2O#f z;gz|{#?`7s#MAaCp0s}ZU71K+U(Aha2Qg*qw%6;TQG*QmwkD}FHQ`xQ4G*r*-o4ui z#rZzlqH2P7u=VMBIc001qC%bfhu6K`7lUuhC1bb|^qST#scRWSIc3{7V$tbt@4v)) z-{uUP;6!-uu>7U%rJg)M#4`Jf(uX;?6~p=^wtyI z{u@fbuQ_xIvObF^6J(4`wXrD=Em?l>`LWB4@KU58RNUw5tSd%sxxISh)!(xsx9U@M z$dmp#GPotBIP4CK30^FrX#A;d4%xU~Mcv~;OY)&jX?CnNYTk+_E78Ks=C&}m$~Qu( zDooI|Ez5MKUt%u8W}Af41shn}uFQAOK$^iE@k5q_9hjT0rs z9cSO3*W_097vwJLa{iqoPL0t7$I30^e=lL(PX-r37ecgtLFxSOHg zN2wgrO>}MXxJKR3dArg#rE8L*4RuHbi(yuw#=cS6_V;+fWz_m=24|tmDZb>@ z8Li>#C(#q@L%q}_Bt&JK)FZE%thbr;`)GDm#*QA;IPM#^N1_pV8kFBrIF^SD(hV7i z^UB@+_=$ohG8OhJge0LYw;MY%Oa-gvxe)qK|NYd^2!nTlcn{?^3uxZxy5nw%%@nyD zz{_p1cVKk1L#gfy`Ii*ij+D#<^hws5Rf*40*^Fbqsixld`R4x8c#-8E`9aB7#!`=% z^nm+C^-v#gC0Ra^6JK>n&lB#)ivG)rsP0yK$5RIhlaI2Oa@Cx*p8Whac!f1i=$Gq; zTW;wgNKd^~L}1rJ*skGNX9HG=t8q&96i4rVpT%cN+fz0xXC9~!xS2Lv__d%V-x*qM z?7FPopYftI;jl;x8}ZYV#sGLt&$`{Sjxlf|*s6&4GID-|0O5|0TGp((^*;EO%`mSMQr5;SvE~x@ z6zk+lr2fj7vFuTdMc_!|X}YO?JjplH3X#?WHtD3IDDJ>P*-$vz52a+4^qfdBVnxN=0#&Js zl_!QLNS{KTlDBT%Ih#;~Ntf09g)$W7Sq|P97Zn?xmdE+k-u8Q1r(**34djD@hS_aI zdLDT-eC84QBGy_UhdNrVfna4oiuA)9@}an<{n`6KpKwgtnQ+lA5k}uSwof^XPhzgG)y)$2>2gH(eO%vi z)@N0)4p2082sgZ#qx@QWm$?H>nn!(@6R0&egXT2-|WDt#_1t5ukN-yx!PFaG|6PSkW2PuI5)4gOgo z@tG*1bE^yT=F|^1@_kwb{;98(eRi#8m+qBoSLv>dGnXVe3)x&uL;KUY$@86i=eKM4 zbmmqrS2-3mktP^W_O)NH>d(Zz<7fLio>x98z9`X2s%5HD>_gg%z0-+B)Dpgw;;uPP zL~(-u>Mr@$ha!@S^FbSB)^Z9ysu(&GOVaLzsFKJ?@gZD;ORQt^a2@`oMpng@??Mlj zUKEG!e%C%&OXb1jU48K|DfGKmv#4r*!Y8-mcXSTDb4G56c9woz{uuqt7cZko9;A5S zX4$-J+Ims<)%(@!5UeF#dFe-M?Hqifq{*l2EP8V{R31kz{I}~g=QWK{40VJI0nCd6 z)F=+d6Jc%CIyv7I#0_}O^1Ua#zo9p-0K4zTvFUp{<<%{_&WDn17_j<#Jh?+%yvmN^ z^>;Rw$NW?tIx|0YCta_7l@Z^FqKg?erG%$%EYv;Pn$3{$MpUfg{bKLaKK0=1QKxF% zejFL>9HB3MG~ycw^`s2L8L{LQP|%9_DQ;PmZK5v85dTI9C!{~JP*<;72rcqsu}g~C zX}pU?M>y&MJjRf8E-UWnah~Q>yr>6UPUxowBVEq}f<2}>?4B*O`4etFw~ujl=JGZRf_Jz*ke*9exb)VT^M+b1EK`jtNM1@48(J%qFT09Vnvi4xj$`P5lb) z`WdEQaoG3?UzkS!Phnnxk~_gOVcNfhpK4th;$dT@fz2tCqCQOBG0^rfb>LgmC4-FtJ0hp0=o z!?W$C@%paVb2u``5DE8@a-1%_Sgg|n!*IPiib;2Zt#}D4JYNa*i5^ob%$TNgJhLf_ z$T-Q2g_B!*8a3DF!X?Y)+(>;#%zSr-Z1HG~Ig{6)tTXzTo=xy1vM1h$T*3RK{aEPd zj7ySfe!1gO=hr~hR7>zQf2X?>bN^L?KdZ-7eG$&6d5&gp6Vq9iN>;XT8SAaN$Ft>} z#F(Aeuf1H2Jy=P*s0HZwAKgrZ7pd!>0y=7H#MUN+O|gnanxTUI+&r%ozfiXN9#3I9 z$Gmcl9;lG?PZ)MwvD%|mCU-B+gX;xhs)0}BCmDo?rG*`pQLd;#ByIIM zCxKFvUqu8NRW!HG$Jk?c&Y=98KFS70o;$oHByXRQTz(4L3JILCJg$$s|4hgUh|L{g@dHq~-UBAMRS*)^IS?X>Xyiuo2NwJYGhI`EdKTPhT8)CV=r!kxI9 zm5}f0f#w;nJY!O8`kjbqmxg>bUh{EBrT`B53%=@adLnH?>8@?{X53@ibpRT&Yt1a- z3gQKgwph*DHeNy&Gp20WZ0_}y*K{AZA=#(%T}&1W<8Xpz5pHWLe%HtMek{1-L41iP zP}mODa^}f-Y$v!4^^?vSRr#MCwC)F)0EHh=-3!|4$tZP*KzAuUGsC8e`{)Dy5yrl= zFS*)n$~4?Ypc{o!Z*2QG<7m%3`@W?3WpzUXuMIp-q_g1B*j)=$m95~>W@Ai(PFlCE z)KHSui^q~FTCPf|Q-zebu5SV60sV~ex05GvSFsi%qj+%NK%xo26HL{v z^EIl}PG*fWE>UAc>1g1QWWjf42Ai<`weQYn6--4z0gy4FbuR%z1hGof`9{`YdC&m_ z4*@sOu)v+qc7L|ugYF(_Bk*WZ&1(R%XW&-6G6D#K8yt8E!oVQ%&(Z(v#_u;N0JTH< z+X=vRxdH87@_Ofqp*IwNsB?0)3=9eKkj|L>cYh~h7@1ymu4gOISFkWMf$$<%=>x1gaai>H!0;rN8RC}x7EvyGDQ1^nZs_E zU!Djz%bG}8y?tXjts2m+3F)l&99=nPVBlgbA(~Mvy(uv946X<~729?<#y6OZYsj>V zu1w4#$8;Yao_s(krgFLh08`%`(M=kws^@K&MQ!7z=yk_N>FU}0bUz2^U}>E<>R3&a zMA-b~IaSmzUl+VOYAhNqQ24bgAwZ%cD0i;kDXx;TSiiNs@@QpCDf+|`s8sKIOr<1U@{6FnoATr!y>N23<8`5 zfj)dHzXZKEAw0|;0oh?>Qfr&{VG125!ZNm{vJa%Na$|e2Ul(x_dSm)3<=(vV)<+kT zNhNf8xd#1K){q{h(l2}a?#)qS$Lvl8MVa=j%JPCYqs3|TRzZq%GEth7!OVb8wsEl)XY8^&R4#-z&)zFzq%tXer2 z>|>0b`L5P2<2l~>Mr8!UwWjmW%?yhDkgn^XD8D5g=J!`8`cFD-N85C2o4>lTCSvjs z^gjPWS|^~kR^9PA{X0TCf{HzgQjw1+a~uK+n@f?pDG~bZqh>U0Td8Mm^o16RtJ{~4 zVwa|-rXGcCd|@x`dyeay_O3C&fXj;bLsxoxgL6XBUbTT!M42=06(meyx2fg5zRMEU zlE{gGyct2Oz(KBJ?1gVv|2~7LF)>) zBXGPv-Tm?L)!4?L87U@ljN0x}7=0d`IRPE^FZ#YNO+k{<1R5x=PIf9FvcaOJlg}t6 zHiW*7P8MWJn(E9>p*8L#UHAAG7}Fd@FQTTUM$KVGjBuJK!Ah#VLvQNZla zWwm+{nQM z?;sFzmZ6$(b1}-3?QndQ-Z=aAVsyg`(R1)cEa(fi!;Eh$|^D+O$IAR!|jz zvqiw65xG@#`p0T*ZU1h^5>tHyx+@x2eu5Sgg5DRm79FQrO;U!t;b%e0q4B8{pfRuT z^A~^W7f$}xP5_YY0;ef1>73<*zvAnKyu?eD4lG*Q1sqB50hS2#3LAMa zojIC18}%^E(Fg|nZIApt!P)^>xv=@4X`xys`HlvTpUG_(V4wkRp&$}GFxtWRdlD1^ zVeqHQNOdL>k06jN@CpNEE1@u*sJ1+}b$y;VwE_j0x*PHl=G$s1?Dz2MGp# z@Y(nqYd->ifvl{uOeJGg19v+y0y(5!!&e88<2+$w;r_P-S7Hz#8 z6h7V_N`+QJnhSY=0_R1u3qnD^>4nPQpOd(oj|w0ga4$j;`9yzwpoC&~0=#P=3UuCI z*!_*N0}wEJD_%l|D`G?h*Fd*C)*c8U1R>FXR*^vy*qeYqUK)@<1QKALS@7KKuR{TN zAhf^=q<}{X7YBbcNb|ls9&7{Gjdu$!N;XhPCL=7C)KWU*vj5+igk(2~-Cx_%jwj#0 z`!o;?Zl4QD?lJrs1cZMa^R`$yW^-oIVan8w5n)1awWTE5a%JmOm%yor+0E+L!kmdQ zH+F6-9y5o%XBQNF61#NHz1{yV-K`j_1P%^R2*k?CeDy_GjTR(o4I?U-;PIL?*Z?eC zgUt3fQxbPGHq^mRFf63boZ!eyYoq|2I6$Wp#1Vox7>hx__J24-3lhMpbjYw(^4~a< zja>O3&UB%NuYu8=8K#L+097u~I57yeekh#|{2!bFnNM0|Om&xv)6d!o)+B&}a4^R_ z%5Tf$@1rR;l@YjcNL-l|04Ry0SP(y0gHY(f$)|y81S?BHeDI%7OK(^Muav5*m;&&= z05W*y39DR)gYh>Y^aXg$jgHk=2!MYHpgaS~;FsaRSo7B>bJ*ZbKmk^hzbJP9`pw`o zabVo|?ZF2Rh`=triOHmpENIBa<-5S9v>@QWn9}*l^g$=6AiDEjQrL%`QVwf@AgEG0 z9e3y7^#!buR#YkNnydEY9pV>+bNRE26q*I%pSqc-lI6BWgO+Mc_q>rau@9s)zX`!uLnXuqXSA9ECSW;h`^T(|=WdmNB=;QNBr zc1V9~-G7S(SI*qEq!NGv*ALuu)c{0(WQYD(DMXw{_)83NvA8e+fZU?_kAzfV=gH52pN!&o(;t?ajqj_-NU2aG zDM0dsX|6Hh>h&YOg0D!H=3xCuB5p-#upcYwbh`g@48d&`9iDtl6NVPbb(pzO>L@YIx zqiV5mTIvJ{xp1ZcG9}m&EL+3_llku>VA!xNk<^jSd4<9FOCwB*2+8fEhw3ZT+ZAkQ z6X3jbi>wwr-9=~x+kvHgdH$mh2XkBxD7P^B8wAi0cdhdS#Rk|7m-2b%I3BRF{^(8G zM9tx()>!HU>vSxEZNYjEJpWOcezRxn*L)Dsumz^b zr#!F?SoMbI9}Ur*ss$!E>J^|^7pSKL(mmeyM8uaBsihG(6M36g+GOom2pUc z4GpE!!OI%3a;C6<|6Ljm93OCB^Hxqi0wVHz{kv9~?g`$aH||^+uAlp!uf8p2c7qs% z{|JOggy$XP$Q-3y5*qZ25Mb`WNtt<}z(yC%I@rIAbhaql|1J{R!vuQjfHs-jM(0Dy zy4fX{{j?3L(r4#iiG!@*4<6D#QBUd;S9HP=f)5)(wV{ReA_~ctIrv))iI%)405Bnw zAw-DfJ3vY>BVZ~GpSA9CjcN9{nbF_pD|lm;`%k{3NXbk*%!1162Ef+Y3BD(Ou0(*Naoi3;Fe+s28ubQwoYdGwC z<~vDL(S`P)SylW`(w!s*s&sBklf!}0Q5Qj^)d9?b2d#a1l&U5&Y zk7lroU=XM8#|JVC$D15SQDwYKPW`!Eh{})Z!0P4#W2;`6UymIk?8APicmrpLrx^bTo86XJRo`MH5~^wH zT-Ktdfe+Ohe&=l5Qde)|Fh_kzx3vp~n248dNr8`pwPgE8>NBiT00LjmozpHq-(XjRMSYte+!&fd#)i7^#$L!UHvwW8qY?&PFbeC(?x%X zns)dTz9Ct(Uv(@Jbs%OK9hyoClb~p;6BN)XhmY%{+LM>E95LD8^PFk7w~a|wUi|Q} zkhbr%ScFaKiQIN=Vqwl#(F5jQr?Y$i_s{Zj-po}>pgP2gpL4f<7LPkVt5TQMLrl;y%be5Utl_<)(hY$c^JJ=UvbgbXs)-e5!1X7(wTqN=m9bda&3 z!uM5X;%(0S8$0t;Q^)A?h4%!!kC~SjvZid(Uq@)645UvelVH=1&7+I74nGr4xPLxv zSx~wTB(QuRzbV_TN0AK))kbY!cOiTubSLx9GNKW^7^T3f+w7(73MVnA_ArpWx+- z_t#|a2?mlel}TQYlTt%u)N|xMud7p-5HIKDG2dc(s?c90s2ZF0@4ll7;X-i>LrxE% zjdaPA?UYgL<(Z2ZtotRTPCe!pr&aV4KIRh_-0%>wzwzS5W;ohxR9vqAjj_V1zZy$6 zk8yTB$gRcEOS2vmNyZB z+kA<0)KEXct03zBtOnIqU+O&ic>!BZ?oY!9ywlcZ3mM*eDBOjqHIwWQYOHz(I+SRV zd%w-#=BF*{=zB;=CC9fsCRjOq{p)LnRO^}i*UN^tBJjG8juDB;h$po2gv`%~@>|IA zSDrsMlvt)B`1zDSJtLf~!O(=>zB_cs?{EEJ^Su&P;3N*HHBSrY#Fdz|Fp;B@9FoozS* zo8kYlxPj1~0q!5_zTZ-PX;Olh-l8U9C9+UF!N1g=9@xQHAcBiZ&+%Ul8BW5ORYZJ_b94txSLHh4=YU798^B>aIIdp#+zE z6>S>}FUHY%L)idBdEe0Q9BLuPI%$!FUDJ>G1*_-h-E40Q@~)@B9Va|o=kG1KJlNgA zKMPD|H7&(jf*JHvvgqsEctKRGU1JSi{T-3E?r|P~O_Ta^Z((?C0^AlBGQyT9&>B{0 zyOceIg72jO$+m#4RDWW&Rz7tC)3q5NR;4^&D>=I_G`F2lX$gKGSxwjUT2`ATi+sZ+ z_0-@!yE+^mAfrY^A_ra5N8vx|6ghUOg6`8>7*5F+lJ9_#nw}cNsx9>D!P8mN;bR_}2Tg)Bg82LhG#FA%~ER z{$1Jx?)l-5zXI7yr-qi_b6LKQ!baewV=)-j3Jy#v(2Av@HiI_brmYWpEaxZbi3G3^ zVBm|yzHM?yh%}GH8M_dhy~E7fd5ElIoM%kMjNpNF2xt1?g@)~DZ(D?gr+Mk&Ji74y z=2v~JV@vEEY-nTSYa24%9KF18Bc=XG|k+%{2(Ic5m@) z=#0s=KwWZ9vhjE!z<)Ygp{HGmcYGtGT@#iAQ=`RAZUd zEKgvNA&7L-?VT^H_h#rd{P2)4c`6S@tE9u`n_=CXi2{=t=KRmRBs&S<%ES*iXx>O#0A?8dy zbx~q4`<_r!-U_Ffnn_icn@q9q}NbGZP=aeA?()0|RTPrjGnC;u@{b8oDg zVXFSldGj^+lnlc5a!NHMqO%a;)-o7Eeoq3~~9GFlQeo7*+E3;MNlfD;~} zYT*k+zR$c6H2m-2Kxfk!AadW3{s(5@P=gEHXoabbz;TQJn=ggX2%>D*t}GHzhF| z?-yIOzV_lZWeIJU_@r^SdL~QENAp>>Lz{1UzkX!7Wl{64W#>s$G)Dfuuk3;#cw|5; zbl^(t?{c)8J+ZI3L~ZDDtQTno6=3yee3PH!3Yi#tRJdPHS;Uq?s6G0$;;Qx6&HK&u z!}Jq5O;$bL@#wZsU*O(Joz7@6nYw^Q3 zy4P91LdOPqgYC{#FPJWTKDb&qjXjlOU5@Fsq?y&Y`L1vA$CsX4o%2KzCrCxlFK0a~X6H@9Lq$5=Qk;|8XhVX9rvv+$Z)m$g}1lX4_B->r( z?{&})Kzd%nmT6;^qF+uxdz8j!;aCk#&+npbHpjEFEBnESup=Mx2`3kg3!q;E8-vb5 z_vpXZ79jwEV`Ws@GIQ=>T|y%uBL!JRoCX8Q8>G`c{!ecK@E$*c_5>$x4o7LY?~<=` zy4j33VaJM(@4CP3q1|isxJOzkN&8*6Bp<0*QX=o=wKR;{(3%Z9Ne#V`Q@sG>$3Kxc z%m;t51hE>xeV?NIqR(=Wp7ef(mgZ=~<5hTrA&GGhvNH>_#wiA0iq))3P%x4GJtd{q z%O^I3sI%qkl8=kCD!StpA=bea>`!YIWdzR(&jM}BO532c&UsfH`~g8psG8jQDy}Z* z-eUX~={oVdX6h<7Yi)AJp3!$jlHrs?N;>pxwOrHnqqvEC8goJ5$2A++ zmRpMFatcE#QNZO}cT$u<=Fop8k2hx>`OKuGWkb})N_#cp)>-1U;AskSdEe>$>Ha2P zEBR%_x`_=%+77kFs_XHZeAzqN9a1%X&caK=S$t5qveMc9Y%ndmN0x1iy{2J_D}^UR ze4o-ct=|rDm2F+Xt6}FdD2qodwAed8xx#mbl9=EmUsfxV@<1sQlO@4!SRmP< zBfk|4%w%{-P93bn3EC%+bAc}0)#5P}0L*rlH=8RZK??e3z+_U{p$EUg)8|g8@p53& z2Dnl7Qh-tlVTT}DZz|Juw-p%*0;wU{VHhCrkF^8)>kdTb0w_tN9h_>1-GLy42!yDB z$_XQ)Qtqyz35s<7$tDQaunn_=sqODPfyI5fS|A3_>oZd)%A5R%HHa{P3_8YvZt3*! z|Hs}5xOpaCe;7s|!HAT4csn`7pI?^sc6nY`0hJXgVCDttrutdIxU~|ts=3(1aTa+L z#CM`E*Ak{B@49Rk?GzgLvk-w_>z@iHzTn67XNc5Kjuovv`V7&$GjefU6a0w*Wn+sa z1IHz;jQS#;s4oM$86&a!N>z&WR=7H9hD1<`Th)0bQqBlu!hI&=N-_aI8x&Y_2mD9-BWJFQZurggCau8e}E<*CtooMHgE6rrX2 zz!~f=4kHNuBi(<%$)M2q27xC&C^!HLGgAFw9s@3j1eu-;6YcK=eJ1r=3seWM%CZ0>AM!Hrd@wDG(Z=@g!Cfh%W`C^P- zf>}RuK@_~^UtRnb@1Nv)EN$Nz!MX7f{5REOE`VwRC@FRR3l$Ahg8!hZxxk9vj}(mV z&H+Sq02}n*qtHvI$Nj6%1ukqiLZgYSr|kTZtCLxgT-Qv=n3wx6@|)^XU7Y#t?~(GP zrq6_(IYL9LK__*P@W*g`w<7tc1-O=J9mnKnp*w zE}EA?oYIG}249yc*IFZ@q&l&XcrEf=LUNj3aw@JS+*F&tm8!$ND36`0It@c5;j+FF zp-)X4m1f=F%S0Mu6&EIt9}P9SLr?rx#-*Oow=?+WdapI7Z<4q`$Eaxjm^t7Y=(Y`aOLys5z@*Ce=$1sR@spS-Q?{a@E!td5uL|sJ8{@ROZ-u} zfmplzBjiP2o$s*|iKf~YE^D?@nDpvskG@-?JiQ|rxM$K#8BNaH(Q~zlX}+}K%a0I4 zzvyjvkEA78c+3CcQj2$zoSl)0=*9bz<`n%m z0?3pzXFRPA26w{BjP+?wsA*$KzM0Ppzv1^-%twdxy}PFiZ4IP-2dOl)4&Jag(R1Ui z6E5_rAT9IuqZ2*O+Mgw0L+NhNtP^VzAIItwwoLE|e#Nohxe?`m{F9fXBWm-7*<)-Q z%|ec4bmhV>zNL+P7DmzfIR_(fz`+q}d5NUE4)46-SUPZJI}{8P0TjvA6LuRvoXO z>M>Ba4iP%CRot}vMP9wel2gl{JD(J2TVlsaAIql4tm2UvkSZNk2vNzDlPs$;e^9>v zQ6%!5=gvT9)39jga7uLT1>Q@dJ+)hMl|^^a=|Xxicer<5RZN|1xoPnK0L(?XO1RdY`8s7KrXWQX|nhv)5Dtf{R4rd z$?qa39`V2ICu1WjMo$aKnfPu40}7JhI3}N#--a}>G=;ha+3l%^+GbRRBD7yF8!?Xb zJT_%u>CJ(&@Mv$vu2|tv8!xidlMuVCXs@^c=6MWr$60EGY&sML#cYQWous=F*X)cL)=W=w)LsD zlPE*uXNs@k4i1r`tGxRWH!bdl_gN)jM;(mxRwJ6Gz2O!3)gAXgJs4H8q>mw93aS|F z{oh#M5xuMI@N0MYf$~6)+>rM>7b!i?%#+C$B3}M=KsZ$iZm{tFwJOw^MZSnnt-csu zmhh8K_e=QqQDweT6!zjh1pKV;pk_)x_k;Fs7B_}ZpH(s~kSR+=eIg7L zJ}I%KILJ*48^>FJOzqzNjVO<`x=>%J-5D-&_VX{cOsZ7=+spupgjK|Cag|^WHgmFp&ip;^1kOq}bg)E;9>;VhmNtEI0)>h2J`y#!W$D_xWZbv7aCkYTssQ!ZRjuZ2N) zv=^08Iri;7QPcwprZzTyrt-ND?=e zHdUrU5}xjyhoXsfmdakoNf(px89N2$9c1HIcg_juJyY<0J@UCalF9xXa$KjnmYM-; z-Vd3XrEtmtq>&#F#f2hFO-#{ZNSw{{bpt7>a;jcW9Io5~oeegk2_RG$&g?izCEIWY;6@_}+@c_3}=hY0ChO)YcNvWYlT8h|dW>4l%GD=5}77V?M9J zLb|5d`so#0pQs}8Pl-n6>Ekb62iw8C3&fHqi?Ck%A!Hi z?a&?S;Y_*HP!tXf>4zn0U?xU9DJC%Qcq!8q2zMfr8f~kPEiuR99HYs+&5zBi`e5OZ zbqN0bU3@b^jRDKf#`Z6ZZ^CjBQbC1zIo-{o8pnQZnX(@XOMO?kI4f%d#se6sc}-QX zzXM?&jh{zfdByb$lV#ko67MWiX3SHY$qTmIpiv`<&Gcrp8|CM)2xv_%R@O~c@hxy_ zOvx;W-xydmq_Lqygvm8X4`S5;aG$(iNwkhxW-M3;%nkUY2FkF{5;;HgbNzs&K7cQF z_H8h1X7@wwh|U>kObAG4=N$aCBNLsL-W$h2E(m0}7Rg)sFaSvNkN%hi;G|A^3N))i z+uyLEm(hT=Y%KUBz?N)~?2f;g+4;sF?7{6^-#7|POs)uz1FdSShwJ!q9N-72++0yBG3jgY-LwWJAa^71qi9bY< z^JTPT_Z;2HO=YSH$=k=2#Eg-A9&QFrHv)c}WTG<+3@>jf`3Wno;v-WP7eD+sPIx=% z7EsV51+*iq0PB(LgS96|UiR0q3a(g#iR3G4REh-<#B4eJ6H;Y!WF{&E^OHu{9U9M^5}U*>oU1@QY^$oqFb$xZsL z^+5r6Zx9Tcn6)au?a|+fREZR*uW|v5Q2)4Mlxf?d%l;=)0AL?a4I;taL#^H4NFZj$ zy2rlf41n-W>Udqu`__FXgaW`G?D=FMFdAlLHojMdAAR1a2_PuN!T9*J3#5X^Wo_mE zP(cd#LxK5?VNDNUmS^LU4J|q!N&^(g40!~SAwNJW4J5nnFX?<6>Q)PNoN&wq;CWI; zF{0*4KywmwRl_XYI<`L&gkjtd;6UT}l7%*7QMw_1(F9D~0DDCP>GXI1E<_}|pT`L| znc@#ZxuxXVSm3TWFm6uN7WPE$zCJSLQTLI#e`Xh4b}01Ta*J>0)%3%8St1>1t=0{H zTM>AIIw(Rg0d~(Vo!#fO7%xamFYLu*w#50RRIPM1pZKT`&g!mDx3N z0LDMklIjU403g94&OkPH{o(O?@{7ZYd1x&R0sc7FK`JPLu0KqMrA)OskIDrDysSF` z2)I!L)B9z2|HWfi_S2K9X3#esT>9w6HP{|v4GYm|=Q6}sWuxd&&b{^5s2#U?r=+XPyQ_t@W3*BudVn6>ZU7w8*+c(u za8Ezb!Gf=d*G;^l#o}u07jGT2!Y25J`BNRUqJ_ zhrs`^P1^Kt&i$eLKTYF=f;(%-D%yzNyqUN<0H6wkFfb}^#`0fh7}%Tex_=fCie7~R zkgd!<0T9k9oxS*bc7!S0S24z>CFbW(q9A6Fu(Bm9uoVLe#`{+0d{9*_)hy(}y<{xftA=+3Iov{+-zpR9@BRJ+{ zR8vi06AC)aIzb@F*3CbB`_ZW4BabgC1mTG5$krRt2+8 zKm-aLhg!1P)n%80$NQNeOhr0<```5u##ngZ$V+GtEz@DDP5)l#M0;3#|3^NOCX2REa@4``|a{!6#Rd5Fy4j!I6@ICuq!)aM}KK2k)T( z@C^2P;JkJAhl!Os4-%28K;M9}w61>_p5i(UDD(Ac5Cih>48}iLSkr? z9nozKU|Wwa59No zvmbx*C5}fM-6E)K@U0XSN!+_X$Of(AsPALzVOpcFDcX2#IxzCS>wQ*i#e0X4CecY0 z#!KjzrhGW8`&@Z zkQ9@*h#W#vWBKVERj)CG*`jSSr_Z*?ho8J~9nr?P6$^v4(5CPe+zAWuk9A$NA`xZL z29L!7K5yz#?MwsCWHZU)9FmAzWJj`c?^ooV-p)6wH$m;CxX5lf?df6&v1%Hbg71C` zN&BV?C~T@GEADT0dmdjqG8Eb)8@aS~<5m)r1Xom|wb#7>$Fl-!mJRp@=FuR@nP5-XVZWL+d((w|!NT6xNQ zh5V6zDK}_$(187b!Ptm)f9dhhL`xPZ6}}&kX#X{Bq3a{$-zFz#f28cfq~^j zZ2$1#|D)?2!z^o>bm6kC?y_y$Ho9!vwq0GeZQFL2ZFbo<&VJ^b_nrCX%-O&8bw#YT zGVh4UjI}ZVgquntPXI)$51;^=V_;bS3k8>^4nScZKZYV;013q&Kpqjy{8941&ify* zm`o2ZZF(`i04ckjAnO&Ip494f8cm71ydp~BVbj|m1~f- zOEpxbI-I22Kmr0<`bXSUg1PuK|6TDiU7!l0B>*u5sFTv6han(0rJza4c|br;0swA6 z@)lXuzkvNmy?~rti$Y6?0>(;5S9bgT0kN9@;0g%#C!74g*ow;_&;oV=jv^+21<+Z6 z?Bd_hBLE*?Mk9rC>{@N26IGvLB4$uE0X|m(?g!W`bIIZUFUE{g-1fXc_1B0ACAbTJ zAPhwSCm?@-T;@NP;{Qq$pveOe0Kz2yw=g;WS${9o2>;dsNHqBXGQeiYfB#$7t!6n@ zK%hMk{&-Rf(}?E!|FEwBxEusC3I5-^7sJk{ejhsAaXrW`<&CJ~!u$*ciDi?&2UdVl z9K&dF2b}L098$>pA_#iH->SKS8|OPCKIutS0W%KoZrA224-5W&HfLB_$R!=D(Z_W?e= z+O9qqjQ&Fh#M|4*ZKz;?5>d?TfEkeUp`V%JX%@0qPo^VfbVFYgthB-hYLRXk(WtGo z1do~l@QdpJPo@;i<@o&%8vi;PyzKZuson*GS3CkS85{TVIdr1a+ypqx$pB`6&;_jj zrGx)}NAngy2Gr3OsQTBe|1t0%q#tVGnPYA1`v0lKfV>gGqyKfD|A5DEEX7o&h|)v_ zCfq_+-mMWY>LX!B=7Xy(Qy~>%No!Hv__4d3nmv%DsJ1_8HmqpCcRrux8D!(J5MsnZ z>nYSPwk!Gp@Lo*-W1$etm9+lfq&(pJvu>dD{MpeX6krbj5ep5-cv1LAjQQM!fn z^c4>P%K`?tm_VU|nM$GmPoU`s_4@Iltky8)kNNc)B5=)yTTE2?`6*#O=FTh;{2gvE41;y~+_ybIlY9A0*o_c@b9UK`Kx%$tv z|8Y41U>p87Df}1MfGSpo*8c(xV33&LP;Z0+7~CE=favx#z?I5^nT93*D`3E)$s=*S z*$<>xAWs$XC!s|T+a&_hY|oXRnJ$6VKdJ165WX=6_w_BpZCn|Y^nu`sFO)LzG+Afh z|Je)V1T!s<13*%i|M@MZ%K%0SgoZ3!ulLU%z^H%FZ#2-1N&QsFd*P@C8>7|ZLcbO8 z@f5^Wf^*y+}k({{#xeo}7d6!3GXNfI^ z%=Uf^ppt7qz~nY2;r{-h-&3QxLaI(&X-Kn9AA`Rwu!%wM568VqRu&PS8n+(1|L!2* zar2k~HKk4+5N*lxYd#i-u!zJ@MZR!#)dhH-OriI;9SNbwx{ zm133jNRI9|HA`=thE(%4PTCKOXGc#)p@GH?GWkw&rsoxLS`+xE-9b1S<(H6B@v|M| zFtBhxY?PZx#K9=H*fyfs`*R5SN*YXE9nSScr(e9|eDGJIexz$hlmLbuO_G^!+z zcmq0!my&ovA3OR_jf=KluWBlKQA z1K+Z~QNgZGf9Jd>;%P+vff<c_#0@RLI(;_@S<_)yT)D(j+EK{U1A$K|@^qWMUDL;#=nS zOl;(jq1pBaBh8%ZmPJ2xaL&e?Q0ZopyQ+x2WjJ1Aac`MN?XIi+pTA_8IwV`eAJTv~ zPz^dH{VQe=QS$MjU3Bm#k%YUs+~heY(_f>zQLkPNVLqSlp1WP3kHCN^>_kB=XTbRi zIuE#;asNOY-hYOCL8E~F^TG$Ts5pIeVVnu=gVQ--GvDsDaLn6j47#ar%V{|+?6X}e zD35BR%w?03b58O({m`;XpogOxsJU)M>F!w+_4ED3Q@Zo3;;hqbEDd8UCma^&Kq{x64 zW)tyj@!g{|Z>f4$d2V;ZpAwufann)a=`V(<(~Pc&%NawW)g-W$-;EiFk+^kq1A`J+ zKkfe_c2nBRJ|TI-{mL#gqkA2sljYWWwVix-bGrD^mD&HwqNn3eDa3x&b7r*TcmRcT z-FheXr#gCZV{M(|OJ2+yn)?I<``*=4KdK$LO@jpfXp*X}cY007NOKZiEZ6QHdi|H| zFglQ?+Ux3!ep(0e={v|s+84MxXu&s7nEi^dR{@trSu7@26)AeVg^;>{S+v4k* zR->gjinRIG9WbVWB=-VggDxYHrS4nQbAn63wnVEcTeXq{xOtDLHH=j5QFl&jKz2og z2C=jLF`l-QIXsTuVELW21r0()=c!>Dj;uWcpZaKEfgzoLjKF!=yfVaQ^i_h7Ks}dc zB^9u)6tokgf2rsMIYE5h-7{%*pyRNQ^p}+tKOO;%T;g)H5a7!0;pcyMqk!?*(t*mpS=@ivHZPIt+w^B2bHByXGzbuW-)W01}%iTG_H7F2(T z@^7<0ANCt_8uyYc(P)-CW&|%e?OriJ2Jo7#P0up$%aI+>14C4N(O+Cnn)58w432G#Nd8@jH^=0H+!rwGRCD;r5rbcGz7wDwv!VMHs>xxcoD~Q1*sfi#ML+x{!owaG`Q6mUVKpFm1C9B zZ-puA&y~1KU&OHSkuNeiCU$ye7B6=3W;he>Men@P*c&AT{g4dzpLIt9sPRTal5bS}J4gId<6o$7n|V`A;t^l{5+4l}Cz0;=p-II0iJyoH(XO4J}k3DaJ6O(KEw^t0=I z#K!93r=&n*rTI=QebgCP;Vhhu6EW3z{K|DIdG-nTdiI5dLYycaJ~Axw9A4}%Qkt|( zwzc+KERnP9PGilHo5%46rfC_q7Io)9td(={ge6Ft(`=)UwMnsoazjoQ!1b@)RXP=y};zrkbizn1HUr|TB z50D>w6v~Q{&2p(+-eN7OcHC6Rgb5h$ZFl9dMMP=n$MKDHZh_=`KI*wYfV?qTa4F;0 z+$q7$S9^Hn@6n>`inQ6~JrTInw14EF9KL!+B6u3wY;n#FGRaVzlo*wnN5t`Xhuh@- zCbWddCitOr8&S^mGv*p{TvOCX3tS9e#gFC{6O#gmxE;{Zfbk4gk#-}h#)C{gF>p%W zOs1r|M?7g$Pp;h`k5!yefLlp}X`6B7*UHCBZm^>CA@B+%nD%U^SI_)y63KeMfS-y* zIp=x|A+)83H!COB?gli6-*lG@M>`pz;Cz+No{VHh^G$uiG-+yvQP>=15`8MIohk_U ztT&vEtnxr|wC+$b13|W*^(&~d>+Vn%6IJDYd91@$nI*h47Xk}VLv18)9~id zN$x_3xusz0VEAidS3|21S42%YQ48lZ%e6_2WJyeZ%#6$rqk^q39BdR;9B(a@8ZfN2 zcj~*?5KX(N?~>6xb%bi-4LigzTCH ziSpWLHQ%}QKlSnXTolAU@0*DF2``g)0`UsUn(CUysDan}DCf>HEFJKLOVm_62y zqe!Py()!R8XTym`Q8)Vzvq0-4uR)%$_f{gHq~KU-GB+>-Hs|;B*jt!Rlgkb=&U0nS2RW>a{dC&GoI1LfSZ{bNU z#uchG;j$YB{#Jy3l`8N7RWJc(!$n)#Epfmhh5J{SrMxREVYa3xl$45K1^7q5Win30>UaI zu#`Xh3}dic>~Sq&wWg<0U0+gTFf?q<%^#;BT)a$*TKLVJ@%neP#gW41$%+#Eb>ySc zV!A4~PT{^AI#`~*IA@#E*5UFX2k(vyK_As$rN-{-RRugPrTG@?3^E{qq9c_?qTi=8 zyKu#~DIZdX5P#p^Akx1%cPSLRoA|SGd!Sm3L;|-)$<%n22BU#lwm(bLj#m*2YI=AmTf*Yx72<*i@ zsi%Y_b44^^AU4|h?rlnAk!>IN)Ax!1d0&cb5genP5XhgBgqUpIgZ`-e+3Y2?X>=h_ zL5cJcK(Ej8sp`vJHiH(n!x^69h3RRl#6c6-{A=tjACsz{X_kHhc0CrWo5RVS0Qg8m z!mxEb(uy6o1%z$X#eR)veR;3LtPgs>pYheD)8f1ci5)ba6E6iVrVC8}OHaJN8fd!@ zs<}{vDN}@2KYd5ue0O$72K*IINuQ>u@`0Uzuv%CKG>hWSisB579|jMtbTUXVJ}rUq z2Nk9gaF@eZ#b3_|S>^B@t!KA>#^KTcBdo zHgFRN*E`-Lx(l|MlYF%8!~Vo5r@al(%#b76gU*1_Fs&HylkhWf`h%N+L1ha51;)B3`qtRu7~ROTJ?(S%Fe5hyZB-l`e#tTT1hAgN-bzN z2+X3ESsGk|5SghBj09F{+O*@_mokRgWsYo1ea4j`_9&`ePchE&xbMGwGvT7wNR=Ik zv^tZ1gI@`3JiTz#0&QTi*a!+%e?<_b_o3-8I3_6mT;K7IZL0c?WQ60f+ttXvGduha zE!i}n+i*dVhfxC&d)c;E`nIe3EueRD*s@@A=hO3S5=T1kTRX1=Y_Z|46Bf7y)X`;O zJB-l8+%H3>rP-neF}1LzU=ePG<1U+GVV2#sp5u8iH?)!n-njxKun$Gd+@{8!WbVXPV5h`@~EAu$Z)9RyECKCBh&5i}dFHsVbHJPtl_nvfby2KqL#a zq^-TjAG3-wu9WTj-~_IgQ4yxLDl(DPm<$YM#aTI8uZy>@PlfnWOQ43qod}o43;{2U zbr0-=S{%LxDh6sB6%PnzJ8JOZ+tc47w`7O4%|qPa_j%iNV;bm$n&CB6zm@HYe%4IC zRw3~P?Bmi5qViSayl!@e%fUNcPejreTZu7wg??Z@N?ycYE_L1pn=3QCp~?+|U0QzA zRz-j0Av!!Y!esXPYLlSHhd*eB1y!-uAG?zX98@}ITr@dYuiB{h5(ZxB>NqSNY2Mu% zR=eecT=8GhC4Hu<(vmXC&CfY58Z@usp-qO!<;7#~TmC zkgm)5&Do^`dcOwO??zwD@94>>hQ{N9KbL|OWS)Oep3Z_Oep|hMtGfXTzX>_4qCv|(pu=>Ud-dHId&6^a7TkA!(^aM>6uTt&CzJn@ z1@RIZ*bc9Dd$4oc`Dc=dqH0_wg4uwKtK%m~DwWNj*o?=!Jw@V+vf0Bg@~O`uG^S=Y z)iPUmCrIR1C5$w1J2z%d=RPbj)M@&4miG;eF*{1x+f{MI<}Jkv63#Sp2>ElGVSg#y zrmMzA_?XxOgf(oxn}CiXp>2dzrZoF_Af5|;m+=;Rur*k!ujhH$$2XS?4}<407czo_ z@yV=apGNGEVyz=A;F?vxelrW#A*>2m!D6;zo)!yn?7Sq811e$i0x?Y zR~fM6b0U>mYe=DdQoBwv?@aqZ@cyzR-o5J2OKtBX1Vm}##A39!Hu<Ok2a)L(bsr{v(1Ybr>XCVcek!~eW0=%%X@dI6 z(*MN>p_U)G@fAD*6j)0(0$I3ymoEh8Z>rO`SwJh z1Lbd`V@xZ3p!Rz6G4ktY;OGrG!6}O>SI-$&`?sz1;5WC?(@R~tjW~p1j90N+%u;tQ zm**fb6=~a>hkWwSF3OqLpf17!Ru3ggeB2_(9!?}Z*Z}dLjW(L2^N$gtvUBfpmJ4~9 zaTSFR*7}}>hrx_9kHc+0Rc912s|@v4d-vT|-@M48=@txbc=$-iJ?xCw zJf<5SAN!$vI*%;UsH{y~OrEMjq6f%eBcZZ!=Or9VfD^z(dRdO!U2|owc3VWsTN`4o z|6bm_Jl^WF6$@!AmsjZTf~dJp!#0AdwV+CGG_S1%zFQM39kQ-B)K%M9AY5L;Y-r?p z?o!QCq-vY*!nHUd<#xg2@ob>TZ$3}1xkn4=KWj?rMnUshz~<)*>*~e&zI~#GkdDe;v}%XA%Eth2qhduLK~Zq&`~md`R^yz!Ls$5< zgy^63o(S{04yjO0>n~4WpyA7~T!?9JjBzbd@Q$rGm=H{@`5(;0Ps&3z-(_iSr#dVyf`_rI__R0^HO;r; z7+fRQ5+UrGNyiC@_;Sj_84nYX)zUoMBJMDX@S3@)PA!{MoE*_6ja!oFxA$_#qjr^o z!i5XWd{5ijgIBdAL9YiaYJFc!lfo>783-V?03WG53E4}6D+ z5s=_O1{KsGG7QrwoJ~p}ghkyEW?GUh4^c0Ohv|wY9u0?A?!*co69R0Kxx5VxoW}(v z2NSv#(~$<|0fc074|_ETzKc1|<0nkp{hnhaZ0-DGH5<0318=6h#?+ikhAY2`G5uNSYrtiQdEMGFO7Qyoxy)k5i3n(Mz0qI+g1)r3m^HaJEA2QJV$6)crI_``E< zjm%JeLAzCSjR0G)vo6{YHKL;EYC))*g*6f>t$kM;f%5ht3pg5+UTEJ_aF!{gMz+5Y z-1bUg4_&ndy!Ha=jXng8yVuwDP0(0riEFi-t%07d+gT#oYoMY!$F3^55)tQeAWiM~fj^UbXMWQ=@hUw2b-@u|i1J0ermzJLlP3nO)LjCEoMYuy(%x>^h> zpCr#tT?|1dQVlOH75d2E{TrSeI#|+&Y6L*K8rq%Y8lHUtEVAHI7~x7Hy?h%?+hw7x`=R_Hx7tk`>1IMCBRIr#Vo6X&h-O?B8fQP>bQ&z6zqST#8wM)Iz8y}%Lx@smsu|$d2kF5QcJIq!`Z0N4oRAuA{#RT z!aqPT;GdGI4dz!%ffJ^E(8`lN4Zj(WEG4{aG=p8LOj|U~$17HtuD){kOnVlXk8Q-< z&cnOxZuRJXx4rn`&3_1*OA(6PDfy^7CK{I;?SfsG6E7KMo z%ldRg_dcNh8cZ5hJKcxf=_o>ju(6*Xty6}T=J4_>9zEOeucG;lDfmlMM%=(kSyVw9 z&7IWSi1T-vzp8V?ts7VxijtMcuKC{<{#kHemhu`L^@;r#FS(-rgx&$aauFu$MuF$w zfzB8G)qOX1h;gU{Zdh=1a!__Y5;NH8%Rp_Af?TR@=+1adnIGd zqIY^N^qSCWpOb{ZCA0qi5uV&{P@UShpel?0l;I}`+Ww>1`^#Oi;bVJ=el`e(a-}QC z_pN@f>~-mM)P&F)7~*Yp|9;=zoRE3ykVCoXBzECO%gU_?*eEF=tefCTKLwy)$@WsK1$uE#y;baf}u(m$G69n2wW}8)^*&qE~ zbu%cRl4ZiN63wVJtF#nknrODml-s0+PB(N|zgK>`F9=+}61^CRB#I}WNEkrhI#WaW zYjac)JGXyfBG%q6jqH*J58U=$WIdIDp`vMKe)t>n%DmaSpz=t|dp*EEVqJ`SyC(Rf zF>}yA2UA{J1hIcBwv2Q8T$^6#;j6`eGfDk?_sS}D^AUF{H*?gZF>0K5Rzwu@e2K7g zVeiFM&-mdUT6`iKP>Ut~ZjvWMOi9=VF%p`6`H9JI?ZFKD6goSv6dUDihTQyyyy8m# zom6}~-i)@`*)>THy%*=im|a8iUCJ=~R`#^ke=Eo=KIxo1@c!_5q2O>{frl^uAyDCx zn)zpr<=wjAZV$P0hOf63VzjBtUGQ&DPQUu6YMz1aV#DSB!4^A-lRd77RfE%Pfv*%K zf0b++E&?zjY+;DJ)h7lL2U02F0Mjg%kh~PWOMDg%sh%sf9K(I2$VnE9*h>0P*#dCZ ziMYeiRXN$`v2QU&AZ>BJrmWdS@pBccmzM_O<>oE7jRy5`v^OOvDCKFzh?l}RCOueV za>T;ly~e<%%O9nKIdjRidNQwX?9PU;RK-OK-=rtqfXw~Hr^wV95zfiJ=jx3k_ah-r2gRxI?7O78Ad`JH&sgfs%bYeNogW- zUH49?>jpZ<7-YI+FP|HF+i1|4f5Zfu_g_C{1FbPxm>?X(yFp3tg{m{>4E3s!DpF8Se3l_aA8Y#lk*;xY! z@tFE)i18T^8BxWdw%@oGp{^w&&D+sPuK|eoh=78a>R=11H{>;4e~rTlg6||mh_E+X6+(rUaDd& z#`p}k1v8OQUTG-Z6z!{Fk7Pa1J^wj4uBSl9vmBHJ&(V|MO#lnF#TbU1P@Q3ghqV!MT> zzr2_#U8Q&?J|EjmWnO9O4cDWXm|os>2UK+IwWF@rR0Wm6yVtO1Y;}SES!Wtidb2!u z5XyAftP4uIrM#yLC(Z>E?jXq1ocS0UYq!2UFqBJX(s;erk5FWlAmI;<+zaHQJIh44=K#Cn!5XB>^XN=1FaF&U))kg z#*!cFqNWDK+EtIUKbk6?)YbyZUB*HG5cj0qJah|0lR+#EAg^`{rPOZ zF8I2E8BdAgCXjzkunoVHFL$Mk%F?yv7$4}zP~a*@Saby)5vr`H}c<~o0G<&J!{FEjI`d%|{f!5r$tIFH?LHl#QE9Ebx@K!OM zEg@4v&+FhHv&R0zEeD%-VG-+m`3RKL_rAk*_(H4nChXy10{KVRSeIu=*7Q>+FK_#0 zw83{USAjHJC`;i^OsN|#Io!6R`9CHm)t7t{XM-!vB~5>Mo=iG(qaB7D0yFP3o$st9 z1?S3Hr7_I8Z~3Qvi5(x1j=7Lbg=~pKyQ7~MHgwZ5E%5%p))5`6$@JdYd6sJxhMXe6 z;>NB|8tJ6m3g^E`yTx)R#}G+BfSrUZWPIWBpA(~}Ye;PKG(M!D9D3lUYK~4d#rMNR zcmGMP!ReeU5DyU?2qrFkWwUf?sAUZt_>zYdl?18VnTkl0*p~JWqTQR?sCBeG-Hu;O zs&in=HYJ?+(VKrsOU^KnpUXA3%rX$7nwP;{9Z|eJUJ1fuJI4Rz%T%VJt4`TRHRi9m z3rdtC@280w)au?N*xz^P<1sqpBXXG5EQvKMOwuG+b(VVxgr?ZWr{_iAlB+dRxM^K) zGxj7yL?l!%EqJQ}E@kTq`hNz zb-Azh3Jw40FwMyaaiyT|R}a$J_K3Zu3uCp@(gQ>>S58@JVQMXDh`)KsscquGOrJe< zALpgm)ASU_sTZGxPIiHKQ$dCF##6_QV+~TjkAT`6GFokavxWOv-1q?0ivSFtyG*kl z3KwM`tBkxO|IUXN0_7Q~F5b3?$aiAF(e54G!-37hFke{p7qd+yTGFaVEoClu$Wd(G z_7}rarr75K$U5c^7^*x1?#CmDwNP^RE9vn)|1rDQ6@jkbW>(RDk^UZTHwdH&KgvspWH7!x&`60%frb6p(+7{0U5s33ea+_9yKm6vmGD`-z$c_9#Y8gW=(n6 zcCcM@oS<1kI8CoOQs$s(;#q6p`j#MB`H~@jqG>JhXi{4c2-7EU!(lJ|CotuIDKpQgC}73Jw~mMT6jwXH_>IS7A!w*tyMIJh2^!Vku9Q4_BuEHd+4#4p;3mzR5_bEkfkciO zSUt66fn+!^t~!CrRlKQ$CIWSs!Lrm_5E~;at+PupTGs_w^;7+qHHp-LZ}f%9n!(u* z2PS^^KkcRshcL&{tkfg#>(Io)URrh4)n?@4G_;_ke|Ij}^U$-WE?)>r{cK-3CkI1t zojac{Tb;@@QqSKRQiUmC`du}(Gxkfkpljj{2>xmgEtzDR1e7ct9d^ZV!fyAR+zNsE z3)SD~wiE1=dJj1fGKkws4+~Kz^W#Mn1lyewSvd+ZMHyu3{EVMqBY(NI46usb$AMRY zMCJG(GH&fl`{WYnug#>X*D0iCU>NT2#!fy?m55jCrUXY6x4jD$-%z7I z@gb(IH}0eMpt3I*U$fS^Lc>_kXw|kLlTd15MZ1R`FVz$c?vrT}c&F?MtITp8X{tgR zT-^YA+ElVg(Y9vl_LQP1O}H1$N6*fj5df6{S6A;DNV@%SaL-CSkbH&naRP zkunV0f)g7)iyHl>uJDgHfYn{FSs2<%`cb~{fY|jn}e{R z=@lQ0(TZ&YbB5X#h2^=ZEI0m}YA8TF$$a_A7Cu#9Op<8RuC{HKUp}49@fGCK9el3) z_KxCU0nOR%6SBkVk*Bu~Qk#=H>eU|QA^ZZz!fCk|eTLgJPj=aJkP7caM0_=&Y|`zT zFwzo1A{|0+6{9{jtaoz?G#XyGW-4Z&BKl4xqV?VqoqMwM@mAJ`+2NLDXI8kseOY`r z2Kzf%~K`G z_}M0>iGJ-nbI$TgurM%3|8J^p!TUvf$Dwa;t-&WKzYXP-4ckZ4o#XS-@B`|cu-rSP zyszs_?83an6K)`HF_&i{F*C@?#pM2<`O(krXjTu%#mNUdH&NeGm9VcA=06g_AM)!r zp`%JI`YLhE?MK<^Q7+_x)W0ZlM)+S1rWjH7rC6zcf9y6=CO#2XZd^I#2Lr$N0|hZk zC=ZAC^J126!L!<5KI@liY6fs#5gdHr%_rEy3epGE+dDch*if6sjRa@h`5qEyJ{3lr z!(jz>ft0_45H|F7GIgel%u3qVIXDCR?LZY>5k^kH?X(96Pb$pgLX-83=Iu9~@=%M4 z`UB@o_rM9=`hBksROorWr7d}HK)au~%Et9TqSiyxp`=eVfl;nW{{K-eEJrD@Dt zn_47eD$CD;+MLL0-em+Y6bSx-xpLxP6>79SbzI-ecq;1oz_t)n>IN4k$YE#8_DW5*PhGYNvJNzoTtP|~WD2+`4emXc!JsC6O`Aq9 zOaNY4AJ$uN? z6tRBbYGZ4Kss=T!0)gnYo&$R2*m!o6f*f3W1Huww)Y#tM_u4vv{OI>0Oc4oErlo67 zR{F|FVWT$9RoYytC&Y`i~VODRyHdlynTFRxKMmibHYYNx(dmc{M|Gq zU)0;nW(4t0$Xxsn-jzq<9hC+x{!d0^b*=9+?`h|@y*JQ@>OpuxT~RR)p6wDSD)P&e z0m1TK`{(kCThm;7+WCw)DY@KN780B)4*SB?PW}7`wbRIC zUDdB*G^(28!)#XH-uN=r3!I{kWQ93>@o;OK9oDUG<_DUbaj(~4L!GP9;|VGcAZLcE z88z@eKZMNH&smbjyH@-`3=q}Q*ALpVmB59<#2s{G%wolSr=Y7)JMVTpGUR zcNX1>XGL~0P3UtA`=dPL+P%X1i>yI~%bvd{xm2fs1JnAK8lO60`&ou@fhQu8M3Rr3 z&>xawYEz;6<5#Kc%}#?5nMV|XLk~pkpG>~Ec>yqTLTRTE_$_gfi$3ycup7IVo`MRP zy=VPmE&7j}pG+21w&jufoW~$ui%x)Wv(=q^(X|8|jf;r^{6}G>$fM46WGw2zU`E7V zcm<+bVNz!ig%Vst$lqqfwjv2Cery`Q^8$WN0IUCr-&I^1$WSsL)}6^RR6K4d8=)@-{d#2i@pp)DB`+$3SqpZg=gUJJZn#_l zElyFHt7mZmX`)F@2e*>4&ZNH_<(AL*UaOhr;`2{Dk;2u%wEv3JWe9oFKeR9{)fNBj zini9sJvy#FpRn9y{oW#ioKfi6rh?XC#fTF6#24G~t8|Spe)05+^8v(~`Tjy1I#*co z{rx_{X72*miv_Q@(vh!P)m}&VB`u^#Qr$yuk4}WV#9rL;f>E7o>zKI=A>$Xb-{mwQ zIhf-Tg7Z?4#Fl-(WbY z;-B-1^qd`D-lTM(X>v~D_RQb(wEYQXj05+HWbUGf#+^Nbm3+xND21BHp%zkM?;p4N zL|j==G#my?o#%}5TijA3Ksk8vomy#`+S|o6>(a$WR98q-rj*MMx1?JnH{t^wFC-Tm z?ieAId4{ncUmQp!2NxSYR(ZM<*@QsoD`cmU-`?qU+R z+=|0#AO1jh-eYEHJLTPPtp-NiFz&63OHrHc3+tOJ%0|dxukfr&%RYK-kd7K3 z9tY3gWeoAyOlzJzc>QfyWBqx_-R#IrtP%cn3WIY!+OkCCyL+b$&;QP^Ag20OkP~WW zo`bHkdMRGusWV^XVd82?5Ur5<_nT;U&fbw}4M%c7fDv4!pKRR_3~hkNh1%$Mmho+e zG$Cp;T;`Y?Fke==5rOpEsmMjS2x~GhVI}`w4QcG&`{_07xmjnAM;}FpQ6suPO{qsk zmTL_vY12^W_G!_kBhuDZ!>4`?{O9DC#Rd4nz zjoQ`;SnwB#I0a^`^yQx0GUE_S24L61be1?oBve_E9~1T8oYTf(D5(=zNTz{*Nx988eL+s0aNJ<4)?~{?0Z1o9zP27QwCS(tt(Ew!LdDg>_BS6 z=rp~9;XkFb&TdB&fg(kJlKtLOvEpUCGAv{MStE^iuGsS{&APx8P93I=8Z;Ci4}S6_ zRsOxGnbIOTK;(X=vau$ZEBDZOUHhcF{LAV9H!W-K^L|d97UI1mqj%9SW7Q^xZ^r#n z1w9DqnzkWK`SjZ#rg-?0>6n`3)XxUD5mp2=@8bYL35NGL=l797OYeK9<151y$#DZP z9QRDesO;VyJnHM>5{13GQ1naa6%C+wYfKFjY<5H8cYA26zuiQVC9O#+(V`uVoIrVB zS%-TV4)*a{LyOpaMrTl3#VrEEdeI27e&Qy3UisJrS;f6V0sck$+DLpS7~_^(L3MeV z%Il>AjXM8C7AHqI?Cv~M_*3f^Drf$%k~34X#*KH;Ku2mOH6GpKW|_&zx!UfCiVJZK z?V)k#W1fPl%BH1Sb0Y2Pxj@Hd2e~Zd`+hZ!BT~6=n0G4ZQA3zLMy8M+SW{cP^0uq< z{V94|c#jEJoClD4``T(w23JB~M`Ol5s2nmI-t!6HxJv)l)=xABS96E<;MDHF<%tFR zW&7SLu(EHPa@^A7 zUgd>;OFBs)GBr9l;8RR$5Qc)wBpKl*-@h_n3oTTo|C*=k?9kaVc>xO*qq@et&txG$ zkCgD2=%F~xg#o@!Y1?_N>M{3y#+f8Y2A$w<(2e~uv~EP~{#)%Vph=Vthag!BIrg26 zHqxT})o^9#(|CjLC7pA`ge7O=>bxAsm>8yz1PPhC7k}O!Jyx4>?~l03KJAgS+K8Py z{G~uzPaAcV_%#GA=a3E*2G}8>U{jeBo(D5oIl1J)5z(}-xp(ETUS%Yc`puO?>R9+` zKjAY9OS)xc99a9JZEH%9qpP7|IZShbRTSp0J`@vyGRvg-W6Pjyyy(m=O z?yCiI7UAQ-n^*9H%WkhIA2=n{b@=21N+3UZIWV6d4b)O6rp8FVvJ&za{qT9X1t=Ic z3mn}*aM|{){fIyK(e&f-&v#{pp)B>UaW~V$9Vg=OzW> zw-PXc1g2RUElP7ZQ4hjo^>MH2N_)Z50ZfHv7(XyA#U0*O(1tw<>Ff6j9a~*lBoWOH z!@|^Biy@CTS5PS%Hp|k@%t)juqWz2+D>DSK%#TC4;?4G?f@wPjO@W5yjb-J)$f~Q{ zGMFIoem8{GmT9ctXmk&=K|#9VgM>3sC-gjCS3MtxlBr@9)=AQ3fT?GbbkabRqaQ~) zm;GfxRk*dh)nXv?o2^lUas19j2vbrgL8=Yoa<4TuR4dT=!W-)*d&S!1!XL(o$_@rC zizU?|(mGybL|w7unoCDZydncOuPU#Q6s!B=+|ZU2^(t^{+n-MVB`Z51kbS!06Ww7q z^+9MB0lEHHW?BpogEZOko0hh*XMzHH`{;GH$buiMj|j?Oda-0$x2o=GR$68sbg+}* zY$PA8IMa>qI-EWCPHMAM{4)#zp5Ab-kJ}OH^H^MOc{7)>nZ<4UzWQ znyU58SKV8$y3~#73L_5Z>*7XlMN3<$z)E;Ip(h_g!v4UWX!iiBQk2C&0mHJD2<(pX zg?ZJ?*R!;_kL9y$5(WQ(8-nAv+Do@ipUJ1*=uqxK5D~%N=1=N+L|LW{6R}>m#_HY@R#W#3*RdnlBu>hd{Teskn{OXbmF*pUSD75A(4U-0 zSl)H#8@S1I24u&+uWZg20>)wo(K)=LXF)scSfAk6j1v?f&kz<3Fo~ zGYnyY_fwRZV)Fz#|BcQ$lBY-#{JNBv)j#FC(=@=jprNVrv7_zTgmCA!=_N^Dx~)r; zkax%cOfEPDUk{ts2=}{TMxpugqaV2I502r4$wBwYqU}WiYE+@{#~erek*u5;-4U#< z2`bs_rAzw=Vt7g^v%7vZXNT7uQw5nkOkH-xHcn{RF=mTK7C=$nrmg|+Cf6dgS;p*x zu_J!>I0yu~XecDdYP*PxZ|=+&tDXTzeG-=kMQIZC4@!YB6GQ~*x`hAiokP_YYfomX zyGZN77=ghCC2y17fW@AYAXg>zV4T_&{N&s>2d&TFVyJ8LQv~2vMaX_3fG|p6; z(e-F)E}%5Q@tZn#Ya~^T@vQ!QpLKCj?wzbeKBssD)=o>Ph(HFm(|Affl!lv*M=56h z{An}Qhv1=+@_}KkX0A2&)Rg+VqnGanTNvlrJz=mVH%erqQuHz>Ipa7+x3n+_iP<|E z$gM&%NLFR&08qjXE~;od?tLDDC6X+?S+uRlfVPiQ?{ILa?<{?qf$E6ti3p)_L{)D& zD~1k3P_HTUBX^!*^7>?=P??s^kw5IXSrXpZD1mm?&0=BjT9KDJ@2 zs4ZgvH}5qC_<_*sdBmsk?wZn_k6S8<{+5oPv7$M(jjyQYszz;!l;JrF6mqa`xrpld zj;XFST!IyeLK+A*dGJKsTA~|9mKVwdJ1Ej_B=O|YCOAgU`ot+Cqd0)miA!I*)hmT znBRA;e*^LJ>RG%PHA)c@&rVTWLTlq~(DKV*lz>a;=&bBOH)pS4O?gXGbA?aC1~kJ*j;a4YdckRWbIWWaova=$&un`!a zp|H7(0yyXk0*L{4oFy$wO`UU(7ZrmB;u=pecu@hyK9q?w&u5Duoe#X zTj9NfJnQ@pUnttkCG|Eq^TDsb0H44D>kx^IM;L3uFj6314ZI_4eIDy3XsV1YPT?oA zW|~tT)GFUjJKkcKmi9jP>Yog;7^Od_`*Kv`iV z^=;$ITv;GImj_jz##jra1O#G8d};)TZ;~b`Py+-PRL-_plCR`zdlHSh3W}EfI7WI`|H(e~~&K!_*X!mrJg%@fMYa(YruS z_{kEUK4SPX5sewbA{Wf#2g*oc0Y`dEZ~`wI!@ZY}*)ss+jBR|vTkMRzXUdZ%APhz? zyeXPOEVS}iOtllHjv^8k=xJ_Lz_7FrfyoeMv(>j{IRv*s;F}0T8*eU&3t-h|Sp0Jn zP531v#6-AlLpz_lhX5?gJ1t( z4}~%zH`9}F{^Gy;&hgxxAtA(dn4dNZdpu{9x;2hcAEyX!ywj;AW7Z*duk=#`P02lf zdY6zDJvc%@_P3fm%}PpTJ2O*T{-rS2=IvfQ!z_^P?j%51H@&WD$~_noyc)f{l=kc?eKV( zBAXZ87>gTkj~T=HuM+~K0M?NNY0$+%&Fg3a_bS7_IRFYwe`z?$msuJ*JU&2kroNl! zSF>GTRr?Sv%v`Iu_G?{^*CCJ7{hw&jJ#9|v%Wc9*mGKxadllggI6OJC|04V_6wwxQ z+y#=${lUs+O$pU7%g3@KR!Z~G%N;)eqMoW?+xCn@o%;T)rPv@U%=A0)qRV-B&} zpqmxYD%1gGcWzW_EyFVC8^>YLGPZWMASw5p@c3Isas^-w5JnX-*L}y03K|07aT9Ca z%X&cC_9Vch=!~G;Yu;DNy}3TQ+Ewlbz)Ef3pvW7^*V8CwZPIzk!n8}dYJj$x<6%Hz zodPDv%@5G}I$hHzmh!dKlM+bSu474gsr0EEm+7K8BODeqW{CZL`d1GBk!jP)W_+*KHc&aZ_z?zK^$&O`oR@FAoyH)PY;7q&wvX$9a(SZ=g z5>e7`H7{0}pFEoELz#(5R<6Nl)<73&)bS!a2UTC58m%_!gPy?CfpJm%Rtoj|Utr)Er(8!p*0O*9=BmK|Hi)4LJ1pVt;@QWX zbWBm#Qh?X(yk@@ZPCfkZW0YM;Vmb^fi!aDIrOTXXuBdCpBEYuX;|&6HA`6#toZFJd zFw7UW%Btb3p_H+^+Pk^Y?HEwnS>rbqTjn!p>>pWExCUV+WxVYk`;6T@ssZ%i0W1~c zu>|@~YJyJ#9`wxQQUC9b&}bG8QFE^g#A;8j*v${Xvvg6zB55nb^cbNE0X?zJ?Hth2+pluMC>B zNx5NK`QZt%=Dcc-XPhCUS!!o*cUKl#}o-BJ)M)_`P!us3`uK-4eC)J zWjA!8gY&MK6`D;wv)2frMxvaF9i@cXq_LjMe}%VEQKnFI{{~)e`a-56bCE;Y>E5lf zfJTnu-XN?^-!nV&YoK~M(c{rTX4?<4KDAbt!%^G5ueU`w_!VULG-NX6yhzN*jdt)4 z4w$U;i6Agah^;IKa9jI4uzP`~3+QQim6HDaBk$OK)}4Ugg>8w@yeh|iH^BHT)gc=L zQjPo@&fi0L+-~B&3%wLf^#IgW|I*J78|P0g^~&uqOmX!9thqcY4NPJO9pDV)0Tiho zu_cycc3#CWfQ~i@PKZRih|cgd2csHmj3wFRbY)^C3J*R}JddMp$GX9Oueh#PK%@mS z$H@@?k|9K@6iyxNgtYIh65i8X=nj*-=m{&%5%muowTQBF2QDr`F~Us5Whsv14(;A3 z?z)P&zmfLCZWoT;{{sN^*J}{R))Jz;E8olj+8e0Gog@Vi`4`pGW7D`-!7=(eZEZb6 z)Qfrc3JZ8H-fd{V?ormKW`|$p;^YhRTK9sIo+lV}iE*`>{J??dEO7(1mPNk_?aYD6Q}BrHDGOLm-yF}=%99Ew-hub%?`szNmvn4 zu60d<12Dn*8DI0IKe$=TW?EyVc|^T|rNGTa5XR%3V!Qw<9tsyk%j zjd-3qv4MGXq^6c%5D=m~&XeeC4oZ9@_)WajLW$#5?0M3Vqdf}HMj!mrJB8xl0CBJ{ zQbUlQgkz<}`DYFZ8s^qe`s|BF-v-ufw-&>KHql^)lj{?%6-sFb@qNK?kqN=H$2I~- z6A~WFK*RJPXIuVZjAO9^yYZGTnTW*I(87HQEX#WxLl?n??jkAP-St&1an`55GY{s< zMu}~wU|BK*c61f%l*N%ywfJQz8<5g~oO-CEnpomY4%beHc1K8EXxVZ4B>+D39XND> zzmc9EB#^PT(&J}9@BKAN)K+K8R6ZbG+Alsfa{dTWT-k&Puuo>_ZUj{?T|!VQN4d#{ z_p^-nQ8+;0wdM?=Vj2VzQ%)Kxz&qaec-ppD=_Nh4o5;R*g<>k&4S&~TPKB*qi@bOx z8rWgCa3c+jW%JBaP=K~|l{Bjo_fE_Yd-R~zNe?B&+47H{<{Is6Ad!Rl-iO=^pWqd! zcfk-kFgTLOLDSF9IgI$4(e3z_wjZs7D*Y5}=+x5re1W6NA582^Z+-TbDqU5d7fBnL zQu5KJofTX4sBuxi(qC&~j2Jna#SsX@^%Qac-@Rnlx=;v%+vu1^vOWZc_IbO;R;W4h zIIg;uUalOl#c;q>w=0riG=VGG+KR-XpuTj9^ZmubU4I_XwI!$k*pV>6V?h~3J^PFT zH{|$Radbqz88yuWWBp-OE_$#Zi*!2AZP3Ow8xq7CVy_7t#F9c585|s~NtaIfsP9Mi zSJh*6RTVl=5`Ppv$Uev)o$NBp&41t+>F8S`r06x)U{Xahazc$Er*)|PVF|7Zn**eJ zAi_;QR=T(GR-_0`7X?=*(7Kg)REReo6AsW8^!KUHduLvhzwFQeIM|&`Na_WZ9BY z7=skRmHV=sZU*>8M3i>S(xZL?azP>zx5B8SI81Tq0k*pNJ}X5~Z*Ac*Hcm_!A;3#& zK53Xjf=|96hN!ZQ-2`R`AM41Mcc3>puroZ+F`_n3(YcGnz($L(pdbN1bw;93o>L<> zIDb8_F1+Mu)@NJ$+;SfMQvoKXO!FN0#uIy)WSq||I10I1qBPKR&Y*L!8Z*pB%WXR^ z3eiQ1v7XUqfhT;>lij;8LDfD&wb;-#iKOz8XVSx_C;xY_8SilvwmdrY%RjMh9;j}| zBdDSjtza>6C*sATBA@(;$wt-}aDMLP{7jQj>Y4q@X?Uw07A!|F@6;rO*XOR)q}t#D zIhFG#O8-y3C?ot*LntC!p3k8t#fxja(F28KxFYp@me6zb=x-!zIdD?5nNF6gm&1m9 zRoVGP-4TDAT}$MC^cuES9Y@TIof4!#(uvlAcleuQ>}0&ejKwjN)t|e~b@y#hl73ac zOLG1fSa)?D99INo%1tPd4MLc|Ubag2#SRE1^_1^aVdoKM?1d@HkPrXCQ_1TqY+`^A;^>eVrL2GV zaQ`&`l6jK3QSm=7Bjb7Fua?T=IJYzdv`uI2#L|+%c&+XjQuY2CsLc5uHUNDb(;F=& z6Yvf>b~2oz5<>RM1M|;P3ZOTtU8O})(>KxZ{9tdRc^JOs$Q3_ioK`wE$=QH+VX>Rs zKIKC5Gi;I?+?N~BUaVzg9778MEO6;j4kKoTPQI?4__@R0t(UPAw!Fu;0G3qteyeKx z_Z%7hvM~M7p(X4qzK}7S@MNFQZKb?(u`N{WCeS^8emXEY|4Ix=Z$1wj72UFpCAXTC zUuFWJj;dVLt@Jf;Tnsyl6yQFC#qK8kY<**`m%&p1lm zzxmk6P$iw$kLDpRjUaY9L*O+4Q2~$FmNIP@HvkD<6PEfSsFRjPbzgoj>j5~of@DKW z#X&JQJr@~VZrA~fa^X2v0c>RvBN~UR|IW@1ajIv;N|pL=REY`mOmJpa0mZ>G_68J{3zyF&M+VNIk9mL?#<7V7h!0EFl-Al>)OpYM*RI9|iU8m4-XP z8NJZgcPxVS{3MecvNTD-WxTroyVJFzSOZ+PjGQ)`BS1R%D{@4zB~DO1*_Cugk)3(= zOK1D06zWX}=g&Ed4%$f&=W+vQc@;7yT0~3_Y*Ax>-HA%DVD?z`WC4B|*d&7CEpb^> zSD%G0@sK}U*v9c<)>S;st( z*uBhF;g4GyaG~k%tp*K{VpZ!3x#6PwN%F&m#dOzS3TZM%^(l?bH4D6f3}d_~ZStDk z(+A#E4mqY32F|v{T_|2|ra0CT zbElugtLs^T*gNNLqLT=?ycjua$Y=_YlZx+=9E4{?BSvkoGf=K>0Jn;eZy5}2BcYfI z$UJej7UPWoIQq&JdSp%=hjlj(hwE;X+wh{A(EwrX;bahkxORC!{+A1T$bkBvRIJh# zPCrLacFS|5ZGcBWye^=o)4mI5hfL3!S%#Jre?;Fhyn+$5lMLJJX{4EJYKbyTy#fE+ zq57r`C`s@+Psm&iKl`Qe=q_iv5l#;znda)^PYY97kG$u2D4vHt>)6!7 zf|oRmvcNX>t{(OJEVT@#QIPjHgaLVdU!fmk$KDaAntpL^l*3RaGCn$ncAzP~#Ad`c32Xxo9n#c{d*q@`H6YTeJ6;oE91&LRh5?MYI?;L&3GLO{S0Yyn`_UZ~MGy zK8QLgn!O~@J8cuK`&IPoME1r2dx-`K{&Mo1pq~2v7tCtVfXLDCaaCGH@-aDUr>Y_(2m<+`X}DeA7O4KEGFAQ0u%ct z82ZbGh(X=4(6n(ci8!2Xk-<7QeJQu9^+w1U_pOyb=pW&SP(z4n$3!{rdJreA{itB# z8bAM0o0&lU0T|e*!{zs-Af4TL-Mp=!JRBk`eIL&_uhx=HB9ZWJ4u1;d2V7dsA_naU zIvDg#&)-M!d}gQXeQiZz**!%ncUD37K|YM2Yn~Ngu4`n&E$qrM`#F5D{|KC`Z5733 z*QV?us&}u(McmOODxZA5JaQWqX78$wEkVWNh_AW9r-2d_pI)dZji8zDBYNvGml{z) zMC0OBew95X<=FvGIs?Y0b{n%sz2A!mPg11~oPb%zh}PQLPq7Ybx{>mHvf>bXj$A)I z_~6FimNBbcMKa7Y5QCma<+($TQWt_SC7OP#O$Jiw+;Ke*VM63XT0_c}e;y4q)_4Ft zF1PR}=5!PKpep49^kxW|xX*Rf;KP_?z8L|o8+|q-9hFVgFJ$2b1;H)RGL_)J8-SuA zQ$#yg#h{Keq=+u`5QMXXyQMg^Ei10SWL6g%NqKEVo2462*~?<|eynPG*+TI1f#QX> zM1>>lVfmUS?Y$|}pu^-OtV~x-f^{3uBNw`4{bWMIxQ|}85h^vz3X@lstcFG_QqO*O`JftsA6L3LWq7nOBn0;L}cK3SekEQ^1 z)m0YWm+j~bU@OIs>HU5YLnA9Q*EAe;@BZ{?^z<7s>;A(|EUVxqCratjyot7X`z zDt_gs>b(-iV8^8W-ck4K8BKO($}^@hEyeb-xH>$_`nX`bCxcp5jq7x3I#9t%`Y-+m zu$9J1#&K)UTk8Ol{+Y6ZGA8jD0p#b>^@+H`3chf?#tM{K3`Z}nnKw)Cs>iD*#uvC! zb9OtiRSZ#petc{&fd*}^LBP0cop*GF4Fy}ja91xpS?d7Qm<%7r#NhXJRY8W;KeytG zRh)_bU2M>6&D9|}e=bpW(mD{BHud#2?eh|5$At>3{V5S%sEQgh!A-`eYjhAOL7&ZT-IVXHm1VhZW?8zoySeUK4;C zGdNoND?Q<*oGZcrBHJo2eCr`c(Qhxza8emfyTsS|cdN$Qm+j}1j&l_Qb)^-*Vi##S z;s>j`IHEt(oF@Aa@p{escn~X6^N}a4%qVw*zj*%U0+@rs*K62SaCKqMZ!*P^Ex%sU zcl&7Q16WBt6>WEsC;UxnqG7R;oY@}4v9EfBgRTUjw)Qi@XS2>Z0boyt?Sgy~XK6Rt z$(D++9d1ovofa3I8o-3|Nu_8z*20@h+(h#Ts%b+rb>8^-SvVxfuR^*+%5Ki_;D0 zc`*(3TGTt9{UKcZBYI1sZe&{IZG`)Vq(mWI9%dKEAPj->l@J;B^0(h}(896N6dLEkvM5!~&X5 zrrI5Vp^*T(MpJD`xJ;u7cpDfHn}b?5qdVfc>P&}0TWS2!XbN<8I;k|o%!&H)vdI9q zDeC}Cg*U*bn@_<#&78&^w$iY+w0V!Z^9|{NO~J7UJBTk|@+9%JcTV5%i6r~guzM0_ z!U~ul725DCm}vzE8iTZB>;b(23=^z(lXVeau62C;=q4Sy2$LwY+kW%se$i!hZ*#G@ zas>zv(r#ZtHwOo2$~D|W$13HZO)GzYaPBu?2xEdznbpgo2@u1Kttx>Jw}}I&%PS+Z z)=!)!`S+3?FzO#YKk-LMmC z)9VX?qMTut*~%Hb94aZ+P7iy`T%pJi>O=F{9UGUP&_5{Q&GjWm#)vV}>j7wao!Y;O zw3tU&X$J|L8h?6nK9r_Q*NU27gKJIjb&{oVp0rnTK@lL8PeEvo(i5BhU`eVWY!SHi zg$oye&SyyR0X0(gf3)0|j6=&@ha2Z-fz=8@~kdG?gMJ%YEA(@h$_a%s& z=89<(F{jQ{Ew16Ni=zkU z%r4zEZ=`i;b>NW$$bU8JZ=B-v8#__}`^%$~?m~Ydbrz26( znN&Erzf`w?Ng1bsZ$2J)k0L=3Eg)Gi(E4otsQS6amkxpBLMebYld6mY6Yt+>%Hv19 z(G#g2?85Wp24EdtKon8uxs)h=`_5OzbNOjUukQv{B;rl;v#>dd_9qI~H1-!|$yXXl zP-n^D;DVS0tu*m={D{cb=wBKG5+p+NQH4AC~PcHEkECxz!Rn)U2WwoC?{F7uf4zsx&Dk~Z%oA(Q6K7{<#W+l{lU_t zvzdhD`Oe5}y81)9#HU${0c=*t#3OyUaVvbm%o{#6Uj*;{z;bqDhP7N|=2;eFsKCm0 zk%E0_`Hf?bzKV-Nk)`!fQSrW;)&)22K_iXV{O)=pd?2 zT+1L$8Q2*#rj^xp&tHlbF(OI999xXVY^3%zC8<{ zB@icQwJ*AS)5EoYN?t>^6XlH6?`<>HjC)?~6*xpZJeq!!5X@4WHluw=0@g{9Q{C4T z=~uyU&WiByR+DCkZyBdtJmOcenxEd{dT6N z2VOPRsYny=UCR465%6$R>fzqi09%(C=;-BhXWek=@^9{1mouFnALTEt1_moL!)}re zvUc(p_Yz%4bvpneSKt^^5lF3YzIy%CN>(k=^*&;Hy3g@@LcVovtGt28C`!&d~MNg(S%NKq7$M3oeCHWcvdufQb5wlF5s9V>|ccNha<@iDCBqr(9EcN z00-E%d$15rYgSs7lY{=jNv+;_+u^*d*v^;^Hem!CJT=nGpC+gsSDl*(^KTtVna(f4{n9F`3q#4(p8yO#Mh_5q@a!ASRH;UR?OXFNM1XjNLR#}{9Wtu6pOugIN0 zBTw~T+Ga!M)m3G^YhgXF!iogqU zH>*#vs-Un4&R@#Z5Gk?>*T~1l4<(dbAGkfsrk|Pgt(#Kq_KIY~AUp6ZPrA3}&YHb6 zSw2RysyQL~_}3P?w84pHW`bxJEd$M`k~ z$*5$pa%b@jckrz+x~G=JaJU}}*wkT>@>?{SIfR)ll{+fo{q zTok*(SyRUtNLO>C;P2s}0e}Pk>)Y$9+E_XHMSyqCM;GWlk6OSqVouYfphwh20g$M& zb8$T4|F-I!3Q;pt?x@2{Bvxg6;nMgx#QTxgd#jO0_Y;@1Su12E4T^PR=w{^(G-Y`Z;qHW-IF*711(FFZ?~p6X^evM6@O1){8#t> zf0G>9ENrUV;4o43oAVYYBkr4-Uj>?QOB@{I&PPGgyon{}>)Sl( z11p#P0b7m0&_9R=SaI#>pHW;Ku+ljx1)#nvno-bzec-zKEQo$Pm8VM7xW*KubEdAw z!Vab2=E+PeV`&8tW{h}2|oO)eCs_OEeG3fPp4Bj3jMTR$Y12CU5;wB zf8pH2@drfJ^92VsR+Egm4-%OmyhKd}&yJIBeB3}QbzCHSlXL(5uD$OMaUeQ9X2v9( zVvz*=S$q%{H7J9YojUC!vyJZfrxvK5_jVz9y$Gy$#O!$}$9BPzga2Dj`RXC$%SL<_ zoL{0^>uQW_p-;^q)-TR%%Ooe;7K=v6pIb}TMgaqItR}C9VFigVkhla;bWxB+P3DCi<~N* z@GIBST-P%)Vq7eX;vNj@CD#RXpd}tL*Tl1l8~# z>rVDmzQ$IEh#A=Fy>_2|u}zJOtC*C18wyv%V3YxG-LRfn498a;f6O+aVWNt(bl^4; zI9vw;aOe?o8P0C;o8jqQm;#OFCX!=>DWf|)h;usU)ol0;m9jvdO&M>#C!Ke+yh20^?+W5{3 zAes3~v2Gr%2>FroxPkkN3SG;GKPFrH8j1;H*0qh^NdZQyGkLZTZ_aH`vjJ0$~JO0B% zjS=RTlht!yWeC4=l0n@H(*I0gNqM82=@t_8rqH;VrZeew@lRt>uxgNMY^Q;KxxzVV zRXT8XJh!nz;kFJS{84-ot#unTKjSjPiq(6McmS;=@4<+%fTBItWJhXSu;R(`i*6Zq z__l8n0`I8VpE;_9Un!1PMKCLqiI@#v{BOP|M>M?}Qw-r5`y!RKm3w=K@Z`Q!z&fi} zfAl@_$^Ht?J6J~QnxY#k42=C?b4F<)0h>(bvU?0abaJe`(80c)+yua;4h z>(-=>W~>#)5urm?g}55XlJP8veLeYVsF=_ennH_eF%oL=X6Q3+6XU=5%sjseeUXQa zQ^($c6@zda>|xiCjLaOs&_j58sTK08zb45!9jWUjLxhs!abVdHg)@;8H(hR+v)kW= zZ8T>ja(^`mPtvu&4ZRP-lcelDWukJU4B;X8szQ~dCepo#3hy)7?Q1tv97(iejLNW@ z&i&2(gNO!bSXvk9T1T8_Hl+*1N^zx*aJp}(W3%+dRTFo9eb^ktEXb?+2(&7Q5nzFh zP0j#I7D&;@A{l&jrb;jwNzgDDv_EzIm@|lL(B!Z~w3z61pMoLT^OU!ftQgr5UA@%- zdZ=S1?vJTD#@S-fxz>uaDObE>BZb9DX7618&h{`yzZ3xu)oGS&mws?%S$4tOFUdy? znSBxW1NEIruK#!CP*c73WE=Dd=x99Ju{)FJaRL|mkUn= ziEFPqGThPFYC1Jg3U7nK0ZS+@18BseQ*wYq6EPqz;36V3xJvvkiAeImHB0t(HwUj^ zkz&Kdj(8CU``jFCLO*dVUJD9n*?*WRhXYu>Xbs3Kex0b?_33et>bjE^Mz=s&4Cq4N zSt_vUrSWPwaCrUiU-?Ud*EVDR)x0@GI=1@G0%jNf*}I+~Bc^4F;geHlgN@b4+Ei72 zG7h675$@JUeQ^r(w|}rF1g-3ni$89*Zqp*@7KM61`bbvjc~t2u3mfhXu91=f>ql(p z6`eWm`VtVJQswi9=Xe!-1MJ1jFUZIa5d?E3{E-W|$cEZ1%-=^yjq$lhh?<42chOIF z`yFrk^8LW7a7{*+K4He1S7=s zQ%HlyLVlN3r?LG}dt)=l<#oO9V}cfk7Md7)u4_n`hv#36MC4mvzVZor#7IO|+o+xk z7y^TK*7r`8ZgdBdWzk35{1#<0`1P1nmuxKpBV7dn$u3TWFGUKRA0k+`{UY%0@)`CW z?N3QF`ah17@F|W|)=Yy;tJ=i-2pBVK!nqE+!Nrp6nr;;OVBPL6=^piS4HyJu+nYoz zvMN%JtdSu_of&+022Hod2T>ny&4%iWH7ToNyEVRxD<;Z`L7Y%N?&sembh}G%wZ9Yz zM}s}zHZ$#k;?T^dR$j(0o!IJ|GIkhdgDOL5xuc95j=jf`UT4*Rt>8r~MOHo&G_yme z+^sE*@<4TqZ3J)}FOIoW$UJ+J<6YS_#|2d;^go4>`Y+1; zOoYZ@{Q5dEK>tI_Ggok$od#L^M?*1Stz*rz4-fOA{OLgF(|8-n z%D#=(!TM}!*l6TB%wzx3+LF#w>u*z<7cp|~+~qZnKqJkUgw6{<+BAA{xm~SrYtZ6o zf!+P0{PsYw4R=k-v;@8X3G#;frk$wMKqUuehl{I%rq1XG!EEY3()H2Eqgz|pg^S#2 z>a3d-O*A?c@3qepoA0cGWqm@MBko=J&~*(Tp$b$4QQUl)5V*Tx6}C58;Vz1b28`mI z`4B(`^jCW#Ru(MV9-w`Dhysn0rB<2#DK>IVv*JZSaO;K!1_R1eOGGr_;UwiLRmR(G zqxeZ@1N?cIeUBx2C>(ibF1rgpIYPc(wTFENAu%#D@+VtqaE}EI`S+RG0lkMMmdH(} zA5j)oiqO?2etahQlM z7aU69Dj4v%L0(CM7d~~Zx?+{Xq)HW>JXsMT|~MLV@!Ooy{_I9Wa>B;`#4`z*;pP@ zyTM^kxz%RkAXH1azY&(4@|5nm3{K>^Y@^O_ z0vA&vjthSJZ`5bqw6Ndg%b)u3(~49c&RS!EkMM0!Wt8}}hhe9?4`N%;ZsX=Z=Vk!5 zIk6wn9PF7opQ#TcO(gK_CF?>sPREVb12YtERa6`iwE)q)Wga8e7u5n-FetnOM`vUIj-E zNIM4}PBE+`yn$V8-iLLM)VAWU*?#bX;EB`OUj0XOY6Hp97mpq62L(9JBm%Erygu8P z3DeUGVro5K&pqWezMzzaxjrM=vX;Ku27^K(k%j`a`H%GfpQn%@1sjI0X?HP6Lq9Tv1pUTY#9YGL)R{>-JphN>JEx$GI>~rauO*5P2(A1X ztX)qP%dsh3=x+KqUModrIP@T1$qycey5`GxKn&e59cBlSIHgS+%S1U%@BYITGJ)g zbpKOf$qh){CooIhg3T}1uL@`sz8S(OLH)hj0i?~n<`$ajiz71)ReqHT`_=!yRr*iSZQc{gou}yVv?O#O5wCD61 zJIUWJx?IH~jUg=L=pxCH9eY){(u(yz>Au!+v@j3nP3Suk+{~J9d#5s-CW};h%5v?|A?RW^*~BTJi3$Or0h8X5N2=}AbG$7me1R%soh&;e z(aRX^?WOLvd03-76(&d`34FXB37WXGj7Q6+If%{r3m*&1VC{NwYJK8 z9i>28&&TGTUKrk$^N-9*Pm547-p$rt{vzw>Bw#{Bivey&X9D6=snNSv?F9=M>R! zZZs1Wkh^NH(Glwe%yR2F#*B7O*XWdL~cwv|)D+Qrr8eymo4Q7S_6I4>gy{fV+ z;ST2^LW`WaUL+@pe^Ky#I7b81kOZa`V%&($@KXmift@PmL@5rdJJKgyTS-9Levf^9 zRuyrTdwpDSHh&0)TFtD^-s6$IWl7_e6@JqGa0oa?B{1ZNr829~cb*27%DCIgdM7?g zyV*G!%!{A+B%4S`H|6MMxHN7yA9++{N`Qlw#?j~u`D5J=@yY9-HbXT zGV%>$QGD#@SKFdv=9Z1fjfT*5nZd$7TC7xoGI%-|CNO>y_z3tu!^J}>V{X;4*|m>0 zzg`#hP>ED)tZOTdN?3UBo+`ezzXv~g+oP$z_6HANu0Dm?L{vyU1q#2iSC(C zZ9{0_GV5>PrT?$Jf48enZ^hpy&Vn@xVf{)aq07O2I5C&ifQYCxsd4 zL^SCG)8KlJr!JzM;hAgxNhz5C_RfR=H<1sU4;#2ca$>U{C<9~iPK#HZ{K*=a(xVHg zCm{bjf$a0S>ZjGK&}(XAIjYm|NV#riQ|mY89;H1;AM)-0tl;HMDab_>i)slj)(;~n zBSaGp)$xj^6gE!5Atu1|(78@^A*Xa_xM-QdC>pK8ep@dxJm}~4cJW3in&rO@EmaHS zS9cXE=??qh=5$9O{+pw1MC_hp)v)w#))?q$Pe255LolVMSj#D%d6fJcJ$>%- zj&@?zE6ITwF)-izh9*%DN*vyzC^CDE?Q8xi#|E^ zvyLBtNn~|On;qKc*%vOVhpK}sIg>7yY$(@7mXp=wLDjoFFO8r&9#I&|CyTv1dQr3z zQ9p0VCGFt&S!HVfEH-Tpu@~T;z(wUZ+-|04JRNIlH-&jzVOuz~4dlFk&m-Q{A#_qn zSqR>`GBj}X%+%MPa~??XW_t5JVj}5bwRXW82k<5%XTq8_hgDHStq9}(-0y!DV#G#P zg1Gax71Nj69eWONscF=|udcA@!h74+$U^@?eLU+W)NX>boY^=xNb?`MJst$K0DyWz z|6Xr?8!?bD*e>r-l$CclC3G=x(6Druhj>P9%VhicAuUK6g3&>Dl1 z8g6I3=8$EvhOxBVs>nH!C$l_tY?hvsKKeKyX};U;4Hl=HWytxY0$dcL;3ZW-RZ9~D zV*z0hC@TB-HQ~U7@wvQB*?KaRBo78-Y zpA>&*7r+y?be4(h;85@brvKYZ1-)g01yr`L9*p$asCctm)){r-0X0j5O?A~*R}($# zM?>-ij>dnZ-T$BN*n3fVtkb{OiZa?5;lY?7ETV5BiLA)@km62TD)nmS{Ed;VDmWO*w}< zHF46xs(;khfUweh*Emzml&Bt}P%;#qBQAHfhiaGFNd*^@PkGAb-wKAt%E+D<6*DX8&62T94a&04qS$zofH&Wv=q7$9r>2b0Z30Uxo8kEs<%7 zTQlWoc94y*Q`%WC|GIK4b%PmOzXY3Ymk^V*J7qX5By^xvhb0=@r z<{{;C|Gy^7UpbTjEDELZ8by}?oQ#|PC|&>d?Sc4h8>{yMTuCG%Cb-t;|#*YRlS%f--u<8y-$+3%W^eHpRLB?Zmj?W&) zo9RUP&t{l+c~ex3EeR_HEHn_Xa@-yr)h?fcSw4$c^kiB|#42@d|SGOnmQA zZK<_}R6cqPg}GQ`BV4P4cK)yqY1<9D?By>5;W>eKX*+yIVd*@F4*u}xewBB8=aMa- z7fl=d$^L)+g$fCceb{emibl(CET-L;IGdAlbupAKV-h_*^czMfw;b{k^v=eb&f+f- zUQc^+A&-C}0Cujq%Kr@&^L$R%PoRB&m)7OVjfE}k=K+g=X{UwOrkbgw!R2>F;m9TD zZSiT_LpT^dC)=7#>Ls_cAyXKFRruKCsn4jt$TZMs3t-FpE#8y9juEt~Q_B-ItUvMm zbrf>PHiOho@m@euW~Fc{ty#Bzq;{9viZlMR?#25#|)ZUj|pSVZ;S{Y=+S<=!GQl1QqY!%PuqpG_+0 z#IZPbb=C9$I25xII6*}*v1$tu_Cgr(YZ;1$B$#JV*Sq#5+ILt><{S|7o|wpkw|vtT z%UL5mpS!6BZD0buS$yJl*5MU~U9(JwFlL`Opf+4sXGAqP{z^%~O;gB5=bXV;r?Jje z51h{3HAAwY^Y0{6Vh#J(DobrdxC;*G>9WTk!wWfy|JS+rZiD=&Y*^BXXxGzQNaQV31nnA3O-0yNl67Igz4c1} zKseLU38hduKT~|mtYOhwV))dO2n?f+1a1%|_bxT7de0oHoFM@eCB1OXQlrCiU<(T- zQQ#cg_ddj2aun$uNd4N7r~oPFC%^(nV3*lLP6)m0+|E{nqE!27ncasAJ+Ug#m;I(= z6VW4%UG3%_IRsP_|1XjgvcV;Q6X3{xZwc>F!8tZpmS0{gsWLV8R#DEWL_}?m5}r1q zJK3H-K6rXJ!W!6uUq+m6A7?w++%%`bZKCenouH)R zbZJPvzfTf%jCl6Yi$3>OJo<@J!pAtMz`j&szbjb#e;|~uc@@)Wd5a5vxii|S+OOB2lGJn5qCSU{Zec$ z$_>;vTBfhjaxg|!1(E(4F=yOGkhu!DWn3EqBA%Y#mCs($lW0a!jM~T*lyfQ2rs^YX zvQ?H39I9;o!5~0y5&JwR^d*E{GKQM>%y={^^TU(c-0su-0R8GwyCuBfI6w2nfn9a>&SU3yA|kUm)a&=r7W@6xy9b;5;4u`L*54N}{1e9Qk5wSq;BD9V=BAW$*OCz_5T+X!8mmT;b3 z?(N1ge};{2?<3XhcEEpkl%N*)@CY6Kpki_5y91L|a+2=3R6?f^FKLv|C&%Im!zq|G z^c3}b=`c6lJ2HInyssE~G=@T5LoA~!RUk}RS7$ClbFG=x~cK(po59hOfx|x0`=QlhL*bEeiPgdgS zUIkT{bt^Y5{qTe%HUguIR)e73#P)<6tvZTow-Ax2eduZAy<2U zop{+nEcB7M2MM?$XpEBbs9%CaD|vuj2s;0F&NFU{0*{BSwWZMs8ZE`|K&JJsw;%CSu?!WGYQr^2zihl)Li4%74W zr-|yfOjsoeFlJ_`R@kuW_~A0&a6_fE7LFbj{>&vt;Q}WZ0xUJRRiACc*!1?-0$0Tm zZ{tzEtebW2N^Eq6&_lw8b-SR4!@`2ddYtP-aU2*MSBgHABi3ERk@~`vucDwU%O7HQ zK{#AzfH_icAy~>cmINlAYQ(Ii6duvNxS_tOjL9QuS8^&+$Gf{-85bic|J8&}4z6Lg z@F)|B)2Wv*5>s4pyXY93N5!9j(7Z9RI>NUAxmy#&xMPX)SZ%qhm_x=&pR(ZsoyDO+ z3?R4CFs6n6&x##WXaK11r)ctd(v*<8GtgkcmS5l^@c;kzYg0Vj6O$I{4%dR2pap%6 z|*c_vDVD22~Nh(m99BMKx4V-3+Ic zixJU?Q67|*t&p<|r{P#j;vi{wlWSP^l&LBi5sp)bKEFgAI!c4uEa!ekt6($?IFE;G zij*`oZU|M*9e`fKFLIgYay1Ut@9=glS`QPL zlgc{2@#8GzoQ36!mTQ1B{}h4#Au2SPs#;YJ6f^SzT}u$3`xD<>Rbr#ypKbTHFM|7 zl}u~>Jx0~Q>s(gwx*ya0T3j7Gf-%z?4y^Uj{qeYKI;};HO1l9J!s0(P3bA;{kv*Cd zkk3Uoh#HU@l%8Z3R{45@_&XZ-i*y^3?T6P_a5uiD{+||9-}^!{89B1hHCnbtf*B(rnSv{A9c%V^V@Xqr-%k^`o{-%8UGE@&z720Ia9k^wIw2 zaWZO2k5aOFT#G=gWvVyD7@1)q=%TlXB=uW&9fQs9J0=WA7>;(m%(; zN@HfpI{fz`Wz`GB>}tU@`)#T>z!k0vhk|g*gp*XMpV_YlN}jl!Jq^7Gb>VSZYkkC$ z*Ao4=A)2cT_fNRZpoBJVUyvwZtT#-YVqkTD-9UNYub;W8rkooSXm6T*X|_wx-fjOw zbAEp)!N{S@Ph8OLft`Y_3A4pwex;?G9Y2jLp`EwDZ=w;-?#0hyR1h3$0Ubhh>^p61 zW%u4mcQ+Y|m%owY`qahne|1Nsvha+I{#FxB?c_9(C*9h1n*w|W)-(NYT&u`04ZnE@ z0JCUO3Ww}Tke}E7HK#Qf^{|w!4}ry}FnVmIJRAKpg2~OlEygl*3EcWaU#f@$1vu?| z?U&vC*WZWz0ggO4x8_h{=k?=_zDVl6&0@>6j(gwWpFXgwEIDyZDEG14uq{EZzy;mr zk2hQaiI}a)=2>pk(zE*Km+ZcM_~XG5Oq^upRr{*cOfc>0tOcd_W#;61odf^%j(qca zYt}w2XG3DUKuVAJes+Q64OxoEj<`Mi;^y&Ed2CjLVc}=M6|dE{3I_Mgozg@O_%{^ID z^9xbZoWewG!oINv%#*J)6@{9bI5A2cN*XY83Ho@|Tggwl-^OT%C~ZsCP>Pvrs+A6J zFo%Q^PS&dlk4{99VA1#q2;)I3na+PwS6MnR-p&UH$@qCu+id`bft%or1m;O<{2cKU zv4qnd+#j(CaYkkZP&QxHf7%&1ONJHz!4FB}@Rl77w z=-5z>fXF%8`D+HB7`0r-3)b6FW%+-fZm7BBdMFJH4kOL)77>8&u_CeBerMq%Cl5%p zLdQ6ea6LMD18?0np}$7FZRJZ0!WuhvFvosEFmkstbHYA3ivuoU2P_kFQT#*Zedrj0 zrq_cecl-1V_(PvPH4c*PcU&Bmv$_c(UBcPql#bDyekFtqP$3cgHX(0=9x zRtJo5vNWLS>?2;#_lOUyI})?(@8@GutzxX}KM~=kU9xnsCu80FJRh35@acY;{vkWT zzR~)xL!sx=&-VlyN&9G&%hT&7@i!9%W-q%fbcsjFVeBG|A+z5Q}@a^au~$<$CL2f?dt~55i<`c233_6?3{QK z#yG3!>K78g|Mgq!Q~KF~h)ll&tB~C*hwi8K4Nw!V&KloCw9Ykk{HE-w zpjeB?o8JtWGrb$i4QeoJ+4cd|wCQF=pf(C5&HF8SQqn|BDocB2jm1VUTSW8_>cSVY zz3jN*3+>@4XQbyj&}?6t+6K!O9HS%>fS0|)hYr+(%1RXT5*W>Y=3IF1myDHME5@;D zK%6nkmM4v2oC`e$`@`go(Q_p17qF=5Qk)o$z2pZ=u0W%U{ln-42$YG28b$7bLp@s& zXV8$`r*zluTpEZNqpWOx);N;4>-@h4*)ML-H z5Ys-bn3`00Z9As=r*L zgH1j$M8U(w5n9pM2*4jtftz@|hoqqXnfDif$6u-38$zKd+&fvl7l5)e8*tqQK`;gl z){U(Io@{$AO3eD2e1(^kL_1Cl=sCuEIe(bWIS0a8fD4-Q$#@t{Nt&^!p85+CD1UK= z2;6}t-JPacx!n+tTTHI=bj}$$pPm}Ytt}*D4)|+yDq)KRrW*;>I=E^JmJ$L#Yl5_` zWh;FJZFx4?mfo?_7s90d=zhOqD`@nEwn|W>Ub%c{vxs;d+)wtrAXRo}i);a-Cofk} zryDa=x2;hig%g`DoFkD?wkA&(wago(oe@hTHQ!xSQQ0{}Jpx)AP;^r@@GwAxutFRq z@COIXn*fESr09M7eaDY3*N=0HjNl|U6&uV$iw%Ync5if9#!L1oKM9xgvZbnXku zkr;{1!aBR+xdubqF@Hm~0~~Vo4e~Y)&l8H`rnu|&6S93GMXMRNuc{1<;&B?D;Hc4X z;TFQbKXOWCVQi!02OT0xCDz{e<`v1dRY8i&gKhDc$jFHo zOY4-_B}&lqsvU}pu;tT;*!%PD7Ad+p@l`qKn^C2A8ovn7iGN3x%O81xZJArtDk}jb z9UL95Xo!5l{8nLSn44fu!NS>L3-w;@3S*(*9TN zpmDUFxfzQ!SaRYXnj$r66N!1qaB;T+xarm9&Ssf><@GFjn<+cq_PNt|d3fn%(!at- zcH`XrK|@`fusAPe|1b7bdKShEk?pmu8AHrMz=B_D(JF z+zr*TgDoEqyJ*=Xg*}@NxlprW5;a}g=(1kIgTVt)fA||FwHbShFT<+_WP^<}DO9+ECZjt>Rde;V%tC6u41&8=SgmcSd2IJ_0&vImZU8+owh)+2ay1EOf4jh}o zoynp0=>0xeylry<`B}?(2DPB!XI^+V7z%}34Us%rjVezrn8nIy1d4KFoN%1Jf@n<< zR=moU^$7v7VIm>vpLbW`JQ9&9OGkb*Bq!_C@LBd7vM1^1l#7W{r<><*aA6mSY46fQ zyN22^Dpvx$E{u7CQF3Ycxq<`fC@P#3w;0@P;p{UGg%C4$vXZ*AOy=BNzbJq_OkYVG z84@G)0jb_!*=75gp@9M;y%YE)zBSe@g?DbvG{a18(oUmK?Rh2+xLN?Bj@`zKS)l~5 zEN#!thNN#N`{NAGChutX-}r#hXwHyERPBlWf3@Q!H|sYbc6uYUbpNjVi{3`(nN_)t zQHh&+VIBM;MAu>FI2CUsm^Tq~!M4JMw?#Bca}!)zkhTg-ZZ$6sA{tLz)jy-gPZ50rf7D`G)KGg;fp3blcP?UZ>IgRa z2LQ0{AUFVgVbX*jek2F>U3n@H2R^5EoixkCz(+ipp6eD8`PRz(#5m{ zEL38I(wQvMjfkAw=4-)`;GtHW9z7Ks(jH9QxxD48wtnjTWS7EeHcwT)r_OPw% zI`9PaFNY3XPS#(sjql1kn&$Nxm|VaiJ>J7$7|P^gjz;v6Z8fF0B?`}e5CyrZb(k7n zX(Zt-;JyU;`0l~{*^tKK!A(39uu}U{`~vU$ZNZD==BDz04xJt|NYN2AHZxKm2qm$O zA+0|Qfn~24ZJSwkwXvIffk}caRnj^6+KguVu<%PiH}lSc#HPq+p)#~WkH+n0@HnFk znKeOkW6kT}$HU*D|IcWVSml`m*lhWJw6Qhdp0Xi!vO3nEf|(QLnwt)fsSAi)MUslR zV%&e>(v<}e9A-Mz?Wv}+r&zO2lz!_f-oMw*d(WG%=JhV@!TNpzOQ9*;0F7Ni<*^(K z?pNH1eY#)NXG}yL;%A&#Kg>8-)*(BcqGi=fYB011|! zRKDrBO{Z4N2`fmjIvQM^@LLx)Q)iVajLxd$RydRr8cnJ8#l}r)Y0NVkhzw@#2F_M{ zw9+_I*608l9&Riy9;2}_2jlZ)bp$Jj<%aJy_ha6-M35P=%Nr%+Hj6PjKzTW*l`uR| z=f36Ct&k5l;pyP+HIyB`TUPzpkGjE=kP8U9D6%#xixN^#Uc6eHiAOMz6{DL>ViKbJNUUtMZ@L z5MNv2K;&P~2#gWpAyFq1*Z9Kg#b~;p5;h3S2pCtFS*tx@G)m58c|Shnck8;Dv87TH zeQ+c72wqU!&=9%6M{Ln-irGgCH-~EAI-ncQ_K;flOWKkwF^|jU(X~!@eJ$L*pELry z0k%T_G`z#+z}aWr|8)uc*gNDh4%PEVBTo0fBU6)n{Y5-cvQ?Qdx!Vx>OLk9)aaeQO z`^!Td0T;5e;NCpHu1P!4=iAhgx+RbB>TetRi1iPM0-|UwhyNIXY;FHrwbCh?ozCN{RSD-CQ@w6ai*LhOKk@}MBJo0L1`Z7=GlCZ6=vO^jQLxLe^J!-;O-nm~J?+GSJUG><(+` zp2MGV-4PXDJb^SCGe6yS3(h(fbw?k13Gaqh%HEE?Y`+y?tq1L`hLU~7gl4v&p|}Om zPs1+|1Rv~vOrl~~Q@MDt&Bub&{6~ShqR%CC!z`0^5rO<5qQ{wORzJkB{sNo0^`XLT z&)P#1yVWJ#?O`y$C>_>P$dC3Ta15-!4*EEyfkQZQQ31P()n>D}6xUieuE(w%Udr(u zL%p#iK@!|xfiH}+T602^zD9QB!yt|*Ve;p5f`GL3Q@#mH*Z6YXzTr{xZm_ezajsC# zw2+4TEOPvLJEd5nQ%G?LNAZAZ*yefvZ7NGeleSzFVs=1~o z62uSepSvg3ThL4{vT|8NU4YgULfGbMc}-gPlRoyaN=&o9>1FO)g|9W!dD3pFC>QqK zq8%?eN|}y;fzAKLe);g*a-`?Aq_^q1AB z?UgD@KDouC$OAI?4|F>!NC~*^@(%xuHUF~YOAJ^yN?xSayKZyYc)QB8!staih|90b;>A4O?P4TR+~M25KK{!-v4@3b7a=mq_lz7aJtY{_0gEJW7vhFP%tk- zsSKW#k5JcLH(K$O$BXHyO{KjhAVZX1+ho*sm7LnM+ad+HC#1<>_L@;t=d-q$$)+)s z?jS1yQS;nyM$UZ73CKX{$*2(+xGrCqT+@c<>u+gnKM9j2I#ifMYu>zUfkj~?Q5>r~ z5El?j6n#VIU-~>;2AGkF&Mds*z?KpPSW)VO$_ET=&b^;45F3Px3W5R&JJg5;Yx%7b z=lj9|OVgpg(1bK$0G}8B1X=aKrN7#SyZhf9%tbvJxq7aSFg#K6e(7*PMCn|Y-)&65 zV37pk?19eI5ZYLS76?Sjph7SQz6>kcF_fumY)nDMj?N0SsSIS{y4j?dfM=8(!@chk z4Zj(k1~@K%SYtk)6iu&?vhQkM6!VpJF1X||6nDalBp_n8F}EtN7-7ab+E9HJvrqPfCv{OFiiyG!x?t8Kb>Jp^A4^VF(t^y1HWD8cC*mc|QdLPh9JQLLl2D4q zSiN`p|EldBE@ro^YNKLrLJXmK!*=z0SS%#mYatE~h}%MIOLaWw&Iy%t{H*8Bfov(G z6O3yQhk*=RnJ8aBqXUZX4;!H(J1cF`){D#sDMCpz-Z{f2TI;ZZV_(j9Gmdnb7p?z% zVQhLRwe-6(5iuEgg&2hyHWvOw`Z75OrF-~SvB-dS>KkIbVJVzi4CnRrot$v zb%nxJAdl1?D0+V&D>!#9h~YYa6Ron@o=+??A|~d{)koJhSZ{5Q0%2GHU|diVC%w(- z6`+VHRxOBVQ}>L{r3}zc=oq2=wpL#>z)Tft<{r_(<@7LM9&@!^bN*LF{4yT?>ApNS zUr(;782J2E5>$$L6ge;}1B+s@?I1&hQbpNa(a^ai^=Eu!YcW9&3`fW}HV3xC`l8T} z@C8(OWMSwjGzW1NaPg%kth_Hv8~d&i-W~1%siBD=Y9h{Rc)BUvwAFf4j3F{}vnoT^ z*5kkhgdUEAQQNg8$ua2!;;;3`60Q^dLZcO{9Tu?~_uc_OiH4eBo%B$QPFiw`+oyC{ z1m&ZzRggxy&d$ZmAA3Yha}YB2tuA2P+%6 z9N|{Bu0X%zIy@Ron6$R5>d_Mwx6q)QK~SkhG@$BR3yU1WBDO#8qF;GzE}Ft`?um|@ z<3!T;0mjTZY}q{ch1fr2f?4g*_R`h1QS$|-g*DwH8f>Ysb7dbc4E4 zw;8z?I960p@qW(Qk2fiY%Tv|+(|4xrWe-V0vpZPc4K|k`Jpb-$&vTP|AAAmEx!-j; zV@v!$aeXiK5>aU8l+$?qEqVxa!s{d~+v8Jh|cH)BWij|cSw%hTB z*~xmuOVJdwgmR&(6&KIN)VVgRmC%_2`C>dx=ETz-#5%M8xVQZR7+6=@%vT6FmT(sEi`YIt8yZT7$o)ctY_X-;b4ys zO=4;2x7~QitZ|P?tTF%p&=icHnk0G+(;Zd#2F)yiIx&WA_8vUh7mJOG)+)}R2(&i# z{p{3dN8%1H$`x#1@%j?eX$c&3z#BW*(Lg49FO3b9SZAtx8hVRlQa%4>m)}_D07*$p z>R75unB;^^y2c6-u&<5temfuJ)ml9^W!@ugJM)utUUcVT%3upwdG;P|hlg>; zmO!>IkQ=PjII~`3LPS9LSqD4^S!OO*z{mB-n}*~~k8KLmHF4A&o<3}?KXmGMl>N!= zMrv7;;d@{{*bVc(_kzSeTgZ3`)GMuq=S#~ zzO_P~kwzx}{}1^~N?%X>_3SR34_tZ+gX4||+;MylTkZDkEA~fECNJZWF%Gk5emIB6 z&>Mr*mQWZKnh&0Kw3);qZUO_rJHIm68(tN+~`P7 zJ?x6;gVrJOa`ItUfI*8E6|`C_*?u^?osV;}>F))3<`*J5{J#G% zIdw%L*k%rX`}?tGh|xFGM8+Zk5Z5NXWG-Zd0Dd#RCyDWar*3T6%xdd-oqn>3)X}Vv zC+kyM&Oc9hq1#w=%*y{DZZ68@5KI`i!F+2^M5dMior_DwLX-Zcx>X-LM7>URdJc2%<{5;VGV(vLmdE;2ON zaJ&H|2|7}^xPNkOwv-!~0y3m!kNC1|lX9t4UbKytCn@kJ7;TTbOn3K7ceBrJfv@wso;I6z^VKvhC$Nbl41@vU+Z{H({&zy07&m@+&Rp7wB|{ zfW5Hop!kW(c#$807f?|E*$_+Meq3j7-slwNQbSUZpG}w@@XA}JB-TAlZJP1Zp$g^k zwU?);L!pA-9*03T2r|(1J$O#ElcU0jf;=h&#g;;sWALJ~1P78IF{W;+=bxbxhaj(> z{7&un8EFEvbvF0V_HB}E#;hcAJ@WMz3+I*lkGbDa$8h&_KHJECn0&!T5>gi`b8q&O1YUv9d2$;uHom9VDvU5RN^*Da{gH3eRp zU1kzpxzQi)0%r3F(hewr$Q*Dd5bRrS6Tv9~&&7Qvg;Bb&@{>cw^$j4)Vd=KJZ%SQ8 zLT1QPK0gy^v~JPIg!2{qued8Z$A}OSa+J+@a(=a2e^4D5e4ke)m8B%`fyp`S!FrY7 zdG??9ON{D9Lj8Ev&l@rCS3N2&;e6hZ?^kbtT2TZ>(#l`_K*T}v>FL1aFrvuorea4} z5mWH8d8MAj#0QaI<*qDdAcrz0dX1{}D>sA2qfs^&CKRWFf8|zkwY2VoGv|_;5$WwL zSIJlKkS|p-BJA)eQG{g(#`|_X-RfrYvw_f5L}g?ERL&w1&Oam$h}jg})Ed$h{wkQe{dsOFy${z(A8A1RX8K*!CLXgtp~VoBF&l%P z@9Qo`32hy#`5rQlPjXH@;7+3;pwyz@yZ`@dw8^n;1`(X^t&BI6tDm!mV~$meuCjLx zk|!+%6f*eGATzs`f%$+`Gmw(-!|CvQ z@w&2r9eyp(AV{^YgB6o(kDj?$>kk7|mpb5YdTKDRKuiDDsfet#dv=Y{5=n_VZJK{3 z$i}lfBd>`xbsKi$v75)1TwKPH9b<0RRCWyR$;s__z$e{d-osC?eL?InJ5Tu3k;Ft9 z@w_vnH#)^|5ivW4QrWz0@Y^&r@W&>+HSqA8#30O~uR*&s>Mj@X*OY^Ko?Ap|K4m5i zL&g9(h+^0mgTfNv;iGpxU z_-~mzeyk=13~NW_W(ND}_{=J$-P9+s3s@1Ytzy5};76n%e9y(stWI1udRuB45A%d+ z8@H5MQ>uj)2S!%Z+AFJnL-{8Bi3G?c!}FH7q2+eHw#9+zO?%Jtj6;HZV+<#DCrhDd z^DE=_)OHz7Nx^Q*hx{?Y(NpRB#L;tka3WzA1U-FaCwL?^3Lkh%a-G(7 zHhb~s$VkvGNt2wwgZU)Tz7%bu^uiirrZl%|d=ILl+y2NukmXsb8~Z-`moo)Xz=0tZ zC+r-U=j}lx_WdT&ba8&hr@Z@`ACMDNrbh$epOxGeN%uqff|7h1m>JEQF^0KN4jrgl z^)8B_b@5$5%`jermZfGy>M@UnBz#~*`_#es5w!N>J$8DM_7IAR>is{XwF?}75pkhM z#7NE8c!ph0BYwf1axdY-rRS^WWEf`@NeyU>Rk+~!+yY>0-gEpn6#CViawi54U&JOc*Yk!Vvr zF{12iky7y0l(DqJO4~L_zz}E}o&B|OBydSMgWD8k`VXmu`LRT5ShgZhvhm(T0-PN2 zs281cfBK`pimq?*(9U_DAcKCbI@PfcVTdYaIiS{pF+_aBU|Im#C_Ljlg4&vSGseM@ zoSdpZ9U)0Isi_XN3tRXw}nY`*R(DFDo!`xt&rM>XS!LdHREpepQ<^Q8{ zh&J>STo9CdNvk$T(jCN{XfA9auIBa+u?6HJ2}`RW@=^b@1->!6VwT?6q6H7%FO#%Nu?@8DC-zX1Zv}r?Mf{u@+6$a5rkGj22PYkRlOg+qYS-OXezf+5hz=#pd6kaq zwg7sRaOgav6EeZwz;bTp1=^x14_(;`V=E4uUBvky8@u=Rb-f}iq4^kWf*J&A$SIU z8a5cTI03>+Y}$w6joNmB0M@pucH=Tc$*jbp*;74<$rkjcL=7b-KF-F|uvUBh57=af z#p-0;B6up+Bwit5O?a|44Z|9hHdY(HJq21_>i5ErT{Z$Zfn*h_mgwJHxGKJrT**~V zn2`!@6gM5>KKrUz&S;RUx9nyCeefwUJS>ZZ)Tpe5OCTyF({5NL zIGfzGKQgCp6Y4JaMIncDrYMuG7Di&E3^!v>?kFj92CY=HFvOWZRMC_ULDHdmaX&;v ze;qz1eky-@-D%8Hwrd9z!ZDUZECOW?>|S=QvGQ)z-|_buGS*Y>W9jk9GWl|S7B`-z zdaCT&2&Q?w8SAaa-MI8ngG~}77{Uk|fnRhr@ zW1S%9?`Ug3;|2l0BqbFG2Szp$jpbvX##yp~d9tbtiK?%ic1)x6I`ZtSVqw@Q_$?q7 zR&A!_*XWv8We3X{e))6Krq#fqT$#(mv|H;@SbS zz3+vaYu!8Vpe|0|SGk=VWslyZW3M~R=#02X2L!fDLZC#VW4N^ ziKlX6X1^HFc$5i0iX{f}V940|kjfYT`GuMSIwE(F)!`2b3($nMo;l|zfz2xY?|TpF zZ1`nyKq*~l<9iQ#Ax@b&mUT9L&FeH7-)GsM*o=*XZQ&fNb#zcI!J@=O`=u?(u%A8p zUYHdvgKCun7I{7Ah87+@S8q%!*=Z)of#B@{R@^u+RNzrj=TYpkK)#*=Pfw!kJVSP| zh8HZE^+l-sY;1JUcJS4$3dBfPk*Ovwd~b-#Ky#$3X(}ocao&73pt}yz7|ibq-Ze_B z&Y$Mf97AI1XhiRD0nAY0o8L=QqjH+iz+d*kh9nm@0NnPZx1RK9EM2{OO=k>Ggh)-R zbmf!3nxcO11~BbKN(PG*j|J7z_HyKarVX&=x+OY>BJReRgQC@7-fa_yC4>2e4Q4;VsH7y=;y%{*A8P<9{#e5ua$ED1!P!T~~c<}>5x=4df zQHC8X#c{}Ci#Z!T+QteU93i-rF@8xzQ?djx)hm`wQOLD!wd%)|9bg^%!2Rv~2+z3$!_B&?QFZc(bOr;wT;b?hp9)O4< zQ+~k%-WI$T>VoP^Uzv4L|0#7GtQO&4rF*)EXv^S{?dKO{uQXuDtNSuCt@z#}Gj&nO z07rOiwui0f!|KxR47O)G|c0DD*D3(g^d@>W&4(%BVY<7}#k)P=4|Ogaj3 zUh{q^a3)_hax;*wWEMkAXP4zs{(w~q!BhZQx%6HYMcH*q{Kr2)VrF7x<9Piu<51`0 zc0vbP8luAW*QlxpuaPqBTYT&ec)Z!+8xzl?(FW$wS<`b&rWf;Pqt7-GA#uW5U`Z~& zIwo|X|Mh^-xC_{>F0b`Z7#*ftPKa7%6=!^mr*dLX(d#?%t~J&d)Vmc!Gqf9z(NG?@ z30(^H^mc2tSf{z9ahvx|n^-k446MvBn7RegMLK>)C->A$id(E>ZTg>MD1;XVVEHw% zjoVB<`^ysa%W)XMrFDzaHp7X6!T*Xk zy)0RU?_lm|!}MSI${A%=L9e3mdw$xUQrVHTu=how|9%1Pzk|8}E41zdA73CoT#9=0 zJu{~v6vo8OC>eZ7_zf>BlEP>+WDoa*2X++@ba@`ZGViUKf z_n5D-9Tq{{*48tH<8EJ;qvyfnz}~AkcP)&2@|{glaA-T~4&CZQ_uUwOj(da~!XVSy-khW`ZR<3=>jlyJ_n^NHXrmDYUX$E~lQ@H+^&yXHk-NdvC3 z+(^v)pzu5mk`@xk6+v$dWvveX!0-cawX)7M4k$hBJTTz}T$$=idmW*__;6EHKUR>9 z#wMvR(k&q{#79H8L)M7cK3e_In10{*Dco%En9!jk73@!(*|31PK^>IBnV_`Bif~p>YLvRJ}vXp~5pGb*=TzJxY`GQ3Ya>TAUT<;ixW^k#lEJ ze9>-;4XHlr;NizjUQ4apsaYi97{NX;TRu@{rb-hE7w@rEvkxUnSx z@`kUtI{kD#+G;+%yrsW)H(W*C8yM_7gO`mSdOmlUm=Sk@aqvV@6d!&nGVyWBFgl@V zf^lW*-+~Lj)y?$A!UTD^@Bi_t@^jEPj*v=BfIBLo8yfuflZ3vj31WQCJ|pLMX1SIg zOaITHUNOwPN~ehy<5(c9)iqPVhRTUuXejv0{pZ|BXy$cNwllY+nT$V_Nw2+h7=0dw z(Z%a3#}_TA*UlH)(5JC05m)y@#%Q&N+Vxkk0xcBNr((1y$n)9G4Pj&=p>gxs+L-DR z{;K@SmzXZqL;^5%U8Omx7_U$I@27CNx=7In&sUCe^Xv3`__={!_zVr{J-*y)QVlPG7PtFccyg&|`=@totc!b8YWd=2} zKK&F>G*{rUesd(kmU!lGpbPg|wuX@J9K7@`FWTTFpAI#IXXPw=pgcx5ji*j32MbNy zI9Zs~EzAbq#|*KwsMcAac400MBM^ubYMEz@cKzFtPW!J-m7JH{n@C0(mt>hlxA@TC zNB*8Yr3oaJoI>bu%m4$yp>7sXyw9q&Q}uuSOn7h149b60^0bCIS_huqXqND&M_c?U z`2L)~cULU&UvPyAviVj3$R~+Zzh}*%Q$zz-sxCItJEyz?ANpoI^Tu2*jqPe9D9~+b zBsM{bu(q=Vb;?bj%H7+l>B^qG6CK834?)GtH0;ySR(p3CxTWNt?RmFZ zTR>GIqMa$G^#`$Eonf$n8zv>-(cg1bEdpX*6f~i#Q?U2d94fRBpdk8TwDyBDXmmU5c~hdK`1Q)d*yp{I^Jy zOhN&aDq#y$hQoE}j>^`pQGnl=$$a!oAl8zRCfZ=%&FRi_cGA#7U6pV1i(=ID&)U|t zd_9%JH~V0cizb+pI%aF5-{cbme7%pP^8*`Si7O=oUg))1LldkM6rmcXR5iTl5RxE1 zQ2g9c*YN?@WjQ%rF3*d)cdOY-8^{+m;^#w4MEtdkS*WXc7C zEF0Fi(Nz{z5|m3Jnqz3y&`~QlxqAEy;7^%(V{%>nIT^dMSk9Hz$_;ekRjq>-NcMeS z$uCzW5ftjfY^b2BwlB}%-9iWYtbl~Mb!p+}JqQR-5cx~wc|{25mq$Lr=;V(|vGd7T@y6A_cwMt0)##H+ z?W4t7o8_H{4fQpWaQgx&z>o7cv?9>59S3o*WU(vv(N>yrh$Fw-FId6*c$=Tw<}%Dz zu!y+3-)B$`b5NEFC+@q!@24tme{nYcD3qi+Fy=omO0JfDlh9QvP_YO*=i#p^WfOw` z>HQF^G9DRhfa~fLtPk`tVA#yDT?ZQwgrBRXFV_T>#0G2YbsC6ba6`fe=yTiPfE?6G znO31>K>IyO??tRQ!}Oj1!GnVpkMR$0QkhW}GjSo_e1iHocWaYMBJH-86wk+P60|AS z8@(LNU+&f2d=y+Oo8XU$pg$mvFhbRs-VQNJGIT@N58a&?p}uzt{oSFr(A=>sAxd@c zNgeT1J2Gznb3E5vt6*LlDM1Y|m(}H3{ma$BYZtS_Y3+O+&Qy^?1OO}j*wnz$)_V7*os!0P3 zJ^HhooAh!Q(kjHF=tM{WvDX#jQ@&(M0+O8VZgO;sH%b1gh^;V!z{wqMUOKoIidaCI z2vW0DJ(DQ-P3`utBNI*jlJg!QBJoy*J?bIfDI7eh9!*=U0J^e5q<~T;Y|grWq^pB} ze~yPumew0EHHklQ0xVXgqW+@2N840i`H z&=L0?J2nhsGTvldIO>uI{O_;*D-1~#9`6PSfDVr9Rt`Q8ZJPBs4;N$wL4{{gk94^m zC}Jo_r$cX2Yh02vbWBfq_yg5|tKvYpAm;#icaA`d#AO{f6of_nq7Sb#5F+QS8TP7B z{oYpdtIi_+KiC=?-BPIrwO+hxk;WZe;wvogl?3Iy^!F5z5jHU||KZKQe!r(SW2p4vC?~r_HT3}gAkzhx~DgaZH-@9O*$G+Pc%{czpa&Qvs+85$}#cbrs|NFPh zO8zOlUK8d(KUx@xA-o9)=ug0#y+*5|h0NN^1;duTs7GAw%xKJ;I#V$>U!wQGl0gbQbF z>zuz<{)L#L%v)m6beZ#VibIa#_90{?s zqul3MW_shfaAt>rgEMvULslFlgtE zF`l%qP#w82rwY6nq*F|BfxP1_^Q1k|VF@#4vjo{b4LhL}2^T`P4J zS$Ux1K%ruSO45C56aB!dh-fIEpxfzf`ad?dd_p*jZK@2;$FSr7G>!%scB=JS&ZqVn zm&u+==U9>xwG`^<_z#ySMAk!))>)s_4!%>&Jrv>Z670mZP5i(soNvN$vjCH(x<=c8 zvmI~XSnggn<2L(J>!oD*RMJRAFX-astJU1ktgzG==+WSQ-d;A6e88~6tgTZpH(Rlj zn%rT-^v0x^^Wi4n0DskA-gI}>HM~pFm%gyKm=dvgLIvt9KBk3~RmazL$ebkH6obYR zqBCz)9k>hSBs^esLzI1dnu{cBbVn4=9!q>yu9HJ zFlOYmJ&S}5QZ7cTA=Rdr#&I7f_L1l8eWG%>i4+bq5QXK}HYevoi^aAmDL*9uS>jZK zh}^j?>_3xg*Kboio_oST*FR&wjobxwZH-?|mdA+A>$ot6&xevaizg@uLFc(PkY5EO zcVbJLI*7v=w7vk{)-3#`L5g~0hpHX9<(PGQHgfOr3cMSO3Yrxcw*(`+SdfNFoj(%( z-72|Fb5??jK#}|NHWvB)Wuioez~Zy=Xoh&I170T=i+bs^Bk>{HqGRvti&{vK>!Ud4 z3hp$*_vDH#Ntu#zF=C_9P#mXn>*}?W3DipW6(p~wRiZc z@Y+x~%U`JG+0VYd>l3U9k?aG_n?|_Pw+Dd++Sdhx&FjG=n3$98z-Z!^32M`5%waBMYE%NwTdvR`*{pE7xe&}A_@#O zt>U<=gvR^=RYJG*TZgvgP%@HB+E0m4OBp%xVN1y(!NVuQWdmF;_{>1Y*$MDzISY`* zDGnhxOgB;mE6cK(Dr$NhB*|zyM$(iElp6;5)(;p#@skD;20RE>W8_#}fxd-{|#>wSz7TFOi_mrGy8WTl`ag+p|mVG0z zcH_!bC!jpwN!bi?Dep8@cO$&q(ZUj|B&-ggBNGQvEbAFpA23&1D<~LH&ijiucE^AlZf!x{I&t9!tq%l02K321Qd=on#(`dtJ#|{fb-utpBBID-Jb;-6$ z5?2h!IIf~(Qi|>MH1!~bf3)3)DlroP9#ywL*BLa(;HeO1R~>yz1&$3X);_~Tb-ahx z^~(8nj$vT%4BJ!xH%FnGM)4$*|L8n_KR>A_fK1S~j_-p;kZ`ZdHntGdnDUyQyYHVu-T8xPZo8%RtyYT7Y%8@M!%M@B%x9Hkj~{1 zGYKucHw@WuN&sos4JF_a4*14`*_b>Qi1Zd$CCl+Ba8^)x^;As22CTnLiBn z92kA~#g~bkEA5!JG>yLhu9*-~VH44?b;X$U^tKh8?|p_P>ELIG(P%&N8f5P`5o61$ z?Dr+VNSHcRA9W8PLiI+67zzQB>^1t{p7OKeQPP(;nM3-2oX!fq`y4DlzQ-}i>~7W+`T`6uskP;yIASsMxBqytSxaC zU^JAT90e|=FKQ@R+;oZwafy#*doC3}mZ*EuqY1Gw+^1L4u=oTWyk3wKcb-|RKHCl& zI(2`^jnySUE3Y>)d_EK3lt4DZI&U)7cAt(n6L~Lh=vrC(zbb9dg{5%wOkcvFB>?vK+0n zzhGtiCtqRqmik)(%q3`EsgPt;o!gJ;w=+&@YEV4gntdI`e2LAGFIZRqtv$F5U`Wib1_S_Gt2Mfdf5q(! z-b}CwA5js+rA;4&z~^>BoNv@x{Id#K;Yy)V# z2I68rSP#SE)T_=BL&BO+E+8LJFMRp|*}@fTCdXx?y8YR9%`8|np{qcv6#d!1**#FX z%Dqee@OztmX!UzXwu8Uu0#bWQJ=c1G>14=ec0vCB-=TF*&u2Q1p~z*_qMIy&|(v{d!PQ|MDBo#|n<$43fzo^;l5w#bm#@}Yj_ z|H8@qV;R-30!LA)Ru4fNE4o>HzQNLjpg z257KZUkr0GrBopI-}%F*UCa6fK@%j{U+9e+0pLU=F|hbF!*l=zuv9W7RtMQDv;gGp z;#kW8g9PPl`lu>(`hM-Oi5|=wYdx+2B2i=bZTUP(Ew8*mzdZz``;E=MoRwe8bdZZJ zlQD1yJ+gMd08SXwi}0aM4*E!#TSKx(4tCyq5ODZ1aIrAc^W|aSBmM``$56-L_P)l|zV&zbYX#V5-D)Es3vs2;om9fb*eZNFB7@KF+3|Ak+stH&RcD z1FIP5$qs~?Z<$O}aR#WM;#nLFg9yh!&AJb4_|_!De}SiDWEC)nr~$*)5b%Ff{mqil zh{+y&j#~0PWp%9tr0joUwS=CU$pB_YukRIiVwj6g&Q^=uHVl#}tkllsixBSC?--q- zigZN@#HI=F%5!oWjm=I6oXjoI?d+b6`ciuqCJ2@WO(cmC_s@8}@Z{aurhJ=ff ztS~T9YTrBqY%n{2R%1auWeUpyrngXeVnws^9b)YR;Br8ioAWCl6Bs&w(Es&le+AFa9HO0i|i{FSOi5NoESSi!0y9`Y@Bes~B zGsJ9eTP2YeLgd72V$=?MCU$qMQ$ycY3#7wtK@+(=*zm%^%w`r^@A860*SUK;ZDrt* z?_r;WcTF^Q+|7i9$!P?SBaojh6+ckukAG<9?_cgsct5hQ`m8ya$ z;?r+_nwROvsu|8j-SDbYND}X5Kbp;Vg&Hhxh#T<6ObMFyo)*tnOnDC(<*Ta`k~>@g zm6R-iYH?P*F!vskvW};o)j#a{Md4PnlR!SU{1Wl`m%ya6_`tOa4rPXXi8#C z(~VJ=S%ECS9|3E9S^-*l7V8XE{rmBuK}u6G3i@E*r%>q02PemJ+4$KrT0ZmM;~36U5YBmsaK*66Y6Fn`2#I_t+n=_ER8jBmk@s)s6gH}0-(o@Y?yyQae^U-# z8N9~N*PISsmmH$Ax%7j34ZtnJ8Svc-`elOHC890e4?uv-KhN0f7KYq)k9WT1LUqRB z+=w{#p+QqPJHs2wUmm{{F+-_Kv03=29EJ2LNqxam$YRvA;|J89Sw$ns5p%OHg2#^S z!oPhhft>(|5}JkPg>}85fcfTz9$}-jNr9#?;T;2;PATdYou4zE$=i>3Lcc9qablC7 z+h*N9{-x9M;zzRp=juwE=kCAgaCK!005392Nhab`>DLFKoD#QSg_O0i>jG_kuOkoDU zJ-jP}eqC>z?mKKH{DR06^d!;so;J;M4b-vt*lKlt;wvrjhlm+A3=G}oG3MZg##;d5 zS@)6oW^Hx|!8MMbb&9&XTtlk65eo#W#$Dw*cGYb#3JqZdTiAVR0KCk?Aw-rKlQ|;V z>{R-YK4~6^a$o|sBmDlMNUA%00 zkM|>k0gzo?{wXiok4PE4r!Dw^W?{{ye#y0z`_X7wwPde?ccZUA7R3k+Y+6N&mCpo%=x2i_SS^Q9G1YVf-i2J zzrAX$ctVlBCNv2BV@lyUWJC5upTkSgRf9y9I!B$po=7BXyCf9V7nrR|Fmb54UV*G~ zf^(!pmF$c}%^JZ% zpj~;7h^xzFa;pLxISYZg@x2~;DS@w!9D#Lf-0epb1-jJm7CM{BK&K9QbJH^Q9b|jD z3!JnQIPn9i;3nXnRMdBc#U3Qq^`Z#fBA%UXLF%p~8bLqCK8vl$n;9t%lfz|IfzDr; zxapcbM*ok*j%*dorI*a)n~c2eG%=@ac3Oz0`D62k(6Bv;xx`6u7fzxkT#!9Uhi&wC z*O_8t#$whSI9Ph^{bO2wmu&#LaizHY`YU(O=`B!TA0oUQybhZ*tB;T^VAVKH#({V< z*Rgv@WIpJ13ZwS;_*@HO4;jHKNYmg^6aqP_&FEmiz?S$J9L!I9e62{=>5Z1_xdI}0 zS7N#7t(}4nS1=ME^GEo?u|f)4=lnigk?PGitA?SLIR!>-l*-fkVmBjwt(QFYyZVBy z-34t>7Ei?v6H00aMw+Hc{%N-jlv-3L%*xv#;@1Ah>$w<4d74jh zor7MTcdou@hr4{-c7X2~m4z;U0n4Mkn6l+teg%2ca`>6|<$O|>fTfj#;$t4|+Sft? zwrc#G9%6fk>-`Z(dLWy+% zb+nQ{lJK^+*EcZT2Fpk8_Olz~ZeU|R+i+p#(Hi2tbTc8|t7%^e!OZk+2M;zBGd%eB z;IR)KjR=X7Xhj%eq?r|pG?!Bv%JQBB+qVm>E6({T#VE0G`uiI#EKrVuW^cvguwV1~ zwJkI~ba`lOL^vFWTL@r@Mw(jIb&+;NnXbMm_DGMuttia$aeCJHG*{F&i zm1D1^1yYmxdvBV$<0J*xOQ}=9=_R2&h{4XI>PJLm&gl0LoC5+GgaC=cv)AboYcUzm zkh$hxvHy`3afTPF>n-0+xSZzU5U`LG)+&S^Z$WRFdg>3~({<2*?|SuLX~BIVP?G(@Wxq|OH>v-0S)-s3a9dg*Hz zQ?{dNM*w2HmRKY~Pp#C=-i>A^b9iMN(^iNh#g7MN55zyM^1}Fv1SqhS8j$&!vMfezFbOHtETO>dDTD~ zx@0XS@+?6o3|w464mb=4PI6f}*w4K(-yh;_nA9@72muo+t{Z=sP)@&L$CI|K{&?K( ze;HXCs3J2a4+{>UGeC4~x<*g^@<9Lr@_+H(>c{C=ZV2fhc%8!3QCo+3p*SmcKIdbo zIX-c#yY*7}bAvdJ>)NhlM^hY%{TX%4iU|uiO3h*&v8h1-=mL4wK3$6|tBH-b6R?tl zmD*80Wn05}4zO{5)9Nrg^9RhXPE|(a1%c`sKAhDOjnYo7){%e1Iv1DF63m5HNkX%Q z=jTD!kGEBxcblXnY?E*Y+SpqywZy*>HNukv=)&=R0-M&~RZ%kq�A)C3rlo4M}j1 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 From dbfdd2eb12a29a57b7f0162b7504ef9b77cd8bac Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Thu, 9 Mar 2017 12:19:36 +0000 Subject: [PATCH 44/60] Update intro video. --- .../web/public/img/feature-page/intro.mp4 | Bin 106467 -> 240870 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/services/web/public/img/feature-page/intro.mp4 b/services/web/public/img/feature-page/intro.mp4 index 888b99975d89de38847bbf0974fa5cfd4b4753b4..e36e1c84bf413b6629cd4b4c1e8b6eafb01f3c95 100644 GIT binary patch literal 240870 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 O#?YRR7a&$%x%)qvFcZ1} literal 106467 zcmX`SV|XY{6D=Cswz*^5wr$(Co$T1QZQHi(WXJZ&`<;94kLl@Ny;gNqb^Vx`rw0H4 zfWXw*!`{Z8nGpa02*AS0&gS=GG;lRy_{A6i001CN9ZgIC0Ht*B2`)N2Im#Md|OjI7KAGz3O=jwS>Q%!~w%jLd8t1jfc}90sfmzZ2rLzXUoN zc@Z%hW�KpFC_t+-O}bj7{vU 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 From 901bd296e30b6c6a596f6e8c868b8b1bb979c931 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 10 Mar 2017 11:04:23 +0000 Subject: [PATCH 45/60] Add poster assets. --- .../img/feature-page/feat-accept-poster.jpg | Bin 0 -> 86569 bytes .../img/feature-page/feat-changes-poster.jpg | Bin 0 -> 83046 bytes .../img/feature-page/feat-discuss-poster.jpg | Bin 0 -> 107571 bytes .../img/feature-page/feat-todos-poster.jpg | Bin 0 -> 94730 bytes .../public/img/feature-page/intro-poster.jpg | Bin 0 -> 72008 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/feat-accept-poster.jpg create mode 100644 services/web/public/img/feature-page/feat-changes-poster.jpg create mode 100644 services/web/public/img/feature-page/feat-discuss-poster.jpg create mode 100644 services/web/public/img/feature-page/feat-todos-poster.jpg create mode 100644 services/web/public/img/feature-page/intro-poster.jpg diff --git a/services/web/public/img/feature-page/feat-accept-poster.jpg b/services/web/public/img/feature-page/feat-accept-poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bad07902f348b02761d1b3f96b295a34797ee87a GIT binary patch literal 86569 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

        ~D#wz9X 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

        B85gH(iFom-k&#E1V-<;-pWhNpV-X{jYa zysq|r=D*(7|I_wq@c8?GJgz;izZilH{!ohyd45#366>#_^P}&B+MEL7cnh;PkXF}@ zBSlET2aJ23_dRuh#*6Bk&w1XevM3_e)Ip4CSG=W)s4FilVn=z`(^Dq4Tuq5;AsEk6VLWcj!l_{BN!T$Pqb*v za5JIa@uqUxhmx)HeNTseEcvR4flQ{uEC1j#eBzPTV6H#fsMXEK+e6yT7A-on7Dt?_ zA3pPSmwdr|Uz^BVKb#7ouw@apQXwKLpJL`_X;m8CDi_Qj7(6dq&4Y=yO1(T4-%}KW zE68q$*oQp*IZRdWwY2t`_*)P*sx>fMI6Zi2T?A95TIY^` znm&;J<7&$9`oQ;LqQ->e6bnIo6II-X;HJ(XPQ7e$@DP~u&@00}(cMdZ5@_0C?P=vJ z?~-&wj;$-}N%ML1lO6!SIT~s3FP(zj4vndD-ZX_bq}@IMa3Y`fnNnr&F??x<%q;%) zbKWS-;?*BK=z|J5(kVpRi?VjOLgWQ}>cm;np|j_6j+%SQ}B}${HhmYv4y1hsDH$3skm+#sRJBsW|ev?a*#OygK1-`_8 z%zmNAU8~`?DZ}P`uc!O$>bX4CQoitBV9iu|P0LIQqk)D6sy;8kICxOY71oeL6Y{72 zD%WDkG%?-xLeTFKd`N!N+lhtbjgb`L0M2v8*3UEjrM^q=eC9m+E zE%U9yb4*yJ+k#b`3Ig~Yzq`ie3^enMz@(FHa})y3xLUdTS-jVXOGz=?g;CJhrLN}{ zwN-cAhAIj?StH%m^C8I+!2M-m$qh-W>bPZxiVccrj9f()5#fny^>$#jBx`;)AF zkJ%;JLHh$>?)q-kG~Lg=PLGO`3GN0Y#n!KrNJP=6GVM7T80W`=DM4Jh)4uBv-4%D$ z8c8)IQmM=N!-UF&xnOmWjIdP_Zl#12p|5BgXFJyL&)^uf1UXjT zJ_dzbeq6LO`|#0w;>k)Wk~f-V?{nm+mN%M~gJnnb!mE8rqvA3=qh#G5{0=n%D5CA0 zSB2zv7nx#(191rH);Le^*yQs^)Kwj7#Lj)&6!z1>VaF9pm7crsxVJkkf5Sr=yx2OT zy*RC((}#6tB~w~>KY4BpT$Hbk6sZ7aY{3)w<6Fz*9`;MpTFuLNKq;uvGtWLZ+n&^v z%ni{HKgRJ1Vjs5v((`0cb;I8K3hdw(<9fB1hwjEZMIZO8fZmf+#*7&pc8T;V$O3bX zPwkbSW(l@^@b`L%r+UH4Hh#q6Ccz=^@UT&KK-!1J5S5*~rcXTc=hzYJcxcFN{VAA} z@J^=#i94NFSpaq(Q!|HC3Ju4EaXXQW`VsUG2Cx6O?TT0`wX5Yo;N~s?$uo4w_HL)P2$$ zAWckP8eJyIPt~Sy|GM|IcVgfn6$$%&Gk28>^1Y%H_ucQDA2)Qk*k}9K9?^0^2e8J% zF-V*CxuU5XW`s>`bRgU_T?8Qx$1Lj(B|5}^{!G)Ct}e|b?p@E;fWC6U+7=%v5X$Ap zk0i8&dR8`^+&vOP#S$qm(GYq=7^VP2-NTXl2r?R4@+~bC(%P%xXO8>*xBG&D?+`aH z&A(|}3azZ10Hy?$Yrzh!*q1gk+$>(AJQ8FpmtD;A@ zYUxBwAd3rTXbGL4x9;nPx3;Rxempf`jm;E88d~_p9LUH1`Wm5=7hya8HmjMSP4C!;WLE}~F_>1HGCAylaQ zC|r}=vWV-!X_cG<8v^`-uo zH2rkm*2i6Env5g9(2!;o68S81E*wCP_nS-e8mF9B8w}wj6KMQ&X2ld1#PB2YPiqk= zmFsKJwAzSSZr5_$AeMj0Q`HEa8pNbqnufvB8?cN=lIVDi_Sy-Xxw? z_^!uKh|s-hb7IsVe%8a`KB9@&XqtHpp|`_I6lB0Al& zF5_DC60@-I|m|mq9_pJxy)#^$)3}DLZd*IKXv?A%(_4h1jloJiq3ti-0ibCRUf>v`tOR-sN+6ff2D+>u-%p;op63VqWI z)ZOPCn`l!B=)21t(Q%_Ii6vLvBQ3FyL^>au_W9so6hzCqm}&cI2jl{flspIs^u$pP z=)NPeu{LJA(hI%ueMr`EYAucVp`F)#v5i@Ty6WX3Ob3P=Bm6_ zW0f7p^0dw#mX?*rdqDo+hVk?CcqF5(=+g$S(y9m0EpoC7M0?z~xGV4l`wt%CxO{HS z9?TF%t@*=jn*&%YE^@z6#gu2zJV)Hrip*SFfi_|w-#Pm2;<$vU(mD;GMS74lNT)!! zE%rIJqvj7qYuMJ~-rSbY2v+KbUIj-rJm}9DmrZPyM}stSAy_36i>?mRcDq4r2g?fA z44P;+U8wTq&n^p*`{sEMlKwJ#crM(x(Fo%AJSB;xBQE+-D8SI$v&6x9-lcDpYK zgjtcAC-Ibh6DNj^uZ@;R$y(<7@!pKYSi^IjzYrXt#|AXrsxxyh%9kxte>dD5kRUuD zw4IPX?NeenK(Dj(JVSk$Q&d~B4rcYP*TpLDEyjhWVs!WUaLe!icLYKVhY&>K(`_k>lU;V1k-(7w3&27D5K0-u~-5}_IUl9w^KMZ9r zsrO>)f$DC$SDU^;oTfUmu&EGH98kgR3Grr8i8}>PH`Evzr6PR1bgn$1Ti(@Y{w_#` zI-ffIYiO)HCTgfkD+av`$H>WU*ZR`n>jTnnc!=DOj_|B_SJt-&SpAT_*xIIIPIezd zR_ceHqp|l<$hp~o%SgmS#|$cKA@A&U%AD-G6!BGlkWR*8u`Eue9JqD+M3y$z{T0)# zQ1+ee*IVPI{7LN!Et5RPy@;`=j}m$)acls-+;poz7vj z%0N+RkZItJh&+%cGu~a~9Kzy;CPQMzwKYfRxL}~g&wKtEd1gaLn-PxrlR3a!Sy{L6F4eqQZF{r(?nA9Uw`i`_!6{s?u{RxgYLkq2f* zE)11wJ}x!Su=y?F1f6|a5y>%Ot~ol09L$$Y9E8KRaQY3T$;il!EWs=HjyqYpRuW6?5dq&qzjc@s6EP#MrIG^bgeQ+QFuN-t-4W#Av%X%+ z*53so1;iN4TJ1Dk2bRYH@4z2|@ML*H*w1*aQ*k!r?Je}DfVm~tRqs?*IDKMHD*(p< zLVpDw-GTB(VemXx@dBTP^rT2eJK_vqv!Re2(fj)5jSyC~qrss0vPaOb%&jS6tP_d^ zH3UFZ8V&l}ovZvIwe<8ZF=dTmP*VruDPYbjE}s3=-J#Vf7`~-4U*L5B$Odfztwp%w)%1pZet%|U;3nvK)1z$t0xB}&k(Pl zK%b)`i(xRR$zB33n7cLMSLZ!FDN?r;bW+!a@f>qM+P33E#)Q$+PA&%+u=~>eS9DHi zznd_yL=HRgV`PIKgx`UFeXeksK3_4WKOqX*2wR6nYs2#@eZ4q zQJ}_08n8uMz_@bUo|82E1JPtfyeT!c0mO^tk+G3j#3LkR$onUDmZq-i# zuW|rUEZQD1(DDXy>A2GTG%()D$@dBM-#<;CEY~)cRnMI_U{Y2rvX`1J;WU-^a{UJH zJJ4`l$FfieN}VC%wi21WCz}{x+4E#nR5CE4m4=@tbS~OS)ZA0MvO@jIgxllk$3TLD z^txj$a%~q((+W;kbk{Mrb1Lc86smp^sOrr9?31EFY)(Q|$_>e15BBz^bY~uEgPsb__6Z6)r*KXH6?w(jmtrV%2EGwo^>ki*XAeFA@^@7ik zjwah#f8D+LK4(NrP>HsZQ{ugp);FZ>0uBm}*^;bRO1Z7>6bv1prk)^H|Lol;gdpm3 zwQCW&mK?uKMZ4Z{%7kU>Aa=Rg#!{Q1L(8Y7Kkn%CqbOe4a4puM)A6U032hTB=G;{< zPD_NLc^Yfj9Q+^Bj=yDZma~I`SbgtP&~P%1G_%b0ye?B@Wp;SIb<(BgWGT483aKMZ$kz~^;(Pj%*U#o;K_Wj4vyOuAE(XJ3jgVKn5UVx?^Q3IB z3|BeN^65M82m}wxv;KJ=(xMydlA&n}Fb=kol zL4LR%g<_lSDO$M)=kh2dN z8=k+q_vTi6I&E;{8E)Q`ZE&e>LJE2mMdP3&SR~f3Zo@m4?o6*~NTV&uWru6ad~`u! z+e@U_3)!4OtGk1#pQ~#5MX(@6*z${d4u6_wKNNgK=ZA{D5(1LK0$N1~EANZf$O}ah z5^_d~NES_0T#N`+C?N;E7d@pRT?RgSJB!kbGUy$t{=_!B^1cj@%oS)@bIaOnucXoZZ z-{fhtjJAfmqN}H+!V?y5kPEQE+K>Z43#>CbwKTBsprCIr&2?NJ!t6?b75gX0dMS%L zM7FdP2NVNG-0w5x%8ZO>Vj&^f4l6tu`$6ugZO1R=5)jxgY!YGUYRqNe^cjAzSnb@R z*xmr4xDV1-{50IDh$o_Kzd8j*{93o%%c@%UH?LL+4z{$gcrikD8Efujhtu&Y3iog= z+3&yHaR>^V3<0o{-40BVB=;=C^YSfQ@0{n&ZVR&N znEC|8xc}Owb;8Er#cC&A4eca#f1T5=decNKx^1{P-UHE-_mBxg>8dKwN$^Bwi? zi}jh-oB;Ue@#nu*a2%8G-#mJM+4lavh~Jz2yC5a=9|b9rO5CCm5|!$(+@Q<+)Vw3f z(3FVj7@Yy(2e&7V0d|d~|a7 zRv065<|WZ@mC>=l6NZEmZMWSe-pI1?q3K3`ly%*j7TMo52MGH?hg|*EnXS@9OotEq z5+#7iQPf%cC5lqcCu(MoQ+7YGl@lR8|312=(d1_<4>1OD&fY%QOl?~wq1&-{Fr9#^ zP!L^37ySL-(wyQ9EuVd@`d=EfjOHivKWo6*p-n<~2*v{9gPNgjszw%#R!q4@I@z(;&emyIpHHsC1*ZrJiCsaZmY_Is5q22(30HfLYm9Nr}5 zPbdRV#5UQ`H)Rro(gD1Hy^IdXEQshyO@x6a+5i$C5(_?3nw!dTZ{g;_u{v~1$WuK( zepG3qtKinbc1IcZYga642RjbHu2(^(5d9BYNL|9v=zfMa0j=Ca2{sdGp~#Mr3H`6b zCYD;J;8gaQ>BH9XFm83I?u`_K$jhAtGb9{Gie&lf?XZl<@=p6iz^!(PEjvnZC~3!y zrC}sa29sxEeqhch!mCd~tNj1Ka}dEUja8Zy7{!{tw_f@kr#ccNut~h9v^aATDX?q@ zc4A=J7xpA^dU&#-mVl+<5cmL5u%&^jOn?4k;xDc8p9g~AM)1$Wp}!E1|I&>9*TvuA zR*{MomGz(gddJ}Zj2iwcku^3m_&)o9-tc8f9OaLpvUrxwv);J-j;3P535)2IYF^u= zw5QF`d|$MVT$wcs%Y{LB~%MVWx|KrM1gjOxpio= z_yB#_ERl*&>iJuBg9%#?a}k>FO@TEz^U2mN8ag38yklKVPXJsda6AUFC*-BXHToPc zvs?0{LNed4ozlE}pU0QqO~S;a!zN|I0WKG@kcL494nrKiKX!y;Y@IY6Km|-LFICI= ztpkSaV|0C(9N03dX?x@;+IM>l4%*+;#CyEvb#HV`@<|p?vNPMk-i^ucdu_7evu&oR z>yng-v?ULCwy!Rwivwkz3BX~#L51uB%9V{9x$)A&sH-A>CmbD~!_zjj{7!21?tM>- zR-j}5McdpdDJ?(hIq%3T`^WiYRw9dGd1W>7Y0INS#$6ACi_)sZ_eESOt6j0_DD+R2 zLv*}btFF6JW}8^ROXs;Oe(P3MpIP3q23qra=Mag->ucj9gW$%j-FDOL>#HrBc>Ogq zQOXpTP>B>-HXgVf$DqKRt;s`E^sUn`c!m8ZaZT-X15fcMA9M&!SBH$h1b?Zkn{dIC zWG^Yoa=(Zywe;QQj`fay^z6~);roKLd=G-n94(F=?P*A{sr3_4fovx7OI`}S?zi#e z4V+-`)E2pY=k|=H^CtRSekzFFBLLDm=q?fHx|?Y(t0!-rABo!cw76J*dLCv)-J+_S zqo85MGwNfP{@rD0UK>7$`DWYc0nywg2-`tmtUYb}38zAvbBB(hP6WAOueX=F5d0#5!lbU(_XaBEJ@*&vL4uI3#Q?KXg?M!tj*x@%Quj~~=Z{0o zbD9ql8iFGl&DzXyWg}YKP%FnBt63P;yC3^idVC|D;j4y0YQ7_2gHEjk#M#OHy+WRf zoyTE(#_S^ddr7o#sDcrP`D`sdS!IbXL8>diZD7DxE!WWYmJqRJ-$T^)AUY1Ic8l4p4!5SI z7QXVI2s4{tlND}R*4lW7%`7%B;(=XfHPNj8=1d~Ii=b$bOgK&a`mTj-NhVm6t zql!)Jr!2z9wq!S~)Af#awqes9m;@=)VsC(zl%Wm{jOpQhk+%#)kGD=Lj#C2y+UA9C zy4R(brfETKwQ?Ma{YwIT{gOZ^TM{%ugbBBr9ekINDHF+2E7c+qE~AvA<{GoSV38VQ z=kYNxWeJdVU#M$-O|ftO=zNPiUOdfWvGkDaQEm}CfkdO>*$FV%d>A@ zwxFR#CFpj;?B1AWsi_b12+iRw)cedp-EE|{FymP&-Od+Z-DJdP`zTTq9O}iZABuF5m&Mn>ITrW$x|@g;cK?6VE$uF{$vU zn8!q#Ryi+Su|f!JK?CmFEFRNi&4vM+_(T9BJNr&M;YJ**6ghKMH8;cL+%B7M)UUcz zvV}^oct=}R=}_2${($rN{1?gbKaHRN2kD37=YN!bSRec_ymOV&if6P2^_D@dwR@+L zF@o13-&x4V-1r6X-aY!D-otFo0GIwc7`PPa7`Pm2Fh}Q;Pl`e%uqhih!@jKq_64EO zIlj0hb`7LZ#pKed6QMl~3?_qAmT`2}W=NZjY$JD}n`h+tif*CvXH^2dKU~{OiBp@b zlpm4mkUHR_BuR5It#~Ib-b`XRz3#p1;elceL7QWbjF?U)AgIs$6UR#y(n-&3*QiZc zBs(&Mft_~=-w5^%wy5yY{l1~lb*?KJEgfJ&yeDdbSnd|nN9Wn;Ps{9_&BB=HY2_+M zVIK#4TThoo7%0qG#>0l;YM3dP89VcY&cFOMME9JklAJ}Fikqq!o^4NhFD_l=2M|8^ z@j2BD3-vnQWH0|1t-R}Y1zIpIc^Tllr`dvvq^+6z;k2lgID>REwc=COg_(D%gKS*I zMVmO9aYEm?MHj#<+H4|Y39?LY zMe5yD+8os?!-d&X#}1unv(NQe6Lmp|h=TMAUHM+Wnc8^%Yq#U+WoNwH*&0D42O4cKz(#o2^>Cs7;Xg2XvWTeCb2sGpWal)VUznkgV6%it(Dl zw_>ZA3Z6fj2)7(pXDUC5nv%4dwR^T$1)7*S$#RI4zuq=ZFr;ue=-=J?^&4OWlOvjOOv(BYi*hum(HLZ_NR{YqOH~U5Is#W z>CwVPNt)QFy5~CLzoeIF&%ZYw&J2g!4D;xrBA-i4abh6*|J z4p~y>GY}`xuRt*{zzy&OQY4)H1z_m#Il22?bzDsoUWHSEfUiDnx$r)ykv-;KOpn6^ zqB;&pj?l)L(7stwLnZ0zY>9Oa-phAsGV4kA@)oz9OIPV8d?BxOp!iav4yMkAWq$!$ zjHZ#rmJ$z&;=*AHf&#!^!$@b6=%>iwCuV(i_y#1VbRb$2BdFc49Qrk+;)rgoM^Y;e z`fcN}lQh>m6ZRrA%~gVT-ZS%3e<*I`o7g9!0aiNB^-WV4Ze8(y*V4WDVZj?<+J^>TL8L>&7D<;L@Fa0ZSs_DB(lU)J$zWCid@VPkk?|`;dwm#Gt}E*yp?M z)8{H@J>LE|yggRBwA@U1;7BQUQ#_CETR#A>laMUO#a|Fbz%fe{mE@lxnKiY+7(e){ z(=I8nSjM@Y4TtXQ-d;>TyWbRut=(0+IT-4K7@a*=}7Lnr8>f(pu@ z+>o}uz_t~@+Pcfjsdp$$3bv>9T_~1!53DrBKzQ(F(1E*7J=tiDaD_X96j1wXP_0Pd zx`ss5Vb<(g@lAFKBTtDMYuF9GxAP1JNXdGIOF zZ`Lg2C(N~cwul@JoX3iW@szrr{i`DdTyg=giXtkiU6`=wB4$w!1vn93YaY(e-e^Y* zHujqut|+G@!gs)O3H~hihNI}bM}_?uS2=u_T~E#GyXF|Zxtzn-Y%NQOGZwKUE1my zWxOgWBI2&@lF*IL7oRETeC%uO`drh$k$6M$3kyh_6FA{j2d)AhC0ne=q3%gjdroAO zO={u~=V{<@{=(cmoinF$y;c!@ACD=7GuWSdiuhY_U02i6X-=U z1fEtm-5%Vp^*7^^cGE4}UxPnls~~;MbbozUl?h~k-tQRz8T6W-!mPWp_9<(1mtu0$ z_MRh~VN1^WZCp0nY`FguWfl5thcGexAP8&qgM#vWCyFR}4>&}qUeRlSK@~PURw})o zC9s3(Q3t`qEv!H0P(=VlbP`T3Lzo!Z6J}n+QkNt45F9Vfm;#`$2)-*M!qme!EH$Z) zZ8Koyr&I)d>1f$)`7sBG`XC7P{WXWk`IGI^^WH(5c;JYu-v%#}D+S|y6N$hlp(K`| zN!6u>HSebSMoFo6?37vYfIw#XQZI78^jd+>cL_H~29B;>`SmX|$i*`R1Uq$?#Qjpn ze0m64-@DD4F&vm`X=CEv`oE{nrvbmtt6+z?rcjU{k z267R51z(!YeBCLMwO(!MG-AH>x(>JNrrZ&&1T|1hd!ewW`!VVl2r??duIrkw(EbNC zoGcAFZjy!JG4Fw_jjO1P3a>Q06flpR3VNZwaJRJ4r(>zs!ycJ9L$(-T1CzY;;bA+ z273GSxVYINH*Sk%Kigy`W7^Ps8j}YLR@o0a#@h^^4f$8SecC%N$ESWSM)7oJuXLey zLt}n1i?D#WmZGTNxx!W$nv+Y_@+(e?;rW4+Q*tM@tmXao%;rH38mZU_|0L!e%bdFi{THo~ig8^qv z9bg{4Pv6*54)xoe@I6^BXOgLBM_m^|X8zpBzwpM>Aty5{pAu~ON!UhYupx_0%FBjew(VF=W>CQA{L}w z>FDpZ+H2-MC2HgU@+m@rYoFVgkKjGHuL+-5`Y$|v!pBQg4!;WQR`M{{Z;U}pLQVri zta(Akp{y5l@9zyMYsDLx4PL&gISunddUt|zR2Z>ImBob<1{PKmK|jb{tG54tzy}XIX}+f6Wi6ZHA`s@n&14CLkW|CGQ6$IZOoPaRPj@A|q8e zT*9$$8O?L#y^x~5+;7JbJAE5MqILvnIL^xDt~N@|Wv^2r+X$?!SAr1vT1{k-J2Kw0r}J}Oukt{ScMRP*{4d>x zvKUWtL0a6bZDk^WISsrI`3tW^E(^_6sQEV z@%&Q1=XwZ!hA|)1Ps=1C3GKM85^s%8`5X{QCz;yJ?Z=ih*&JWg}vFWP~g!f+SUp-Oo`d6ugccnvBSpC=*}*&1&9;kbeW=}OPN`uzI}x8 z<{aK}nx83^`SXxQnoI1#=e{;hSlJ4`wNsOq>SUtLuvo$fn|rdJ;qzr}^z;`-&mo7k zSy{)m^JiqR;6q+PhC&r?ArwM2zC)Nw+JN;hJe<&%{f%KqNZUvPcJ#e8K)E~43~8bi z=dPTEdy@X7eq|nXUtis)R~znrkHyN!@ojSugN)>*fv&+<0d>yNV8sww2FYN9Z~R7C z-%Yg>dH1)uI%OgH?Ube7v<1`h4RmxI2?TN6%p<#~`SM>yK{bM_lKt>Cj{Md42&<>Y z^;J>HTAT3ENSXEN!cN6tkp~CADHPw!+;?UkPum98H3KDNTznDnaW0QV$agOj6krtF zsFtRWZ?4xh{L`Bpx}J9^HyJl@#0zj5(PEVsTd7MBIPuojSw8z;c(6q}Kt;gl5H+Nm z1v1&a*q2Mc*__AwWsQM5W5?z0Co+Gd7wth0d)_f0K6TjUlpQ)UO)rmc*_rgbD=YWW zb7r=VDzI-9?x~AKwY_sYzFp0p4{9Ebn|c52pou*b8w1Aft)8vmQwu0R^58{PEZ}fG z;KR;LNz1q|lB;NW!X}Zuy$U;MwBsy0I}mlSou2EmX~8WKF44el@MAtW*u2=xspDg5 zod%nJ``ZoZa76Qs%nqL>G4AvL|7xEn0v*HUw8vIzSgU3Hr36piETz7bl>myAW{Y@)Ny4-1k^T%^0 z2#*cf9P2PyjiC$@6y3Vqj~yV1twfZ+rEA^*fgd|3qlR_}D}+|d!ESR-_Q{jxTRz{V zeXAfET69u$MmqEP?ngs^wyVzJtO17)Vt9drs`pYRU+lTW6>6BuamqoGeunVKU(NVk zaZ1)|y5|PFyJQ9X2}^Pze`Mc4=Bvf$kWb$Tg*?&}Ow~#qngw}_YfDrw%#n#c~9HzoBk z^p1zA8&ok%^6!Z!q}W-ZerCE--N-a|!EMS1HOF*pY+gJeagwLj$n3#O5u2+yy@6kc2y zK~S;Yodd;tm|c3L+KbXhozP}PTuuD>IVunLU2wT4BK26W$<_5nyCS5>I;qpVM4ED4 ziVLdd%jHOk2^CRmfl0GphhbaN^U_D&UiVWeMn$w&3oHrEiF6&QFe-j5e;+atorf?j~az+6l_2_|T$aLI)zXV{)jkOv`pj^9?O^ zid$qH0#!PM)tw17a9da4j0nGKhLE}!W84s9#5_I$uSB@zGZ~8CgOT(%VCLgj<{P4ZUMy zidK?Ip((yaR1_0oJZ&oc(~Ni)VZuMRP`%l1+g=jc;G=CIfZCA(Cx}(|uFbj%8HtG4 zEzG6-Jgvcc2H>o)!@E*(SpBAk6o1E6hd;`;gkpitK8u_x zlct0jbbbrn^00gAws2HKD;OD&QMs)oW*QLPzOKnUtmchf1#8;y*|)ldrf(`gtRbW4 z(Ug1?+7vViHFB`msCrnIv@%4MLgP&?mWbfRN&b}?$Q}Zs` z*AW_KK4ZSHM-Xk$eQmv{>C{Ew$LXIQA&FH{p7FNOGXCu!Ig-89e(aJ!q54f^Q$INN z`I_~Xtzbb##qsmIvh-jx!tFPabcd)FG|K8UKl>ZEM!%^gQD^&G^dr&Boy6pX_*y3$ z`REHtLK{a+msg`xJMv95yj`AB7rJZ`;w$-G%i7!s$d0A_iR-(nq_riw+s#eCNiEDO zoeY*sSeH&Epu5-CuKKZ4 zdX4wxYYp?hm3!v)`Q*o?IpUdJrh#t8`52{VDSMU;#JAA8R*hZxs4S^$QvALV@&rCg+kDKkeD6UHtpGW=9zWCz0N5 z*)>5-BTUwU&b$rpJAdUWY<_bEoLnn~B#T#LUG04JFKokxR|>jlsES?2L}Bte=l4G2 zf(Ms_;J?xz@D1K{-@;1eBu8s1z7RZ3_rcaCNPb>l{4!&Au;0Ske&H7T7&hR_^oOEi zXZxg@7wP%rQ7SGa>yw6qSs*`znx8r$GQ6u|r{{1y^0T776Yxs21~U?>1SV}Fn;p1>2$l(^(=T+pUEtc=!?TcS-LC7?Bjs4 zL{jPppN7ji`-o%3x4?XUV z71_N~kfGl7>e7WTgqVU72VN-1@>MCZv=%?1B0OGinxz@ffp)Gr_s5G(*2uiHnM8Ec zBehXx0tTubUowu3ERWdk8JyP_Ef{nz9Mm;g>w^oKw(9&W3S$tx$jjU^Kq#-LVFf~? zclh_ubAL%4IA_?y^fmAII}Cbd1J8zFi_8m_2?7OyTaTzn0#PoIJhZ3DUVi8841Ylb z{aKmLs+UghH&oSSB|AlcYg?eP4U*VTLXel<2P+CKEkKJ2$%{Jo5Wf=v5gdEB76d{( z5xs932m7Vt?}5#knt_WvsKkC+ut}e ztJ7EpK$f2rM*GhS$O7+R1_SmZ1h3b&MM?07EEawvACaGeCKPy119ayxZF^d?b7x;1 zTLmZ=tzsOgJ_Kb*6fwuI{}!I(CnqmhOLR2qE^n)pKe4fyN3P>|aJdZcHk$pTVdj>h z;b!xLpzl>G87`NhZb{p=99hy%(>PZ|L+!rMA#Z870}c_kXkVP9MP2AB8j{%Rl3a0m z!BKdz!JY)2Y66%S6VHED~cIW5ZLBAzDjP>L(DFnH^h z%%N_fBqQIn-#_l$UROPyvgd0_ET17A8uV!9Ycw)4mrrG^YX(ou`Q_-7v|A|1P1Jvz z0w3@FvXSgwZ!3+WjG9ky+HFTvoZ$-%oJ13{Nv#3u4_kV4Q-Ftxp|N>kLA_Wl+4*^H zDDBUH5hBXvemlmyW^+70+-iLw`Eo285o(1Zkd)IgG8uEgc_>lO-$(O*Kw)0BdNAUQ z@=yQ0X8Av~lK)S-B#B2*LNpz(v49%WxyF7bs}Po_FPc$>35@-26buIIBZ1&EFzP*N zx+f$daU*d`1P_k@L4XilLlg)S<73{NtJ0d~z|Fw=%b!u-KoNNOgT{oW9dtm{^w=3L zC)Fa~REv?w7Q8~^wCNpi#cHuaKLs{g&bHx`I!ApV>lJ2T+<~UN6ta2QhWdspbAo{R zFrW|NtOA;z@9VAWLq5Jhqo+|2Gi}=Fm$O0T#Pa$(kqC#PfhOp9q<93}F45aEl-QU~ zsp=kXNpYF1#8?_U)cIx;A1x-7uSm$76vir)AP|X^6i7;;%aYQ$+7OPI|$JP zPl2iewA2SxO{|7F2yAiz80-AAO1Y!5hkDtfUBusDG*9D<=knO`n0m273nDpeKHB2RpReM$>A0I=-ciR$xW9 zUN63@bwIrxgpD|jba`7Wu+q_iLI3ggd>Rp~gO006j6EOjXT&wWYbYt63V`|IGugyWOv-;)rGsV%X$nr2A!b3EeKwh`z}dRLjwR(Qwxcx^`iCXf6N4f zaoI0MBIH#?$C#`C@OAumroul%WB<1_`MrszA6O-PTz}<%oms`@$VS z5maryWW?&Zxt(ZvOk{eV<9vjX1>`b0DEVIf2dkNeqSkhv0TZJFlK=$>!wxNRU!2li zEqxqz>aFa0h56Ec_0=P~@G!Sk&c__nZSG!|8_6llJl*y#70# zHfT8sV#bKjN{&~&V3tf9I)60L4zPvW&%UwbhJ^hhEbc16u}|A@+7GKD#NT&#~Y5qZ3n`%r?ebU5ib`^9PFO0oX%=GPuqAs>W58} z-jO^Jb9zyNQ4@)i<=m)V@+~_EfRzuG|i7@oa{;ZG%H!Y9HI?9`>YHV&Zh zs-ZViV%uJO{?an$U@V`p3D;7jOLdlvWP;5FT23xzrFM4B|FN1Ik?+SD-Qq_Nh%`nl zrJv0PObqyNhUUz1NUAwCNo&i;@zhjWC>XivzXC{aI@;D#6ZKC}0z~P><9SM+t<4Yy z(5|c%81o$c6fmPdQLNeZ$2{^Og>86RGo-AEI^5*Zd(~&F&H@6Ux)*_bm^$q%`1jMjy}2NK)tB*@Q^ z=;Z!|muofS@%9E(0#g$Iure*!`!nX=x}33{79QC&=B<8#EJ5GpZ6@pN&qSlit_{bD z)=_4)E&ap>#qmh|0iuy-5;>b=A`f4=rUtxHl590KkeKezXs;eJ-}RC2<_yzKp1;g{ zX~zEKGF6$abJA;C1KOl7pF<{aM7^^@TAL&!KD0u?$6XkfML3qf;d(UE@(Ti+`N*uR zkp5DkH`UjEl9h!eCVp{o2X$N}k8R70yPl}Qmc%@c9;%XJXZOU?$Wl`_e;Vs9R5kwN zP9ET|v0>2$#rn7G^~fxM=ZVj$BAClrFF1YaN8;jgJq1CIzKfsa^jEz;xwD)$?KQ5U zt;-NT#PQ#Zar`pq=XA>=NnIVk> z@%#x4g+ND)V4N^x3DkOI;Oanj@-iZ{O}j&@-71Q!4cmWI|5lKjFXfH6SLIl2nJYMz zanz6#j%q8Yht5{;s}{bf#};1Pb zRc}+8)Mj|dcj5%I$9jk>LaGPC_Ge@#G(6z$*mN}r6LL`9;zv;dXS*_ZMB-1jEE~pM z9~@>Rm3`Sd24|22ZU1z60p%|=GoH;OjUUf75TnOIsq^*{5Ejig3hLYH3|L}CjB=x__N&c-0&)d7aGCbTq{t6-bwC^8}a0`@zf&-IGMZnrkF%BT&{32h$BQs0xjdHJQ=V z-{D17Mec1m+IOFvF5bvcTNwm#(S0mp9b(0-1mmSOsoo_bu2jxiEy2|H>Q!<%L+fma zV2r$0AL?RC4F0@@nO5TJ=}@<~(+O|NZjvXV`?C!ku!7X{(Rh$KB=uG8ml;*eL7U@a z+eY2uW(g0j(fT2wD1DBH*J?19T6|lrGFJhsmc{;$^^t9ONUrQf6k)==0gGf>@_T!y z_%qNr!Ylu6o5Nf67R;dv9X^Ol7HqPX*=B~TzMg|{5Cu8v3;zy^8fQNt(p59C>XzJq ze$H}EC<)*^{Sq$s^y@-I>jQZ&XzyUK*jF3+bCRPB}bMCT9%ACmx(^Tjskl|h$w~Q zc@p9osnQW@DDd&Y!8p_9Qh`DnB=CjF64Nv*2j4a6K>^^TjF`Oil#kxijE+QIlS}cm zq*cC>Ps=kyT0=%Ie$Z#)F1a%XD@dXj-(;lKKA_zwFu-pyr>;4NBNX|O8t zQr92aCT%C<$?Sd1;=he#=6Ym}kd+dKbL4pCC|>_sK1Hs_atIZ8%2T%vm>F|_S0KL- zktlWDXHBmBcq$b3RH8tTaeWi4|IPRC!W(p^QcytsO~{iYmYDH#40zOOrg)zZVZ~na z6!**-N3@0%3)4((_{h%xZWX@iB2@bjKfDby4&1s3z8Jx!CW-#09#{?g>hjnnA}IZ; zk{hH~U^ztvHVt!?pK)JQ!bc z%s7*G$9ftLgSywb)3!QZv{AJV&(dksF=la7{e`DJX?kX4@YeO(^U^_OvNW*C#u~#X zAHS58ZEIrogbim?<~)UB46Y|E=woW7&XkT&iLb$|43p` z=!ISbz9-J>c%0G3Hn%N6 zrn*Hcg96lsqgK6=ccN6$#gFK|8F|dB7@S(@>W_ak>{3X~)@OT!0WmN^tNKcR0y%6s zuB!wOPagnh^f0FVdXOm}YwF2)uNt9IF|X7I#*El>>aax;5J;WFKrc2Z3&=DOP3=3t zXC~un=nDc#P+7v%v9(!*R_v0;o*58^h+5dFC_m$_tjmUTUZmF>6MXubuSa)X5PHe? zCHyH97dy9CIP>Qzr(E+{jD{8H5r~=!qWH8o2?%G*@ES+!(hdMww6NlXHCw@d?8Xk( z_;wZ#n%Y#(yP29&o43rPh34mVd->$yZN|Uf62%;SBX)=wyz6nd9Q52{R<94f5-%oouR;(9NOya3}+7}t}E?#+v=(|&M z9U9eJfMX=$v5jJ#jj}y^(Bi9HR?nu?C4EuEh z1synz2+FdkX7#kkMJ1;Enhy)8bTewx9MU#sVu9WmIV}4n z!&-(qAGB*`k3y)0bx`sm+BqLvIJ*1*ymG4?I|RJ6E=p)Ac#SuxRgcJ+5y{vsQoDKk zw>4`Y?a^gh zASC|P$Pl$~(q1o5rT7JSTq3lR7SD2`VedyGIOO5yzmGLDQ&SVr&+N)5dAA74DI0le zRP4vjWS5qdW^8$i`k0VVP$_Hw3H9acNhA60GzGLWC?ACmtp!D=jg#ik!URTj{Z@<_ zLT6p^`IM4j5i>$vKM;`8+xaXa=NzL4ekFcMGYQchTh3er>guDkzwNNzAWtx#7`O@{ z+F5f62BW?V=3a7WS^056UnY@}28A4U8X38TY6QL`T_a%7v)Ztvzh7}whuChfe=Y7R zPg<;0X>T>-=f@Oqd&@#$TYZ7$Wu1mNgQj&VS>q_WR?KnGJPxd!jia>>F$?HB}uH`VdCT~?yBvG+~@~ZUukO?ETZd<&i*H6-%f;}5EpmV3dv0?9^ z&-O`=38&`!u!c{dha()GjB5gT+)m)CxcIL%GeKl@Q*Zsa2s|-^Gf0iVvlY`#RTsU$ z%dJl8tuAiD=%(8ouOq62s<@ikCgI?E!hi-^E_$J|maW*N@WHgevvuPjoU9ofNQs5^ z$+6oN;tQBFJ&9-NjKl|scGpGr8B*T>qY|{+1lQ>TQGJtfhIM|StsyU0)tO{}m-b$9 z$LPU>tXM$yjBEL7ddP=I53g_$Tui4MrA0T#V)y~s{Bjbh*{t$Tq$M^!)}-0L4F(Gq zkJf$?K5OaWmhX0nOUXE)SVIP2M^YA;&$W}r5y}U$4FH}Ph=Npy-1$FAj{gbg`0q`e z|5}a`{M-BzRCMq^&^i9MODqn!yoW6tO{dgN0Mz;9P<{r%Xc(pah?od(f@LNi#UO~L z{riPdTRdE#;`Gi%<)Rh=rbKYIs{;Lap4~O-79sv*BIgfUg;hJJ!@Oge-x~aGl;gEp zA<{fV*szM&4E2*VzZv(3Y*Z6-eM&E*y*%w+gol6epY9XQsKrc+cI<2p`q4cmwm^&badC&3tXKP2)$O_#-Zky7nqSl?zYgHo2OrAoEh!8t9V8-(S(u5`IA3^S z(UCi2;o`2fnCI`xhhBXb;eCv@iXGFK-gJ+;wX8U?6_0Xo`!&1mtQFf_kjfwn2>%Oj zII;#4Bs;g^4t*&~m}k+_rW2B7zKlPWtUYJn>}RVNHQMPae#O2CSVqGy38TwZ>(!1< zO8IoqFej2%g5G#PZ;S#Oz3GIeil~tO+-}Cel;)WWcy4v6Yd&&kP5@nK?+q z9M{ClQPBon{0LaLWV)bwlK8?{3el0~yi=5x)SJ83k~^>O{hU=b700HUsPKbfyW;GE$qa!HmB zfT=#$X;ldJvuRa$=AfhjpvVXpKnFVwYRj7dM_9-de;3!#R2@Q&IrOoPb+Lk9N-<=D zUxW%}!7Ge?KcjjbP@jI44di|sAHA)(#PT_hXhpN32JRRxgYg4*sdPj(E$OEb6 zA`NA5D0}GLWH!1b-yToN~4tIKr08Sa)DJ#$oJiwI`OzHMpoO^{u zeKe60TT)QeX&j%i4qMy1d1JwL8dn1OCCl{FVtO|)m)p0fZ-K6Xx-f#mx2Jl6ACM#D zRAsEk7$Dg=LU&;lnh?2N?b%|-?@mhR*u!tG^A5sFPuE6)GxbWba+zs<^whYotULE3 zxCymc7vU_|;Aq%1)^S9VOfb<6_ai24BnQYGlDB*$yGWk2Ofa}|uw!I-Us|6Z`DER; zYXGj%ilrnyz0(gFM`qllllfirnJacfok84Rxf!|C{V{8&GJvF3&twiAjjhb=QH@fT zSu&%1=*i4|Ihcfq7}VNKXcg5XgKL>~g_S(3AL;|<#8v%F5c(*OsKJ&M*{bA|nVvK` zY9p}Wbbf=6ErHQF&lub5*?PLj^~i{)e7CkAVbO{~*w-c!SQIyNMZ)G`4V=1Zh0n_{`dhA1dx4C${>T^MiNEdH zNgJ&A-<8G?J_bz20&bb+tlkzyNknw6<~DLJVoafz)X32Tl}N|AB_)opT&)_cMcoAo zRBfY-`GlV4L`pe~M^D@%EijP;+hu2I!X3O-@ZAEME?T`!e3GnaYtn+&ssr3Mu5;5hmhHqHCwa6INd=} zoHPt|le|Av4(&DGv-N7^g3NCL^|T4owm2Kp+@Bp}VqoC#v;b6Wm0y%cCZG>Y>;^@GJO9~>ilz|pz@oU(gNsc8Wy0~B}>hkkbWD@6g1WA^VP`X_e(x)=me=Q6ZeT0G()FYUHzQD?iZqc1B|mwv`uu{HjNkYd7)uuuH|Qc^*fWnv@-&< z-Ifp2=a7EjnMp-tj6)#;)+az`2oW0xs=+h)YF*%LrcV}bQGtVWLFDvbCA-b&s~E|t zOq?|m#vX}oJqzFW>V)9Me?@v`a_5G|Q%0W1OUdl;0*{@d1jN_S+G8e>>;Jfb{}-Lr zKd#|_Z|FZ{R#X3@%hS1)Pm1xIeiT8|7XcU_b4sagJq(Zl8}_&n!FI+RCH^(x-Y z`T!4EW~Uw)^s53r6$m45b>b4a;JApvUwDG^XNtPqs4nQa`4y*q)ULC|Sw;2|z27k_ z%7BFhtvzo0TiYw8906$5V%?kXH{7}cYxQS+?Y&!-^tNo&jpHP=#$>H4^AiiI<=?BM zo*#MqZW_mat@oswHj8~C)7X?>WAu-?<_$(Lv{X6u_uP>^%u{uZ>CNL@H9>G z{W&aY3+)!`C{5E+jY7=0TY6i%*B?+U9Y?0|w67>8y7&mlDXTIWani$#D+e>GwNZm% zV$}PQpO@`|s@3>&y8Nu{pSk<`*jO&krTt_$7)Xg>#e97IMvXbhaWR^tBfraDyYq+? z$f2jzKYXhS=-oz-YO%90p%{%<1}BD{B!9b;pPGKM|LoOm_sn`{_x*TQS|p$09dM3AlbH8JBQGnOqA@bZ^<2|ml4KH z2pZx23}Yv*%40A(pm6?a-pyXz^qQ8x{%luxHC&g#N8>%yH#osC;(R>0m#~PF|(+!t+6%U^(Fc3#Tf9fVy9S z8`Cn;+an(Dx+;Z{kTOOpI)0-bA*$^Sd5zfpg%=#cb^>@Lsy`YqYPwyK3s$!ZMix0) zb|B`lS7}$w!n(~-mZgu_I;3}TuC^~(uTMn;q-1-3J8`Los*qEtFSi{(oZICvRZCh6 zsQ0qxli~o9%vXMP+oVDwp?%}Mt z=5tM=z+#L?Von$;SNpAeT$W?8A4|_%5?Wc95sw^oV^bSiG#7y4PX>eTKT3(b*P2on z{K+90Y$fsd{7jxMZ)_)Pg9nH{m&b3NVrZQ0+L^ zpTF<|=YD2PO=-A~c+14{eqS6&yJ>Mq_0ecmh2nK;*nW_?){H#j-!@zUy+6{2RYjbF z+2OM4&vi$3Z3U)BYH#s!h5W<*lD5ByUw)ag1wuD z*c)ME5N3B8Bc-c^Z6iIom1BR)-qlVq%%IBHlI%q%9N@d~+4%F(qxRx@yEP*dE;Hne zhYKoV=9zK|;78-~UgPpd2iC%IerYRrL zM3aT@o23oxc-UrM6nzrf7(99~84xq7K7rd~*ge)7L^42h&{n zRP{-;=Co9*W^4|Ez6#0(Y0sjy^4Ryj(s0u9keK1O?xeFa|?>b608T~>HT-x528awF6`O8~uzG7nqg8T@d*;_>D`IIwG(k}MS z=aaZ>?-ybx-Y*VbyGlHgJSS?fYaCSyefv7ZCYId?!p6WhL|T+|z00{=%r~KCnC=Nd;=lQY);a#U`xE9GopP_*{H53KiRAYoEz;;%{YCrBk|38aD%28wAoG zYW(B}X@|bEC%zm?7@qWPmw&H|6mlrRuP|yf$o@Gs0N5TC5peBVI9@7DgcVZBNv;iT zI|7(hafj+N8~C>wyP1D6lmFkVq({#G6HV@IYS!N-dFDm2xp_I!bRJ;SW2;NP3WL%E z`(z?{Z(*75(RjPo>PFTU;I_ifR;H~4fUul;X`Gh>fk@ch#oyNCx1mi7C(rxG0!r@w zg%>{w`));<(aMlG>^VCOkyj1ln!g)8PCA2j#rWCnD>WBqcyB1Uj}L-n>GE8JVehKBW>Q>u#q9- zDWdMpE}PMWz($j8>92}EAP^~7=$wQb%X+}Ej72J(p-MuJfSDtyyhEg>iAJpQz?V-s z%utL*5-VF4q?RMzeUrZ4(tA(mDQkw2^wr?TBqrgS_2T~6UwAYcM13Rk%3OeW(MfB@ zuVQGH@;_%)c~|f&JKGCqU(??{G86id-15uezY2M5OlPLUC{A;UqmYZ^>U-4tc1HHaF!rYR|t^_1nn67LQQeX7$cyb7ZEE^v)!HyMBI z&+?t^9d_!TOt2FjV?3=fZE8qPPLOxoqfio-uw+!CncZ5)gbyIr0oE1CahFnZg}wk? zMXvnBQadB}PYU8;1GbDiweoSJo%3+|dMo{+kUX9I9^r~yh^=cRk>uN*Naw*XGuB7) zK!@2~`U_Y-oqQ77mQ=U(0=c&hP!>Geas0{YD&Q_+u{fLIVDCkrPS8{;wuLAvXAt<9 zhHL2JX6ql;QJCftk?ZUH$A*(b3Xse=KzgVEt=psY$e}Ztv8ZIq4x@NmB9?6-12p=( zn22JoR9l)OXt2Y3hEjFm#P$p>r~-Ekx_lgwxGiY(Qi|}gD?{8vP8B>hXPl+x6Zywq zP?DD{4d2Nsj?}?$QwNcc*V)$=X>6`cA5w>(FcB7HQV|a*B8x!q9Ds43p|W-^fZ{d2 zHf)O@3gi?}`7=p$sO-mna^1tlVK&I}hJ|f4Q}X<&Z-JlQ7QN6dx@jIFdG!MZ5KiSo z9iHeNUbi?(YKD|q#Yk6j?U|W8uYDk3OmH@_g4#X7)DsV3b<^#=()Z4e^KFHIKic{& zmVuE09NvT;OXuYS*x|^EXz$kI@)EHX-`v@x@ULaW5f;)akrQyC9O#IbFx6U^80i`Gz%jOSfztT7punD;5GwG@I(^0{;}nh4#?HDUQz7Lf(L*4>4iFR}A)0}q^eDmCiti7+o3TqX$VJ!{mLFO#F{oSC-i%GKf0o0^SOizRNBWu39PLf-9iuUX zcRa$~N!?4~z6Rv5v<+1yH2<9O+|UWjuOD00(||-(E=iwU^7gyziXM0~4tHbuWayM- zZoYg0lQ48CH&fo55F>q0JU4YVnBgT;w!ubLP4tA)e275$ zGD*q(rZQ{Yibi{lLQNd)RZ_Ip26SGe8;|#hmuZv}A}gD~aB%?UWDN3C z&oXnqYNmjU3#D(f9Sjg2a|HQiSMaX_`2BlqE7af{Tgq@ONV9aSqePu*?~jVarSGp! zienx%3Ryga(+O|VxQ0&$ooq51A8??&5OA%Dh=pKJ^?OfhAIy0yHHX>LQZn)18Na-^ z;B&P#X7SzrX>d0&Hf_dhJ`D=plrn*~u^IBGCkwxq1}Cl6-FZM@5!Ez8{aH_h*X`E1 zu!6ITX=4l6lD(7F(`X*^=5>u?xXZMypsz%`*B4xf`h7Qyb&Ba_-SW%GfQ?o6D`F1w zih^DwaaE=%;za3tEl=w6`y zyoRq8-3@j`R4D8b%%p(*=90myi0Ra&K z2@w$q73t~!843~-$}@B{v}b5&=ve5#e}6WAoc#Oomk?NFWMm9<3?eKnB0Nk?OuSzQ zOg!x0tk{1v=zli<-u;jB$FDHhD6p6Cl<=_FFmTwg@Yt}A-7sWNO2Waz{?hla9|9sQ zJQ5r-$`e%?3kDV*9u6KJ6&?){4ju u5{B0R|BV2^*IhfXB&&j8DTYDyFLDX#BZ~ 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 literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/feat-discuss-poster.jpg b/services/web/public/img/feature-page/feat-discuss-poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b632b395e416dd77df08a3b9bcb9c71a110e8de6 GIT binary patch literal 107571 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

        brSd>i2Z0BtRl!w+%* zU?bFjjE^b~hG%8$uXemUE(OQpZH60lWxtnd3LPu@6UKY=e}~86H^keCmjj;<9xpx* z$%nI`wXyo6)ol8o4_9t{9v1j-#4PsT{{WLJ3G^JaKhO@tb?m$z!^A&YZN%Ymc&ncK z^yS6hEIiZ`uRo%_q5l9{aCrTQ`1$XbW6d+)Zzg+CN7Fx{y|Q1aw(ZylYvOUZ+%4A) z`2Bn@78`py2r&Nu*{@=`a5z4$;W^v$;`VM9YsAMtWseiTh3BBvZ~p*gTqnC9W5=_P zY1=IOKN&IN<=3|xY;&OLm(;$!E%<)8?44Wq`!5lHW*kZi8)y4F>{lMi!u5Xy`+pOQ zz~FAVW5o7+Jh%ETnhdS~0POd%OYHm}2N90h#o}=?-8(*fUu(Ai07d1XvAlkY@#cEZ zg~#ln+Vaaj&BR)s!#aQ@ZC@MHGv&-hSKT0hyBW}E8n$H45#>mL34K1H`1KCc#DKB^4j{{XY^Rm~`n>3H7PEOzlwT21VojsDq(WZ{=+;%$cy zZmhTEjy?1o?W6P)voY8(;C7a~HxrHY_?HKV#pkv;aPjE*XeC_#07Lk9k67?9*`Hi- zH~CY6pWfSU9z9eWwBP9W1^)n3Z;nISGUDf!Jvni@{5{kgH5aJ+0Q%={%fuW!d2u=8 zj}Nae!$DOK{h$7g&*5-ANyIN%@$>p!(=Im~+Hp6>#nnLx-}YtdCp$(StL+VC#_bvL z{{XtjKW&%Ghn9lE*ZKkK%a^OWAFFX6T5$H^?ZQlWzi$t3z4LWYX9M&v^m=ax4^rY? zyR>m|!wz}z`mw{q{#ppZ`T^<(^260UQR8vA+wpcxHsX6+w)#9jc7uFx(0;`q9v^4z z?Ql5UO#62J%jtcm7k=!hE$_al^(^mP@cmK1bGPxnkAaHuGyAyjy#;l<^hbkf?09ha zj(VdmCj3qrXT#5*(P#U#6&j_z5^>#GZ^C7yxF>5z+I7+?%GzU(3C5fkQNNeTK{wI# zdjl5v<7bxC)G4kU$0N3^vM&&aLtv_10Nx$OeOYy9l?9fj{T=KrdiM^`#vad>dGWSf zczi!;p4oUPA-DPs`YqAfzel)(mizGdymZ?=`na8=9rNnX#X-@~K)w2(u>Sz~zYnqT zTKZoP7l=GB+r`5ly+IpOevS54J$a80ik+9o#N%wcaJYWcJ-6^sR8Ic@X5OKB1_}n~tbHj<12TeerP$(1% z1pl5O9~Xfx&UpmO-oIech5**-N;>G;$H$K13IUm6crZ;c0>zBCSB z8Yr85XoBOveFwb0G*g$xfy?7S**-K5Um6E5jRTj)fy?7T=E?D@k9mA(uM=&%`B5J7 h_|#MO(0R+_LGLe(Q04Kc9KJLja`@0Wd}uPD|JfcaX?*|y literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/feat-todos-poster.jpg b/services/web/public/img/feature-page/feat-todos-poster.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f221dba570f84356228dc47530474bffceedcb6b GIT binary patch literal 94730 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�Qu zo76&OBP;UOMKg9;9W!!JAny;_Y9H)=*e^Dqsjm~LL_3>{vqGbaL#iza6uD7<=EZp0 z6MEN5Bod4}bM5)t68;FCrtv83%f}H|7vCO!uc=OrC_zE_`S!4cx#%RNM3{@5s>G;1MVfCw zC9fPpF_tSnFxdxL6!mi?mS4aikEkuQr8FM#aL85Z_TgiOI=MN# z?X?a$RU#=EBqmjvQiz2#;Jt5I6F*+w8^vmCu|H_}C%J%F{Oxm9H@%#M?ObgJkrBgB zr$l^TnWvt~)8hgvpjyfeveL1F=5K2U3#aBdv)-jQ#+q^^AvVt^lR{ZtOGB#kOi|5R zT<{WGX?!5csF<>q zX$wQdd0H_BMGl*k>=vM~*q(kN>u#rS>D$l*a*;zUaafv%UcH06R0}tihpsMCF2JoH zg{bOo<(c-Sk=J?dW@A)_^g?kke0uMcbb<2Z?Bh#)tT~^gGz+kqc4=K{mW%$X$r&-y zDpFq3cJwY4*#B7q7x>Kb@fd6oBzGLFTESDQF3KTl5P6xVmvnw`s@VXK!xk7}I&YIVK9nd9Zi`TyvW`W&yGy(aR&z-|K9XX+P+& zk`y{c6+~BCwwt{i≫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

      1. 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

        2XY9Ff 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 U^8RwbD Date: Tue, 14 Mar 2017 17:53:48 +0000 Subject: [PATCH 46/60] json stringify and trim recommended currency --- services/web/app/views/subscriptions/new.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/web/app/views/subscriptions/new.pug b/services/web/app/views/subscriptions/new.pug index 2d410f8fba..8995af6192 100644 --- a/services/web/app/views/subscriptions/new.pug +++ b/services/web/app/views/subscriptions/new.pug @@ -4,11 +4,11 @@ block scripts script(src="https://js.recurly.com/v3/recurly.js") script(type='text/javascript'). - window.recomendedCurrency = '#{currency}' window.countryCode = '#{countryCode}' window.plan_code = '#{plan_code}' window.recurlyApiKey = "!{settings.apis.recurly.publicKey}" - window.couponCode = "#{couponCode}" + window.couponCode = !{JSON.stringify(couponCode)} + window.recomendedCurrency = !{JSON.stringify(currency.slice(0,3))} block content .content.content-alt From 6c1a15a698dd6202eab4cdddf0120380bb7cb652 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 16 Mar 2017 15:48:57 +0000 Subject: [PATCH 47/60] Move comments when cutting and pasting --- .../track-changes/TrackChangesManager.coffee | 52 +++++++++++++++++++ .../ide/review-panel/RangesTracker.coffee | 48 +++++++++++++---- 2 files changed, 89 insertions(+), 11 deletions(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee index f51d1ed41e..b2257099b4 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee @@ -73,16 +73,24 @@ define [ _scrollTimeout = null , 200 + @_resetCutState() + onCut = () => @onCut() + onPaste = () => @onPaste() + bindToAce = () => @editor.on "changeSelection", onChangeSelection @editor.on "change", onChangeSelection # Selection also moves with updates elsewhere in the document @editor.on "changeSession", onChangeSession + @editor.on "cut", onCut + @editor.on "paste", onPaste @editor.renderer.on "resize", onResize unbindFromAce = () => @editor.off "changeSelection", onChangeSelection @editor.off "change", onChangeSelection @editor.off "changeSession", onChangeSession + @editor.off "cut", onCut + @editor.off "paste", onPaste @editor.renderer.off "resize", onResize @$scope.$watch "trackChangesEnabled", (enabled) => @@ -244,6 +252,50 @@ define [ @_onCommentAdded(comment) @broadcastChange() + _resetCutState: () -> + @_cutState = { + text: null + comments: [] + docId: null + } + + onCut: () -> + @_resetCutState() + selection = @editor.getSelectionRange() + selection_start = @_aceRangeToShareJs(selection.start) + selection_end = @_aceRangeToShareJs(selection.end) + @_cutState.text = @editor.getSelectedText() + @_cutState.docId = @$scope.docId + for comment in @rangesTracker.comments + comment_start = comment.op.p + comment_end = comment_start + comment.op.c.length + if selection_start <= comment_start and comment_end <= selection_end + @_cutState.comments.push { + offset: comment.op.p - selection_start + text: comment.op.c + comment: comment + } + + onPaste: () => + @editor.once "change", (change) => + return if change.action != "insert" + pasted_text = change.lines.join("\n") + paste_offset = @_aceRangeToShareJs(change.start) + console.log "PASTE", pasted_text, paste_offset + # We have to wait until the change has been processed by the range tracker, + # since if we move the ops into place beforehand, they will be moved again + # when the changes are processed by the range tracker. This ranges:dirty + # event is fired after the doc has applied the changes to the range tracker. + @$scope.sharejsDoc.on "ranges:dirty.paste", () => + @$scope.sharejsDoc.off "ranges:dirty.paste" # Doc event emitter uses namespaced events + if pasted_text == @_cutState.text and @$scope.docId == @_cutState.docId + for {comment, offset, text} in @_cutState.comments + op = { c: text, p: paste_offset + offset, t: comment.id } + @$scope.sharejsDoc.submitOp op # Resubmitting an existing comment op (by thread id) will move it + @_resetCutState() + # Check that comments still match text. Will throw error if not. + @rangesTracker.validate(@editor.getValue()) + checkMapping: () -> # TODO: reintroduce this check session = @editor.getSession() diff --git a/services/web/public/coffee/ide/review-panel/RangesTracker.coffee b/services/web/public/coffee/ide/review-panel/RangesTracker.coffee index a9c43e9816..14193f628d 100644 --- a/services/web/public/coffee/ide/review-panel/RangesTracker.coffee +++ b/services/web/public/coffee/ide/review-panel/RangesTracker.coffee @@ -1,3 +1,6 @@ +# This file is shared between document-updater and web, so that the server and client share +# an identical track changes implementation. Do not edit it directly in web or document-updater, +# instead edit it at https://github.com/sharelatex/ranges-tracker, where it has a suite of tests load = () -> class RangesTracker # The purpose of this class is to track a set of inserts and deletes to a document, like @@ -78,6 +81,13 @@ load = () -> @comments = @comments.filter (c) -> c.id != comment_id @_markAsDirty comment, "comment", "removed" + moveCommentId: (comment_id, position, text) -> + for comment in @comments + if comment.id == comment_id + comment.op.p = position + comment.op.c = text + @_markAsDirty comment, "comment", "moved" + getChange: (change_id) -> change = null for c in @changes @@ -90,6 +100,18 @@ load = () -> change = @getChange(change_id) return if !change? @_removeChange(change) + + validate: (text) -> + for change in @changes + if change.op.i? + content = text.slice(change.op.p, change.op.p + change.op.i.length) + if content != change.op.i + throw new Error("Change (#{JSON.stringify(change)}) doesn't match text (#{JSON.stringify(content)})") + for comment in @comments + content = text.slice(comment.op.p, comment.op.p + comment.op.c.length) + if content != comment.op.c + throw new Error("Comment (#{JSON.stringify(comment)}) doesn't match text (#{JSON.stringify(content)})") + return true applyOp: (op, metadata = {}) -> metadata.ts ?= new Date() @@ -110,17 +132,21 @@ load = () -> @applyOp(op, metadata) addComment: (op, metadata) -> - # TODO: Don't allow overlapping comments? - @comments.push comment = { - id: op.t or @newId() - op: # Copy because we'll modify in place - c: op.c - p: op.p - t: op.t - metadata - } - @_markAsDirty comment, "comment", "added" - return comment + existing = @getComment(op.t) + if existing? + @moveCommentId(op.t, op.p, op.c) + return existing + else + @comments.push comment = { + id: op.t or @newId() + op: # Copy because we'll modify in place + c: op.c + p: op.p + t: op.t + metadata + } + @_markAsDirty comment, "comment", "added" + return comment applyInsertToComments: (op) -> for comment in @comments From aa36768d8ad014869fddf84e569694c7623b866c Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 16 Mar 2017 16:01:03 +0000 Subject: [PATCH 48/60] Remove debugging line --- .../aceEditor/track-changes/TrackChangesManager.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee index b2257099b4..0dd6a9f06b 100644 --- a/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee +++ b/services/web/public/coffee/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.coffee @@ -281,7 +281,6 @@ define [ return if change.action != "insert" pasted_text = change.lines.join("\n") paste_offset = @_aceRangeToShareJs(change.start) - console.log "PASTE", pasted_text, paste_offset # We have to wait until the change has been processed by the range tracker, # since if we move the ops into place beforehand, they will be moved again # when the changes are processed by the range tracker. This ranges:dirty From a4d6d5c53f3a3eaebc709e64ba600f3141efe380 Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 16 Mar 2017 17:33:01 +0000 Subject: [PATCH 49/60] Add opacity to comment and insert ranges so they can be seen overlapping --- .../public/stylesheets/app/editor/review-panel.less | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index 7d2dbb1c9f..5cf9117587 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -9,13 +9,10 @@ @rp-border-grey : #d9d9d9; @rp-green : #2c8e30; -@rp-dim-green : #cae3cb; @rp-green-on-dark : rgba(37, 107, 41, 0.5); @rp-red : #c5060b; -@rp-dim-red : #f3cdce; @rp-yellow : #f3b111; @rp-yellow-on-dark : rgba(194, 93, 11, 0.5); -@rp-dim-yellow : #ffe9b2; @rp-grey : #aaaaaa; @rp-type-blue : #6b7797; @@ -748,13 +745,16 @@ .rp-loading-threads & { display: none; } + z-index: 6 // Appear above text selection } .track-changes-comment-marker { - background-color: @rp-dim-yellow; + background-color: @rp-yellow; + opacity: 0.3; } .track-changes-added-marker { - background-color: @rp-dim-green; + background-color: @rp-green; + opacity: 0.3; } .track-changes-deleted-marker { border-left: 2px dotted @rp-red; From 3c2f5525a14f213829adba41c6d7f1a80f1fbbe5 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 17 Mar 2017 14:49:32 +0000 Subject: [PATCH 50/60] Show an explanation error message on too many track changes error --- .../public/coffee/ide/editor/EditorManager.coffee | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/editor/EditorManager.coffee b/services/web/public/coffee/ide/editor/EditorManager.coffee index e01a12cb8b..a1d00d3180 100644 --- a/services/web/public/coffee/ide/editor/EditorManager.coffee +++ b/services/web/public/coffee/ide/editor/EditorManager.coffee @@ -121,11 +121,22 @@ define [ _bindToDocumentEvents: (doc, sharejs_doc) -> sharejs_doc.on "error", (error, meta) => - if error?.message?.match "maxDocLength" + if error?.message? + message = error.message + else if typeof error == "string" + message = error + else + message = "" + if message.match "maxDocLength" @ide.showGenericMessageModal( "Document Too Long" "Sorry, this file is too long to be edited manually. Please upload it directly." ) + else if message.match "too many comments or tracked changes" + @ide.showGenericMessageModal( + "Too many comments or tracked changes" + "Sorry, this file has too many comments or tracked changes. Please try accepting or rejecting some existing changes, or resolving and deleting some comments." + ) else @ide.socket.disconnect() @ide.reportError(error, meta) From c74449b2e3cce3b4ae6814191213ea04b2bb99ca Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 17 Mar 2017 16:28:21 +0000 Subject: [PATCH 51/60] Don't show the mini review panel when the only visible entry is the add comment one. --- .../review-panel/controllers/ReviewPanelController.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee index 5067799571..6c6354a773 100644 --- a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee +++ b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee @@ -163,7 +163,10 @@ define [ $scope.$watch (() -> entries = $scope.reviewPanel.entries[$scope.editor.open_doc_id] or {} - Object.keys(entries).length + permEntries = {} + for entry, entryData of entries + permEntries[entry] = entryData if entry != "add-comment" + Object.keys(permEntries).length ), (nEntries) -> $scope.reviewPanel.hasEntries = nEntries > 0 and $scope.project.features.trackChangesVisible From beac43741cf3bead3bfed015f458ceab8b58d936 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Fri, 17 Mar 2017 17:05:38 +0000 Subject: [PATCH 52/60] New add comment button. --- .../app/views/project/editor/review-panel.pug | 10 ++- .../controllers/ReviewPanelController.coffee | 1 + .../stylesheets/app/editor/review-panel.less | 73 +++++++++++-------- 3 files changed, 52 insertions(+), 32 deletions(-) diff --git a/services/web/app/views/project/editor/review-panel.pug b/services/web/app/views/project/editor/review-panel.pug index b9dea40207..f4606be9a3 100644 --- a/services/web/app/views/project/editor/review-panel.pug +++ b/services/web/app/views/project/editor/review-panel.pug @@ -1,10 +1,18 @@ -#review-panel +.rp-in-editor-widgets a.rp-track-changes-indicator( href ng-if="editor.wantTrackChanges" ng-click="toggleReviewPanel();" ng-class="{ 'rp-track-changes-indicator-on-dark' : darkTheme }" ) !{translate("track_changes_is_on")} + a.rp-add-comment-btn( + href + ng-if="reviewPanel.entries[editor.open_doc_id]['add-comment'] != null" + ng-click="startNewComment();" + ) + i.fa.fa-comment + |  #{translate("add_comment")} +#review-panel .review-panel-toolbar resolved-comments-dropdown( class="rp-flex-block" diff --git a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee index 6c6354a773..04a32b2626 100644 --- a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee +++ b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee @@ -15,6 +15,7 @@ define [ entries: {} resolvedComments: {} hasEntries: false + showAddComment: false subView: $scope.SubViews.CUR_FILE openSubView: $scope.SubViews.CUR_FILE overview: diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index 7d2dbb1c9f..5bfd6275f9 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -448,6 +448,11 @@ display: block; padding: 5px 10px; border-radius: 3px; + + .rp-in-editor-widgets & { + border-radius: 0; + border-bottom-left-radius: 3px; + } } .rp-new-comment { @@ -871,43 +876,49 @@ } } -.rp-track-changes-indicator { - display: none; +.rp-in-editor-widgets { position: absolute; top: 0; - right: @review-off-width; - padding: 5px 10px; - background-color: rgba(240, 240, 240, 0.9); - color: @rp-type-blue; - text-align: center; - border-bottom-left-radius: 3px; + right: 0; font-size: 10px; - z-index: 2; - white-space: nowrap; - - &.rp-track-changes-indicator-on-dark { - background-color: rgba(88, 88, 88, .8); - color: #FFF; - - &:hover, - &:focus { - background-color: rgba(88, 88, 88, 1); - color: #FFF; - } - } - - &:hover, - &:focus { - outline: 0; - text-decoration: none; - background-color: rgba(240, 240, 240, 1); - color: @rp-type-blue; - } - + .rp-size-mini & { - display: block; + right: @review-off-width; } } + .rp-track-changes-indicator { + display: block; + padding: 5px 10px; + background-color: rgba(240, 240, 240, 0.9); + color: @rp-type-blue; + text-align: center; + border-bottom-left-radius: 3px; + z-index: 2; + white-space: nowrap; + + &.rp-track-changes-indicator-on-dark { + background-color: rgba(88, 88, 88, .8); + color: #FFF; + + &:hover, + &:focus { + background-color: rgba(88, 88, 88, 1); + color: #FFF; + } + } + + &:hover, + &:focus { + outline: 0; + text-decoration: none; + background-color: rgba(240, 240, 240, 1); + color: @rp-type-blue; + } + + .rp-size-expanded & { + display: none; + } + } // Helper class for elements which aren't treated as flex-items by IE10, e.g: // * inline items; From 2c2abc3cae17abc13cb1032d56c1be7d26fb6e51 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 20 Mar 2017 11:18:29 +0000 Subject: [PATCH 53/60] Wire up new button with existing UI for adding comments. --- services/web/app/views/project/editor/review-panel.pug | 2 +- .../ide/review-panel/controllers/ReviewPanelController.coffee | 4 ++++ .../coffee/ide/review-panel/directives/addCommentEntry.coffee | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/services/web/app/views/project/editor/review-panel.pug b/services/web/app/views/project/editor/review-panel.pug index f4606be9a3..026663e35f 100644 --- a/services/web/app/views/project/editor/review-panel.pug +++ b/services/web/app/views/project/editor/review-panel.pug @@ -8,7 +8,7 @@ a.rp-add-comment-btn( href ng-if="reviewPanel.entries[editor.open_doc_id]['add-comment'] != null" - ng-click="startNewComment();" + ng-click="addNewComment();" ) i.fa.fa-comment |  #{translate("add_comment")} diff --git a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee index 04a32b2626..2f903879ec 100644 --- a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee +++ b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee @@ -327,6 +327,10 @@ define [ $scope.$broadcast "change:reject", entry_id event_tracking.sendMB "rp-change-rejected", { view: if $scope.ui.reviewPanelOpen then $scope.reviewPanel.subView else 'mini' } + $scope.addNewComment = () -> + $scope.$broadcast "comment:start_adding" + $scope.toggleReviewPanel() + $scope.startNewComment = () -> $scope.$broadcast "comment:select_line" $timeout () -> diff --git a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee index 2ec79efcd5..40282562d4 100644 --- a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee +++ b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee @@ -15,6 +15,9 @@ define [ isAdding: false content: "" + scope.$on "comment:start_adding", () -> + scope.startNewComment() + scope.startNewComment = () -> scope.state.isAdding = true scope.onStartNew() From 8951e91e315e5d5161c54cdaf98b681f5163ab3c Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 20 Mar 2017 11:35:35 +0000 Subject: [PATCH 54/60] Remove add comment button from the mini review panel. --- services/web/app/views/project/editor/review-panel.pug | 9 --------- .../ide/review-panel/directives/addCommentEntry.coffee | 3 +-- .../web/public/stylesheets/app/editor/review-panel.less | 4 ++++ 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/services/web/app/views/project/editor/review-panel.pug b/services/web/app/views/project/editor/review-panel.pug index 026663e35f..83a985ebf0 100644 --- a/services/web/app/views/project/editor/review-panel.pug +++ b/services/web/app/views/project/editor/review-panel.pug @@ -81,7 +81,6 @@ on-start-new="startNewComment();" on-submit="submitNewComment(content);" on-cancel="cancelNewComment();" - on-indicator-click="toggleReviewPanel();" layout-to-left="reviewPanel.layoutToLeft" ) @@ -322,14 +321,6 @@ script(type='text/ng-template', id='resolvedCommentEntryTemplate') script(type='text/ng-template', id='addCommentEntryTemplate') div .rp-entry-callout.rp-entry-callout-add-comment - .rp-entry-indicator( - ng-if="!commentState.adding" - ng-click="startNewComment(); onIndicatorClick();" - tooltip=translate("add_comment") - tooltip-placement="{{ layoutToLeft ? 'left' : 'right' }}" - tooltip-append-to-body="true" - ) - i.fa.fa-commenting .rp-entry.rp-entry-add-comment( ng-class="[ (state.isAdding ? 'rp-entry-adding-comment' : ''), (entry.focused ? 'rp-entry-focused' : '')]" ) diff --git a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee index 40282562d4..abbce86e9b 100644 --- a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee +++ b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee @@ -7,8 +7,7 @@ define [ scope: onStartNew: "&" onSubmit: "&" - onCancel: "&" - onIndicatorClick: "&" + onCancel: "&" layoutToLeft: "=" link: (scope, element, attrs) -> scope.state = diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index 5bfd6275f9..24f8759b29 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -568,6 +568,10 @@ border-color: @rp-yellow; } } + + .rp-state-current-file &-add-comment { + display: none; + } } .rp-overview-file-header { From 0e24d7118dda2a5d94af589cb006758629c5b86b Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 20 Mar 2017 13:56:36 +0000 Subject: [PATCH 55/60] Hide new UI behind query string parameter. --- services/web/app/views/project/editor/editor.pug | 3 ++- .../web/app/views/project/editor/review-panel.pug | 11 ++++++++++- .../controllers/ReviewPanelController.coffee | 7 ++++++- .../review-panel/directives/addCommentEntry.coffee | 3 ++- .../public/stylesheets/app/editor/review-panel.less | 8 ++++++-- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/services/web/app/views/project/editor/editor.pug b/services/web/app/views/project/editor/editor.pug index 9924fe1221..ce24108f77 100644 --- a/services/web/app/views/project/editor/editor.pug +++ b/services/web/app/views/project/editor/editor.pug @@ -19,7 +19,8 @@ div.full-size( 'rp-size-mini': (!ui.reviewPanelOpen && reviewPanel.hasEntries),\ 'rp-size-expanded': ui.reviewPanelOpen,\ 'rp-layout-left': reviewPanel.layoutToLeft,\ - 'rp-loading-threads': reviewPanel.loadingThreads\ + 'rp-loading-threads': reviewPanel.loadingThreads,\ + 'rp-new-comment-ui': reviewPanel.newAddCommentUI\ }" ) .loading-panel(ng-show="!editor.sharejs_doc || editor.opening") diff --git a/services/web/app/views/project/editor/review-panel.pug b/services/web/app/views/project/editor/review-panel.pug index 83a985ebf0..89b0e05305 100644 --- a/services/web/app/views/project/editor/review-panel.pug +++ b/services/web/app/views/project/editor/review-panel.pug @@ -7,7 +7,7 @@ ) !{translate("track_changes_is_on")} a.rp-add-comment-btn( href - ng-if="reviewPanel.entries[editor.open_doc_id]['add-comment'] != null" + ng-if="reviewPanel.newAddCommentUI && reviewPanel.entries[editor.open_doc_id]['add-comment'] != null" ng-click="addNewComment();" ) i.fa.fa-comment @@ -81,6 +81,7 @@ on-start-new="startNewComment();" on-submit="submitNewComment(content);" on-cancel="cancelNewComment();" + on-indicator-click="toggleReviewPanel();" layout-to-left="reviewPanel.layoutToLeft" ) @@ -321,6 +322,14 @@ script(type='text/ng-template', id='resolvedCommentEntryTemplate') script(type='text/ng-template', id='addCommentEntryTemplate') div .rp-entry-callout.rp-entry-callout-add-comment + .rp-entry-indicator.rp-entry-indicator-add-comment( + ng-if="!commentState.adding" + ng-click="startNewComment(); onIndicatorClick();" + tooltip=translate("add_comment") + tooltip-placement="{{ layoutToLeft ? 'left' : 'right' }}" + tooltip-append-to-body="true" + ) + i.fa.fa-commenting .rp-entry.rp-entry-add-comment( ng-class="[ (state.isAdding ? 'rp-entry-adding-comment' : ''), (entry.focused ? 'rp-entry-focused' : '')]" ) diff --git a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee index 2f903879ec..ba5c70daab 100644 --- a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee +++ b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee @@ -28,6 +28,10 @@ define [ layoutToLeft: false rendererData: {} loadingThreads: false + newAddCommentUI: false # Test new UI for adding comments; remove afterwards. + + if window.location.search.match /new-comments=true/ + $scope.reviewPanel.newAddCommentUI = true window.addEventListener "beforeunload", () -> collapsedStates = {} @@ -166,7 +170,8 @@ define [ entries = $scope.reviewPanel.entries[$scope.editor.open_doc_id] or {} permEntries = {} for entry, entryData of entries - permEntries[entry] = entryData if entry != "add-comment" + if entry != "add-comment" or !$scope.reviewPanel.newAddCommentUI + permEntries[entry] = entryData Object.keys(permEntries).length ), (nEntries) -> $scope.reviewPanel.hasEntries = nEntries > 0 and $scope.project.features.trackChangesVisible diff --git a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee index abbce86e9b..9d33bcb35a 100644 --- a/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee +++ b/services/web/public/coffee/ide/review-panel/directives/addCommentEntry.coffee @@ -7,7 +7,8 @@ define [ scope: onStartNew: "&" onSubmit: "&" - onCancel: "&" + onCancel: "&" + onIndicatorClick: "&" layoutToLeft: "=" link: (scope, element, attrs) -> scope.state = diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index 24f8759b29..20b1b953fb 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -197,6 +197,10 @@ right: 4px; z-index: 1; } + + .rp-new-comment-ui &-add-comment { + display: none; + } } .rp-entry-wrapper { @@ -569,7 +573,7 @@ } } - .rp-state-current-file &-add-comment { + .rp-size-mini.rp-new-comment-ui &-add-comment { display: none; } } @@ -884,7 +888,7 @@ position: absolute; top: 0; right: 0; - font-size: 10px; + font-size: 11px; .rp-size-mini & { right: @review-off-width; From a35f2585c7ce21f7e08334ea90a89363dddb7421 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 20 Mar 2017 14:02:25 +0000 Subject: [PATCH 56/60] Remove unused flag. --- .../ide/review-panel/controllers/ReviewPanelController.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee index ba5c70daab..406d2a9c5b 100644 --- a/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee +++ b/services/web/public/coffee/ide/review-panel/controllers/ReviewPanelController.coffee @@ -15,7 +15,6 @@ define [ entries: {} resolvedComments: {} hasEntries: false - showAddComment: false subView: $scope.SubViews.CUR_FILE openSubView: $scope.SubViews.CUR_FILE overview: From 8a8a5a7079f8dbd5ae3786ef1cb746c75fb2a456 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Tue, 21 Mar 2017 10:57:09 +0000 Subject: [PATCH 57/60] Add a 'ServiceNotConfiguredError' to Errors module. --- services/web/app/coffee/Features/Errors/Errors.coffee | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Errors/Errors.coffee b/services/web/app/coffee/Features/Errors/Errors.coffee index 0bbff1f19b..92228f7b0b 100644 --- a/services/web/app/coffee/Features/Errors/Errors.coffee +++ b/services/web/app/coffee/Features/Errors/Errors.coffee @@ -5,5 +5,14 @@ NotFoundError = (message) -> return error NotFoundError.prototype.__proto__ = Error.prototype + +ServiceNotConfiguredError = (message) -> + error = new Error(message) + error.name = "ServiceNotConfiguredError" + error.__proto__ = ServiceNotConfiguredError.prototype + return error + + module.exports = Errors = - NotFoundError: NotFoundError \ No newline at end of file + NotFoundError: NotFoundError + ServiceNotConfiguredError: ServiceNotConfiguredError From 1ed1eaaa052a04a727771a51429ad9313e1d2385 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Tue, 21 Mar 2017 10:57:39 +0000 Subject: [PATCH 58/60] If analytics is not configured, produce a ServiceNotConfiguredError --- .../coffee/Features/Analytics/AnalyticsController.coffee | 9 ++++++++- .../coffee/Features/Analytics/AnalyticsManager.coffee | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee index f9431a0f5c..75a8bf092a 100644 --- a/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee +++ b/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee @@ -1,7 +1,14 @@ AnalyticsManager = require "./AnalyticsManager" +Errors = require "../Errors/Errors" + module.exports = AnalyticsController = recordEvent: (req, res, next) -> AnalyticsManager.recordEvent req.session?.user?._id, req.params.event, req.body, (error) -> - return next(error) if error? + if error? + if error instanceof Errors.ServiceNotConfiguredError + # ignore, no-op + return next(204) + else + return next(error) res.send 204 diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee index 9f34d6d9d1..66d2818032 100644 --- a/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee +++ b/services/web/app/coffee/Features/Analytics/AnalyticsManager.coffee @@ -2,6 +2,7 @@ settings = require "settings-sharelatex" logger = require "logger-sharelatex" _ = require "underscore" request = require "request" +Errors = require '../Errors/Errors' makeRequest = (opts, callback)-> @@ -10,8 +11,7 @@ makeRequest = (opts, callback)-> opts.url = "#{settings.apis.analytics.url}#{urlPath}" request opts, callback else - callback() - + callback(new Errors.ServiceNotConfiguredError('Analytics service not configured')) module.exports = From 1663f2a8eb6e19fa490bb8f24f15253b6bd56d95 Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Tue, 21 Mar 2017 11:09:39 +0000 Subject: [PATCH 59/60] Use res.send, not next --- .../app/coffee/Features/Analytics/AnalyticsController.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee b/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee index 75a8bf092a..1f2466674c 100644 --- a/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee +++ b/services/web/app/coffee/Features/Analytics/AnalyticsController.coffee @@ -8,7 +8,7 @@ module.exports = AnalyticsController = if error? if error instanceof Errors.ServiceNotConfiguredError # ignore, no-op - return next(204) + return res.send(204) else return next(error) res.send 204 From d611ccd2cb38d0095b896eab4d8cab35e2f4ec82 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Tue, 21 Mar 2017 14:28:58 +0000 Subject: [PATCH 60/60] Apply z-index rule to container, not to the button. --- services/web/public/stylesheets/app/editor/review-panel.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/public/stylesheets/app/editor/review-panel.less b/services/web/public/stylesheets/app/editor/review-panel.less index c2bef96e72..c97c3bf9a3 100644 --- a/services/web/public/stylesheets/app/editor/review-panel.less +++ b/services/web/public/stylesheets/app/editor/review-panel.less @@ -889,6 +889,7 @@ top: 0; right: 0; font-size: 11px; + z-index: 2; .rp-size-mini & { right: @review-off-width; @@ -901,7 +902,6 @@ color: @rp-type-blue; text-align: center; border-bottom-left-radius: 3px; - z-index: 2; white-space: nowrap; &.rp-track-changes-indicator-on-dark {

      2. ae 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 #|nWOERL&VbfWs&{fs&z+^V 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 literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/feat-todos.mp4 b/services/web/public/img/feature-page/feat-todos.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..6e827a3ce3717fffdcc178b1ff4c68d9e699d596 GIT binary patch literal 230127 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�A)C3rlo4M}j1 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 literal 0 HcmV?d00001 diff --git a/services/web/public/img/feature-page/intro.mp4 b/services/web/public/img/feature-page/intro.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ce7dc877dabc0108a25a8655e3b34b3bae5329f4 GIT binary patch literal 132214 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

      ZwQ+zS8%alN*8>Wap`0KQOe{X&;Srrr* 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 Date: Fri, 3 Mar 2017 17:17:11 +0000 Subject: [PATCH 17/60] Also pull italic variants of PT Serif. --- services/web/public/stylesheets/core/variables.less | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/web/public/stylesheets/core/variables.less b/services/web/public/stylesheets/core/variables.less index a642ab97bc..176843f241 100755 --- a/services/web/public/stylesheets/core/variables.less +++ b/services/web/public/stylesheets/core/variables.less @@ -50,7 +50,8 @@ //## Font, line-height, and color for body text, headings, and more. @import url(https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700); -@import url(https://fonts.googleapis.com/css?family=PT+Serif:400,600,700); +//@import url(https://fonts.googleapis.com/css?family=PT+Serif:400,600,700); +@import url(https://fonts.googleapis.com/css?family=PT+Serif:400,400i,700,700i); @font-family-sans-serif: "Open Sans", sans-serif; @font-family-serif: "PT Serif", serif; From a5ce23f2372ccb9a15ee43d3119e53043ad48985 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 6 Mar 2017 15:52:38 +0000 Subject: [PATCH 18/60] Layout adjustments, basic responsive behaviour. --- .../stylesheets/app/review-features-page.less | 101 +++++++++++++----- 1 file changed, 77 insertions(+), 24 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index 1206da62df..c37548ed65 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -11,6 +11,9 @@ @rfp-rp-blue-darker: shade(@rfp-rp-blue, 65%); @rfp-rp-blue-darkest: shade(@rfp-rp-blue, 75%); +@rfp-card-shadow: 0 0 30px 5px rgba(0, 0, 0, .3); +@rfp-border-radius: 5px; + .rfp-main { background-color: @rfp-rp-blue-dark; color: #FFF; @@ -22,22 +25,24 @@ margin-bottom: 2em; color: inherit; } - .rfp-h1-main { - color: #505050; + .rfp-h1-masthead { + color: #FFF; + margin-bottom: 1em; } .rfp-h2 { font-size: @rfp-h2-size; margin-bottom: 2em; color: inherit; - .rfp-section-feature-alt & { - color: @rfp-rp-blue-dark; - } } .rfp-h3 { font-size: @rfp-h3-size; margin-bottom: 2em; color: inherit; } + .rfp-h3-cta { + margin-top: 0; + margin-bottom: 40px; + } .rfp-lead { font-size: @rfp-lead-size; margin-bottom: 2em; @@ -46,8 +51,15 @@ margin-right: auto; font-weight: 300; } + .rfp-lead-cta { + margin-top: 0; + margin-bottom: 40px; + } .rfp-lead-strong { font-weight: 700; + .rfp-section-masthead & { + margin-bottom: 0; + } } .rfp-p { margin-bottom: 2em; @@ -72,29 +84,33 @@ } // Sections .rfp-section { - padding: 60px; + padding: 30px; text-align: center; + @media (min-width: @screen-sm-min) { + padding: 60px; + } } .rfp-section-masthead { - background-image: linear-gradient(to right, fade(#FFF, 90%), fade(#FFF, 90%)), url(/img/feature-page/full-editor.png); - //color: @rfp-sl-red; + color: #FFF; background-size: cover; background-position: center; - color: #505050; } .rfp-section-blockquote { + position: relative; padding-top: 30px; padding-bottom: 30px; background-color: @rfp-sl-red; + box-shadow: @rfp-card-shadow; } .rfp-section-feature { - color: #FFF; + color: @rfp-rp-blue-dark; + background-color: @rfp-rp-blue-light; text-align: left; } .rfp-section-feature-alt { + color: #FFF; + background-color: transparent; text-align: right; - color: @rfp-rp-blue-dark; - background-color: @rfp-rp-blue-light; } .rfp-section-testimonials { background-color: @rfp-rp-blue-darkest; @@ -103,24 +119,39 @@ background-color: @rfp-rp-blue-darker; } // Elements + .rfp-screenshot-masthead { + max-width: 100%; + box-shadow: @rfp-card-shadow; + margin-bottom: 2em; + } .rfp-quote-section { - display: flex; + + @media (min-width: @screen-sm-min) { + display: flex; + } } .rfp-quote { - display: flex; - flex-direction: column; - justify-content: space-between; - flex: 0 0 50%; - font-size: @rfp-lead-size; - background-color: #FFF; - color: @rfp-rp-blue-dark; - margin-right: 20px; + display: block; + width: 100%; padding: 20px 40px; border-left: 0; max-width: 30em; font-size: @rfp-lead-size; quotes: "\201C" "\201D"; - // Override weird Boostrap default. + box-shadow: @rfp-card-shadow; + border-radius: @rfp-border-radius; + font-size: @rfp-lead-size; + background-color: #FFF; + color: @rfp-rp-blue-dark; + + @media (min-width: @screen-sm-min) { + display: flex; + flex-direction: column; + justify-content: space-between; + flex: 0 1 50%; + margin-right: 20px; + // Override weird Boostrap default. + } p { display: block; } @@ -178,7 +209,26 @@ flex: 0 0 30%; } } - .rfp-quote-person-photo { + .rfp-quoted-person-name { + margin: 0; + } + .rfp-quoted-person-link { + margin: 0; + font-size: .8em; + &:hover, + &:focus { + text-decoration: none; + cursor: pointer; + } + .rfp-quote-main & { + color: #FFF; + &:hover, + &:focus { + color: #FFF; + } + } + } + .rfp-quoted-person-photo { border-radius: 3em; width: 6em; margin-bottom: 20px; @@ -193,12 +243,15 @@ padding: 40px; background-color: #FFF; color: @rfp-rp-blue-dark; + box-shadow: @rfp-card-shadow; + border-radius: @rfp-border-radius; } .rfp-cta { display: inline-block; background-color: @rfp-sl-red; color: #FFF; font-size: @rfp-h3-size; + border-radius: @rfp-border-radius; padding: .75em 1.5em; &:hover, &:focus { @@ -217,7 +270,7 @@ .rfp-cta-main { display: block; transition: transform 0.25s; - transform: translate(0, 0, 0); + transform: translate(0, 0); } .rfp-cta-extra { display: block; From ebffcc71c2d73ad2a90ed6052caa933b03ebdf9f Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 6 Mar 2017 16:46:35 +0000 Subject: [PATCH 19/60] Add hero image. --- .../web/public/img/feature-page/hero-img.png | Bin 0 -> 124300 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/hero-img.png diff --git a/services/web/public/img/feature-page/hero-img.png b/services/web/public/img/feature-page/hero-img.png new file mode 100644 index 0000000000000000000000000000000000000000..86c078c0b04832e97280774edd04ab2bf34d171c GIT binary patch literal 124300 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 Awg3PC literal 0 HcmV?d00001 From deea69a9f4710fef25fe5bce75d8942829e84d8d Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Mon, 6 Mar 2017 16:47:10 +0000 Subject: [PATCH 20/60] More adjustments. --- .../stylesheets/app/review-features-page.less | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/services/web/public/stylesheets/app/review-features-page.less b/services/web/public/stylesheets/app/review-features-page.less index c37548ed65..4c3b039384 100644 --- a/services/web/public/stylesheets/app/review-features-page.less +++ b/services/web/public/stylesheets/app/review-features-page.less @@ -94,6 +94,7 @@ color: #FFF; background-size: cover; background-position: center; + background-color: @rfp-rp-blue-darker; } .rfp-section-blockquote { position: relative; @@ -123,6 +124,7 @@ max-width: 100%; box-shadow: @rfp-card-shadow; margin-bottom: 2em; + border-radius: @rfp-border-radius; } .rfp-quote-section { @@ -143,7 +145,7 @@ font-size: @rfp-lead-size; background-color: #FFF; color: @rfp-rp-blue-dark; - + @media (min-width: @screen-sm-min) { display: flex; flex-direction: column; @@ -163,13 +165,16 @@ } } .rfp-quote-main { - display: flex; + display: block; max-width: none; border-left: 0; margin: 0 auto; padding: 0; quotes: "\201C" "\201D"; font-size: @rfp-lead-size; + @media (min-width: @screen-sm-min) { + display: flex; + } // Override weird Boostrap default. p { display: block; @@ -196,8 +201,10 @@ left: -0.75em; } .rfp-quote-main & { - flex: 1 1 70%; - margin: auto 40px auto auto; + @media (min-width: @screen-sm-min) { + flex: 1 1 70%; + margin: auto 40px auto auto; + } } } .rfp-quoted-person { @@ -206,6 +213,7 @@ .rfp-quote-main & { display: flex; align-items: center; + justify-content: center; flex: 0 0 30%; } } From 708edacea9824c69f0f2ebb0c453db1a72cccec5 Mon Sep 17 00:00:00 2001 From: Paulo Reis Date: Tue, 7 Mar 2017 17:21:50 +0000 Subject: [PATCH 21/60] Add videos for the feature page. --- .../public/img/feature-page/feat-accept.mp4 | Bin 0 -> 394826 bytes .../public/img/feature-page/feat-changes.mp4 | Bin 0 -> 421813 bytes .../public/img/feature-page/feat-discuss.mp4 | Bin 0 -> 201928 bytes .../web/public/img/feature-page/feat-todos.mp4 | Bin 0 -> 230127 bytes services/web/public/img/feature-page/intro.mp4 | Bin 0 -> 132214 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 services/web/public/img/feature-page/feat-accept.mp4 create mode 100644 services/web/public/img/feature-page/feat-changes.mp4 create mode 100644 services/web/public/img/feature-page/feat-discuss.mp4 create mode 100644 services/web/public/img/feature-page/feat-todos.mp4 create mode 100644 services/web/public/img/feature-page/intro.mp4 diff --git a/services/web/public/img/feature-page/feat-accept.mp4 b/services/web/public/img/feature-page/feat-accept.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..88285975ffaf2511e0da6bd7cb86f65b31d84da0 GIT binary patch literal 394826 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